diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 1bfa7a41ccc9..ffc0150ebac5 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,53 +1,18 @@ -#------------------------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. -#------------------------------------------------------------------------------------------------------------- +FROM mcr.microsoft.com/devcontainers/typescript-node:22-bookworm -FROM node:8 +RUN apt-get install -y wget bzip2 -# Avoid warnings by switching to noninteractive -ENV DEBIAN_FRONTEND=noninteractive +# Run in silent mode and save downloaded script as anaconda.sh. +# Run with /bin/bash and run in silent mode to /opt/conda. +# Also get rid of installation script after finishing. +RUN wget --quiet https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-x86_64.sh -O ~/anaconda.sh && \ + /bin/bash ~/anaconda.sh -b -p /opt/conda && \ + rm ~/anaconda.sh -# The node image comes with a base non-root 'node' user which this Dockerfile -# gives sudo access. However, for Linux, this user's GID/UID must match your local -# user UID/GID to avoid permission issues with bind mounts. Update USER_UID / USER_GID -# if yours is not 1000. See https://aka.ms/vscode-remote/containers/non-root-user. -ARG USER_UID=1000 -ARG USER_GID=$USER_UID +ENV PATH="/opt/conda/bin:$PATH" + +# Sudo apt update needs to run in order for installation of fish to work . +RUN sudo apt update && \ + sudo apt install fish -y -# Configure apt and install packages -RUN apt-get update \ - && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ - # - # Verify git and needed tools are installed - && apt-get -y install git iproute2 procps \ - # - # Remove outdated yarn from /opt and install via package - # so it can be easily updated via apt-get upgrade yarn - && rm -rf /opt/yarn-* \ - && rm -f /usr/local/bin/yarn \ - && rm -f /usr/local/bin/yarnpkg \ - && apt-get install -y curl apt-transport-https lsb-release \ - && curl -sS https://dl.yarnpkg.com/$(lsb_release -is | tr '[:upper:]' '[:lower:]')/pubkey.gpg | apt-key add - 2>/dev/null \ - && echo "deb https://dl.yarnpkg.com/$(lsb_release -is | tr '[:upper:]' '[:lower:]')/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt-get update \ - && apt-get -y install --no-install-recommends yarn \ - # - # Install tslint and typescript globally - && npm install -g tslint typescript \ - # - # [Optional] Update a non-root user to match UID/GID - see https://aka.ms/vscode-remote/containers/non-root-user. - && if [ "$USER_GID" != "1000" ]; then groupmod node --gid $USER_GID; fi \ - && if [ "$USER_UID" != "1000" ]; then usermod --uid $USER_UID node; fi \ - # [Optional] Add add sudo support for non-root user - && apt-get install -y sudo \ - && echo node ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/node \ - && chmod 0440 /etc/sudoers.d/node \ - # - # Clean up - && apt-get autoremove -y \ - && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* -# Switch back to dialog for any ad-hoc use of apt-get -ENV DEBIAN_FRONTEND= diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a05bc6b36912..67a8833d30cf 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,28 +1,30 @@ -// For format details, see https://aka.ms/vscode-remote/devcontainer.json or the definition README at -// https://github.com/microsoft/vscode-dev-containers/tree/master/containers/typescript-node-8 +// For format details, see https://aka.ms/devcontainer.json. { - "name": "Node.js 8 & TypeScript", - "dockerFile": "Dockerfile", + "name": "VS Code Python Dev Container", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "build": { + "dockerfile": "./Dockerfile", + "context": ".." + }, + "customizations": { + "vscode": { + "extensions": [ + "charliermarsh.ruff", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.debugpy" + ] + } + }, + // Commands to execute on container creation,start. + "postCreateCommand": "bash scripts/postCreateCommand.sh", + "onCreateCommand": "bash scripts/onCreateCommand.sh", - // Use 'settings' to set *default* container specific settings.json values on container create. - // You can edit these settings after create using File > Preferences > Settings > Remote. - "settings": { - "terminal.integrated.shell.linux": "/bin/bash" - }, + "containerEnv": { + "CI_PYTHON_PATH": "/workspaces/vscode-python/.venv/bin/python" + } - // Uncomment the next line if you want to publish any ports. - // "appPort": [], - - // Uncomment the next line to run commands after the container is created. - // "postCreateCommand": "yarn install", - - // Uncomment the next line to use a non-root user. On Linux, this will prevent - // new files getting created as root, but you may need to update the USER_UID - // and USER_GID in .devcontainer/Dockerfile to match your user if not 1000. - // "runArgs": [ "-u", "node" ], - - // Add the IDs of extensions you want installed when the container is created in the array below. - "extensions": [ - "ms-vscode.vscode-typescript-tslint-plugin" - ] -} \ No newline at end of file +} diff --git a/.env b/.env deleted file mode 100644 index 71d3e4b59cf3..000000000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Added for Language Server -PYTHONPATH=./uitests diff --git a/.eslintplugin/no-bad-gdpr-comment.js b/.eslintplugin/no-bad-gdpr-comment.js new file mode 100644 index 000000000000..786259683ff6 --- /dev/null +++ b/.eslintplugin/no-bad-gdpr-comment.js @@ -0,0 +1,51 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +var noBadGDPRComment = { + create: function (context) { + var _a; + return _a = {}, + _a['Program'] = function (node) { + for (var _i = 0, _a = node.comments; _i < _a.length; _i++) { + var comment = _a[_i]; + if (comment.type !== 'Block' || !comment.loc) { + continue; + } + if (!comment.value.includes('__GDPR__')) { + continue; + } + var dataStart = comment.value.indexOf('\n'); + var data = comment.value.substring(dataStart); + var gdprData = void 0; + try { + var jsonRaw = "{ ".concat(data, " }"); + gdprData = JSON.parse(jsonRaw); + } + catch (e) { + context.report({ + loc: { start: comment.loc.start, end: comment.loc.end }, + message: 'GDPR comment is not valid JSON', + }); + } + if (gdprData) { + var len = Object.keys(gdprData).length; + if (len !== 1) { + context.report({ + loc: { start: comment.loc.start, end: comment.loc.end }, + message: "GDPR comment must contain exactly one key, not ".concat(Object.keys(gdprData).join(', ')), + }); + } + } + } + }, + _a; + }, +}; +module.exports = { + rules: { + 'no-bad-gdpr-comment': noBadGDPRComment, // Ensure correct structure + }, +}; diff --git a/.eslintplugin/no-bad-gdpr-comment.ts b/.eslintplugin/no-bad-gdpr-comment.ts new file mode 100644 index 000000000000..1eba899a7de3 --- /dev/null +++ b/.eslintplugin/no-bad-gdpr-comment.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as eslint from 'eslint'; +const noBadGDPRComment: eslint.Rule.RuleModule = { + create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { + return { + ['Program'](node) { + for (const comment of (node as eslint.AST.Program).comments) { + if (comment.type !== 'Block' || !comment.loc) { + continue; + } + if (!comment.value.includes('__GDPR__')) { + continue; + } + + const dataStart = comment.value.indexOf('\n'); + const data = comment.value.substring(dataStart); + + let gdprData: { [key: string]: object } | undefined; + + try { + const jsonRaw = `{ ${data} }`; + gdprData = JSON.parse(jsonRaw); + } catch (e) { + context.report({ + loc: { start: comment.loc.start, end: comment.loc.end }, + message: 'GDPR comment is not valid JSON', + }); + } + + if (gdprData) { + const len = Object.keys(gdprData).length; + if (len !== 1) { + context.report({ + loc: { start: comment.loc.start, end: comment.loc.end }, + message: `GDPR comment must contain exactly one key, not ${Object.keys(gdprData).join( + ', ', + )}`, + }); + } + } + } + }, + }; + }, +}; + +module.exports = { + rules: { + 'no-bad-gdpr-comment': noBadGDPRComment, // Ensure correct structure + }, +}; diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 1b6649bb0880..000000000000 --- a/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ - -{ - "env": { - "node": true, - "es6": true - }, - "rules": { - "no-console": 0, - "no-cond-assign": 0, - "no-unused-vars": 1, - "no-extra-semi": "warn", - "semi": "warn", - "prettier/prettier": "error" - }, - "extends": ["eslint:recommended", "prettier"], - "plugins": ["prettier"] -} diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000000..e2c2a50781b9 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,15 @@ +# Prettier +2b6a8f2d439fe9d5e66665ea46d8b690ac9b2c39 +649156a09ccdc51c0d20f7cd44540f1918f9347b +4f774d94bf4fbf87bb417b2b2b8e79e334eb3536 +61b179b2092050709e3c373a6738abad8ce581c4 +c33617b0b98daeb4d72040b48c5850b476d6256c +db8e1e2460e9754ec0672d958789382b6d15c5aa +08bc9ad3bee5b19f02fa756fbc53ab32f1b39920 +# Black +a58eeffd1b64498e2afe5f11597888dfd1c8699c +5cd8f539f4d2086b718c8f11f823c0ac12fc2c49 +9ec9e9eaebb25adc6d942ac19d4d6c128abb987f +c4af91e090057d20d7a633b3afa45eaa13ece76f +# Ruff +e931bed3efbede7b05113316506958ecd7506777 diff --git a/.gitattributes b/.gitattributes index f36040d43639..e25c2877c07f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ package.json text eol=lf package-lock.json text eol=lf +requirements.txt text eol=lf diff --git a/.github/ISSUE_TEMPLATE/1_ds_bug_report.md b/.github/ISSUE_TEMPLATE/1_ds_bug_report.md deleted file mode 100644 index e331ff168600..000000000000 --- a/.github/ISSUE_TEMPLATE/1_ds_bug_report.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -name: Bug report for Notebook Editor, Interactive Window, Python Editor cells -about: Create a report to help us improve -labels: type-bug, data science ---- -# Bug: Notebook Editor, Interactive Window, Editor cells - - - -## Steps to cause the bug to occur -1. - -## Actual behavior - -## Expected behavior - - - -### Your Jupyter and/or Python environment -*Please provide as much info as you readily know* -- **Jupyter server running:** Local | Remote | N/A -- **Extension version:** 20YY.MM.#####-xxx -- **VS Code version:** #.## -- **Setting python.jediEnabled:** true | false -- **Python and/or Anaconda version:** #.#.# -- **OS:** Windows | Mac | Linux (distro): -- **Virtual environment:** conda | venv | virtualenv | N/A | ... - -## Developer Tools Console Output - -Microsoft Data Science for VS Code Engineering Team: @rchiodo, @IanMatthewHuff, @DavidKutu, @DonJayamanne, @greazer - - - diff --git a/.github/ISSUE_TEMPLATE/2_bug_report.md b/.github/ISSUE_TEMPLATE/2_bug_report.md deleted file mode 100644 index 1f4fac77efb1..000000000000 --- a/.github/ISSUE_TEMPLATE/2_bug_report.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -name: General bug report -about: Create a report to help us improve -labels: classify, type-bug ---- - - - -## Environment data - -- VS Code version: XXX -- Extension version (available under the Extensions sidebar): XXX -- OS and version: XXX -- Python version (& distribution if applicable, e.g. Anaconda): XXX -- Type of virtual environment used (N/A | venv | virtualenv | conda | ...): XXX -- Relevant/affected Python packages and their versions: XXX -- Relevant/affected Python-related VS Code extensions and their versions: XXX -- Jedi or Language Server? (i.e. what is `"python.jediEnabled"` set to; more info #3977): XXX -- Value of the `python.languageServer` setting: XXX - -## Expected behaviour - -XXX - -## Actual behaviour - -XXX - -## Steps to reproduce: -[**NOTE**: Self-contained, minimal reproducing code samples are **extremely** helpful and will expedite addressing your issue] - -1. XXX - - - -## Logs -Output for `Python` in the `Output` panel (`View`→`Output`, change the drop-down the upper-right of the `Output` panel to `Python`) - -``` -XXX -``` - -Output from `Console` under the `Developer Tools` panel (toggle Developer Tools on under `Help`; turn on source maps to make any tracebacks be useful by running `Enable source map support for extension debugging`) - -``` -XXX -``` diff --git a/.github/ISSUE_TEMPLATE/3_ds_feature_request.md b/.github/ISSUE_TEMPLATE/3_ds_feature_request.md deleted file mode 100644 index db573d9f8dac..000000000000 --- a/.github/ISSUE_TEMPLATE/3_ds_feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request for Notebook Editor, Interactive Window, Editor cells -about: Suggest an idea for this project -labels: type-enhancement, data science ---- -# Feature: Notebook Editor, Interactive Window, Python Editor cells - - - -## Description - - -Microsoft Data Science for VS Code Engineering Team: @rchiodo, @IanMatthewHuff, @DavidKutu, @DonJayamanne, @greazer - - diff --git a/.github/ISSUE_TEMPLATE/3_feature_request.md b/.github/ISSUE_TEMPLATE/3_feature_request.md new file mode 100644 index 000000000000..d13a5e94e700 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_feature_request.md @@ -0,0 +1,7 @@ +--- +name: Feature request +about: Request for the Python extension, not supporting/sibling extensions +labels: classify, feature-request +--- + + diff --git a/.github/ISSUE_TEMPLATE/4_feature_request.md b/.github/ISSUE_TEMPLATE/4_feature_request.md deleted file mode 100644 index e98872ab0d10..000000000000 --- a/.github/ISSUE_TEMPLATE/4_feature_request.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: General feature request -about: Suggest an idea for this project -labels: classify, type-enhancement ---- - - - - diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 658e6a5d037b..c966f6bde856 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,17 @@ -blank_issues_enabled: true +blank_issues_enabled: false contact_links: - - name: Stack Overflow - url: https://stackoverflow.com/questions/tagged/visual-studio-code+python - about: Please ask questions here. + - name: 'Bug 🐜' + url: https://aka.ms/pvsc-bug + about: 'Use the `Python: Report Issue...` command (follow the link for instructions)' + - name: 'Pylance' + url: https://github.com/microsoft/pylance-release/issues + about: 'For issues relating to the Pylance language server extension' + - name: 'Jupyter' + url: https://github.com/microsoft/vscode-jupyter/issues + about: 'For issues relating to the Jupyter extension (including the interactive window)' + - name: 'Python Debugger' + url: https://github.com/microsoft/vscode-python-debugger/issues + about: 'For issues relating to the Python debugger' + - name: Help/Support + url: https://github.com/microsoft/vscode-python/discussions/categories/q-a + about: 'Having trouble with the extension? Need help getting something to work?' diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 25f76b17fd7c..000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,16 +0,0 @@ -For # - - -- [ ] Pull request represents a single change (i.e. not fixing disparate/unrelated things in a single PR). -- [ ] Title summarizes what is changing. -- [ ] Has a [news entry](https://github.com/Microsoft/vscode-python/tree/master/news) file (remember to thank yourself!). -- [ ] Appropriate comments and documentation strings in the code. -- [ ] Has sufficient logging. -- [ ] Has telemetry for enhancements. -- [ ] Unit tests & system/integration tests are added/updated. -- [ ] [Test plan](https://github.com/Microsoft/vscode-python/blob/master/.github/test_plan.md) is updated as appropriate. -- [ ] [`package-lock.json`](https://github.com/Microsoft/vscode-python/blob/master/package-lock.json) has been regenerated by running `npm install` (if dependencies have changed). -- [ ] The wiki is updated with any design decisions/details. diff --git a/.github/actions/build-vsix/action.yml b/.github/actions/build-vsix/action.yml new file mode 100644 index 000000000000..912ff2c34a74 --- /dev/null +++ b/.github/actions/build-vsix/action.yml @@ -0,0 +1,101 @@ +name: 'Build VSIX' +description: "Build the extension's VSIX" + +inputs: + node_version: + description: 'Version of Node to install' + required: true + vsix_name: + description: 'Name to give the final VSIX' + required: true + artifact_name: + description: 'Name to give the artifact containing the VSIX' + required: true + cargo_target: + description: 'Cargo build target for the native build' + required: true + vsix_target: + description: 'vsix build target for the native build' + required: true + +runs: + using: 'composite' + steps: + - name: Install Node + uses: actions/setup-node@v6 + with: + node-version: ${{ inputs.node_version }} + cache: 'npm' + + - name: Rust Tool Chain setup + uses: dtolnay/rust-toolchain@stable + + # Jedi LS depends on dataclasses which is not in the stdlib in Python 3.7. + - name: Use Python 3.10 for JediLSP + uses: actions/setup-python@v6 + with: + python-version: '3.10' + cache: 'pip' + cache-dependency-path: | + requirements.txt + python_files/jedilsp_requirements/requirements.txt + + - name: Upgrade Pip + run: python -m pip install -U pip + shell: bash + + # For faster/better builds of sdists. + - name: Install build pre-requisite + run: python -m pip install wheel nox + shell: bash + + - name: Install Python Extension dependencies (jedi, etc.) + run: nox --session install_python_libs + shell: bash + + - name: Add Rustup target + run: rustup target add "${CARGO_TARGET}" + shell: bash + env: + CARGO_TARGET: ${{ inputs.cargo_target }} + + - name: Build Native Binaries + run: nox --session native_build + shell: bash + env: + CARGO_TARGET: ${{ inputs.cargo_target }} + + - name: Run npm ci + run: npm ci --prefer-offline + shell: bash + + - name: Update optional extension dependencies + run: npm run addExtensionPackDependencies + shell: bash + + - name: Build Webpack + run: | + npx gulp clean + npx gulp prePublishBundle + shell: bash + + - name: Build VSIX + run: npx vsce package --target "${VSIX_TARGET}" --out ms-python-insiders.vsix --pre-release + shell: bash + env: + VSIX_TARGET: ${{ inputs.vsix_target }} + + - name: Rename VSIX + # Move to a temp name in case the specified name happens to match the default name. + run: mv ms-python-insiders.vsix ms-python-temp.vsix && mv ms-python-temp.vsix "${VSIX_NAME}" + shell: bash + env: + VSIX_NAME: ${{ inputs.vsix_name }} + + - name: Upload VSIX + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact_name }} + path: ${{ inputs.vsix_name }} + if-no-files-found: error + retention-days: 7 diff --git a/.github/actions/lint/action.yml b/.github/actions/lint/action.yml new file mode 100644 index 000000000000..0bd5a2d8e1e2 --- /dev/null +++ b/.github/actions/lint/action.yml @@ -0,0 +1,50 @@ +name: 'Lint' +description: 'Lint TypeScript and Python code' + +inputs: + node_version: + description: 'Version of Node to install' + required: true + +runs: + using: 'composite' + steps: + - name: Install Node + uses: actions/setup-node@v6 + with: + node-version: ${{ inputs.node_version }} + cache: 'npm' + + - name: Install Node dependencies + run: npm ci --prefer-offline + shell: bash + + - name: Run `gulp prePublishNonBundle` + run: npx gulp prePublishNonBundle + shell: bash + + - name: Check dependencies + run: npm run checkDependencies + shell: bash + + - name: Lint TypeScript code + run: npm run lint + shell: bash + + - name: Check TypeScript format + run: npm run format-check + shell: bash + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version: '3.x' + cache: 'pip' + + - name: Run Ruff + run: | + python -m pip install -U "ruff" + python -m ruff check . + python -m ruff format --check + working-directory: python_files + shell: bash diff --git a/.github/actions/smoke-tests/action.yml b/.github/actions/smoke-tests/action.yml new file mode 100644 index 000000000000..0531ef5d42a3 --- /dev/null +++ b/.github/actions/smoke-tests/action.yml @@ -0,0 +1,66 @@ +name: 'Smoke tests' +description: 'Run smoke tests' + +inputs: + node_version: + description: 'Version of Node to install' + required: true + artifact_name: + description: 'Name of the artifact containing the VSIX' + required: true + +runs: + using: 'composite' + steps: + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node_version }} + cache: 'npm' + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + cache: 'pip' + cache-dependency-path: | + build/test-requirements.txt + requirements.txt + + - name: Install dependencies (npm ci) + run: npm ci --prefer-offline + shell: bash + + - name: Install Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + options: '-t ./python_files/lib/python --implementation py' + + - name: pip install system test requirements + run: | + python -m pip install --upgrade -r build/test-requirements.txt + shell: bash + + # Bits from the VSIX are reused by smokeTest.ts to speed things up. + - name: Download VSIX + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.artifact_name }} + + - name: Prepare for smoke tests + run: npx tsc -p ./ + shell: bash + + - name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION + run: | + echo "CI_PYTHON_PATH=python" >> $GITHUB_ENV + echo "CI_DISABLE_AUTO_SELECTION=1" >> $GITHUB_ENV + shell: bash + + - name: Run smoke tests + env: + DISPLAY: 10 + INSTALL_JUPYTER_EXTENSION: true + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: node --no-force-async-hooks-checks ./out/test/smokeTest.js diff --git a/.github/commands.json b/.github/commands.json new file mode 100644 index 000000000000..2fb6684a7ee6 --- /dev/null +++ b/.github/commands.json @@ -0,0 +1,157 @@ +[ + { + "type": "label", + "name": "*question", + "action": "close", + "reason": "not_planned", + "comment": "We closed this issue because it is a question about using the Python extension for VS Code rather than an issue or feature request. We recommend browsing resources such as our [Python documentation](https://code.visualstudio.com/docs/languages/python) and our [Discussions page](https://github.com/microsoft/vscode-python/discussions). You may also find help on [StackOverflow](https://stackoverflow.com/questions/tagged/vscode-python), where the community has already answered thousands of similar questions. \n\nHappy Coding!" + }, + { + "type": "label", + "name": "*dev-question", + "action": "close", + "reason": "not_planned", + "comment": "We have a great extension developer community over on [GitHub discussions](https://github.com/microsoft/vscode-discussions/discussions) and [Slack](https://vscode-dev-community.slack.com/) where extension authors help each other. This is a great place for you to ask questions and find support.\n\nHappy Coding!" + }, + { + "type": "label", + "name": "*extension-candidate", + "action": "close", + "reason": "not_planned", + "comment": "We try to keep the Python extension lean and we think the functionality you're asking for is great for a VS Code extension. You might be able to find one that suits you in the [VS Code Marketplace](https://aka.ms/vscodemarketplace) already. If not, in a few simple steps you can get started [writing your own extension](https://aka.ms/vscodewritingextensions) or leverage our [tool extension template](https://github.com/microsoft/vscode-python-tools-extension-template) to get started. In addition, check out the [vscode-python-environments](https://github.com/microsoft/vscode-python-environments) as this may be the right spot for your request. \n\nHappy Coding!" + }, + { + "type": "label", + "name": "*not-reproducible", + "action": "close", + "reason": "not_planned", + "comment": "We closed this issue because we are unable to reproduce the problem with the steps you describe. Chances are we've already fixed your problem in a recent version of the Python extension, so we recommend updating to the latest version and trying again. If you continue to experience this issue, please ask us to reopen the issue and provide us with more detail.\n\nHappy Coding!" + }, + { + "type": "label", + "name": "*out-of-scope", + "action": "close", + "reason": "not_planned", + "comment": "We closed this issue because we [don't plan to address it](https://github.com/microsoft/vscode-python/wiki/Issue-Management#criteria-for-closing-out-of-scope-feature-requests) in the foreseeable future. If you disagree and feel that this issue is crucial: we are happy to listen and to reconsider.\n\nIf you wonder what we are up to, please see our [roadmap](https://aka.ms/pythonvscoderoadmap) and [issue reporting guidelines]( https://github.com/microsoft/vscode-python/wiki/Issue-Management).\n\nThanks for your understanding, and happy coding!" + }, + { + "type": "label", + "name": "wont-fix", + "action": "close", + "reason": "not_planned", + "comment": "We closed this issue because we [don't plan to address it](https://github.com/microsoft/vscode/wiki/Issue-Grooming#wont-fix-bugs).\n\nThanks for your understanding, and happy coding!" + }, + { + "type": "label", + "name": "*caused-by-extension", + "action": "close", + "reason": "not_planned", + "comment": "This issue is caused by an extension, please file it with the repository (or contact) the extension has linked in its overview in VS Code or the [marketplace](https://aka.ms/vscodemarketplace) for VS Code. See also our [issue reporting guidelines](https://aka.ms/vscodeissuereporting). If you don't know which extension is causing the problem, you can run `Help: Start extension bisect` from the command palette (F1) to help identify the problem extension.\n\nHappy Coding!" + }, + { + "type": "label", + "name": "*as-designed", + "action": "close", + "reason": "not_planned", + "comment": "The described behavior is how it is expected to work. If you disagree, please explain what is expected and what is not in more detail. See also our [issue reporting guidelines](https://aka.ms/vscodeissuereporting).\n\nHappy Coding!" + }, + { + "type": "label", + "name": "L10N", + "assign": [ + "csigs", + "TylerLeonhardt" + ] + }, + { + "type": "label", + "name": "*duplicate", + "action": "close", + "reason": "not_planned", + "comment": "Thanks for creating this issue! We figured it's covering the same as another one we already have. Thus, we closed this one as a duplicate. You can search for [similar existing issues](${duplicateQuery}). See also our [issue reporting guidelines](https://aka.ms/vscodeissuereporting).\n\nHappy Coding!" + }, + { + "type": "comment", + "name": "verified", + "allowUsers": [ + "@author" + ], + "action": "updateLabels", + "addLabel": "verified", + "removeLabel": "author-verification-requested", + "requireLabel": "author-verification-requested", + "disallowLabel": "unreleased" + }, + { + "type": "comment", + "name": "confirm", + "allowUsers": [ + "cleidigh", + "usernamehw", + "gjsjohnmurray", + "IllusionMH" + ], + "action": "updateLabels", + "addLabel": "confirmed", + "removeLabel": "confirmation-pending" + }, + { + "type": "label", + "name": "*off-topic", + "action": "close", + "reason": "not_planned", + "comment": "Thanks for creating this issue. We think this issue is unactionable or unrelated to the goals of this project. Please follow our [issue reporting guidelines](https://aka.ms/vscodeissuereporting).\n\nHappy Coding!" + }, + { + "type": "comment", + "name": "gifPlease", + "allowUsers": [ + "cleidigh", + "usernamehw", + "gjsjohnmurray", + "IllusionMH" + ], + "action": "comment", + "addLabel": "info-needed", + "comment": "Thanks for reporting this issue! Unfortunately, it's hard for us to understand what issue you're seeing. Please help us out by providing a screen recording showing exactly what isn't working as expected. While we can work with most standard formats, `.gif` files are preferred as they are displayed inline on GitHub. You may find https://gifcap.dev helpful as a browser-based gif recording tool.\n\nIf the issue depends on keyboard input, you can help us by enabling screencast mode for the recording (`Developer: Toggle Screencast Mode` in the command palette). Lastly, please attach this file via the GitHub web interface as emailed responses will strip files out from the issue.\n\nHappy coding!" + }, + { + "type": "label", + "name": "*workspace-trust-docs", + "action": "close", + "reason": "not_planned", + "comment": "This issue appears to be the result of the new workspace trust feature shipped in June 2021. This security-focused feature has major impact on the functionality of VS Code. Due to the volume of issues, we ask that you take some time to review our [comprehensive documentation](https://aka.ms/vscode-workspace-trust) on the feature. If your issue is still not resolved, please let us know." + }, + { + "type": "label", + "name": "~verification-steps-needed", + "action": "updateLabels", + "addLabel": "verification-steps-needed", + "removeLabel": "~verification-steps-needed", + "comment": "Friendly ping! Looks like this issue requires some further steps to be verified. Please provide us with the steps necessary to verify this issue." + }, + { + "type": "label", + "name": "~info-needed", + "action": "updateLabels", + "addLabel": "info-needed", + "removeLabel": "~info-needed", + "comment": "Thanks for creating this issue! We figured it's missing some basic information or in some other way doesn't follow our [issue reporting guidelines](https://aka.ms/pvsc-bug). Please take the time to review these and update the issue or even open a new one with the Report Issue command in VS Code (**Help > Report Issue**) to have all the right information collected for you.\n\nHappy Coding!" + }, + { + "type": "label", + "name": "~version-info-needed", + "action": "updateLabels", + "addLabel": "info-needed", + "removeLabel": "~version-info-needed", + "comment": "Thanks for creating this issue! We figured it's missing some basic information, such as a version number, or in some other way doesn't follow our issue reporting guidelines. Please take the time to review these and update the issue or even open a new one with the Report Issue command in VS Code (**Help > Report Issue**) to have all the right information collected for you.\n\nHappy Coding!" + }, + { + "type": "label", + "name": "~confirmation-needed", + "action": "updateLabels", + "addLabel": "info-needed", + "removeLabel": "~confirmation-needed", + "comment": "Please diagnose the root cause of the issue by running the command `F1 > Help: Troubleshoot Issue` and following the instructions. Once you have done that, please update the issue with the results.\n\nHappy Coding!" + } +] diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..14c8e18d475d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,49 @@ +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: / + schedule: + interval: daily + labels: + - 'no-changelog' + + - package-ecosystem: 'github-actions' + directory: .github/actions/build-vsix + schedule: + interval: daily + labels: + - 'no-changelog' + + - package-ecosystem: 'github-actions' + directory: .github/actions/lint + schedule: + interval: daily + labels: + - 'no-changelog' + + - package-ecosystem: 'github-actions' + directory: .github/actions/smoke-test + schedule: + interval: daily + labels: + - 'no-changelog' + + # Not skipping the news for some Python dependencies in case it's actually useful to communicate to users. + - package-ecosystem: 'pip' + directory: / + schedule: + interval: daily + ignore: + - dependency-name: prospector # Due to Python 2.7 and #14477. + - dependency-name: pytest # Due to Python 2.7 and #13776. + - dependency-name: py # Due to Python 2.7. + - dependency-name: jedi-language-server + labels: + - 'no-changelog' + # Activate when we feel ready to keep up with frequency. + # - package-ecosystem: 'npm' + # directory: / + # schedule: + # interval: daily + # default_labels: + # - "no-changelog" diff --git a/.github/instructions/learning.instructions.md b/.github/instructions/learning.instructions.md new file mode 100644 index 000000000000..28b085f486ce --- /dev/null +++ b/.github/instructions/learning.instructions.md @@ -0,0 +1,34 @@ +--- +applyTo: '**' +description: This document describes how to deal with learnings that you make. (meta instruction) +--- + +This document describes how to deal with learnings that you make. +It is a meta-instruction file. + +Structure of learnings: + +- Each instruction file has a "Learnings" section. +- Each learning has a counter that indicates how often that learning was useful (initially 1). +- Each learning has a 1 sentence description of the learning that is clear and concise. + +Example: + +```markdown +## Learnings + +- Prefer `const` over `let` whenever possible (1) +- Avoid `any` type (3) +``` + +When the user tells you "learn!", you should: + +- extract a learning from the recent conversation + _ identify the problem that you created + _ identify why it was a problem + _ identify how you were told to fix it/how the user fixed it + _ generate only one learning (1 sentence) that helps to summarize the insight gained +- then, add the reflected learning to the "Learnings" section of the most appropriate instruction file + +Important: Whenever a learning was really useful, increase the counter!! +When a learning was not useful and just caused more problems, decrease the counter. diff --git a/.github/instructions/pytest-json-test-builder.instructions.md b/.github/instructions/pytest-json-test-builder.instructions.md new file mode 100644 index 000000000000..436bce0c9cd8 --- /dev/null +++ b/.github/instructions/pytest-json-test-builder.instructions.md @@ -0,0 +1,126 @@ +--- +applyTo: 'python_files/tests/pytestadapter/test_discovery.py' +description: 'A guide for adding new tests for pytest discovery and JSON formatting in the test_pytest_collect suite.' +--- + +# How to Add New Pytest Discovery Tests + +This guide explains how to add new tests for pytest discovery and JSON formatting in the `test_pytest_collect` suite. Follow these steps to ensure your tests are consistent and correct. + +--- + +## 1. Add Your Test File + +- Place your new test file/files in the appropriate subfolder under: + ``` + python_files/tests/pytestadapter/.data/ + ``` +- Organize folders and files to match the structure you want to test. For example, to test nested folders, create the corresponding directory structure. +- In your test file, mark each test function with a comment: + ```python + def test_function(): # test_marker--test_function + ... + ``` + +**Root Node Matching:** + +- The root node in your expected output must match the folder or file you pass to pytest discovery. For example, if you run discovery on a subfolder, the root `"name"`, `"path"`, and `"id_"` in your expected output should be that subfolder, not the parent `.data` folder. +- Only use `.data` as the root if you are running discovery on the entire `.data` folder. + +**Example:** +If you run: + +```python +helpers.runner([os.fspath(TEST_DATA_PATH / "myfolder"), "--collect-only"]) +``` + +then your expected output root should be: + +```python +{ + "name": "myfolder", + "path": os.fspath(TEST_DATA_PATH / "myfolder"), + "type_": "folder", + ... +} +``` + +--- + +## 2. Update `expected_discovery_test_output.py` + +- Open `expected_discovery_test_output.py` in the same test suite. +- Add a new expected output dictionary for your test file, following the format of existing entries. +- Use the helper functions and path conventions: + - Use `os.fspath()` for all paths. + - Use `find_test_line_number("function_name", file_path)` for the `lineno` field. + - Use `get_absolute_test_id("relative_path::function_name", file_path)` for `id_` and `runID`. + - Always use current path concatenation (e.g., `TEST_DATA_PATH / "your_folder" / "your_file.py"`). + - Create new constants as needed to keep the code clean and maintainable. + +**Important:** + +- Do **not** read the entire `expected_discovery_test_output.py` file if you only need to add or reference a single constant. This file is very large; prefer searching for the relevant section or appending to the end. + +**Example:** +If you run discovery on a subfolder: + +```python +helpers.runner([os.fspath(TEST_DATA_PATH / "myfolder"), "--collect-only"]) +``` + +then your expected output root should be: + +```python +myfolder_path = TEST_DATA_PATH / "myfolder" +my_expected_output = { + "name": "myfolder", + "path": os.fspath(myfolder_path), + "type_": "folder", + ... +} +``` + +- Add a comment above your dictionary describing the structure, as in the existing examples. + +--- + +## 3. Add Your Test to `test_discovery.py` + +- In `test_discovery.py`, add your new test as a parameterized case to the main `test_pytest_collect` function. Do **not** create a standalone test function for new discovery cases. +- Reference your new expected output constant from `expected_discovery_test_output.py`. + +**Example:** + +```python +@pytest.mark.parametrize( + ("file", "expected_const"), + [ + ("myfolder", my_expected_output), + # ... other cases ... + ], +) +def test_pytest_collect(file, expected_const): + ... +``` + +--- + +## 4. Run and Verify + +- Run the test suite to ensure your new test is discovered and passes. +- If the test fails, check your expected output dictionary for path or structure mismatches. + +--- + +## 5. Tips + +- Always use the helper functions for line numbers and IDs. +- Match the folder/file structure in `.data` to the expected JSON structure. +- Use comments to document the expected output structure for clarity. +- Ensure all `"path"` and `"id_"` fields in your expected output match exactly what pytest returns, including absolute paths and root node structure. + +--- + +**Reference:** +See `expected_discovery_test_output.py` for more examples and formatting. Use search or jump to the end of the file to avoid reading the entire file when possible. diff --git a/.github/instructions/python-quality-checks.instructions.md b/.github/instructions/python-quality-checks.instructions.md new file mode 100644 index 000000000000..48f37529dfbc --- /dev/null +++ b/.github/instructions/python-quality-checks.instructions.md @@ -0,0 +1,97 @@ +--- +applyTo: 'python_files/**' +description: Guide for running and fixing Python quality checks (Ruff and Pyright) that run in CI +--- + +# Python Quality Checks — Ruff and Pyright + +Run the same Python quality checks that run in CI. All checks target `python_files/` and use config from `python_files/pyproject.toml`. + +## Commands + +```bash +npm run check-python # Run both Ruff and Pyright +npm run check-python:ruff # Linting and formatting only +npm run check-python:pyright # Type checking only +``` + +## Fixing Ruff Errors + +**Auto-fix most issues:** + +```bash +cd python_files +python -m ruff check . --fix +python -m ruff format +npm run check-python:ruff # Verify +``` + +**Manual fixes:** + +- Ruff shows file, line number, rule code (e.g., `F841`), and description +- Open the file, read the error, fix the code +- Common: line length (100 char max), import sorting, unused variables + +## Fixing Pyright Errors + +**Common patterns and fixes:** + +- **Undefined variable/import**: Add the missing import +- **Type mismatch**: Correct the type or add type annotations +- **Missing return type**: Add `-> ReturnType` to function signatures + ```python + def my_function() -> str: # Add return type + return "result" + ``` + +**Verify:** + +```bash +npm run check-python:pyright +``` + +## Configuration + +- **Ruff**: Line length 100, Python 3.9+, 40+ rule families (flake8, isort, pyupgrade, etc.) +- **Pyright**: Version 1.1.308 (or whatever is found in the environment), ignores `lib/` and 15+ legacy files +- Config: `python_files/pyproject.toml` sections `[tool.ruff]` and `[tool.pyright]` + +## Troubleshooting + +**"Module not found" in Pyright**: Install dependencies + +```bash +python -m pip install --upgrade -r build/test-requirements.txt +nox --session install_python_libs +``` + +**Import order errors**: Auto-fix with `ruff check . --fix` + +**Type errors in ignored files**: Legacy files in `pyproject.toml` ignore list—fix if working on them + +## When Writing Tests + +**Always format your test files before committing:** + +```bash +cd python_files +ruff format tests/ # Format all test files +# or format specific files: +ruff format tests/unittestadapter/test_utils.py +``` + +**Best practice workflow:** + +1. Write your test code +2. Run `ruff format` on the test files +3. Run the tests to verify they pass +4. Run `npm run check-python` to catch any remaining issues + +This ensures your tests pass both functional checks and quality checks in CI. + +## Learnings + +- Always run `npm run check-python` before pushing to catch CI failures early (1) +- Use `ruff check . --fix` to auto-fix most linting issues before manual review (1) +- Pyright version must match CI (1.1.308) to avoid inconsistent results between local and CI runs (1) +- Always run `ruff format` on test files after writing them to avoid formatting CI failures (1) diff --git a/.github/instructions/testing-workflow.instructions.md b/.github/instructions/testing-workflow.instructions.md new file mode 100644 index 000000000000..844946404328 --- /dev/null +++ b/.github/instructions/testing-workflow.instructions.md @@ -0,0 +1,581 @@ +--- +applyTo: '**/test/**' +--- + +# AI Testing Workflow Guide: Write, Run, and Fix Tests + +This guide provides comprehensive instructions for AI agents on the complete testing workflow: writing tests, running them, diagnosing failures, and fixing issues. Use this guide whenever working with test files or when users request testing tasks. + +## Complete Testing Workflow + +This guide covers the full testing lifecycle: + +1. **📝 Writing Tests** - Create comprehensive test suites +2. **▶️ Running Tests** - Execute tests using VS Code tools +3. **🔍 Diagnosing Issues** - Analyze failures and errors +4. **🛠️ Fixing Problems** - Resolve compilation and runtime issues +5. **✅ Validation** - Ensure coverage and resilience + +### When to Use This Guide + +**User Requests Testing:** + +- "Write tests for this function" +- "Run the tests" +- "Fix the failing tests" +- "Test this code" +- "Add test coverage" + +**File Context Triggers:** + +- Working in `**/test/**` directories +- Files ending in `.test.ts` or `.unit.test.ts` +- Test failures or compilation errors +- Coverage reports or test output analysis + +## Test Types + +When implementing tests as an AI agent, choose between two main types: + +### Unit Tests (`*.unit.test.ts`) + +- **Fast isolated testing** - Mock all external dependencies +- **Use for**: Pure functions, business logic, data transformations +- **Execute with**: `runTests` tool with specific file patterns +- **Mock everything** - VS Code APIs automatically mocked via `/src/test/unittests.ts` + +### Extension Tests (`*.test.ts`) + +- **Full VS Code integration** - Real environment with actual APIs +- **Use for**: Command registration, UI interactions, extension lifecycle +- **Execute with**: VS Code launch configurations or `runTests` tool +- **Slower but comprehensive** - Tests complete user workflows + +## 🤖 Agent Tool Usage for Test Execution + +### Primary Tool: `runTests` + +Use the `runTests` tool to execute tests programmatically rather than terminal commands for better integration and result parsing: + +```typescript +// Run specific test files +await runTests({ + files: ['/absolute/path/to/test.unit.test.ts'], + mode: 'run', +}); + +// Run tests with coverage +await runTests({ + files: ['/absolute/path/to/test.unit.test.ts'], + mode: 'coverage', + coverageFiles: ['/absolute/path/to/source.ts'], +}); + +// Run specific test names +await runTests({ + files: ['/absolute/path/to/test.unit.test.ts'], + testNames: ['should handle edge case', 'should validate input'], +}); +``` + +### Compilation Requirements + +Before running tests, ensure compilation. Always start compilation with `npm run watch-tests` before test execution to ensure TypeScript files are built. Recompile after making import/export changes before running tests, as stubs won't work if they're applied to old compiled JavaScript that doesn't have the updated imports: + +```typescript +// Start watch mode for auto-compilation +await run_in_terminal({ + command: 'npm run watch-tests', + isBackground: true, + explanation: 'Start test compilation in watch mode', +}); + +// Or compile manually +await run_in_terminal({ + command: 'npm run compile-tests', + isBackground: false, + explanation: 'Compile TypeScript test files', +}); +``` + +### Alternative: Terminal Execution + +For targeted test runs when `runTests` tool is unavailable. Note: When a targeted test run yields 0 tests, first verify the compiled JS exists under `out/test` (rootDir is `src`); absence almost always means the test file sits outside `src` or compilation hasn't run yet: + +```typescript +// Run specific test suite +await run_in_terminal({ + command: 'npm run unittest -- --grep "Suite Name"', + isBackground: false, + explanation: 'Run targeted unit tests', +}); +``` + +## 🔍 Diagnosing Test Failures + +### Common Failure Patterns + +**Compilation Errors:** + +```typescript +// Missing imports +if (error.includes('Cannot find module')) { + await addMissingImports(testFile); +} + +// Type mismatches +if (error.includes("Type '" && error.includes("' is not assignable"))) { + await fixTypeIssues(testFile); +} +``` + +**Runtime Errors:** + +```typescript +// Mock setup issues +if (error.includes('stub') || error.includes('mock')) { + await fixMockConfiguration(testFile); +} + +// Assertion failures +if (error.includes('AssertionError')) { + await analyzeAssertionFailure(error); +} +``` + +### Systematic Failure Analysis + +Fix test issues iteratively - run tests, analyze failures, apply fixes, repeat until passing. When unit tests fail with VS Code API errors like `TypeError: X is not a constructor` or `Cannot read properties of undefined (reading 'Y')`, check if VS Code APIs are properly mocked in `/src/test/unittests.ts` - add missing APIs following the existing pattern. + +```typescript +interface TestFailureAnalysis { + type: 'compilation' | 'runtime' | 'assertion' | 'timeout'; + message: string; + location: { file: string; line: number; col: number }; + suggestedFix: string; +} + +function analyzeFailure(failure: TestFailure): TestFailureAnalysis { + if (failure.message.includes('Cannot find module')) { + return { + type: 'compilation', + message: failure.message, + location: failure.location, + suggestedFix: 'Add missing import statement', + }; + } + // ... other failure patterns +} +``` + +### Agent Decision Logic for Test Type Selection + +**Choose Unit Tests (`*.unit.test.ts`) when analyzing:** + +- Functions with clear inputs/outputs and no VS Code API dependencies +- Data transformation, parsing, or utility functions +- Business logic that can be isolated with mocks +- Error handling scenarios with predictable inputs + +**Choose Extension Tests (`*.test.ts`) when analyzing:** + +- Functions that register VS Code commands or use `vscode.*` APIs +- UI components, tree views, or command palette interactions +- File system operations requiring workspace context +- Extension lifecycle events (activation, deactivation) + +**Agent Implementation Pattern:** + +```typescript +function determineTestType(functionCode: string): 'unit' | 'extension' { + if ( + functionCode.includes('vscode.') || + functionCode.includes('commands.register') || + functionCode.includes('window.') || + functionCode.includes('workspace.') + ) { + return 'extension'; + } + return 'unit'; +} +``` + +## 🎯 Step 1: Automated Function Analysis + +As an AI agent, analyze the target function systematically: + +### Code Analysis Checklist + +```typescript +interface FunctionAnalysis { + name: string; + inputs: string[]; // Parameter types and names + outputs: string; // Return type + dependencies: string[]; // External modules/APIs used + sideEffects: string[]; // Logging, file system, network calls + errorPaths: string[]; // Exception scenarios + testType: 'unit' | 'extension'; +} +``` + +### Analysis Implementation + +1. **Read function source** using `read_file` tool +2. **Identify imports** - look for `vscode.*`, `child_process`, `fs`, etc. +3. **Map data flow** - trace inputs through transformations to outputs +4. **Catalog dependencies** - external calls that need mocking +5. **Document side effects** - logging, file operations, state changes + +### Test Setup Differences + +#### Unit Test Setup (\*.unit.test.ts) + +```typescript +// Mock VS Code APIs - handled automatically by unittests.ts +import * as sinon from 'sinon'; +import * as workspaceApis from '../../common/workspace.apis'; // Wrapper functions + +// Stub wrapper functions, not VS Code APIs directly +// Always mock wrapper functions (e.g., workspaceApis.getConfiguration()) instead of +// VS Code APIs directly to avoid stubbing issues +const mockGetConfiguration = sinon.stub(workspaceApis, 'getConfiguration'); +``` + +#### Extension Test Setup (\*.test.ts) + +```typescript +// Use real VS Code APIs +import * as vscode from 'vscode'; + +// Real VS Code APIs available - no mocking needed +const config = vscode.workspace.getConfiguration('python'); +``` + +## 🎯 Step 2: Generate Test Coverage Matrix + +Based on function analysis, automatically generate comprehensive test scenarios: + +### Coverage Matrix Generation + +```typescript +interface TestScenario { + category: 'happy-path' | 'edge-case' | 'error-handling' | 'side-effects'; + description: string; + inputs: Record; + expectedOutput?: any; + expectedSideEffects?: string[]; + shouldThrow?: boolean; +} +``` + +### Automated Scenario Creation + +1. **Happy Path**: Normal execution with typical inputs +2. **Edge Cases**: Boundary conditions, empty/null inputs, unusual but valid data +3. **Error Scenarios**: Invalid inputs, dependency failures, exception paths +4. **Side Effects**: Verify logging calls, file operations, state changes + +### Agent Pattern for Scenario Generation + +```typescript +function generateTestScenarios(analysis: FunctionAnalysis): TestScenario[] { + const scenarios: TestScenario[] = []; + + // Generate happy path for each input combination + scenarios.push(...generateHappyPathScenarios(analysis)); + + // Generate edge cases for boundary conditions + scenarios.push(...generateEdgeCaseScenarios(analysis)); + + // Generate error scenarios for each dependency + scenarios.push(...generateErrorScenarios(analysis)); + + return scenarios; +} +``` + +## 🗺️ Step 3: Plan Your Test Coverage + +### Create a Test Coverage Matrix + +#### Main Flows + +- ✅ **Happy path scenarios** - normal expected usage +- ✅ **Alternative paths** - different configuration combinations +- ✅ **Integration scenarios** - multiple features working together + +#### Edge Cases + +- 🔸 **Boundary conditions** - empty inputs, missing data +- 🔸 **Error scenarios** - network failures, permission errors +- 🔸 **Data validation** - invalid inputs, type mismatches + +#### Real-World Scenarios + +- ✅ **Fresh install** - clean slate +- ✅ **Existing user** - migration scenarios +- ✅ **Power user** - complex configurations +- 🔸 **Error recovery** - graceful degradation + +### Example Test Plan Structure + +```markdown +## Test Categories + +### 1. Configuration Migration Tests + +- No legacy settings exist +- Legacy settings already migrated +- Fresh migration needed +- Partial migration required +- Migration failures + +### 2. Configuration Source Tests + +- Global search paths +- Workspace search paths +- Settings precedence +- Configuration errors + +### 3. Path Resolution Tests + +- Absolute vs relative paths +- Workspace folder resolution +- Path validation and filtering + +### 4. Integration Scenarios + +- Combined configurations +- Deduplication logic +- Error handling flows +``` + +## 🔧 Step 4: Set Up Your Test Infrastructure + +### Test File Structure + +```typescript +// 1. Imports - group logically +import assert from 'node:assert'; +import * as sinon from 'sinon'; +import { Uri } from 'vscode'; +import * as logging from '../../../common/logging'; +import * as pathUtils from '../../../common/utils/pathUtils'; +import * as workspaceApis from '../../../common/workspace.apis'; + +// 2. Function under test +import { getAllExtraSearchPaths } from '../../../managers/common/nativePythonFinder'; + +// 3. Mock interfaces +interface MockWorkspaceConfig { + get: sinon.SinonStub; + inspect: sinon.SinonStub; + update: sinon.SinonStub; +} +``` + +### Mock Setup Strategy + +Create minimal mock objects with only required methods and use TypeScript type assertions (e.g., `mockApi as PythonEnvironmentApi`) to satisfy interface requirements instead of implementing all interface methods when only specific methods are needed for the test. Simplify mock setup by only mocking methods actually used in tests and use `as unknown as Type` for TypeScript compatibility. + +```typescript +suite('Function Integration Tests', () => { + // 1. Declare all mocks + let mockGetConfiguration: sinon.SinonStub; + let mockGetWorkspaceFolders: sinon.SinonStub; + let mockTraceLog: sinon.SinonStub; + let mockTraceError: sinon.SinonStub; + let mockTraceWarn: sinon.SinonStub; + + // 2. Mock complex objects + let pythonConfig: MockWorkspaceConfig; + let envConfig: MockWorkspaceConfig; + + setup(() => { + // 3. Initialize all mocks + mockGetConfiguration = sinon.stub(workspaceApis, 'getConfiguration'); + mockGetWorkspaceFolders = sinon.stub(workspaceApis, 'getWorkspaceFolders'); + mockTraceLog = sinon.stub(logging, 'traceLog'); + mockTraceError = sinon.stub(logging, 'traceError'); + mockTraceWarn = sinon.stub(logging, 'traceWarn'); + + // 4. Set up default behaviors + mockGetWorkspaceFolders.returns(undefined); + + // 5. Create mock configuration objects + // When fixing mock environment creation, use null to truly omit + // properties rather than undefined + pythonConfig = { + get: sinon.stub(), + inspect: sinon.stub(), + update: sinon.stub(), + }; + + envConfig = { + get: sinon.stub(), + inspect: sinon.stub(), + update: sinon.stub(), + }; + }); + + teardown(() => { + sinon.restore(); // Always clean up! + }); +}); +``` + +## Step 4: Write Tests Using Mock → Run → Assert Pattern + +### The Three-Phase Pattern + +#### Phase 1: Mock (Set up the scenario) + +```typescript +test('Description of what this tests', async () => { + // Mock → Clear description of the scenario + pythonConfig.inspect.withArgs('venvPath').returns({ globalValue: '/path' }); + envConfig.inspect.withArgs('globalSearchPaths').returns({ globalValue: [] }); + mockGetWorkspaceFolders.returns([{ uri: Uri.file('/workspace') }]); +``` + +#### Phase 2: Run (Execute the function) + +```typescript +// Run +const result = await getAllExtraSearchPaths(); +``` + +#### Phase 3: Assert (Verify the behavior) + +```typescript + // Assert - Use set-based comparison for order-agnostic testing + const expected = new Set(['/expected', '/paths']); + const actual = new Set(result); + assert.strictEqual(actual.size, expected.size, 'Should have correct number of paths'); + assert.deepStrictEqual(actual, expected, 'Should contain exactly the expected paths'); + + // Verify side effects + // Use sinon.match() patterns for resilient assertions that don't break on minor output changes + assert(mockTraceLog.calledWith(sinon.match(/completion/i)), 'Should log completion'); +}); +``` + +## Step 6: Make Tests Resilient + +### Use Order-Agnostic Comparisons + +```typescript +// ❌ Brittle - depends on order +assert.deepStrictEqual(result, ['/path1', '/path2', '/path3']); + +// ✅ Resilient - order doesn't matter +const expected = new Set(['/path1', '/path2', '/path3']); +const actual = new Set(result); +assert.strictEqual(actual.size, expected.size, 'Should have correct number of paths'); +assert.deepStrictEqual(actual, expected, 'Should contain exactly the expected paths'); +``` + +### Use Flexible Error Message Testing + +```typescript +// ❌ Brittle - exact text matching +assert(mockTraceError.calledWith('Error during legacy python settings migration:')); + +// ✅ Resilient - pattern matching +assert(mockTraceError.calledWith(sinon.match.string, sinon.match.instanceOf(Error)), 'Should log migration error'); + +// ✅ Resilient - key terms with regex +assert(mockTraceError.calledWith(sinon.match(/migration.*error/i)), 'Should log migration error'); +``` + +### Handle Complex Mock Scenarios + +```typescript +// For functions that call the same mock multiple times +envConfig.inspect.withArgs('globalSearchPaths').returns({ globalValue: [] }); +envConfig.inspect + .withArgs('globalSearchPaths') + .onSecondCall() + .returns({ + globalValue: ['/migrated/paths'], + }); + +// Testing async functions with child processes: +// Call the function first to get a promise, then use setTimeout to emit mock events, +// then await the promise - this ensures proper timing of mock setup versus function execution + +// Cannot stub internal function calls within the same module after import - stub external +// dependencies instead (e.g., stub childProcessApis.spawnProcess rather than trying to stub +// helpers.isUvInstalled when testing helpers.shouldUseUv) because intra-module calls use +// direct references, not module exports +``` + +## 🧪 Step 7: Test Categories and Patterns + +### Configuration Tests + +- Test different setting combinations +- Test setting precedence (workspace > user > default) +- Test configuration errors and recovery +- Always use dynamic path construction with Node.js `path` module when testing functions that resolve paths against workspace folders to ensure cross-platform compatibility + +### Data Flow Tests + +- Test how data moves through the system +- Test transformations (path resolution, filtering) +- Test state changes (migrations, updates) + +### Error Handling Tests + +- Test graceful degradation +- Test error logging +- Test fallback behaviors + +### Integration Tests + +- Test multiple features together +- Test real-world scenarios +- Test edge case combinations + +## 📊 Step 8: Review and Refine + +### Test Quality Checklist + +- [ ] **Clear naming** - test names describe the scenario and expected outcome +- [ ] **Good coverage** - main flows, edge cases, error scenarios +- [ ] **Resilient assertions** - won't break due to minor changes +- [ ] **Readable structure** - follows Mock → Run → Assert pattern +- [ ] **Isolated tests** - each test is independent +- [ ] **Fast execution** - tests run quickly with proper mocking + +### Common Anti-Patterns to Avoid + +- ❌ Testing implementation details instead of behavior +- ❌ Brittle assertions that break on cosmetic changes +- ❌ Order-dependent tests that fail due to processing changes +- ❌ Tests that don't clean up mocks properly +- ❌ Overly complex test setup that's hard to understand + +## 🔄 Reviewing and Improving Existing Tests + +### Quick Review Process + +1. **Read test files** - Check structure and mock setup +2. **Run tests** - Establish baseline functionality +3. **Apply improvements** - Use patterns below. When reviewing existing tests, focus on behavior rather than implementation details in test names and assertions +4. **Verify** - Ensure tests still pass + +### Common Fixes + +- Over-complex mocks → Minimal mocks with only needed methods +- Brittle assertions → Behavior-focused with error messages +- Vague test names → Clear scenario descriptions (transform "should return X when Y" into "should [expected behavior] when [scenario context]") +- Missing structure → Mock → Run → Assert pattern +- Untestable Node.js APIs → Create proxy abstraction functions (use function overloads to preserve intelligent typing while making functions mockable) + +## 🧠 Agent Learnings + +- When mocking `testController.createTestItem()` in unit tests, use `typemoq.It.isAny()` for parameters when testing handler behavior (not ID/label generation logic), but consider using specific matchers (e.g., `It.is((id: string) => id.startsWith('_error_'))`) when the actual values being passed are important for correctness - this balances test precision with maintainability (2) +- Remove unused variables from test code immediately - leftover tracking variables like `validationCallCount` that aren't referenced indicate dead code that should be simplified (1) +- Use `Uri.file(path).fsPath` for both sides of path comparisons in tests to ensure cross-platform compatibility - Windows converts forward slashes to backslashes automatically (1) +- When tests fail with "Cannot stub non-existent property", the method likely moved to a different class during refactoring - find the class that owns the method and test that class directly instead of stubbing on the original class (1) diff --git a/.github/instructions/testing_feature_area.instructions.md b/.github/instructions/testing_feature_area.instructions.md new file mode 100644 index 000000000000..a4e11523d7c8 --- /dev/null +++ b/.github/instructions/testing_feature_area.instructions.md @@ -0,0 +1,263 @@ +--- +applyTo: 'src/client/testing/**' +--- + +# Testing feature area — Discovery, Run, Debug, and Results + +This document maps the testing support in the extension: discovery, execution (run), debugging, result reporting and how those pieces connect to the codebase. It's written for contributors and agents who need to navigate, modify, or extend test support (both `unittest` and `pytest`). + +## Overview + +- Purpose: expose Python tests in the VS Code Test Explorer (TestController), support discovery, run, debug, and surface rich results and outputs. +- Scope: provider-agnostic orchestration + provider-specific adapters, TestController mapping, IPC with Python-side scripts, debug launch integration, and configuration management. + +## High-level architecture + +- Controller / UI bridge: orchestrates TestController requests and routes them to workspace adapters. +- Workspace adapter: provider-agnostic coordinator that translates TestController requests to provider adapters and maps payloads back into TestItems/TestRuns. +- Provider adapters: implement discovery/run/debug for `unittest` and `pytest` by launching Python scripts and wiring named-pipe IPC. +- Result resolver: translates Python-side JSON/IPCPayloads into TestController updates (start/pass/fail/output/attachments). +- Debug launcher: prepares debug sessions and coordinates the debugger attach flow with the Python runner. + +## Key components (files and responsibilities) + +- Entrypoints + - `src/client/testing/testController/controller.ts` — `PythonTestController` (main orchestrator). + - `src/client/testing/serviceRegistry.ts` — DI/wiring for testing services. +- Workspace orchestration + - `src/client/testing/testController/workspaceTestAdapter.ts` — `WorkspaceTestAdapter` (provider-agnostic entry used by controller). +- **Project-based testing (multi-project workspaces)** + - `src/client/testing/testController/common/testProjectRegistry.ts` — `TestProjectRegistry` (manages project lifecycle, discovery, and nested project handling). + - `src/client/testing/testController/common/projectAdapter.ts` — `ProjectAdapter` interface (represents a single Python project with its own test infrastructure). + - `src/client/testing/testController/common/projectUtils.ts` — utilities for project ID generation, display names, and shared adapter creation. +- Provider adapters + - Unittest + - `src/client/testing/testController/unittest/testDiscoveryAdapter.ts` + - `src/client/testing/testController/unittest/testExecutionAdapter.ts` + - Pytest + - `src/client/testing/testController/pytest/pytestDiscoveryAdapter.ts` + - `src/client/testing/testController/pytest/pytestExecutionAdapter.ts` +- Result resolution and helpers + - `src/client/testing/testController/common/resultResolver.ts` — `PythonResultResolver` (maps payload -> TestController updates). + - `src/client/testing/testController/common/testItemUtilities.ts` — helpers for TestItem lifecycle. + - `src/client/testing/testController/common/types.ts` — `ITestDiscoveryAdapter`, `ITestExecutionAdapter`, `ITestResultResolver`, `ITestDebugLauncher`. + - `src/client/testing/testController/common/debugLauncher.ts` — debug session creation helper. + - `src/client/testing/testController/common/utils.ts` — named-pipe helpers and command builders (`startDiscoveryNamedPipe`, etc.). +- Configuration + - `src/client/testing/common/testConfigurationManager.ts` — per-workspace test settings. + - `src/client/testing/configurationFactory.ts` — configuration service factory. +- Utilities & glue + - `src/client/testing/utils.ts` — assorted helpers used by adapters. + - Python-side scripts: `python_files/unittestadapter/*`, `python_files/pytestadapter/*` — discovery/run code executed by adapters. + +## Python subprocess runners (what runs inside Python) + +The adapters in the extension don't implement test discovery/run logic themselves — they spawn a Python subprocess that runs small helper scripts located under `python_files/` and stream structured events back to the extension over the named-pipe IPC. This is a central part of the feature area; changes here usually require coordinated edits in both the TypeScript adapters and the Python scripts. + +- Unittest helpers (folder: `python_files/unittestadapter`) + + - `discovery.py` — performs `unittest` discovery and emits discovery payloads (test suites, cases, locations) on the IPC channel. + - `execution.py` / `django_test_runner.py` — run tests for `unittest` and, where applicable, Django test runners; emit run events (start, stdout/stderr, pass, fail, skip, teardown) and attachment info. + - `pvsc_utils.py`, `django_handler.py` — utility helpers used by the runners for environment handling and Django-specific wiring. + - The adapter TypeScript files (`testDiscoveryAdapter.ts`, `testExecutionAdapter.ts`) construct the command line, start a named-pipe listener, and spawn these Python scripts using the extension's ExecutionFactory (activated interpreter) so the scripts execute inside the user's selected environment. + +- Pytest helpers (folder: `python_files/vscode_pytest`) + + - `_common.py` — shared helpers for pytest runner scripts. + - `run_pytest_script.py` — the primary pytest runner used for discovery and execution; emits the same structured IPC payloads the extension expects (discovery events and run events). + - The `pytest` execution adapter (`pytestExecutionAdapter.ts`) and discovery adapter build the CLI to run `run_pytest_script.py`, start the pipe, and translate incoming payloads via `PythonResultResolver`. + +- IPC contract and expectations + + - Adapters rely on a stable JSON payload contract emitted by the Python scripts: identifiers for tests, event types (discovered, collected, started, passed, failed, skipped), timings, error traces, and optional attachments (logs, captured stdout/stderr, file links). + - The extension maps these payloads to `TestItem`/`TestRun` updates via `PythonResultResolver` (`src/client/testing/testController/common/resultResolver.ts`). If you change payload shape, update the resolver and tests concurrently. + +- How the subprocess is started + - Execution adapters use the extension's `ExecutionFactory` (preferred) to get an activated interpreter and then spawn a child process that runs the helper script. The adapter will set up environment variables and command-line args (including the pipe name / run-id) so the Python runner knows where to send events and how to behave (discovery vs run vs debug). + - For debug sessions a debug-specific entry argument/port is passed and `common/debugLauncher.ts` coordinates starting a VS Code debug session that will attach to the Python process. + +## Core functionality (what to change where) + +- Discovery + - Entry: `WorkspaceTestAdapter.discoverTests` → provider discovery adapter. Adapter starts a named-pipe listener, spawns the discovery script in an activated interpreter, forwards discovery events to `PythonResultResolver` which creates/updates TestItems. + - Files: `workspaceTestAdapter.ts`, `*DiscoveryAdapter.ts`, `resultResolver.ts`, `testItemUtilities.ts`. +- Run / Execution + - Entry: `WorkspaceTestAdapter.executeTests` → provider execution adapter. Adapter spawns runner in an activated env, runner streams run events to the pipe, `PythonResultResolver` updates a `TestRun` with start/pass/fail and attachments. + - Files: `workspaceTestAdapter.ts`, `*ExecutionAdapter.ts`, `resultResolver.ts`. +- Debugging + - Flow: debug request flows like a run but goes through `debugLauncher.ts` to create a VS Code debug session with prepared ports/pipes. The Python runner coordinates attach/continue with the debugger. + - Files: `*ExecutionAdapter.ts`, `common/debugLauncher.ts`, `common/types.ts`. +- Result reporting + - `resultResolver.ts` is the canonical place to change how JSON payloads map to TestController constructs (messages, durations, error traces, attachments). + +## Typical workflows (short) + +- Full discovery + + 1. `PythonTestController` triggers discovery -> `WorkspaceTestAdapter.discoverTests`. + 2. Provider discovery adapter starts pipe and launches Python discovery script. + 3. Discovery events -> `PythonResultResolver` -> TestController tree updated. + +- Run tests + + 1. Controller collects TestItems -> creates `TestRun`. + 2. `WorkspaceTestAdapter.executeTests` delegates to execution adapter which launches the runner. + 3. Runner events arrive via pipe -> `PythonResultResolver` updates `TestRun`. + 4. On process exit the run is finalized. + +- Debug a test + 1. Debug request flows to execution adapter. + 2. Adapter prepares ports and calls `debugLauncher` to start a VS Code debug session with the run ID. + 3. Runner coordinates with the debugger; `PythonResultResolver` still receives and applies run events. + +## Tests and examples to inspect + +- Unit/integration tests for adapters and orchestration under `src/test/` (examples): + - `src/test/testing/common/testingAdapter.test.ts` + - `src/test/testing/testController/workspaceTestAdapter.unit.test.ts` + - `src/test/testing/testController/unittest/testExecutionAdapter.unit.test.ts` + - Adapter tests demonstrate expected telemetry, debug-launch payloads and result resolution. + +## History & evolution (brief) + +- Migration to TestController API: the code organizes around VS Code TestController, mapping legacy adapter behaviour into TestItems/TestRuns. +- Named-pipe IPC: discovery/run use named-pipe IPC to stream events from Python runner scripts (`python_files/*`) which enables richer, incremental updates and debug coordination. +- Environment activation: adapters prefer the extension ExecutionFactory (activated interpreter) to run discovery and test scripts. + +## Pointers for contributors (practical) + +- To extend discovery output: update the Python discovery script in `python_files/*` and `resultResolver.ts` to parse new payload fields. +- To change run behaviour (args/env/timouts): update the provider execution adapter (`*ExecutionAdapter.ts`) and add/update tests under `src/test/`. +- To change debug flow: edit `common/debugLauncher.ts` and adapters' debug paths; update tests that assert launch argument shapes. + +## Django support (how it works) + +- The extension supports Django projects by delegating discovery and execution to Django-aware Python helpers under `python_files/unittestadapter`. + - `python_files/unittestadapter/django_handler.py` contains helpers that invoke `manage.py` for discovery or execute Django test runners inside the project context. + - `python_files/unittestadapter/django_test_runner.py` provides `CustomDiscoveryTestRunner` and `CustomExecutionTestRunner` which integrate with the extension by using the same IPC contract (they use `UnittestTestResult` and `send_post_request` to emit discovery/run payloads). +- How adapters pass Django configuration: + - Execution adapters set environment variables (e.g. `MANAGE_PY_PATH`) and modify `PYTHONPATH` so Django code and the custom test runner are importable inside the spawned subprocess. + - For discovery the adapter may run the discovery helper which calls `manage.py test` with a custom test runner that emits discovery payloads instead of executing tests. +- Practical notes for contributors: + - Changes to Django discovery/execution often require edits in both `django_test_runner.py`/`django_handler.py` and the TypeScript adapters (`testDiscoveryAdapter.ts` / `testExecutionAdapter.ts`). + - The Django test runner expects `TEST_RUN_PIPE` environment variable to be present to send IPC events (see `django_test_runner.py`). + +## Settings referenced by this feature area + +- The extension exposes several `python.testing.*` settings used by adapters and configuration code (declared in `package.json`): + - `python.testing.pytestEnabled`, `python.testing.unittestEnabled` — enable/disable frameworks. + - `python.testing.pytestPath`, `python.testing.pytestArgs`, `python.testing.unittestArgs` — command path and CLI arguments used when spawning helper scripts. + - `python.testing.cwd` — optional working directory used when running discovery/runs. + - `python.testing.autoTestDiscoverOnSaveEnabled`, `python.testing.autoTestDiscoverOnSavePattern` — control automatic discovery on save. + - `python.testing.debugPort` — default port used for debug runs. + - `python.testing.promptToConfigure` — whether to prompt users to configure tests when potential test folders are found. +- Where to look in the code: + - Settings are consumed by `src/client/testing/common/testConfigurationManager.ts`, `src/client/testing/configurationFactory.ts`, and adapters under `src/client/testing/testController/*` which read settings to build CLI args and env for subprocesses. + - The setting definitions and descriptions are in `package.json` and localized strings in `package.nls.json`. + +## Project-based testing (multi-project workspaces) + +Project-based testing enables multi-project workspace support where each Python project gets its own test tree root with its own Python environment. + +### Architecture + +- **TestProjectRegistry** (`testProjectRegistry.ts`): Central registry that: + + - Discovers Python projects via the Python Environments API + - Creates and manages `ProjectAdapter` instances per workspace + - Computes nested project relationships and configures ignore lists + - Falls back to "legacy" single-adapter mode when API unavailable + +- **ProjectAdapter** (`projectAdapter.ts`): Interface representing a single project with: + - Project identity (ID, name, URI from Python Environments API) + - Python environment with execution details + - Test framework adapters (discovery/execution) + - Nested project ignore paths (for parent projects) + +### How it works + +1. **Activation**: When the extension activates, `PythonTestController` checks if the Python Environments API is available. +2. **Project discovery**: `TestProjectRegistry.discoverAndRegisterProjects()` queries the API for all Python projects in each workspace. +3. **Nested handling**: `configureNestedProjectIgnores()` identifies child projects and adds their paths to parent projects' ignore lists. +4. **Test discovery**: For each project, the controller calls `project.discoveryAdapter.discoverTests()` with the project's URI. The adapter sets `PROJECT_ROOT_PATH` environment variable for the Python runner. +5. **Python side**: + - For pytest: `get_test_root_path()` in `vscode_pytest/__init__.py` returns `PROJECT_ROOT_PATH` (if set) or falls back to `cwd`. + - For unittest: `discovery.py` uses `PROJECT_ROOT_PATH` as `top_level_dir` and `project_root_path` to root the test tree at the project directory. +6. **Test tree**: Each project gets its own root node in the Test Explorer, with test IDs scoped by project ID using the `@@vsc@@` separator (defined in `projectUtils.ts`). + +### Nested project handling: pytest vs unittest + +**pytest** supports the `--ignore` flag to exclude paths during test collection. When nested projects are detected, parent projects automatically receive `--ignore` flags for child project paths. This ensures each test appears under exactly one project in the test tree. + +**unittest** does not support path exclusion during `discover()`. Therefore, tests in nested project directories may appear under multiple project roots (both the parent and the child project). This is **expected behavior** for unittest: + +- Each project discovers and displays all tests it finds within its directory structure +- There is no deduplication or collision detection +- Users may see the same test file under multiple project roots if their project structure has nesting + +This approach was chosen because: + +1. unittest's `TestLoader.discover()` has no built-in path exclusion mechanism +2. Implementing custom exclusion would add significant complexity with minimal benefit +3. The existing approach is transparent and predictable - each project shows what it finds + +### Empty projects and root nodes + +If a project discovers zero tests, its root node will still appear in the Test Explorer as an empty folder. This ensures consistent behavior and makes it clear which projects were discovered, even if they have no tests yet. + +### Logging prefix + +All project-based testing logs use the `[test-by-project]` prefix for easy filtering in the output channel. + +### Key files + +- Python side: + - `python_files/vscode_pytest/__init__.py` — `get_test_root_path()` function and `PROJECT_ROOT_PATH` environment variable for pytest. + - `python_files/unittestadapter/discovery.py` — `discover_tests()` with `project_root_path` parameter and `PROJECT_ROOT_PATH` handling for unittest discovery. + - `python_files/unittestadapter/execution.py` — `run_tests()` with `project_root_path` parameter and `PROJECT_ROOT_PATH` handling for unittest execution. +- TypeScript: `testProjectRegistry.ts`, `projectAdapter.ts`, `projectUtils.ts`, and the discovery/execution adapters. + +### Tests + +- `src/test/testing/testController/common/testProjectRegistry.unit.test.ts` — TestProjectRegistry tests +- `src/test/testing/testController/common/projectUtils.unit.test.ts` — Project utility function tests +- `python_files/tests/pytestadapter/test_discovery.py` — pytest PROJECT_ROOT_PATH tests (see `test_project_root_path_env_var()` and `test_symlink_with_project_root_path()`) +- `python_files/tests/unittestadapter/test_discovery.py` — unittest `project_root_path` / PROJECT_ROOT_PATH discovery tests +- `python_files/tests/unittestadapter/test_execution.py` — unittest `project_root_path` / PROJECT_ROOT_PATH execution tests +- `src/test/testing/testController/unittest/testDiscoveryAdapter.unit.test.ts` — unittest discovery adapter PROJECT_ROOT_PATH tests +- `src/test/testing/testController/unittest/testExecutionAdapter.unit.test.ts` — unittest execution adapter PROJECT_ROOT_PATH tests + +## Coverage support (how it works) + +- Coverage is supported by running the Python helper scripts with coverage enabled and then collecting a coverage payload from the runner. + - Pytest-side coverage logic lives in `python_files/vscode_pytest/__init__.py` (checks `COVERAGE_ENABLED`, imports `coverage`, computes per-file metrics and emits a `CoveragePayloadDict`). + - Unittest adapters enable coverage by setting environment variable(s) (e.g. `COVERAGE_ENABLED`) when launching the subprocess; adapters and `resultResolver.ts` handle the coverage profile kind (`TestRunProfileKind.Coverage`). +- Flow summary: + 1. User starts a Coverage run via Test Explorer (profile kind `Coverage`). + 2. Controller/adapters set `COVERAGE_ENABLED` (or equivalent) in the subprocess env and invoke the runner script. + 3. The Python runner collects coverage (using `coverage` or `pytest-cov`), builds a file-level coverage map, and sends a coverage payload back over the IPC. + 4. `PythonResultResolver` (`src/client/testing/testController/common/resultResolver.ts`) receives the coverage payload and stores `detailedCoverageMap` used by the TestController profile to show file-level coverage details. +- Tests that exercise coverage flows are under `src/test/testing/*` and `python_files/tests/*` (see `testingAdapter.test.ts` and adapter unit tests that assert `COVERAGE_ENABLED` is set appropriately). + +## Interaction with the VS Code API + +- TestController API + - The feature area is built on VS Code's TestController/TestItem/TestRun APIs (`vscode.tests.createTestController` / `tests.createTestController` in the code). The controller creates a `TestController` in `src/client/testing/testController/controller.ts` and synchronizes `TestItem` trees with discovery payloads. + - `PythonResultResolver` maps incoming JSON events to VS Code API calls: `testRun.appendOutput`, `testRun.passed/failed/skipped`, `testRun.end`, and `TestItem` updates (labels, locations, children). +- Debug API + - Debug runs use the Debug API to start an attach/launch session. The debug launcher implementation is in `src/client/testing/testController/common/debugLauncher.ts` which constructs a debug configuration and calls the VS Code debug API to start a session (e.g. `vscode.debug.startDebugging`). + - Debug adapter/resolver code in the extension's debugger modules may also be used when attaching to Django or test subprocesses. +- Commands and configuration + - The Test Controller wires commands that appear in the Test Explorer and editor context menus (see `package.json` contributes `commands`) and listens to configuration changes filtered by `python.testing` in `src/client/testing/main.ts`. +- The "Copy Test ID" command (`python.copyTestId`) can be accessed from both the Test Explorer context menu (`testing/item/context`) and the editor gutter icon context menu (`testing/item/gutter`). This command copies test identifiers to the clipboard in the appropriate format for the active test framework (pytest path format or unittest module.class.method format). +- Execution factory & activated environments + - Adapters use the extension `ExecutionFactory` to spawn subprocesses in an activated interpreter (so the user's venv/conda is used). This involves the extension's internal environment execution APIs and sometimes `envExt` helpers when the external environment extension is present. + +## Learnings + +- Never await `showErrorMessage()` calls in test execution adapters as it blocks the test UI thread and freezes the Test Explorer (1) +- VS Code test-related context menus are contributed to using both `testing/item/context` and `testing/item/gutter` menu locations in package.json for full coverage (1) + +``` + +``` diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index 16fbb5233be9..000000000000 --- a/.github/lock.yml +++ /dev/null @@ -1,2 +0,0 @@ -daysUntilLock: 7 -lockComment: false diff --git a/.github/prompts/extract-impl-instructions.prompt.md b/.github/prompts/extract-impl-instructions.prompt.md new file mode 100644 index 000000000000..c2fb08b443c7 --- /dev/null +++ b/.github/prompts/extract-impl-instructions.prompt.md @@ -0,0 +1,79 @@ +--- +mode: edit +--- + +Analyze the specified part of the VS Code Python Extension codebase to generate or update implementation instructions in `.github/instructions/.instructions.md`. + +## Task + +Create concise developer guidance focused on: + +### Implementation Essentials + +- **Core patterns**: How this component is typically implemented and extended +- **Key interfaces**: Essential classes, services, and APIs with usage examples +- **Integration points**: How this component interacts with other extension parts +- **Common tasks**: Typical development scenarios with step-by-step guidance + +### Content Structure + +````markdown +--- +description: 'Implementation guide for the part of the Python Extension' +--- + +# Implementation Guide + +## Overview + +Brief description of the component's purpose and role in VS Code Python Extension. + +## Key Concepts + +- Main abstractions and their responsibilities +- Important interfaces and base classes + +## Common Implementation Patterns + +### Pattern 1: [Specific Use Case] + +```typescript +// Code example showing typical implementation +``` +```` + +### Pattern 2: [Another Use Case] + +```typescript +// Another practical example +``` + +## Integration Points + +- How this component connects to other VS Code Python Extension systems +- Required services and dependencies +- Extension points and contribution models + +## Essential APIs + +- Key methods and interfaces developers need +- Common parameters and return types + +## Gotchas and Best Practices + +- Non-obvious behaviors to watch for +- Performance considerations +- Common mistakes to avoid + +``` + +## Guidelines +- **Be specific**: Use actual class names, method signatures, and file paths +- **Show examples**: Include working code snippets from the codebase +- **Target implementation**: Focus on how to build with/extend this component +- **Keep it actionable**: Every section should help developers accomplish tasks + +Source conventions from existing `.github/instructions/*.instructions.md`, `CONTRIBUTING.md`, and codebase patterns. + +If `.github/instructions/.instructions.md` exists, intelligently merge new insights with existing content. +``` diff --git a/.github/prompts/extract-usage-instructions.prompt.md b/.github/prompts/extract-usage-instructions.prompt.md new file mode 100644 index 000000000000..ea48f162a220 --- /dev/null +++ b/.github/prompts/extract-usage-instructions.prompt.md @@ -0,0 +1,30 @@ +--- +mode: edit +--- + +Analyze the user requested part of the codebase (use a suitable ) to generate or update `.github/instructions/.instructions.md` for guiding developers and AI coding agents. + +Focus on practical usage patterns and essential knowledge: + +- How to use, extend, or integrate with this code area +- Key architectural patterns and conventions specific to this area +- Common implementation patterns with code examples +- Integration points and typical interaction patterns with other components +- Essential gotchas and non-obvious behaviors + +Source existing conventions from `.github/instructions/*.instructions.md`, `CONTRIBUTING.md`, and `README.md`. + +Guidelines: + +- Write concise, actionable instructions using markdown structure +- Document discoverable patterns with concrete examples +- If `.github/instructions/.instructions.md` exists, merge intelligently +- Target developers who need to work with or extend this code area + +Update `.github/instructions/.instructions.md` with header: + +``` +--- +description: "How to work with the part of the codebase" +--- +``` diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 000000000000..0058580e92e0 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,19 @@ +changelog: + exclude: + labels: + - 'no-changelog' + authors: + - 'dependabot' + + categories: + - title: Enhancements + labels: + - 'feature-request' + + - title: Bug Fixes + labels: + - 'bug' + + - title: Code Health + labels: + - 'debt' diff --git a/.github/release_plan.md b/.github/release_plan.md index 25c6aafb4efa..091ed559825b 100644 --- a/.github/release_plan.md +++ b/.github/release_plan.md @@ -1,96 +1,138 @@ -# Prerequisites - -* Python 3.7 and higher -* run `python3 -m pip install --user -r news/requirements.txt` -* run `python3 -m pip install --user -r tpn/requirements.txt` - - -# Release candidate (Monday, XXX XX) - -- [ ] Announce the code freeze (not just to team but also to ptvsd and language server) -- [ ] Update master for the release - - [ ] Create a branch against `master` for a pull request - - [ ] Change the version in [`package.json`](https://github.com/Microsoft/vscode-python/blob/master/package.json) from a `-dev` suffix to `-rc` (🤖) - - [ ] Run `npm install` to make sure [`package-lock.json`](https://github.com/Microsoft/vscode-python/blob/master/package.json) is up-to-date (🤖) - - [ ] Update `requirements.txt` to point to latest release version of [ptvsd](https://github.com/microsoft/ptvsd). - - [ ] Update `languageServerVersion` in `package.json` to point to the latest version (???) of [the Language Server](https://github.com/Microsoft/python-language-server). - - [ ] Update [`CHANGELOG.md`](https://github.com/Microsoft/vscode-python/blob/master/CHANGELOG.md) (🤖) - - [ ] Run [`news`](https://github.com/Microsoft/vscode-python/tree/master/news) (typically `python news --final --update CHANGELOG.md | code-insiders -`) - - [ ] Copy over the "Thanks" section from the previous release - - [ ] Make sure the "Thanks" section is up-to-date (e.g. compare to versions in requirements.json) - - [ ] Touch up news entries (e.g. add missing periods) - - [ ] Check the Markdown rendering to make sure everything looks good - - [ ] Add any relevant news entries for ptvsd and the language server if they were updated - - [ ] Update [`ThirdPartyNotices-Distribution.txt`](https://github.com/Microsoft/vscode-python/blob/master/ThirdPartyNotices-Distribution.txt) by running [`tpn`](https://github.com/Microsoft/vscode-python/tree/master/tpn) (typically `python tpn --npm package-lock.json --npm-overrides package.datascience-ui.dependencies.json --config tpn/distribution.toml ThirdPartyNotices-Distribution.txt`) - * for each failure: - 1. go to the repo (from link on NPM page) and look for the license there - 1. copy the text from the failure into `tpn/distribution.toml` - 1. fill in the license found in the package's repo - * if there is no license in a package's repo then do one of the following: - + check the NPM metadata and fill in the corresponding license from the OSI site - + ask the package maintainer (e.g. via github) - + ask CELA - - [ ] Update [`ThirdPartyNotices-Repository.txt`](https://github.com/Microsoft/vscode-python/blob/master/ThirdPartyNotices-Repository.txt) as appropriate - - [ ] Create a pull request against `master` (🤖) - - [ ] Merge pull request into `master` -- [ ] Update the [`release` branch](https://github.com/microsoft/vscode-python/branches) - - [ ] Delete the `release` branch in the repo - - [ ] Create a new `release` branch from `master` - - (alternately, force-push the master branch to the GitHub "release" branch) - - [ ] (if necessary) Request that the branch be set anew as "protected" -- [ ] Update master post-release (🤖) - - [ ] Bump the version number to the next monthly ("YYYY.M.0-dev") release in the `master` branch - - [ ] `package.json` - - [ ] `package-lock.json` - - [ ] Create a pull request against `master` - - [ ] Merge pull request into `master` -- [ ] Announce the code freeze is over -- [ ] Update [Component Governance](https://dev.azure.com/ms/vscode-python/_componentGovernance) (Click on "microsoft/vscode-python" on that page) - - [ ] Provide details for any automatically detected npm dependencies - - [ ] Manually add any repository dependencies -- [ ] GDPR bookkeeping (@brettcannon) (🤖) -- [ ] Open appropriate [documentation issues](https://github.com/microsoft/vscode-docs/issues?q=is%3Aissue+is%3Aopen+label%3Apython) - + new features - + settings changes - + etc. (ask the team) -- [ ] Begin drafting a [blog](http://aka.ms/pythonblog) post -- [ ] Ask CTI to test the release candidate - - -# Final (Monday, XXX XX) - -## Preparation - -- [ ] Make sure the [appropriate pull requests](https://github.com/microsoft/vscode-docs/pulls) for the [documentation](https://code.visualstudio.com/docs/python/python-tutorial) -- including the [WOW](https://code.visualstudio.com/docs/languages/python) page -- are ready -- [ ] final updates to the `release` branch - - [ ] Create a branch against `release` for a pull request - - [ ] Update the version in [`package.json`](https://github.com/Microsoft/vscode-python/blob/master/package.json) (🤖) - - [ ] Run `npm install` to make sure [`package-lock.json`](https://github.com/Microsoft/vscode-python/blob/master/package.json) is up-to-date (the only update should be the version number if `package-lock.json` has been kept up-to-date) (🤖) - - [ ] Update [`CHANGELOG.md`](https://github.com/Microsoft/vscode-python/blob/master/CHANGELOG.md) (🤖) - - [ ] Update version and date for the release section - - [ ] Run [`news`](https://github.com/Microsoft/vscode-python/tree/master/news) and copy-and-paste new entries (typically `python news --final | code-insiders -`; quite possibly nothing new to add) - - [ ] Update [`ThirdPartyNotices-Distribution.txt`](https://github.com/Microsoft/vscode-python/blob/master/ThirdPartyNotices-Distribution.txt) by running [`tpn`](https://github.com/Microsoft/vscode-python/tree/master/tpn) (typically `python tpn --npm package-lock.json --npm-overrides package.datascience-ui.dependencies.json --config tpn/distribution.toml ThirdPartyNotices-Distribution.txt`; quite possible there will be no change) (🤖) - - [ ] Update [`ThirdPartyNotices-Repository.txt`](https://github.com/Microsoft/vscode-python/blob/master/ThirdPartyNotices-Repository.txt) manually if necessary - - [ ] Create pull request against `release` (🤖) - - [ ] Merge pull request into `release` -- [ ] Make sure component governance is happy - -## Release - -- [ ] Publish the release via Azure DevOps - - [ ] Make sure [CI](https://github.com/Microsoft/vscode-python/blob/master/CONTRIBUTING.md) is passing - - [ ] Make sure the "Upload" stage on the release page succeeded - - [ ] Make sure no extraneous files are being included in the `.vsix` file (make sure to check for hidden files) - - [ ] Deploy the "Publish" stage -- [ ] Publish [documentation changes](https://github.com/Microsoft/vscode-docs/pulls?q=is%3Apr+is%3Aopen+label%3Apython) -- [ ] Publish the [blog](http://aka.ms/pythonblog) post -- [ ] Determine if a hotfix is needed -- [ ] Merge `release` back into `master` (🤖) - -## Clean up after _this_ release -- [ ] Go through [`info needed` issues](https://github.com/Microsoft/vscode-python/issues?q=is%3Aopen+label%3A%22info+needed%22+-label%3A%22data+science%22+sort%3Aupdated-asc) and close any that have no activity for over a month (🤖) -- [ ] GDPR bookkeeping (🤖) +### General Notes +All dates should align with VS Code's [iteration](https://github.com/microsoft/vscode/labels/iteration-plan) and [endgame](https://github.com/microsoft/vscode/labels/endgame-plan) plans. + +Feature freeze is Monday @ 17:00 America/Vancouver, XXX XX. At that point, commits to `main` should only be in response to bugs found during endgame testing until the release candidate is ready. + +
+ Release Primary and Secondary Assignments for the 2025 Calendar Year + +| Month and version number | Primary | Secondary | +|------------|----------|-----------| +| January v2025.0.0 | Eleanor | Karthik | +| February v2025.2.0 | Anthony | Eleanor | +| March v2025.4.0 | Karthik | Anthony | +| April v2025.6.0 | Eleanor | Karthik | +| May v2025.8.0 | Anthony | Eleanor | +| June v2025.10.0 | Karthik | Anthony | +| July v2025.12.0 | Eleanor | Karthik | +| August v2025.14.0 | Anthony | Eleanor | +| September v2025.16.0 | Karthik | Anthony | +| October v2025.18.0 | Eleanor | Karthik | +| November v2025.20.0 | Anthony | Eleanor | +| December v2025.22.0 | Karthik | Anthony | + +
+ + +# Release candidate (Thursday, XXX XX) +NOTE: This Thursday occurs during TESTING week. Branching should be done during this week to freeze the release with only the correct changes. Any last minute fixes go in as candidates into the release branch and will require team approval. + +Other: +NOTE: Third Party Notices are automatically added by our build pipelines using https://tools.opensource.microsoft.com/notice. +NOTE: the number of this release is in the issue title and can be substituted in wherever you see [YYYY.minor]. + + +### Step 1: +##### Bump the version of `main` to be a release candidate (also updating third party notices, and package-lock.json).❄️ (steps with ❄️ will dictate this step happens while main is frozen 🥶) + +- [ ] checkout to `main` on your local machine and run `git fetch` to ensure your local is up to date with the remote repo. +- [ ] Create a new branch called **`bump-release-[YYYY.minor]`**. +- [ ] Update `pet`: + - [ ] Go to the [pet](https://github.com/microsoft/python-environment-tools) repo and check `main` and latest `release/*` branch. If there are new changes in `main` then create a branch called `release/YYYY.minor` (matching python extension release `major.minor`). + - [ ] Update `build\azure-pipeline.stable.yml` to point to the latest `release/YYYY.minor` for `python-environment-tools`. +- [ ] Change the version in `package.json` to the next **even** number. (🤖) +- [ ] Run `npm install` to make sure `package-lock.json` is up-to-date _(you should now see changes to the `package.json` and `package-lock.json` at this point which update the version number **only**)_. (🤖) +- [ ] Update `ThirdPartyNotices-Repository.txt` as appropriate. You can check by looking at the [commit history](https://github.com/microsoft/vscode-python/commits/main) and scrolling through to see if there's anything listed there which might have pulled in some code directly into the repository from somewhere else. If you are still unsure you can check with the team. +- [ ] Create a PR from your branch **`bump-release-[YYYY.minor]`** to `main`. Add the `"no change-log"` tag to the PR so it does not show up on the release notes before merging it. + +NOTE: this PR will fail the test in our internal release pipeline called `VS Code (pre-release)` because the version specified in `main` is (temporarily) an invalid pre-release version. This is expected as this will be resolved below. + + +### Step 2: Creating your release branch ❄️ +- [ ] Create a release branch by creating a new branch called **`release/YYYY.minor`** branch from `main`. This branch is now the candidate for our release which will be the base from which we will release. + +NOTE: If there are release branches that are two versions old you can delete them at this time. + +### Step 3 Create a draft GitHub release for the release notes (🤖) ❄️ + +- [ ] Create a new [GitHub release](https://github.com/microsoft/vscode-python/releases/new). +- [ ] Specify a new tag called `YYYY.minor.0`. +- [ ] Have the `target` for the github release be your release branch called **`release/YYYY.minor`**. +- [ ] Create the release notes by specifying the previous tag for the last stable release and click `Generate release notes`. Quickly check that it only contain notes from what is new in this release. +- [ ] Click `Save draft`. + +### Step 4: Return `main` to dev and unfreeze (❄️ ➡ 💧) +NOTE: The purpose of this step is ensuring that main always is on a dev version number for every night's 🌃 pre-release. Therefore it is imperative that you do this directly after the previous steps to reset the version in main to a dev version **before** a pre-release goes out. +- [ ] Create a branch called **`bump-dev-version-YYYY.[minor+1]`**. +- [ ] Bump the minor version number in the `package.json` to the next `YYYY.[minor+1]` which will be an odd number, and add `-dev`.(🤖) +- [ ] Run `npm install` to make sure `package-lock.json` is up-to-date _(you should now see changes to the `package.json` and `package-lock.json` only relating to the new version number)_ . (🤖) +- [ ] Create a PR from this branch against `main` and merge it. + +NOTE: this PR should make all CI relating to `main` be passing again (such as the failures stemming from step 1). + +### Step 5: Notifications and Checks on External Release Factors +- [ ] Check [Component Governance](https://dev.azure.com/monacotools/Monaco/_componentGovernance/192726?_a=alerts&typeId=11825783&alerts-view-option=active) to make sure there are no active alerts. +- [ ] Manually add/fix any 3rd-party licenses as appropriate based on what the internal build pipeline detects. +- [ ] Open appropriate [documentation issues](https://github.com/microsoft/vscode-docs/issues?q=is%3Aissue+is%3Aopen+label%3Apython). +- [ ] Contact the PM team to begin drafting a blog post. +- [ ] Announce to the development team that `main` is open again. + + +# Release (Wednesday, XXX XX) + +### Step 6: Take the release branch from a candidate to the finalized release +- [ ] Make sure the [appropriate pull requests](https://github.com/microsoft/vscode-docs/pulls) for the [documentation](https://code.visualstudio.com/docs/python/python-tutorial) -- including the [WOW](https://code.visualstudio.com/docs/languages/python) page -- are ready. +- [ ] Check to make sure any final updates to the **`release/YYYY.minor`** branch have been merged. + +### Step 7: Execute the Release +- [ ] Make sure CI is passing for **`release/YYYY.minor`** release branch (🤖). +- [ ] Run the [CD](https://dev.azure.com/monacotools/Monaco/_build?definitionId=299) pipeline on the **`release/YYYY.minor`** branch. + - [ ] Click `run pipeline`. + - [ ] for `branch/tag` select the release branch which is **`release/YYYY.minor`**. + - NOTE: Please opt to release the python extension close to when VS Code is released to align when release notes go out. When we bump the VS Code engine number, our extension will not go out to stable until the VS Code stable release but this only occurs when we bump the engine number. +- [ ] 🧍🧍 Get approval on the release on the [CD](https://dev.azure.com/monacotools/Monaco/_build?definitionId=299). +- [ ] Click "approve" in the publish step of [CD](https://dev.azure.com/monacotools/Monaco/_build?definitionId=299) to publish the release to the marketplace. 🎉 +- [ ] Take the Github release out of draft. +- [ ] Publish documentation changes. +- [ ] Contact the PM team to publish the blog post. +- [ ] Determine if a hotfix is needed. +- [ ] Merge the release branch **`release/YYYY.minor`** back into `main`. (This step is only required if changes were merged into the release branch. If the only change made on the release branch is the version, this is not necessary. Overall you need to ensure you DO NOT overwrite the version on the `main` branch.) + + +## Steps for Point Release (if necessary) +- [ ] checkout to `main` on your local machine and run `git fetch` to ensure your local is up to date with the remote repo. +- [ ] checkout to the `release/YYY.minor` and check to make sure all necessary changes for the point release have been cherry-picked into the release branch. If not, contact the owner of the changes to do so. +- [ ] Create a branch against **`release/YYYY.minor`** called **`release-[YYYY.minor.point]`**. +- [ ] Bump the point version number in the `package.json` to the next `YYYY.minor.point` +- [ ] Run `npm install` to make sure `package-lock.json` is up-to-date _(you should now see changes to the `package.json` and `package-lock.json` only relating to the new version number)_ . (🤖) +- [ ] If Point Release is due to an issue in `pet`. Update `build\azure-pipeline.stable.yml` to point to the branch `release/YYYY.minor` for `python-environment-tools` with the fix or decided by the team. +- [ ] Create a PR from this branch against `release/YYYY.minor` +- [ ] **Rebase** and merge this PR into the release branch +- [ ] Create a draft GitHub release for the release notes (🤖) ❄️ + - [ ] Create a new [GitHub release](https://github.com/microsoft/vscode-python/releases/new). + - [ ] Specify a new tag called `vYYYY.minor.point`. + - [ ] Have the `target` for the github release be your release branch called **`release/YYYY.minor`**. + - [ ] Create the release notes by specifying the previous tag as the previous version of stable, so the minor release **`vYYYY.minor`** for the last stable release and click `Generate release notes`. + - [ ] Check the generated notes to ensure that all PRs for the point release are included so users know these new changes. + - [ ] Click `Save draft`. +- [ ] Publish the point release + - [ ] Make sure CI is passing for **`release/YYYY.minor`** release branch (🤖). + - [ ] Run the [CD](https://dev.azure.com/monacotools/Monaco/_build?definitionId=299) pipeline on the **`release/YYYY.minor`** branch. + - [ ] Click `run pipeline`. + - [ ] for `branch/tag` select the release branch which is **`release/YYYY.minor`**. + - [ ] 🧍🧍 Get approval on the release on the [CD](https://dev.azure.com/monacotools/Monaco/_build?definitionId=299) and publish the release to the marketplace. 🎉 + - [ ] Take the Github release out of draft. + +## Steps for contributing to a point release +- [ ] Work with team to decide if point release is necessary +- [ ] Work with team or users to verify the fix is correct and solves the problem without creating any new ones +- [ ] Create PR/PRs and merge then each into main as usual +- [ ] Make sure to still mark if the change is "bug" or "no-changelog" +- [ ] Cherry-pick all PRs to the release branch and check that the changes are in before the package is bumped +- [ ] Notify the release champ that your changes are in so they can trigger a point-release + ## Prep for the _next_ release -- [ ] Create a new [release plan](https://raw.githubusercontent.com/microsoft/vscode-python/master/.github/release_plan.md) (🤖) -- [ ] [(Un-)pin](https://help.github.com/en/articles/pinning-an-issue-to-your-repository) [release plan issues](https://github.com/Microsoft/vscode-python/labels/release%20plan) (🤖) + +- [ ] Create a new [release plan](https://raw.githubusercontent.com/microsoft/vscode-python/main/.github/release_plan.md). (🤖) +- [ ] [(Un-)pin](https://help.github.com/en/articles/pinning-an-issue-to-your-repository) [release plan issues](https://github.com/Microsoft/vscode-python/labels/release-plan) (🤖) diff --git a/.github/test_plan.md b/.github/test_plan.md deleted file mode 100644 index fbe7ce98f45b..000000000000 --- a/.github/test_plan.md +++ /dev/null @@ -1,567 +0,0 @@ -# Test plan - -## Environment - -- OS: XXX (Windows, macOS, latest Ubuntu LTS) - - Shell: XXX (Command Prompt, PowerShell, bash, fish) -- Python - - Distribution: XXX (CPython, miniconda) - - Version: XXX (2.7, latest 3.x) -- VS Code: XXX (Insiders) - -## Tests - -**ALWAYS**: -- Check the `Output` window under `Python` for logged errors -- Have `Developer Tools` open to detect any errors -- Consider running the tests in a multi-folder workspace -- Focus on in-development features (i.e. experimental debugger and language server) - -
- Scenarios - -### [Environment](https://code.visualstudio.com/docs/python/environments) -#### Interpreters - -- [ ] Interpreter is [shown in the status bar](https://code.visualstudio.com/docs/python/environments#_choosing-an-environment) -- [ ] An interpreter can be manually specified using the [`Select Interpreter` command](https://code.visualstudio.com/docs/python/environments#_choosing-an-environment) -- [ ] Detected system-installed interpreters -- [ ] Detected an Anaconda installation -- [ ] (Linux/macOS) Detected all interpreters installed w/ [pyenv](https://github.com/pyenv/pyenv) detected -- [ ] [`"python.pythonPath"`](https://code.visualstudio.com/docs/python/environments#_manually-specifying-an-interpreter) triggers an update in the status bar -- [ ] `Run Python File in Terminal` -- [ ] `Run Selection/Line in Python Terminal` - - [ ] Right-click - - [ ] Command - - [ ] `Shift+Enter` - -#### Terminal -Sample file: -```python -import requests -request = requests.get("https://drive.google.com/uc?export=download&id=1_9On2-nsBQIw3JiY43sWbrF8EjrqrR4U") -with open("survey2017.zip", "wb") as file: - file.write(request.content) -import zipfile -with zipfile.ZipFile('survey2017.zip') as zip: - zip.extractall('survey2017') -import shutil, os -shutil.move('survey2017/survey_results_public.csv','survey2017.csv') -shutil.rmtree('survey2017') -os.remove('survey2017.zip') -``` -- [ ] *Shift+Enter* to send selected code in sample file to terminal works - -#### Virtual environments - -**ALWAYS**: -- Use the latest version of Anaconda -- Realize that `conda` is slow -- Create an environment with a space in their path somewhere as well as upper and lowercase characters -- Make sure that you do not have `python.pythonPath` specified in your `settings.json` when testing automatic detection -- Do note that the `Select Interpreter` drop-down window scrolls - -- [ ] Detected a single virtual environment at the top-level of the workspace folder on Mac when when `python` command points to default Mac Python installation or `python` command fails in the terminal. - - [ ] Appropriate suffix label specified in status bar (e.g. `(venv)`) -- [ ] Detected a single virtual environment at the top-level of the workspace folder on Windows when `python` fails in the terminal. - - [ ] Appropriate suffix label specified in status bar (e.g. `(venv)`) -- [ ] Detected a single virtual environment at the top-level of the workspace folder - - [ ] Appropriate suffix label specified in status bar (e.g. `(venv)`) - - [ ] [`Create Terminal`](https://code.visualstudio.com/docs/python/environments#_activating-an-environment-in-the-terminal) works - - [ ] Steals focus - - [ ] `"python.terminal.activateEnvironment": false` deactivates automatically running the activation script in the terminal - - [ ] After the language server downloads it is able to complete its analysis of the environment w/o requiring a restart -- [ ] Detect multiple virtual environments contained in the directory specified in `"python.venvPath"` -- [ ] Detected all [conda environments created with an interpreter](https://code.visualstudio.com/docs/python/environments#_conda-environments) - - [ ] Appropriate suffix label specified in status bar (e.g. `(condaenv)`) - - [ ] Prompted to install Pylint - - [ ] Asked whether to install using conda or pip - - [ ] Installs into environment - - [ ] [`Create Terminal`](https://code.visualstudio.com/docs/python/environments#_activating-an-environment-in-the-terminal) works - - [ ] `"python.terminal.activateEnvironment": false` deactivates automatically running the activation script in the terminal - - [ ] After the language server downloads it is able to complete its analysis of the environment w/o requiring a restart -- [ ] (Linux/macOS until [`-m` is supported](https://github.com/Microsoft/vscode-python/issues/978)) Detected the virtual environment created by [pipenv](https://docs.pipenv.org/) - - [ ] Appropriate suffix label specified in status bar (e.g. `(pipenv)`) - - [ ] Prompt to install Pylint uses `pipenv install --dev` - - [ ] [`Create Terminal`](https://code.visualstudio.com/docs/python/environments#_activating-an-environment-in-the-terminal) works - - [ ] `"python.terminal.activateEnvironment": false` deactivates automatically running the activation script in the terminal - - [ ] After the language server downloads it is able to complete its analysis of the environment w/o requiring a restart -- [ ] (Linux/macOS) Virtual environments created under `{workspaceFolder}/.direnv/python-{python_version}` are detected (for [direnv](https://direnv.net/) and its [`layout python3`](https://github.com/direnv/direnv/blob/master/stdlib.sh) support) - - [ ] Appropriate suffix label specified in status bar (e.g. `(venv)`) - -#### [Environment files](https://code.visualstudio.com/docs/python/environments#_environment-variable-definitions-file) -Sample files: -```python -# example.py -import os -print('Hello,', os.environ.get('WHO'), '!') -``` -``` -# .env -WHO=world -PYTHONPATH=some/path/somewhere -SPAM='hello ${WHO}' -```` - -**ALWAYS**: -- Make sure to use `Reload Window` between tests to reset your environment -- Note that environment files only apply under the debugger and Jedi - -- [ ] Environment variables in a `.env` file are exposed when running under the debugger -- [ ] `"python.envFile"` allows for specifying an environment file manually (e.g. Jedi picks up `PYTHONPATH` changes) -- [ ] `envFile` in a `launch.json` configuration works -- [ ] simple variable substitution works - -#### [Debugging](https://code.visualstudio.com/docs/python/environments#_python-interpreter-for-debugging) - -- [ ] `pythonPath` setting in your `launch.json` overrides your `python.pythonPath` default setting - -### [Linting](https://code.visualstudio.com/docs/python/linting) - -**ALWAYS**: -- Check under the `Problems` tab to see e.g. if a linter is raising errors - -#### Language server - -- [ ] LS is downloaded using HTTP (no SSL) when the "http.proxyStrictSSL" setting is false -- [ ] Installing [`requests`](https://pypi.org/project/requests/) in virtual environment is detected - - [ ] Import of `requests` without package installed is flagged as unresolved - - [ ] Create a virtual environment - - [ ] Install `requests` into the virtual environment - -#### Pylint/default linting -[Prompting to install Pylint is covered under `Environments` above] - -For testing the disablement of the default linting rules for Pylint: -```ini -# pylintrc -[MESSAGES CONTROL] -enable=bad-names -``` -```python3 -# example.py -foo = 42 # Marked as a blacklisted name. -``` -- [ ] Installation via the prompt installs Pylint as appropriate - - [ ] Uses `--user` for system-install of Python - - [ ] Installs into a virtual environment environment directly -- [ ] Pylint works -- [ ] `"python.linting.pylintUseMinimalCheckers": false` turns off the default rules w/ no `pylintrc` file present -- [ ] The existence of a `pylintrc` file turns off the default rules - -#### Other linters - -**Note**: -- You can use the `Run Linting` command to run a newly installed linter -- When the extension installs a new linter, it turns off all other linters - -- [ ] flake8 works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] mypy works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] pycodestyle works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] prospector works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] pydocstyle works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] pylama works - - [ ] `Select linter` lists the linter and installs it if necessary -- [ ] 3 or more linters work simultaneously (make sure you have turned on the linters in your `settings.json`) - - [ ] `Run Linting` runs all activated linters - - [ ] `"python.linting.enabled": false` disables all linters - - [ ] The `Enable Linting` command changes `"python.linting.enabled"` -- [ ] `"python.linting.lintOnSave` works - -### [Editing](https://code.visualstudio.com/docs/python/editing) - -#### [IntelliSense](https://code.visualstudio.com/docs/python/editing#_autocomplete-and-intellisense) - -Please also test for general accuracy on the most "interesting" code you can find. - -- [ ] `"python.autoComplete.extraPaths"` works -- [ ] `"python.autocomplete.addBrackets": true` causes auto-completion of functions to append `()` -- [ ] Auto-completions works - -#### [Formatting](https://code.visualstudio.com/docs/python/editing#_formatting) -Sample file: -```python -# There should be _some_ change after running `Format Document`. -import os,sys; -def foo():pass -``` - -- [ ] Prompted to install a formatter if none installed and `Format Document` is run - - [ ] Installing `autopep8` works - - [ ] Installing `black` works - - [ ] Installing `yapf` works -- [ ] Formatters work with default settings (i.e. `"python.formatting.provider"` is specified but not matching `*Path`or `*Args` settings) - - [ ] autopep8 - - [ ] black - - [ ] yapf -- [ ] Formatters work when appropriate `*Path` and `*Args` settings are specified (use absolute paths; use `~` if possible) - - [ ] autopep8 - - [ ] black - - [ ] yapf -- [ ] `"editor.formatOnType": true` works and has expected results - -#### [Refactoring](https://code.visualstudio.com/docs/python/editing#_refactoring) - -- [ ] [`Extract Variable`](https://code.visualstudio.com/docs/python/editing#_extract-variable) works - - [ ] You are prompted to install `rope` if it is not already available -- [ ] [`Extract method`](https://code.visualstudio.com/docs/python/editing#_extract-method) works - - [ ] You are prompted to install `rope` if it is not already available -- [ ] [`Sort Imports`](https://code.visualstudio.com/docs/python/editing#_sort-imports) works - -### [Debugging](https://code.visualstudio.com/docs/python/debugging) - -- [ ] [Configurations](https://code.visualstudio.com/docs/python/debugging#_debugging-specific-app-types) work (see [`package.json`](https://github.com/Microsoft/vscode-python/blob/master/package.json) and the `"configurationSnippets"` section for all of the possible configurations) -- [ ] Running code from start to finish w/ no special debugging options (e.g. no breakpoints) -- [ ] Breakpoint-like things - - [ ] Breakpoint - - [ ] Set - - [ ] Hit - - [ ] Conditional breakpoint - - [ ] Expression - - [ ] Set - - [ ] Hit - - [ ] Hit count - - [ ] Set - - [ ] Hit - - [ ] Logpoint - - [ ] Set - - [ ] Hit -- [ ] Stepping - - [ ] Over - - [ ] Into - - [ ] Out -- [ ] Can inspect variables - - [ ] Through hovering over variable in code - - [ ] `Variables` section of debugger sidebar -- [ ] [Remote debugging](https://code.visualstudio.com/docs/python/debugging#_remote-debugging) works - - [ ] ... over SSH - - [ ] ... on other branches -- [ ] [App Engine](https://code.visualstudio.com/docs/python/debugging#_google-app-engine-debugging) - -### [Unit testing](https://code.visualstudio.com/docs/python/unit-testing) - -#### [`unittest`](https://code.visualstudio.com/docs/python/unit-testing#_unittest-configuration-settings) -```python -import unittest - -MODULE_SETUP = False - - -def setUpModule(): - global MODULE_SETUP - MODULE_SETUP = True - - -class PassingSetupTests(unittest.TestCase): - CLASS_SETUP = False - METHOD_SETUP = False - - @classmethod - def setUpClass(cls): - cls.CLASS_SETUP = True - - def setUp(self): - self.METHOD_SETUP = True - - def test_setup(self): - self.assertTrue(MODULE_SETUP) - self.assertTrue(self.CLASS_SETUP) - self.assertTrue(self.METHOD_SETUP) - - -class PassingTests(unittest.TestCase): - - def test_passing(self): - self.assertEqual(42, 42) - - def test_passing_still(self): - self.assertEqual("silly walk", "silly walk") - - -class FailingTests(unittest.TestCase): - - def test_failure(self): - self.assertEqual(42, -13) - - def test_failure_still(self): - self.assertEqual("I'm right!", "no, I am!") -``` -- [ ] `Run All Unit Tests` triggers the prompt to configure the test runner -- [ ] Tests are discovered (as shown by code lenses on each test) - - [ ] Code lens for a class runs all tests for that class - - [ ] Code lens for a method runs just that test - - [ ] `Run Test` works - - [ ] `Debug Test` works - - [ ] Module/suite setup methods are also run (run the `test_setup` method to verify) -- [ ] while debugging tests, an uncaught exception in a test does not - cause ptvsd to raise SystemExit - -#### [`pytest`](https://code.visualstudio.com/docs/python/unit-testing#_pytest-configuration-settings) -```python -def test_passing(): - assert 42 == 42 - -def test_failure(): - assert 42 == -13 -``` - -- [ ] `Run All Unit Tests` triggers the prompt to configure the test runner - - [ ] `pytest` gets installed -- [ ] Tests are discovered (as shown by code lenses on each test) - - [ ] `Run Test` works - - [ ] `Debug Test` works -- [ ] A `Diagnostic` is shown in the problems pane for each failed/skipped test - - [ ] The `Diagnostic`s are organized according to the file the test was executed from (not necessarily the file it was defined in) - - [ ] The appropriate `DiagnosticRelatedInformation` is shown for each `Diagnostic` - - [ ] The `DiagnosticRelatedInformation` reflects the traceback for the test - -#### [`nose`](https://code.visualstudio.com/docs/python/unit-testing#_nose-configuration-settings) -```python -def test_passing(): - assert 42 == 42 - -def test_failure(): - assert 42 == -13 -``` - -- [ ] `Run All Unit Tests` triggers the prompt to configure the test runner - - [ ] Nose gets installed -- [ ] Tests are discovered (as shown by code lenses on each test) - - [ ] `Run Test` works - - [ ] `Debug Test` works - -#### General - -- [ ] Code lenses appears - - [ ] `Run Test` lens works (and status bar updates as appropriate) - - [ ] `Debug Test` lens works - - [ ] Appropriate ✔/❌ shown for each test -- [ ] Status bar is functioning - - [ ] Appropriate test results displayed - - [ ] `Run All Unit Tests` works - - [ ] `Discover Unit Tests` works (resets tests result display in status bar) - - [ ] `Run Unit Test Method ...` works - - [ ] `View Unit Test Output` works - - [ ] After having at least one failure, `Run Failed Tests` works -- [ ] `Configure Unit Tests` works - - [ ] quick pick for framework (and its settings) - - [ ] selected framework enabled in workspace settings - - [ ] framework's config added (and old config removed) - - [ ] other frameworks disabled in workspace settings -- [ ] `Configure Unit Tests` does not close if it loses focus -- [ ] Cancelling configuration does not leave incomplete settings -- [ ] The first `"request": "test"` entry in launch.json is used for running unit tests - -### [Data Science](https://code.visualstudio.com/docs/python/jupyter-support) -#### P0 Test Scenarios -- [ ] Start and connect to local Jupyter server - 1. Open the file src/test/datascience/manualTestFiles/manualTestFile.py in VSCode - 1. At the top of the file it will list the things that you need installed in your Python environment - 1. On the first cell click `Run Below` - 1. Interactive Window should open, show connection information, and execute cells - 1. The first thing in the window should have a line like this: `Jupyter Server URI: http://localhost:[port number]/?token=[token value]` -- [ ] Verify Basic Notebook Editor - 1. Create a new file in VS code with the extension .ipynb - 1. Open the file - 1. The Notebook Editor should open - 1. Verify that there is a single cell in the notebook editor - 1. Add `print('bar')` to that cell - 1. Run the cell - 1. Verify that `bar` shows up below the input - 1. Add a cell with the topmost hover bar - 1. Verify the cell appears above all others - 1. Add a cell at the bottom with the bottom most hover bar - 1. Verify the cell appears below all cells - 1. Select a cell - 1. Add a cell with the plus button on the cell - 1. Verify cell appears below - 1. Repeat with the topmost toolbar -- [ ] Verify basic outputs - 1. Run all the cells in manualTestFile.py - 1. Check to make sure that no outputs have errors - 1. Verify that graphs and progress bars are shown -- [ ] Verify export / import - 1. With the results from `Start and connect to local server` open click the `Export as Jupyter Notebook` button in the Interactive Window - 1. Choose a file location and save the generated .ipynb file - 1. When the prompt comes up in the lower right choose to open the file in the browser - 1. The file should open in the web browser and contain the output from the Interactive Window - 1. Try the same steps and choose to open the file in the ipynb editor. - 1. The file should open in the Notebook Editor. -- [ ] Verify text entry - 1. In the Interactive Window type in some new code `print('testing')` and submit it to the Interactive Windows - 1. Verify the output from what you added -- [ ] Verify dark and light main themes - 1. Repeat the `Start and connect to local server` and `Verify basic outputs` steps using `Default Dark+` and `Default Light+` themes -- [ ] Verify Variable Explorer - 1. After manualTestFile.py has been run drop down the Variables section at the top of the Interactive Window - 1. In the Variables list there should be an entry for all variables created. These variables might change as more is added to manualTestFile.py. - 1. Check that variables have expected values. They will be truncated for longer items - 1. Sort the list ascending and descending by Type. Also sort the list ascending and descending by Count. Values like (X, Y) use the first X value for Count sort ordering - 1. Check that list, Series, ndarray, and DataFrame types have a button to "Show variable in data viewer" on the right - 1. In the Interactive Window input box add a new variable. Verify that it is added into the Variable Explorer - 1. Export the contents of the interactive window as a notebook and open the notebook editor - 1. Find the first cell and click on the Run Below button - 1. Open the variable explorer and verify the same variables are there - 1. Add a new cell with a variable in it. - 1. Run the cell and verify the variable shows up in the variable explorer -- [ ] Verify Data Explorer - 1. From the listed types in the Variable explorer open up the Data Viewer by clicking the button or double clicking the row - 1. Inspect the data in the Data Viewer for the expected values - [ ] Verify Sorting and Filtering - 1. Open up the myDataFrame item - 1. Sort the name column ascending and descending - 1. Sort one of the numerical columns ascending and descending - 1. Click the Filter Rows button - 1. In the name filter box input 'a' to filter to just name with an a in them - 1. In one of the numerical columns input a number 1 - 9 to filter to just that column - 1. Open the myList variable in the explorer - 1. Make sure that you can scroll all the way to the end of the entries - [ ] Verify notebook outputs - 1. Open the src/test/datascience/manualTestFiles/manualTestFile.py in VSCode. - 1. Run all of the cells in the file. - 1. Interactive Window should open - 1. Export the cells in the interactive window and open the notebook editor - 1. Run all the cells in the notebook editor and verify the same outputs appear as in the interactive window -- [ ] Verify Notebook Editor Intellisense - 1. Open the src/test/datascience/manualTestFiles/manualTestFile.py in VSCode. - 1. Run all of the cells in the file. - 1. Interactive Window should open - 1. Export the cells in the interactive window and open the notebook editor - 1. Hover over each cell in the notebook editor and verify you get hover intellisense - 1. Add a new cell in between cells - 1. Add `import sys` and `sys.executable` to the cell - 1. Move the cell around and verify intellisense hover still works on the `import sys` - 1. Delete and readd the cell and verify intellisense hover still works. -- [ ] Verify Notebook Keyboard Shortcuts - 1. Using the notebook generated from the manualTestFile.py, do the following - 1. Select a cell by clicking on it - 1. Move selection up and down with j,k and arrow keys. - 1. Focus a cell by double clicking on it or hitting the enter key when selected - 1. Move selection through the code with the arrow keys. - 1. Verify selection travels between focused cells - 1. Hit escape when a cell has focus and verify it becomes selected instead of focused - 1. Hit `y` on a markdown cell when not focused and see that it becomes a code cell - 1. Hit `m` on a code cell when not focused and see that it becomes a markdown cell - 1. Hit `l` on a code cell and verify line numbers appear - 1. Hit `o` on a code cell with output and verify that outputs disappear - 1. Hit `d` + `d` and verify a cell is deleted. - 1. Hit `z` and verify a deleted cell reappears - 1. Hit `a` and verify the selected cell moves up - 1. Hit `b` and verify the selected cell moves down - 1. Hit `shift+enter` and verify a cell runs and selection moves to the next cell - 1. Hit `alt+enter` and verify a cell runs and a new cell is added below - 1. Hit `ctrl+enter` and verify a cell runs and selection does not change -- [ ] Verify debugging - 1. Open the file src/test/datascience/manualTestFiles/manualTestFile.py in VSCode - 1. On the first cell click `Run Below` - 1. Interactive Window should open, show connection information, and execute cells - 1. Go back to the first cell and click `Debug Cell` - 1. Debugger should start and have an ip indicator on the first line of the cell - 1. Step through the debugger. - 1. Verify the variables tab of the debugger shows variables. - 1. Verify the variables explorer window shows output not available while debugging - 1. When you get to the end of the cell, the debugger should stop - 1. Output from the cell should show up in the Interactive Window (sometimes you have to finish debugging the cell first) - -#### P1 Test Scenarios -- [ ] Connect to a `remote` server - 1. Open up a valid python command prompt that can run `jupyter notebook` (a default Anaconda prompt works well) - 1. Run `jupyter notebook` to start up a local Jupyter server - 1. In the command window that launched Jupyter look for the server / token name like so: http://localhost:8888/?token=bf9eae43641cd75015df9104f814b8763ef0e23ffc73720d - 1. Run the command `Python: Select Jupyter server URI` then `Type in the URI to connect to a running jupyter server` - 1. Input the server / token name here - 1. Now run the cells in the manualTestFile.py - 1. Verify that you see the server name in the initial connection message - 1. Verify the outputs of the cells -- [ ] Interactive Window commands - - [ ] Verify per-cell commands - 1. Expand and collapse the input area of a cell - 1. Use the `X` button to remove a cell - 1. Use the `Goto Code` button to jump to the part of the .py file that submitted the code - - [ ] Verify top menu commands - 1. Use `X` to delete all cells - 1. Undo the delete action with `Undo` - 1. Redo the delete action with `Redo` - 1. In manualTestFile.py modify the trange command in the progress bar from 100 to 2000. Run the Cell. As the cell is running hit the `Interrupt iPython Kernel` button - 1. The progress bar should be interrupted and you should see a KeyboardInterrupt error message in the output - 1. Test the `Restart iPython kernel` command. Kernel should be restarted and you should see a status output message for the kernel restart - 1. Use the expand all input and collapse all input commands to collapse all cell inputs -- [ ] Verify theming works - 1. Start Python Interactive window - 1. Add a cell with some comments - 1. Switch VS Code theme to something else - 1. Check that the cell you just added updates the comment color - 1. Switch back and forth between a 'light' and a 'dark' theme - 1. Check that the cell switches colors - 1. Check that the buttons on the top change to their appropriate 'light' or 'dark' versions - 1. Enable the 'ignoreVscodeTheme' setting - 1. Close the Python Interactive window and reopen it. The theme in just the 'Python Interactive' window should be light - 1. Switch to a dark theme. Make sure the interactive window remains in the light theme. -- [ ] Verify code lenses - 1. Check that `Run Cell` `Run Above` and `Run Below` all do the correct thing -- [ ] Verify context menu navigation commands - 1. Check the `Run Current Cell` and `Run Current Cell And Advance` context menu commands - 1. If run on the last cell of the file `Run Current Cell And Advance` should create a new empty cell and advance to it -- [ ] Verify command palette commands - 1. Close the Interactive Window then pick `Python: Show Interactive Window` - 1. Restart the kernel and pick `Python: Run Current File In Python Interactive Window` it should run the whole file again -- [ ] Verify shift-enter - 1. Move to the top cell in the .py file - 1. Shift-enter should run each cell and advance to the next - 1. Shift-enter on the final cell should create a new cell and move to it -- [ ] Verify file without cells - 1. Open the manualTestFileNoCells.py file - 1. Select a chunk of code, shift-enter should send it to the terminal - 1. Open VSCode settings, change `Send Selection To Interactive Window` to true - 1. Select a chunk of code, shift-enter should send that selection to the Interactive Windows - 1. Move your cursor to a line, but don't select anything. Shift-enter should send that line to the Interactive Window -- [ ] Multiple installs - 1. Close and re-open VSCode to make sure that all jupyter servers are closed - 1. Also make sure you are set to locally launch Jupyter and not to connect to an existing URI - 1. In addition to your main testing environment install a new python or miniconda install (conda won't work as it has Jupyter by default) - 1. In VS code change the python interpreter to the new install - 1. Try `Run Cell` - 1. You should get a message that Jupyter was not found and that it is defaulting back to launch on the python instance that has Jupyter -- [ ] LiveShare Support - 1. Install the LiveShare VSCode Extension - 1. Open manualTestFile.py in VSCode - 1. Run the first cell in the file - 1. Switch to the `Live Share` tab in VS Code and start a session - - [ ] Verify server start - 1. Jupyter server instance should appear in the live share tab - 1. Open another window of VSCode - 1. Connect the second instance of VSCode as a Guest to the first Live Share session - 1. After the workspace opens, open the manualTestFile.py on the Guest instance - 1. On the Guest instance run a cell from the file, both via the codelens and via the command palette `Run Cell` command - - [ ] Verify results - 1. Output should show up on the Guest Interactive Window - 1. Same output should show up in the Host Interactive Window - 1. On the Host instance run a cell from the file, both via the codelens and via the command palette - - [ ] Verify results - 1. Output should show up on the Guest Interactive Window - 1. Same output should show up in the Host Interactive Window - 1. Export the file to a notebook - 1. Open the notebook editor on the host - 1. Run a cell on the host - 1. Verify the editor opens on the guest and the cell is run there too - -#### P2 Test Scenarios -- [ ] Directory change - - [ ] Verify directory change in export - 1. Follow the previous steps for export, but export the ipynb to a directory outside of the current workspace - 1. Open the file in the browser, you should get an initial cell added to change directory back to your workspace directory - - [ ] Verify directory change in import - 1. Follow the previous steps for import, but import an ipynb that is located outside of your current workspace - 1. Open the file in the editor. There should be python code at the start to change directory to the previous location of the .ipynb file -- [ ] Interactive Window input history history - 1. Start up an Interactive Window session - 1. Input several lines into the Interactive Window terminal - 1. Press up to verify that those previously entered lines show in the Interactive Window terminal history -- [ ] Extra themes - 1. Try several of the themes that come with VSCode that are not the default Dark+ and Light+ -
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000000..09d019dec4a7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,449 @@ +name: Build + +on: + push: + branches: + - 'main' + - 'release' + - 'release/*' + - 'release-*' + +permissions: {} + +env: + NODE_VERSION: 22.21.1 + PYTHON_VERSION: '3.10' # YML treats 3.10 the number as 3.1, so quotes around 3.10 + # Force a path with spaces and to test extension works in these scenarios + # Unicode characters are causing 2.7 failures so skip that for now. + special-working-directory: './path with spaces' + special-working-directory-relative: 'path with spaces' + # Use the mocha-multi-reporters and send output to both console (spec) and JUnit (mocha-junit-reporter). + # Also enables a reporter which exits the process running the tests if it haven't already. + MOCHA_REPORTER_JUNIT: true + +jobs: + setup: + name: Set up + if: github.repository == 'microsoft/vscode-python' + runs-on: ubuntu-latest + defaults: + run: + shell: python + outputs: + vsix_basename: ${{ steps.vsix_names.outputs.vsix_basename }} + vsix_name: ${{ steps.vsix_names.outputs.vsix_name }} + vsix_artifact_name: ${{ steps.vsix_names.outputs.vsix_artifact_name }} + steps: + - name: VSIX names + id: vsix_names + run: | + import os + if os.environ["GITHUB_REF"].endswith("/main"): + vsix_type = "insiders" + else: + vsix_type = "release" + print(f"::set-output name=vsix_name::ms-python-{vsix_type}.vsix") + print(f"::set-output name=vsix_basename::ms-python-{vsix_type}") + print(f"::set-output name=vsix_artifact_name::ms-python-{vsix_type}-vsix") + + build-vsix: + name: Create VSIX + if: github.repository == 'microsoft/vscode-python' + needs: setup + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: windows-latest + target: x86_64-pc-windows-msvc + vsix-target: win32-x64 + - os: windows-latest + target: aarch64-pc-windows-msvc + vsix-target: win32-arm64 + - os: ubuntu-latest + target: x86_64-unknown-linux-musl + vsix-target: linux-x64 + # - os: ubuntu-latest + # target: aarch64-unknown-linux-gnu + # vsix-target: linux-arm64 + # - os: ubuntu-latest + # target: arm-unknown-linux-gnueabihf + # vsix-target: linux-armhf + # - os: macos-latest + # target: x86_64-apple-darwin + # vsix-target: darwin-x64 + # - os: macos-14 + # target: aarch64-apple-darwin + # vsix-target: darwin-arm64 + - os: ubuntu-latest + target: x86_64-unknown-linux-musl + vsix-target: alpine-x64 + # - os: ubuntu-latest + # target: aarch64-unknown-linux-musl + # vsix-target: alpine-arm64 + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: 'python-env-tools' + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Build VSIX + uses: ./.github/actions/build-vsix + with: + node_version: ${{ env.NODE_VERSION}} + vsix_name: ${{ needs.setup.outputs.vsix_basename }}-${{ matrix.vsix-target }}.vsix + artifact_name: ${{ needs.setup.outputs.vsix_artifact_name }}-${{ matrix.vsix-target }} + cargo_target: ${{ matrix.target }} + vsix_target: ${{ matrix.vsix-target }} + + lint: + name: Lint + if: github.repository == 'microsoft/vscode-python' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Lint + uses: ./.github/actions/lint + with: + node_version: ${{ env.NODE_VERSION }} + + check-types: + name: Check Python types + if: github.repository == 'microsoft/vscode-python' + runs-on: ubuntu-latest + steps: + - name: Use Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@v6 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Install core Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + options: '-t ./python_files/lib/python --no-cache-dir --implementation py' + + - name: Install Jedi requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + requirements-file: './python_files/jedilsp_requirements/requirements.txt' + options: '-t ./python_files/lib/jedilsp --no-cache-dir --implementation py' + + - name: Install other Python requirements + run: | + python -m pip install --upgrade -r build/test-requirements.txt + + - name: Run Pyright + uses: jakebailey/pyright-action@8ec14b5cfe41f26e5f41686a31eb6012758217ef # v3.0.2 + with: + version: 1.1.308 + working-directory: 'python_files' + + python-tests: + name: Python Tests + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ${{ env.special-working-directory }} + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case. + os: [ubuntu-latest, windows-latest] + # Run the tests on the oldest and most recent versions of Python. + python: ['3.10', '3.x', '3.13'] + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + path: ${{ env.special-working-directory-relative }} + persist-credentials: false + + - name: Use Python ${{ matrix.python }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + + - name: Install base Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + requirements-file: '"${{ env.special-working-directory-relative }}/requirements.txt"' + options: '-t "${{ env.special-working-directory-relative }}/python_files/lib/python" --no-cache-dir --implementation py' + + - name: Install test requirements + run: python -m pip install --upgrade -r build/test-requirements.txt + + - name: Run Python unit tests + run: python python_files/tests/run_all.py + + tests: + name: Tests + if: github.repository == 'microsoft/vscode-python' + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ${{ env.special-working-directory }} + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix + # entry to lower the number of runners used, macOS runners are expensive, + # and we assume that Ubuntu is enough to cover the UNIX case. + os: [ubuntu-latest, windows-latest] + python: ['3.x'] + test-suite: [ts-unit, venv, single-workspace, multi-workspace, debugger, functional] + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + path: ${{ env.special-working-directory-relative }} + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: ${{ env.special-working-directory-relative }}/python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Install Node + uses: actions/setup-node@v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + cache-dependency-path: ${{ env.special-working-directory-relative }}/package-lock.json + + - name: Install dependencies (npm ci) + run: npm ci + + - name: Compile + run: npx gulp prePublishNonBundle + + - name: Localization + run: npx @vscode/l10n-dev@latest export ./src + + - name: Install Python ${{ matrix.python }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + + - name: Upgrade Pip + run: python -m pip install -U pip + + # For faster/better builds of sdists. + - name: Install build pre-requisite + run: python -m pip install wheel nox + + - name: Install Python Extension dependencies (jedi, etc.) + run: nox --session install_python_libs + + - name: Install test requirements + run: python -m pip install --upgrade -r build/test-requirements.txt + + - name: Rust Tool Chain setup + uses: dtolnay/rust-toolchain@stable + + - name: Build Native Binaries + run: nox --session native_build + shell: bash + + - name: Install functional test requirements + run: python -m pip install --upgrade -r ./build/functional-test-requirements.txt + if: matrix.test-suite == 'functional' + + - name: Prepare pipenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install pipenv + python -m pipenv run python ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} pipenvPath + + - name: Prepare poetry for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install poetry + Move-Item -Path ".\build\ci\pyproject.toml" -Destination . + poetry env use python + + - name: Prepare virtualenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install virtualenv + python -m virtualenv .virtualenv/ + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".virtualenv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } else { + & ".virtualenv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } + + - name: Prepare venv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' && startsWith(matrix.python, 3.) + run: | + python -m venv .venv + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".venv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } else { + & ".venv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } + + - name: Prepare conda for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + # 1. For `*.testvirtualenvs.test.ts` + if ('${{ matrix.os }}' -match 'windows-latest') { + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python.exe + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath Scripts | Join-Path -ChildPath conda + } else{ + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath python + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath conda + } + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaExecPath $condaExecPath + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaPath + & $condaExecPath init --all + + - name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION + run: | + echo "CI_PYTHON_PATH=python" >> $GITHUB_ENV + echo "CI_DISABLE_AUTO_SELECTION=1" >> $GITHUB_ENV + shell: bash + if: matrix.test-suite != 'ts-unit' + + # Run TypeScript unit tests only for Python 3.X. + - name: Run TypeScript unit tests + run: npm run test:unittests + if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, '3.') + + # The virtual environment based tests use the `testSingleWorkspace` set of tests + # with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`, + # which is set in the "Prepare environment for venv tests" step. + # We also use a third-party GitHub Action to install xvfb on Linux, + # run tests and then clean up the process once the tests ran. + # See https://github.com/GabrielBB/xvfb-action + - name: Run venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'venv' && matrix.os == 'ubuntu-latest' + + - name: Run single-workspace tests + env: + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'single-workspace' + + - name: Run multi-workspace tests + env: + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testMultiWorkspace + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'multi-workspace' + + - name: Run debugger tests + env: + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testDebugger + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'debugger' + + # Run TypeScript functional tests + - name: Run TypeScript functional tests + run: npm run test:functional + if: matrix.test-suite == 'functional' + + smoke-tests: + name: Smoke tests + if: github.repository == 'microsoft/vscode-python' + runs-on: ${{ matrix.os }} + needs: [setup, build-vsix] + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. + include: + - os: windows-latest + vsix-target: win32-x64 + - os: ubuntu-latest + vsix-target: linux-x64 + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: ${{ env.special-working-directory-relative }}/python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Smoke tests + uses: ./.github/actions/smoke-tests + with: + node_version: ${{ env.NODE_VERSION }} + artifact_name: ${{ needs.setup.outputs.vsix_artifact_name }}-${{ matrix.vsix-target }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 51fe9debb8b0..000000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,491 +0,0 @@ -name: CI - -on: - push: - branches: - # Run the CI workflow only on master for microsoft/vscode-python for now. - - master - -env: - PYTHON_VERSION: 3.8 - CACHE_NPM_DEPS: cache-npm - CACHE_OUT_DIRECTORY: cache-out-directory - CACHE_PIP_DEPS: cache-pip - # Key for the cache created at the end of the the 'Cache ./pythonFiles/lib/python' step. - CACHE_PYTHONFILES: cache-pvsc-pythonFiles - ARTIFACT_NAME_VSIX: ms-python-insiders-vsix - COVERAGE_REPORTS: tests-coverage-reports - TEST_RESULTS_DIRECTORY: . - LKG_TAG: ci-lkg - -jobs: - ### Initialization: retrieve, install and cache dependencies - python-deps: - name: Install Python Requirements - runs-on: ubuntu-latest - if: github.repository == 'microsoft/vscode-python' - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Use Python ${{env.PYTHON_VERSION}} - uses: actions/setup-python@v1 - with: - python-version: ${{env.PYTHON_VERSION}} - - - name: Upgrade pip - run: python -m pip install -U pip - - - name: Install Python requirements - run: | - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/old_ptvsd --no-cache-dir --implementation py --no-deps --upgrade 'ptvsd==4.3.2' - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/new_ptvsd/no_wheels --no-cache-dir --implementation py --no-deps --upgrade --pre ptvsd - - - name: Install ptvsd wheels - run: | - python -m pip --disable-pip-version-check install -r build/debugger-install-requirements.txt - python ./pythonFiles/install_ptvsd.py - - # Retrieve the list of ptvsd versions from PyPI in order to increase the specificity of the pip cache key, - # so that the cache gets invalidated as necessary. - # See https://github.com/microsoft/vscode-python/pull/9843#discussion_r373635221 - - name: curl PyPI to get ptvsd versions - run: curl --output ptvsd.json https://pypi.org/pypi/ptvsd/json - - - name: Cache pip files - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{runner.os}}-${{env.CACHE_PIP_DEPS}}-pip-${{env.PYTHON_VERSION}}-${{hashFiles('requirements.txt')}}-${{hashFiles('build/debugger-install-requirements.txt')}}-${{hashFiles('ptvsd.json')}} - - - name: Cache ./pythonFiles/lib/python - uses: actions/cache@v1 - with: - path: ./pythonFiles/lib/python - key: ${{runner.os}}-${{env.CACHE_PYTHONFILES}}-pythonFiles-${{env.PYTHON_VERSION}}-${{hashFiles('requirements.txt')}}-${{hashFiles('build/debugger-install-requirements.txt')}}-${{hashFiles('ptvsd.json')}} - - js-ts-deps: - name: Install npm dependencies - runs-on: ubuntu-latest - if: github.repository == 'microsoft/vscode-python' - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Install dependencies (npm ci) - run: npm ci --prefer-offline - - - name: Cache npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - ### Hygiene + VSIX upload - compile-hygiene: - name: Compile, lint, check for errors - runs-on: ubuntu-latest - if: github.repository == 'microsoft/vscode-python' - needs: [js-ts-deps, python-deps] - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Retrieve cached npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - - name: Install dependencies (npm ci) - run: npm ci --prefer-offline - - - name: Run gulp prePublishNonBundle - run: npx gulp prePublishNonBundle - - - name: Cache the out/ directory - uses: actions/cache@v1 - with: - path: ./out - key: ${{runner.os}}-${{env.CACHE_OUT_DIRECTORY}}-${{hashFiles('src/**')}} - - - name: Check dependencies - run: npm run checkDependencies - - - name: Run linting on TypeScript code - run: npx tslint --project tsconfig.json - - - name: Run prettier on TypeScript code - run: npx prettier 'src/**/*.ts*' --check - - - name: Run prettier on JavaScript code - run: npx prettier 'build/**/*.js' --check - - - name: Use Python ${{env.PYTHON_VERSION}} - uses: actions/setup-python@v1 - with: - python-version: ${{env.PYTHON_VERSION}} - - - name: Run Black on Python code - run: | - python -m pip install -U black - python -m black . --check - working-directory: pythonFiles - - build-vsix: - name: Build VSIX - runs-on: ubuntu-latest - if: github.repository == 'microsoft/vscode-python' - needs: [python-deps, js-ts-deps] - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Retrieve cached npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - - name: curl PyPI to get ptvsd versions - run: curl --output ptvsd.json https://pypi.org/pypi/ptvsd/json - - - name: Retrieve cached pythonFiles/ directory - uses: actions/cache@v1 - with: - path: ./pythonFiles/lib/python - key: ${{runner.os}}-${{env.CACHE_PYTHONFILES}}-pythonFiles-${{env.PYTHON_VERSION}}-${{hashFiles('requirements.txt')}}-${{hashFiles('build/debugger-install-requirements.txt')}}-${{hashFiles('ptvsd.json')}} - - - name: Install dependencies (npm ci) - run: npm ci --prefer-offline - - - name: Clean directory - run: npm run clean - - # Use the GITHUB_RUN_ID environment variable to update the build number. - # GITHUB_RUN_ID is a unique number for each run within a repository. - # This number does not change if you re-run the workflow run. - - name: Update build number - run: npm run updateBuildNumber -- --buildNumber $GITHUB_RUN_ID - - - name: Package the VSIX - run: npm run package - - - uses: actions/upload-artifact@v1 - with: - name: ${{env.ARTIFACT_NAME_VSIX}} - path: ms-python-insiders.vsix - - ### Non-smoke tests - tests: - name: Tests - # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. - runs-on: ${{ matrix.os }} - if: github.repository == 'microsoft/vscode-python' - needs: [python-deps, js-ts-deps] - strategy: - matrix: - # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, - # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. - os: [ubuntu-latest, windows-latest] - # Run the tests on the oldest and most recent versions of Python. - python: [2.7, 3.8] - test-suite: [ts-unit, python-unit, venv, single-workspace, multi-workspace, debugger, functional] - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Retrieve cached npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - - name: Install dependencies (npm ci) - run: npm ci - - - name: Retrieve cached compile output directory - # Use an id for this step so that its cache-hit output can be accessed and checked in the next step. - id: out-cache - uses: actions/cache@v1 - with: - path: ./out - key: ${{runner.os}}-${{env.CACHE_OUT_DIRECTORY}}-${{hashFiles('src/**')}} - - - name: Compile if not cached - run: npx gulp prePublishNonBundle - if: steps.out-cache.outputs.cache-hit == false - - - name: Use Python ${{matrix.python}} - uses: actions/setup-python@v1 - with: - python-version: ${{matrix.python}} - - - name: curl PyPI to get ptvsd versions - run: curl --output ptvsd.json https://pypi.org/pypi/ptvsd/json - - - name: Retrieve cached pythonFiles/ directory - uses: actions/cache@v1 - # Use an id for this step so that its cache-hit output can be accessed and checked in the next step. - id: pythonFiles-cache - with: - path: ./pythonFiles/lib/python - key: ${{runner.os}}-${{env.CACHE_PYTHONFILES}}-pythonFiles-${{env.PYTHON_VERSION}}-${{hashFiles('requirements.txt')}}-${{hashFiles('build/debugger-install-requirements.txt')}}-${{hashFiles('ptvsd.json')}} - - - name: Install Python requirements if not cached - run: | - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/old_ptvsd --no-cache-dir --implementation py --no-deps --upgrade 'ptvsd==4.3.2' - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/new_ptvsd/no_wheels --no-cache-dir --implementation py --no-deps --upgrade --pre ptvsd - if: steps.pythonFiles-cache.outputs.cache-hit == false - - - name: Install ptvsd wheels if not cached - run: | - python -m pip --disable-pip-version-check install -r build/debugger-install-requirements.txt - python ./pythonFiles/install_ptvsd.py - if: steps.pythonFiles-cache.outputs.cache-hit == false - - - name: Install test requirements - run: python -m pip install --upgrade -r build/test-requirements.txt - - - name: Install IPython test requirements - run: | - python -m pip install numpy - python -m pip install --upgrade -r ./build/ipython-test-requirements.txt - if: matrix.test-suite == 'python-unit' - - - name: Install functional test requirements - run: | - python -m pip install numpy - python -m pip install --upgrade -r ./build/functional-test-requirements.txt - if: matrix.test-suite == 'functional' - - - name: Prepare environment for venv tests - env: - TEST_FILES_SUFFIX: testvirtualenvs - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - run: | - # venv/bin or venv\\Scripts (windows)? - $environmentExecutableFolder = 'bin' - if ('${{runner.os}}' -match 'windows-latest') { - $environmentExecutableFolder = 'Scripts' - } - - # pipenv - python -m pip install pipenv - python -m pipenv run python build/ci/addEnvPath.py ${{env.PYTHON_VIRTUAL_ENVS_LOCATION}} pipenvPath - - # venv - if ('${{matrix.python}}' -like '3.?') { - python -m venv .venv - & ".venv/$environmentExecutableFolder/python" ./build/ci/addEnvPath.py ${{env.PYTHON_VIRTUAL_ENVS_LOCATION}} venvPath - } - - # virtualenv - python -m pip install virtualenv - python -m virtualenv .virtualenv - & ".virtualenv/$environmentExecutableFolder/python" ./build/ci/addEnvPath.py ${{env.PYTHON_VIRTUAL_ENVS_LOCATION}} virtualEnvPath - - # conda - - # 1. For `terminalActivation.testvirtualenvs.test.ts` - - $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath $environmentExecutableFolder | Join-Path -ChildPath conda - if ('${{runner.os}}' -match 'windows-latest') { - $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python - } else{ - $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath $environmentExecutableFolder | Join-Path -ChildPath python - & $condaPythonPath ./build/ci/addEnvPath.py ${{env.PYTHON_VIRTUAL_ENVS_LOCATION}} condaExecPath $condaExecPath - } - & $condaPythonPath ./build/ci/addEnvPath.py ${{env.PYTHON_VIRTUAL_ENVS_LOCATION}} condaPath - - # 2. For `interpreterLocatorService.testvirtualenvs.ts` - - & $condaExecPath create -n "test_env1" -y python - & $condaExecPath create -p "./test_env2" -y python - & $condaExecPath create -p "$Env:HOME/test_env3" -y python - shell: pwsh - if: matrix.test-suite == 'venv' - - # Run TypeScript unit tests only for Python 3.X. - - name: Run TypeScript unit tests - run: npm run test:unittests:cover - if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, 3.) - - # Upload unit test coverage reports for later use in the "reports" job. - - name: Upload unit test coverage reports - uses: actions/upload-artifact@v1 - with: - name: ${{runner.os}}-${{env.COVERAGE_REPORTS}} - path: .nyc_output - if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, 3.) - - # Run the Python and IPython tests in our codebase. - - name: Run Python and IPython unit tests - run: | - python pythonFiles/tests/run_all.py - python -m IPython pythonFiles/tests/run_all.py - if: matrix.test-suite == 'python-unit' - - # The virtual environment based tests use the `testSingleWorkspace` set of tests - # with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`, - # which is set in the "Prepare environment for venv tests" step. - # We also use a third-party GitHub Action to install xvfb on Linux, - # run tests and then clean up the process once the tests ran. - # See https://github.com/GabrielBB/xvfb-action - - name: Run venv tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run testSingleWorkspace - if: matrix.test-suite == 'venv' - - - name: Run single-workspace tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run testSingleWorkspace - if: matrix.test-suite == 'single-workspace' - - - name: Run multi-workspace tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run testMultiWorkspace - if: matrix.test-suite == 'multi-workspace' - - - name: Run debugger tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run testDebugger - if: matrix.test-suite == 'debugger' - - - name: Run functional tests - run: npm run test:functional - if: matrix.test-suite == 'functional' - - smoke-tests: - name: Smoke tests - # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. - runs-on: ${{ matrix.os }} - needs: [build-vsix] - if: github.repository == 'microsoft/vscode-python' - strategy: - matrix: - # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, - # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. - os: [ubuntu-latest, windows-latest] - python: [3.8] - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Retrieve cached npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - - name: Install dependencies (npm ci) - run: npm ci --prefer-offline - - - name: Download VSIX - uses: actions/download-artifact@v1 - with: - name: ${{env.ARTIFACT_NAME_VSIX}} - - # Extract the artifact from its download folder (./${{env.ARTIFACT_NAME_VSIX}}) to the repo root, - # then delete the download folder and compile the source code. - - name: Prepare for smoke tests - run: | - mv ${{env.ARTIFACT_NAME_VSIX}}/* . - rm -r ${{env.ARTIFACT_NAME_VSIX}} - npx tsc -p ./ - shell: bash - - - name: Run smoke tests - env: - DISPLAY: 10 - uses: GabrielBB/xvfb-action@v1.0 - with: - run: node ./out/test/smokeTest.js - - coverage: - name: Coverage reports upload - runs-on: ubuntu-latest - if: github.repository == 'microsoft/vscode-python' - needs: [tests, smoke-tests] - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Retrieve cached npm files - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - - - name: Install dependencies (npm ci) - run: npm ci --prefer-offline - - # It isn't possible to specify a regex for artifact names, so we have to download each artifact manually. - # The name pattern is ${{runner.os}}-${{env.COVERAGE_REPORTS}}, and possible values for runner.os are `Linux`, `Windows`, or `macOS`. - # See https://help.github.com/en/actions/reference/contexts-and-expression-syntax-for-github-actions#runner-context - - name: Download Ubuntu test coverage artifacts - uses: actions/download-artifact@v1 - with: - name: Linux-${{env.COVERAGE_REPORTS}} - - - name: Extract Ubuntu coverage artifacts to ./nyc_output - run: | - mkdir .nyc_output - mv Linux-${{env.COVERAGE_REPORTS}}/* .nyc_output - rm -r Linux-${{env.COVERAGE_REPORTS}} - - - name: Generate coverage reports - run: npm run test:cover:report - continue-on-error: true - - - name: Upload coverage to codecov - uses: codecov/codecov-action@v1 - with: - CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} - file: ./coverage/cobertura-coverage.xml - - lkg-tag: - # LKG = last known good - name: Tag successful build as LKG - runs-on: ubuntu-latest - needs: [tests, smoke-tests] - if: github.repository == 'microsoft/vscode-python' - steps: - - name: Delete existing tag - run: | - curl -s -X DELETE https://api.github.com/repos/microsoft/vscode-python/git/refs/tags/${{env.LKG_TAG}} \ - -H "Authorization: token ${{secrets.GITHUB_TOKEN}}" - - # We need 2 calls when creating an annotated tag: first create the tag object, then the tag reference. - # If we only wanted a lightweight tag we would only need to create a tag reference. - # See https://developer.github.com/v3/git/tags/#create-a-tag-object - - name: Create a tag object - # Curl syntax explanation: https://stackoverflow.com/a/36778045 - run: | - curl -s -X POST "https://api.github.com/repos/microsoft/vscode-python/git/tags" \ - -H "Authorization: token ${{secrets.GITHUB_TOKEN}}" \ - -d @- << EOF - { - "tag": "${{env.LKG_TAG}}", - "message": "Last known good build of vscode-python via the GitHub Action CI workflow", - "object": "${{github.sha}}", - "type": "commit" - } - EOF - - - name: Create a tag reference - run: | - curl -s -X POST "https://api.github.com/repos/microsoft/vscode-python/git/refs" \ - -H "Authorization: token ${{secrets.GITHUB_TOKEN}}" \ - -d @- << EOF - { - "ref": "refs/tags/${{env.LKG_TAG}}", - "sha": "${{github.sha}}" - } - EOF diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000000..5528fbbe9c0a --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: 'CodeQL' + +on: + push: + branches: + - main + - release-* + - release/* + pull_request: + # The branches below must be a subset of the branches above + branches: [main] + schedule: + - cron: '0 3 * * 0' + +permissions: + security-events: write + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['javascript', 'python'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + #- name: Autobuild + # uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/community-feedback-auto-comment.yml b/.github/workflows/community-feedback-auto-comment.yml new file mode 100644 index 000000000000..27f93400a023 --- /dev/null +++ b/.github/workflows/community-feedback-auto-comment.yml @@ -0,0 +1,28 @@ +name: Community Feedback Auto Comment + +on: + issues: + types: + - labeled +jobs: + add-comment: + if: github.event.label.name == 'needs community feedback' + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Check For Existing Comment + uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0 + id: finder + with: + issue-number: ${{ github.event.issue.number }} + comment-author: 'github-actions[bot]' + body-includes: 'Thanks for the feature request! We are going to give the community' + + - name: Add Community Feedback Comment + if: steps.finder.outputs.comment-id == '' + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0 + with: + issue-number: ${{ github.event.issue.number }} + body: | + Thanks for the feature request! We are going to give the community 60 days from when this issue was created to provide 7 👍 upvotes on the opening comment to gauge general interest in this idea. If there's enough upvotes then we will consider this feature request in our future planning. If there's unfortunately not enough upvotes then we will close this issue. diff --git a/.github/workflows/gen-issue-velocity.yml b/.github/workflows/gen-issue-velocity.yml new file mode 100644 index 000000000000..41d79e4074d0 --- /dev/null +++ b/.github/workflows/gen-issue-velocity.yml @@ -0,0 +1,34 @@ +name: Issues Summary + +on: + schedule: + - cron: '0 0 * * 2' # Runs every Tuesday at midnight + workflow_dispatch: + +permissions: + issues: read + +jobs: + generate-summary: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + + - name: Run summary script + run: python scripts/issue_velocity_summary_script.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/info-needed-closer.yml b/.github/workflows/info-needed-closer.yml new file mode 100644 index 000000000000..46892a58e800 --- /dev/null +++ b/.github/workflows/info-needed-closer.yml @@ -0,0 +1,33 @@ +name: Info-Needed Closer +on: + schedule: + - cron: 20 12 * * * # 5:20am Redmond + repository_dispatch: + types: [trigger-needs-more-info] + workflow_dispatch: + +permissions: + issues: write + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v6 + with: + repository: 'microsoft/vscode-github-triage-actions' + path: ./actions + persist-credentials: false + ref: stable + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Run info-needed Closer + uses: ./actions/needs-more-info-closer + with: + token: ${{secrets.GITHUB_TOKEN}} + label: info-needed + closeDays: 30 + closeComment: "Because we have not heard back with the information we requested, we are closing this issue for now. If you are able to provide the info later on, then we will be happy to re-open this issue to pick up where we left off. \n\nHappy Coding!" + pingDays: 30 + pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information." diff --git a/.github/workflows/issue-labels.yml b/.github/workflows/issue-labels.yml new file mode 100644 index 000000000000..dcbd114086e2 --- /dev/null +++ b/.github/workflows/issue-labels.yml @@ -0,0 +1,34 @@ +name: Issue labels + +on: + issues: + types: [opened, reopened] + +env: + TRIAGERS: '["karthiknadig","eleanorjboyd","anthonykim1"]' + +permissions: + issues: write + +jobs: + # From https://github.com/marketplace/actions/github-script#apply-a-label-to-an-issue. + add-classify-label: + name: "Add 'triage-needed' and remove assignees" + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v6 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: stable + path: ./actions + persist-credentials: false + + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: "Add 'triage-needed' and remove assignees" + uses: ./actions/python-issue-labels + with: + triagers: ${{ env.TRIAGERS }} + token: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/lock-issues.yml b/.github/workflows/lock-issues.yml new file mode 100644 index 000000000000..544d04ee185e --- /dev/null +++ b/.github/workflows/lock-issues.yml @@ -0,0 +1,24 @@ +name: 'Lock Issues' + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +permissions: + issues: write + +concurrency: + group: lock + +jobs: + lock-issues: + runs-on: ubuntu-latest + steps: + - name: 'Lock Issues' + uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0 + with: + github-token: ${{ github.token }} + issue-inactive-days: '30' + process-only: 'issues' + log-output: true diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml new file mode 100644 index 000000000000..c8a6f2dd416e --- /dev/null +++ b/.github/workflows/pr-check.yml @@ -0,0 +1,689 @@ +name: PR/CI Check + +on: + pull_request: + push: + branches-ignore: + - main + - release* + +permissions: {} + +env: + NODE_VERSION: 22.21.1 + PYTHON_VERSION: '3.10' # YML treats 3.10 the number as 3.1, so quotes around 3.10 + MOCHA_REPORTER_JUNIT: true # Use the mocha-multi-reporters and send output to both console (spec) and JUnit (mocha-junit-reporter). Also enables a reporter which exits the process running the tests if it haven't already. + ARTIFACT_NAME_VSIX: ms-python-insiders-vsix + TEST_RESULTS_DIRECTORY: . + # Force a path with spaces and to test extension works in these scenarios + # Unicode characters are causing 2.7 failures so skip that for now. + special-working-directory: './path with spaces' + special-working-directory-relative: 'path with spaces' + +jobs: + build-vsix: + name: Create VSIX + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: windows-latest + target: x86_64-pc-windows-msvc + vsix-target: win32-x64 + - os: windows-latest + target: aarch64-pc-windows-msvc + vsix-target: win32-arm64 + - os: ubuntu-latest + target: x86_64-unknown-linux-musl + vsix-target: linux-x64 + # - os: ubuntu-latest + # target: aarch64-unknown-linux-gnu + # vsix-target: linux-arm64 + # - os: ubuntu-latest + # target: arm-unknown-linux-gnueabihf + # vsix-target: linux-armhf + # - os: macos-latest + # target: x86_64-apple-darwin + # vsix-target: darwin-x64 + # - os: macos-14 + # target: aarch64-apple-darwin + # vsix-target: darwin-arm64 + - os: ubuntu-latest + target: x86_64-unknown-linux-musl + vsix-target: alpine-x64 + # - os: ubuntu-latest + # target: aarch64-unknown-linux-musl + # vsix-target: alpine-arm64 + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: 'python-env-tools' + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Build VSIX + uses: ./.github/actions/build-vsix + with: + node_version: ${{ env.NODE_VERSION}} + vsix_name: 'ms-python-insiders-${{ matrix.vsix-target }}.vsix' + artifact_name: '${{ env.ARTIFACT_NAME_VSIX }}-${{ matrix.vsix-target }}' + cargo_target: ${{ matrix.target }} + vsix_target: ${{ matrix.vsix-target }} + + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Lint + uses: ./.github/actions/lint + with: + node_version: ${{ env.NODE_VERSION }} + + check-types: + name: Check Python types + runs-on: ubuntu-latest + steps: + - name: Use Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@v6 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: 'python-env-tools' + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Install base Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + options: '-t ./python_files/lib/python --no-cache-dir --implementation py' + + - name: Install Jedi requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + requirements-file: './python_files/jedilsp_requirements/requirements.txt' + options: '-t ./python_files/lib/jedilsp --no-cache-dir --implementation py' + + - name: Install other Python requirements + run: | + python -m pip install --upgrade -r build/test-requirements.txt + + - name: Run Pyright + uses: jakebailey/pyright-action@8ec14b5cfe41f26e5f41686a31eb6012758217ef # v3.0.2 + with: + version: 1.1.308 + working-directory: 'python_files' + + python-tests: + name: Python Tests + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ${{ env.special-working-directory }} + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case. + os: [ubuntu-latest, windows-latest] + # Run the tests on the oldest and most recent versions of Python. + python: ['3.10', '3.x', '3.13'] # run for 3 pytest versions, most recent stable, oldest version supported and pre-release + pytest-version: ['pytest', 'pytest@pre-release', 'pytest==6.2.0'] + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + path: ${{ env.special-working-directory-relative }} + persist-credentials: false + + - name: Use Python ${{ matrix.python }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + + - name: Install specific pytest version + if: matrix.pytest-version == 'pytest@pre-release' + run: | + python -m pip install --pre pytest + + - name: Install specific pytest version + if: matrix.pytest-version != 'pytest@pre-release' + run: | + python -m pip install "${{ matrix.pytest-version }}" + + - name: Install specific pytest version + run: python -m pytest --version + - name: Install base Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + requirements-file: '"${{ env.special-working-directory-relative }}/requirements.txt"' + options: '-t "${{ env.special-working-directory-relative }}/python_files/lib/python" --no-cache-dir --implementation py' + + - name: Install test requirements + run: python -m pip install --upgrade -r build/test-requirements.txt + + - name: Run Python unit tests + run: python python_files/tests/run_all.py + + tests: + name: Tests + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ${{ env.special-working-directory }} + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case. + os: [ubuntu-latest, windows-latest] + # Run the tests on the oldest and most recent versions of Python. + python: ['3.x'] + test-suite: [ts-unit, venv, single-workspace, debugger, functional] + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + path: ${{ env.special-working-directory-relative }} + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: ${{ env.special-working-directory-relative }}/python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Install Node + uses: actions/setup-node@v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + cache-dependency-path: ${{ env.special-working-directory-relative }}/package-lock.json + + - name: Install dependencies (npm ci) + run: npm ci + + - name: Compile + run: npx gulp prePublishNonBundle + + - name: Localization + run: npx @vscode/l10n-dev@latest export ./src + + - name: Use Python ${{ matrix.python }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + + - name: Upgrade Pip + run: python -m pip install -U pip + + # For faster/better builds of sdists. + - name: Install build pre-requisite + run: python -m pip install wheel nox + + - name: Install Python Extension dependencies (jedi, etc.) + run: nox --session install_python_libs + + - name: Install test requirements + run: python -m pip install --upgrade -r build/test-requirements.txt + + - name: Rust Tool Chain setup + uses: dtolnay/rust-toolchain@stable + + - name: Build Native Binaries + run: nox --session native_build + shell: bash + + - name: Install functional test requirements + run: python -m pip install --upgrade -r ./build/functional-test-requirements.txt + if: matrix.test-suite == 'functional' + + - name: Prepare pipenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install pipenv + python -m pipenv run python ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} pipenvPath + + - name: Prepare poetry for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install poetry + Move-Item -Path ".\build\ci\pyproject.toml" -Destination . + poetry env use python + + - name: Prepare virtualenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + python -m pip install virtualenv + python -m virtualenv .virtualenv/ + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".virtualenv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } else { + & ".virtualenv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } + + - name: Prepare venv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' && startsWith(matrix.python, 3.) + run: | + python -m venv .venv + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".venv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } else { + & ".venv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } + + - name: Prepare conda for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + if: matrix.test-suite == 'venv' + run: | + # 1. For `*.testvirtualenvs.test.ts` + if ('${{ matrix.os }}' -match 'windows-latest') { + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python.exe + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath Scripts | Join-Path -ChildPath conda + } else{ + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath python + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath conda + } + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaExecPath $condaExecPath + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaPath + & $condaExecPath init --all + + - name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION + run: | + echo "CI_PYTHON_PATH=python" >> $GITHUB_ENV + echo "CI_DISABLE_AUTO_SELECTION=1" >> $GITHUB_ENV + shell: bash + if: matrix.test-suite != 'ts-unit' + + # Run TypeScript unit tests only for Python 3.X. + - name: Run TypeScript unit tests + run: npm run test:unittests + if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, 3.) + + # The virtual environment based tests use the `testSingleWorkspace` set of tests + # with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`, + # which is set in the "Prepare environment for venv tests" step. + # We also use a third-party GitHub Action to install xvfb on Linux, + # run tests and then clean up the process once the tests ran. + # See https://github.com/GabrielBB/xvfb-action + - name: Run venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'venv' + + - name: Run single-workspace tests + env: + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'single-workspace' + + - name: Run debugger tests + env: + CI_PYTHON_VERSION: ${{ matrix.python }} + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testDebugger + working-directory: ${{ env.special-working-directory }} + if: matrix.test-suite == 'debugger' + + # Run TypeScript functional tests + - name: Run TypeScript functional tests + run: npm run test:functional + if: matrix.test-suite == 'functional' + + native-tests: + name: Native Tests + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: ${{ env.special-working-directory }} + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case. + os: [ubuntu-latest, windows-latest] + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + path: ${{ env.special-working-directory-relative }} + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: ${{ env.special-working-directory-relative }}/python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Python Environment Tools tests + run: cargo test -- --nocapture + working-directory: ${{ env.special-working-directory }}/python-env-tools + + smoke-tests: + name: Smoke tests + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + needs: [build-vsix] + strategy: + fail-fast: false + matrix: + # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, + # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. + include: + - os: windows-latest + vsix-target: win32-x64 + - os: ubuntu-latest + vsix-target: linux-x64 + + steps: + # Need the source to have the tests available. + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Smoke tests + uses: ./.github/actions/smoke-tests + with: + node_version: ${{ env.NODE_VERSION }} + artifact_name: '${{ env.ARTIFACT_NAME_VSIX }}-${{ matrix.vsix-target }}' + + ### Coverage run + coverage: + name: Coverage + # TEMPORARILY DISABLED - hanging in CI, needs investigation + if: false + # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. + runs-on: ${{ matrix.os }} + needs: [lint, check-types, python-tests, tests, native-tests] + strategy: + fail-fast: false + matrix: + # Only run coverage on linux for PRs + os: [ubuntu-latest] + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout Python Environment Tools + uses: actions/checkout@v6 + with: + repository: 'microsoft/python-environment-tools' + path: python-env-tools + persist-credentials: false + sparse-checkout: | + crates + Cargo.toml + Cargo.lock + sparse-checkout-cone-mode: false + + - name: Install Node + uses: actions/setup-node@v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + + - name: Install dependencies (npm ci) + run: npm ci + + - name: Compile + run: npx gulp prePublishNonBundle + + - name: Localization + run: npx @vscode/l10n-dev@latest export ./src + + - name: Use Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@v6 + with: + python-version: ${{ env.PYTHON_VERSION }} + cache: 'pip' + cache-dependency-path: | + requirements.txt + python_files/jedilsp_requirements/requirements.txt + build/test-requirements.txt + build/functional-test-requirements.txt + + - name: Install base Python requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + options: '-t ./python_files/lib/python --implementation py' + + - name: Install Jedi requirements + uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0 + with: + requirements-file: './python_files/jedilsp_requirements/requirements.txt' + options: '-t ./python_files/lib/jedilsp --implementation py' + + - name: Install build pre-requisite + run: python -m pip install wheel nox + shell: bash + + - name: Rust Tool Chain setup + uses: dtolnay/rust-toolchain@stable + + - name: Build Native Binaries + run: nox --session native_build + shell: bash + + - name: Install test requirements + run: python -m pip install --upgrade -r build/test-requirements.txt + + - name: Install functional test requirements + run: python -m pip install --upgrade -r ./build/functional-test-requirements.txt + + - name: Prepare pipenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + run: | + python -m pip install pipenv + python -m pipenv run python ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} pipenvPath + + - name: Prepare poetry for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + shell: pwsh + run: | + python -m pip install poetry + Move-Item -Path ".\build\ci\pyproject.toml" -Destination . + poetry env use python + + - name: Prepare virtualenv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + run: | + python -m pip install virtualenv + python -m virtualenv .virtualenv/ + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".virtualenv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } else { + & ".virtualenv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath + } + + - name: Prepare venv for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + run: | + python -m venv .venv + if ('${{ matrix.os }}' -match 'windows-latest') { + & ".venv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } else { + & ".venv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath + } + + - name: Prepare conda for venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + shell: pwsh + run: | + # 1. For `*.testvirtualenvs.test.ts` + if ('${{ matrix.os }}' -match 'windows-latest') { + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python.exe + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath Scripts | Join-Path -ChildPath conda + } else{ + $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath python + $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath conda + } + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaExecPath $condaExecPath + & $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaPath + & $condaExecPath init --all + + - name: Run TypeScript unit tests + run: npm run test:unittests:cover + + - name: Run Python unit tests + run: | + python python_files/tests/run_all.py + + # The virtual environment based tests use the `testSingleWorkspace` set of tests + # with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`, + # which is set in the "Prepare environment for venv tests" step. + # We also use a third-party GitHub Action to install xvfb on Linux, + # run tests and then clean up the process once the tests ran. + # See https://github.com/GabrielBB/xvfb-action + - name: Run venv tests + env: + TEST_FILES_SUFFIX: testvirtualenvs + CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }} + CI_DISABLE_AUTO_SELECTION: 1 + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace:cover + + - name: Run single-workspace tests + env: + CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }} + CI_DISABLE_AUTO_SELECTION: 1 + uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + with: + run: npm run testSingleWorkspace:cover + + # Enable these tests when coverage is setup for multiroot workspace tests + # - name: Run multi-workspace tests + # env: + # CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }} + # CI_DISABLE_AUTO_SELECTION: 1 + # uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + # with: + # run: npm run testMultiWorkspace:cover + + # Enable these tests when coverage is setup for debugger tests + # - name: Run debugger tests + # env: + # CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }} + # CI_DISABLE_AUTO_SELECTION: 1 + # uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7 + # with: + # run: npm run testDebugger:cover + + # Run TypeScript functional tests + - name: Run TypeScript functional tests + env: + CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }} + CI_DISABLE_AUTO_SELECTION: 1 + run: npm run test:functional:cover + + - name: Generate coverage reports + run: npm run test:cover:report + + - name: Upload HTML report + uses: actions/upload-artifact@v7 + with: + name: ${{ runner.os }}-coverage-report-html + path: ./coverage + retention-days: 1 diff --git a/.github/workflows/pr-file-check.yml b/.github/workflows/pr-file-check.yml new file mode 100644 index 000000000000..6364e5fa744e --- /dev/null +++ b/.github/workflows/pr-file-check.yml @@ -0,0 +1,44 @@ +name: PR files + +on: + pull_request: + types: + - 'opened' + - 'reopened' + - 'synchronize' + - 'labeled' + - 'unlabeled' + +permissions: {} + +jobs: + changed-files-in-pr: + name: 'Check for changed files' + runs-on: ubuntu-latest + steps: + - name: 'package-lock.json matches package.json' + uses: brettcannon/check-for-changed-files@871d7b8b5917a4f6f06662e2262e8ffc51dff6d1 # v1.2.1 + with: + prereq-pattern: 'package.json' + file-pattern: 'package-lock.json' + skip-label: 'skip package*.json' + failure-message: '${prereq-pattern} was edited but ${file-pattern} was not (the ${skip-label} label can be used to pass this check)' + + - name: 'package.json matches package-lock.json' + uses: brettcannon/check-for-changed-files@871d7b8b5917a4f6f06662e2262e8ffc51dff6d1 # v1.2.1 + with: + prereq-pattern: 'package-lock.json' + file-pattern: 'package.json' + skip-label: 'skip package*.json' + failure-message: '${prereq-pattern} was edited but ${file-pattern} was not (the ${skip-label} label can be used to pass this check)' + + - name: 'Tests' + uses: brettcannon/check-for-changed-files@871d7b8b5917a4f6f06662e2262e8ffc51dff6d1 # v1.2.1 + with: + prereq-pattern: src/**/*.ts + file-pattern: | + src/**/*.test.ts + src/**/*.testvirtualenvs.ts + .github/test_plan.md + skip-label: 'skip tests' + failure-message: 'TypeScript code was edited without also editing a ${file-pattern} file; see the Testing page in our wiki on testing guidelines (the ${skip-label} label can be used to pass this check)' diff --git a/.github/workflows/pr-issue-check.yml b/.github/workflows/pr-issue-check.yml new file mode 100644 index 000000000000..5587227d2848 --- /dev/null +++ b/.github/workflows/pr-issue-check.yml @@ -0,0 +1,31 @@ +name: PR issue check + +on: + pull_request: + types: + - 'opened' + - 'reopened' + - 'synchronize' + - 'labeled' + - 'unlabeled' + +permissions: {} + +jobs: + check-for-attached-issue: + name: 'Check for attached issue' + runs-on: ubuntu-latest + steps: + - name: 'Ensure PR has an associated issue' + uses: actions/github-script@v9 + with: + script: | + const labels = context.payload.pull_request.labels.map(label => label.name); + if (!labels.includes('skip-issue-check')) { + const prBody = context.payload.pull_request.body || ''; + const issueLink = prBody.match(/https:\/\/github\.com\/\S+\/issues\/\d+/); + const issueReference = prBody.match(/#\d+/); + if (!issueLink && !issueReference) { + core.setFailed('No associated issue found in the PR description.'); + } + } diff --git a/.github/workflows/pr-labels.yml b/.github/workflows/pr-labels.yml new file mode 100644 index 000000000000..af24ac10772c --- /dev/null +++ b/.github/workflows/pr-labels.yml @@ -0,0 +1,24 @@ +name: 'PR labels' +on: + pull_request: + types: + - 'opened' + - 'reopened' + - 'labeled' + - 'unlabeled' + - 'synchronize' + +jobs: + classify: + name: 'Classify PR' + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - name: 'PR impact specified' + uses: mheap/github-action-required-labels@0ac283b4e65c1fb28ce6079dea5546ceca98ccbe # v5.5.2 + with: + mode: exactly + count: 1 + labels: 'bug, debt, feature-request, no-changelog' diff --git a/.github/workflows/python27-issue-response.yml b/.github/workflows/python27-issue-response.yml new file mode 100644 index 000000000000..9db84bca1a23 --- /dev/null +++ b/.github/workflows/python27-issue-response.yml @@ -0,0 +1,16 @@ +on: + issues: + types: [opened] + +jobs: + python27-issue-response: + runs-on: ubuntu-latest + permissions: + issues: write + if: "contains(github.event.issue.body, 'Python version (& distribution if applicable, e.g. Anaconda): 2.7')" + steps: + - name: Check for Python 2.7 string + run: | + response="We're sorry, but we no longer support Python 2.7. If you need to work with Python 2.7, you will have to pin to 2022.2.* version of the extension, which was the last version that had the debugger (debugpy) with support for python 2.7, and was tested with `2.7`. Thank you for your understanding! \n ![https://user-images.githubusercontent.com/51720070/80000627-39dacc00-8472-11ea-9755-ac7ba0acbb70.gif](https://user-images.githubusercontent.com/51720070/80000627-39dacc00-8472-11ea-9755-ac7ba0acbb70.gif)" + gh issue comment ${{ github.event.issue.number }} --body "$response" + gh issue close ${{ github.event.issue.number }} diff --git a/.github/workflows/remove-needs-labels.yml b/.github/workflows/remove-needs-labels.yml new file mode 100644 index 000000000000..24352526d0d8 --- /dev/null +++ b/.github/workflows/remove-needs-labels.yml @@ -0,0 +1,20 @@ +name: 'Remove Needs Label' +on: + issues: + types: [closed] + +jobs: + classify: + name: 'Remove needs labels on issue closing' + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: 'Removes needs labels on issue close' + uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0 + with: + labels: | + needs PR + needs spike + needs community feedback + needs proposal diff --git a/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml new file mode 100644 index 000000000000..57db4a3e18a7 --- /dev/null +++ b/.github/workflows/test-plan-item-validator.yml @@ -0,0 +1,30 @@ +name: Test Plan Item Validator +on: + issues: + types: [edited, labeled] + +permissions: + issues: write + +jobs: + main: + runs-on: ubuntu-latest + if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item') + steps: + - name: Checkout Actions + uses: actions/checkout@v6 + with: + repository: 'microsoft/vscode-github-triage-actions' + path: ./actions + persist-credentials: false + ref: stable + + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: Run Test Plan Item Validator + uses: ./actions/test-plan-item-validator + with: + label: testplan-item + invalidLabel: invalid-testplan-item + comment: Invalid test plan item. See errors below and the [test plan item spec](https://github.com/microsoft/vscode/wiki/Writing-Test-Plan-Items) for more information. This comment will go away when the issues are resolved. diff --git a/.github/workflows/triage-info-needed.yml b/.github/workflows/triage-info-needed.yml new file mode 100644 index 000000000000..c7a37ba0c78d --- /dev/null +++ b/.github/workflows/triage-info-needed.yml @@ -0,0 +1,57 @@ +name: Triage "info-needed" label + +on: + issue_comment: + types: [created] + +env: + TRIAGERS: '["karrtikr","karthiknadig","paulacamargo25","eleanorjboyd", "brettcannon","anthonykim1"]' + +jobs: + add_label: + if: contains(github.event.issue.labels.*.name, 'triage-needed') && !contains(github.event.issue.labels.*.name, 'info-needed') + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Checkout Actions + uses: actions/checkout@v6 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: stable + path: ./actions + persist-credentials: false + + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: Add "info-needed" label + uses: ./actions/python-triage-info-needed + with: + triagers: ${{ env.TRIAGERS }} + action: 'add' + token: ${{secrets.GITHUB_TOKEN}} + + remove_label: + if: contains(github.event.issue.labels.*.name, 'info-needed') && contains(github.event.issue.labels.*.name, 'triage-needed') + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Checkout Actions + uses: actions/checkout@v6 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: stable + path: ./actions + persist-credentials: false + + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: Remove "info-needed" label + uses: ./actions/python-triage-info-needed + with: + triagers: ${{ env.TRIAGERS }} + action: 'remove' + token: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore index bb91b7039034..2fa056f84fa6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ log.log **/node_modules *.pyc *.vsix +envVars.txt **/.vscode/.ropeproject/** **/testFiles/**/.cache/** *.noseids @@ -22,26 +23,36 @@ cucumber-report.json **/.venv*/ port.txt precommit.hook -pythonFiles/experimental/ptvsd/** -pythonFiles/lib/** +python_files/lib/** +python_files/get-pip.py debug_coverage*/** languageServer/** languageServer.*/** -!uitests/features/languageServer/** -!uitests/src/languageServer/** -!uitests/code/**/languageServer/** bin/** obj/** .pytest_cache tmp/** .python-version .vs/ -test-results.xml -uitests/out/** +test-results*.xml +xunit-test-results.xml +build/ci/performance/performance-results.json !build/ debug*.log -ptvsd*.log +debugpy*.log pydevd*.log nodeLanguageServer/** nodeLanguageServer.*/** +dist/** +# translation files +*.xlf +package.nls.*.json +l10n/ +python-env-tools/** +# coverage files produced as test output +python_files/tests/*/.data/.coverage* +python_files/tests/*/.data/*/.coverage* +src/testTestingRootWkspc/coverageWorkspace/.coverage +# ignore ai artifacts generated and placed in this folder +ai-artifacts/* diff --git a/.npmrc b/.npmrc index bc9dcc1dce60..16cc2ccdf1e8 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -@types:registry=https://registry.npmjs.org \ No newline at end of file +@types:registry=https://registry.npmjs.org diff --git a/.nvmrc b/.nvmrc index e23e7f3a97dc..c6a66a6e6a68 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v12.4.0 +v22.21.1 diff --git a/.prettierrc.js b/.prettierrc.js index c24dc4c40c35..87a94b7bf466 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -2,6 +2,8 @@ module.exports = { singleQuote: true, printWidth: 120, tabWidth: 4, + endOfLine: 'auto', + trailingComma: 'all', overrides: [ { files: ['*.yml', '*.yaml'], diff --git a/.sonarcloud.properties b/.sonarcloud.properties index c701b54718cf..9e466689a90a 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1,4 +1,4 @@ -sonar.sources=src/client,src/datascience-ui +sonar.sources=src/client sonar.tests=src/test sonar.cfamily.build-wrapper-output.bypass=true - +sonar.cpd.exclusions=src/client/activation/**/*.ts diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 508eae4c5ddc..15e6aada1d50 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,8 +2,11 @@ // See https://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ - "ms-vscode.vscode-typescript-tslint-plugin", + "charliermarsh.ruff", "editorconfig.editorconfig", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "ms-python.python", + "ms-python.vscode-pylance" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 451f2f9d3c67..1e983413c8d4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,74 +7,34 @@ "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "stopOnEntry": false, + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], "smartStep": true, "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*" - ], + "outFiles": ["${workspaceFolder}/out/**/*", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"], + "env": { + // Enable this to turn on redux logging during debugging + "XVSC_PYTHON_FORCE_LOGGING": "1", + // Enable this to try out new experiments locally + "VSC_PYTHON_LOAD_EXPERIMENTS_FROM_FILE": "1", + // Enable this to log telemetry to the output during debugging + "XVSC_PYTHON_LOG_TELEMETRY": "1", + // Enable this to log debugger output. Directory must exist ahead of time + "XDEBUGPY_LOG_DIR": "${workspaceRoot}/tmp/Debug_Output_Ex" + } }, { "name": "Extension inside container", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "${workspaceFolder}/data" - ], - "stopOnEntry": false, + "args": ["--extensionDevelopmentPath=${workspaceFolder}", "${workspaceFolder}/data"], "smartStep": true, "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*" - ], + "outFiles": ["${workspaceFolder}/out/**/*", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile" }, - { - "name": "Python: Current File with iPython", - "type": "python", - "request": "launch", - "module": "IPython", - "console": "integratedTerminal", - "args": [ - "${file}" - ] // Additional args should be prefixed with a '--' first. - }, - { - "name": "Python: Current File", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal" - }, - { - "name": "Debugger as debugServer", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/out/client/debugger/debugAdapter/main.js", - "stopOnEntry": false, - "smartStep": true, - "args": [ - "--server=4711" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/client/**/*.js" - ], - "cwd": "${workspaceFolder}", - "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] - }, { "name": "Tests (Debugger, VS Code, *.test.ts)", "type": "extensionHost", @@ -86,19 +46,14 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test" ], - "stopOnEntry": false, "sourceMaps": true, "smartStep": true, - "outFiles": [ - "${workspaceFolder}/out/**/*" - ], + "outFiles": ["${workspaceFolder}/out/**/*", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", "env": { "IS_CI_SERVER_TEST_DEBUGGER": "1" }, - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { // Note, for the smoke test you want to debug, you may need to copy the file, @@ -114,17 +69,14 @@ "--extensionTestsPath=${workspaceFolder}/out/test" ], "env": { - "VSC_PYTHON_CI_TEST_GREP": "Smoke Test" + "VSC_PYTHON_CI_TEST_GREP": "Smoke Test", + "VSC_PYTHON_SMOKE_TEST": "1", + "TEST_FILES_SUFFIX": "smoke.test" }, - "stopOnEntry": false, "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { "name": "Tests (Single Workspace, VS Code, *.test.ts)", @@ -140,15 +92,29 @@ "env": { "VSC_PYTHON_CI_TEST_GREP": "" // Modify this to run a subset of the single workspace tests }, - "stopOnEntry": false, "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] + }, + { + "name": "Jedi LSP tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "${workspaceFolder}/src/test", + "--disable-extensions", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test" + ], + "env": { + "VSC_PYTHON_CI_TEST_GREP": "Language Server:" + }, + "sourceMaps": true, + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], + "preLaunchTask": "preTestJediLSP", + "skipFiles": ["/**"] }, { "name": "Tests (Multiroot, VS Code, *.test.ts)", @@ -161,16 +127,14 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test" ], - "stopOnEntry": false, + "env": { + "VSC_PYTHON_CI_TEST_GREP": "" // Modify this to run a subset of the single workspace tests + }, "sourceMaps": true, "smartStep": true, - "outFiles": [ - "${workspaceFolder}/out/**/*" - ], + "outFiles": ["${workspaceFolder}/out/**/*", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { "name": "Unit Tests (without VS Code, *.unit.test.ts)", @@ -188,13 +152,9 @@ //"--grep", "", "--timeout=300000" ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { "name": "Unit Tests (fast, without VS Code and without react/monaco, *.unit.test.ts)", @@ -209,17 +169,13 @@ "--ui=tdd", "--recursive", "--colors", - //"--grep", "", + // "--grep", "", "--timeout=300000", "--fast" ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { "name": "Functional Tests (without VS Code, *.functional.test.ts)", @@ -234,61 +190,73 @@ "--ui=tdd", "--recursive", "--colors", - //"--grep", "", - "--timeout=300000" + // "--grep", "", + "--timeout=300000", + "--exit" ], "env": { + // Remove `X` prefix to test with real browser to host DS ui (for DS functional tests). + "XVSC_PYTHON_DS_UI_BROWSER": "1", // Remove `X` prefix to test with real python (for DS functional tests). "XVSCODE_PYTHON_ROLLING": "1", + // Remove 'X' to turn on all logging in the debug output + "XVSC_PYTHON_FORCE_LOGGING": "1", // Remove `X` prefix and update path to test with real python interpreter (for DS functional tests). - // Do not use a conda environment (as it needs to be activated and the like). - "XCI_PYTHON_PATH": "" + "XCI_PYTHON_PATH": "", + // Remove 'X' prefix to dump output for debugger. Directory has to exist prior to launch + "XDEBUGPY_LOG_DIR": "${workspaceRoot}/tmp/Debug_Output", + // Remove 'X' prefix to dump webview redux action log + "XVSC_PYTHON_WEBVIEW_LOG_FILE": "${workspaceRoot}/test-webview.log" }, - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/**/*.js", "!${workspaceFolder}/**/node_modules**/*"], "preLaunchTask": "Compile", - "skipFiles": [ - "/**" - ] + "skipFiles": ["/**"] }, { "type": "node", "request": "launch", "name": "Gulp tasks (helpful for debugging gulpfile.js)", "program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js", - "args": [ - "watch" - ], - "skipFiles": [ - "/**" - ] + "args": ["watch"], + "skipFiles": ["/**"] }, { - "name": "Behave Smoke Tests", - "type": "python", + "name": "Node: Current File", + "program": "${file}", "request": "launch", - "program": "${workspaceFolder}/uitests/__main__.py", - "args": [ - "test", - "--", - "--format", - "progress3", - // Change the tag `@wip` to what ever you want to run. - // Default is assumed to be somethign that's a work in progress (wip). - "--tags=@wip" - ], - "justMyCode": false, - "console": "internalConsole" + "skipFiles": ["/**"], + "type": "node" + }, + { + "name": "Python: Current File", + "type": "debugpy", + "justMyCode": true, + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}" + }, + { + "name": "Python: Attach Listen", + "type": "debugpy", + "request": "attach", + "listen": { "host": "localhost", "port": 5678 }, + "justMyCode": true + }, + { + "name": "Debug pytest plugin tests", + + "type": "debugpy", + "request": "launch", + "module": "pytest", + "args": ["${workspaceFolder}/python_files/tests/pytestadapter"], + "justMyCode": true } ], "compounds": [ { - "name": "Extension + Debugger", - "configurations": [ - "Extension", - "Debugger as debugServer" - ] + "name": "Debug Python and Extension", + "configurations": ["Python: Attach Listen", "Extension"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index ee9e78ccfe70..01de0d907706 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,7 @@ { "files.exclude": { "out": true, // set this to true to hide the "out" folder with the compiled JS files - "uitests/out": true, + "dist": true, "**/*.pyc": true, ".nyc_output": true, "obj": true, @@ -11,12 +11,11 @@ "**/node_modules": true, ".vscode-test": false, ".vscode test": false, - "**/.mypy_cache/**": true, - "**/.ropeproject/**": true + "**/.mypy_cache/**": true }, "search.exclude": { "out": true, // set this to false to include "out" folder in search results - "uitests/out": true, + "dist": true, "**/node_modules": true, "coverage": true, "languageServer*/**": true, @@ -24,38 +23,56 @@ ".vscode test": true }, "[python]": { + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports.isort": "explicit" + }, + "editor.defaultFormatter": "charliermarsh.ruff", + }, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer", "editor.formatOnSave": true }, "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[JSON]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[YAML]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "typescript.tsdk": "./node_modules/typescript/lib", // we want to use the TS server from our node_modules folder to control its version - "tslint.enable": true, - "python.linting.enabled": false, - "python.testing.promptToConfigure": false, - "python.workspaceSymbols.enabled": false, - "python.formatting.provider": "black", "typescript.preferences.quoteStyle": "single", "javascript.preferences.quoteStyle": "single", - "typescriptHero.imports.stringQuoteStyle": "'", "prettier.printWidth": 120, "prettier.singleQuote": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, - "source.fixAll.tslint": true - }, - "python.jediEnabled": false, - "python.analysis.logLevel": "Trace", - "python.analysis.downloadChannel": "beta", - "python.linting.pylintEnabled": false, - "python.linting.flake8Enabled": true, - "cucumberautocomplete.skipDocStringsFormat": true, - "python.linting.flake8Args": [ - // Match what black does. - "--max-line-length=88" + "source.fixAll.eslint": "explicit" + }, + "python.languageServer": "Default", + "typescript.preferences.importModuleSpecifier": "relative", + // Branch name suggestion. + "git.branchProtectionPrompt": "alwaysCommitToNewBranch", + "git.branchRandomName.enable": true, + "git.branchProtection": ["main", "release/*"], + "git.pullBeforeCheckout": true, + // Open merge editor for resolving conflicts. + "git.mergeEditor": true, + "python.testing.pytestArgs": [ + "python_files/tests" ], - "typescript.preferences.importModuleSpecifier": "relative" + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "rust-analyzer.linkedProjects": [ + ".\\python-env-tools\\Cargo.toml" + ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 8758e33a5abf..c5a054ed43cf 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,29 +12,12 @@ "type": "npm", "script": "compile", "isBackground": true, - "problemMatcher": [ - "$tsc-watch", - { - "base": "$tslint5", - "fileLocation": "relative" - } - ], + "problemMatcher": ["$tsc-watch"], "group": { "kind": "build", "isDefault": true } }, - { - "label": "Compile Web Views", - "type": "npm", - "script": "compile-webviews-watch", - "isBackground": true, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, { "label": "Run Unit Tests", "type": "npm", @@ -43,6 +26,37 @@ "kind": "test", "isDefault": true } + }, + { + "type": "npm", + "script": "preTestJediLSP", + "problemMatcher": [], + "label": "preTestJediLSP" + }, + { + "type": "npm", + "script": "check-python", + "problemMatcher": ["$python"], + "label": "npm: check-python", + "detail": "npm run check-python:ruff && npm run check-python:pyright" + }, + { + "label": "npm: check-python (venv)", + "type": "shell", + "command": "bash", + "args": ["-lc", "source .venv/bin/activate && npm run check-python"], + "problemMatcher": [], + "detail": "Activates the repo .venv first (avoids pyenv/shim Python) then runs: npm run check-python", + "windows": { + "command": "pwsh", + "args": [ + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-Command", + ".\\.venv\\Scripts\\Activate.ps1; npm run check-python" + ] + } } ] } diff --git a/.vscodeignore b/.vscodeignore index 7b2f2587d239..d636ab48f361 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,53 +1,36 @@ **/*.map **/*.analyzer.html -!out/datascience-ui/notebook/commons.initial.bundle.js.map -!out/datascience-ui/notebook/interactiveWindow.js.map -!out/datascience-ui/notebook/nativeEditor.js.map -!out/datascience-ui/viewers/commons.initial.bundle.js.map -!out/datascience-ui/viewers/dataExplorer.js.map -!out/datascience-ui/viewers/plotViewer.js.map +**/.env *.vsix -.appveyor.yml .editorconfig .env .eslintrc +.eslintignore .gitattributes .gitignore .gitmodules -.huskyrc.json +.git* .npmrc .nvmrc .nycrc -.travis.yml CODE_OF_CONDUCT.md CODING_STANDARDS.md CONTRIBUTING.md -CONTRIBUTING - LANGUAGE SERVER.md -coverconfig.json -cucumber-report.json gulpfile.js -package.datascience-ui.dependencies.json package-lock.json -packageExtension.cmd -pvsc-dev-ext.py -pvsc.code-workspace -PYTHON_INTERACTIVE_TROUBLESHOOTING.md requirements.in +sprint-planning.github-issues test.ipynb -travis*.log tsconfig*.json tsfmt.json -tslint.json -typings.json -vsc-extension-quickstart.md vscode-python-signing.* -webpack.config.js -webpack.datascience-*.config.js +noxfile.py -.devcontainer/** +.config/** .github/** .mocha-reporter/** .nvm/** +.nox/** .nyc_output .prettierrc.js .sonarcloud.properties @@ -57,6 +40,8 @@ webpack.datascience-*.config.js .vscode test/** languageServer/** languageServer.*/** +nodeLanguageServer/** +nodeLanguageServer.*/** bin/** build/** BuildOutput/** @@ -65,45 +50,40 @@ data/** debug_coverage*/** images/**/*.gif images/**/*.png -news/** +ipywidgets/** +i18n/** node_modules/** obj/** out/**/*.stats.json out/client/**/*.analyzer.html out/coverconfig.json -out/datascience-ui/**/*.analyzer.html -out/datascience-ui/common/** -out/datascience-ui/**/*.js.LICENSE -out/datascience-ui/data-explorer/** -out/datascience-ui/datascience-ui/** -out/datascience-ui/history-react/** -out/datascience-ui/interactive-common/** -out/datascience-ui/ipywidgets/** -out/datascience-ui/native-editor/** -out/datascience-ui/notebook/datascience-ui/** -out/datascience-ui/notebook/ipywidgets/** -out/datascience-ui/notebook/index.*.html -out/datascience-ui/plot/** -out/datascience-ui/react-common/** -out/datascience-ui/viewers/datascience-ui/** -out/datascience-ui/viewers/ipywidgets/** -out/datascience-ui/viewers/index.*.html -out/pythonFiles/** +out/python_files/** out/src/** out/test/** out/testMultiRootWkspc/** precommit.hook -pythonFiles/**/*.pyc -pythonFiles/lib/**/*.dist-info/** -pythonFiles/lib/**/*.egg-info/** -pythonFiles/lib/python/bin/** -pythonFiles/tests/** -requirements.txt +python_files/**/*.pyc +python_files/lib/**/*.egg-info/** +python_files/lib/jedilsp/bin/** +python_files/lib/python/bin/** +python_files/tests/** scripts/** src/** test/** tmp/** -tpn/** typings/** types/** -uitests/** +**/__pycache__/** +**/.devcontainer/** + +python-env-tools/.gitignore +python-env-tools/bin/.gitignore +python-env-tools/.github/** +python-env-tools/.vscode/** +python-env-tools/crates/** +python-env-tools/target/** +python-env-tools/Cargo.* +python-env-tools/.cargo/** + +python-env-tools/**/*.md +pythonExtensionApi/** diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d4db6e73ea4..56c1f7697ad7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6095 @@ # Changelog -## 2020.2.0-rc (3 February 2020) +**Please see https://github.com/microsoft/vscode-python/releases for the latest release notes. The notes below have been kept for historical purposes.** + +## 2022.10.1 (14 July 2022) + +### Code Health + +- Update app insights key by [karthiknadig](https://github.com/karthiknadig) in ([#19463](https://github.com/microsoft/vscode-python/pull/19463)). + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.10.0 (7 July 2022) + +### Enhancements + +- Add `breakpoint` support for `django-html` & `django-txt` by [Lakshmikanth2001](https://github.com/Lakshmikanth2001) in ([#19288](https://github.com/microsoft/vscode-python/pull/19288)). +- Fix `unittest` discovery issue with experimental component by [ksy7588](https://github.com/ksy7588) in ([#19324](https://github.com/microsoft/vscode-python/pull/19324)). +- Trigger refresh when using `Select Interpreter` command if no envs were found previously by [karrtikr](https://github.com/karrtikr) in ([#19361](https://github.com/microsoft/vscode-python/pull/19361)). +- Update `debugpy` to 1.6.2. + +### Bug Fixes + +- Fix variable name for `flake8Path`'s description by [usta](https://github.com/usta) in ([#19313](https://github.com/microsoft/vscode-python/pull/19313)). +- Ensure we dispose objects on deactivate by [karthiknadig](https://github.com/karthiknadig) in ([#19341](https://github.com/microsoft/vscode-python/pull/19341)). +- Ensure we can change interpreters after trusting a workspace by [karrtikr](https://github.com/karrtikr) in ([#19353](https://github.com/microsoft/vscode-python/pull/19353)). +- Fix for `::::` in node id for `pytest` by [karthiknadig](https://github.com/karthiknadig) in ([#19356](https://github.com/microsoft/vscode-python/pull/19356)). +- Ensure we register for interpreter change when moving from untrusted to trusted. by [karthiknadig](https://github.com/karthiknadig) in ([#19351](https://github.com/microsoft/vscode-python/pull/19351)). + +### Code Health + +- Update CI for using GitHub Actions for release notes by [brettcannon](https://github.com/brettcannon) in ([#19273](https://github.com/microsoft/vscode-python/pull/19273)). +- Add missing translations by [paulacamargo25](https://github.com/paulacamargo25) in ([#19305](https://github.com/microsoft/vscode-python/pull/19305)). +- Delete the `news` directory by [brettcannon](https://github.com/brettcannon) in ([#19308](https://github.com/microsoft/vscode-python/pull/19308)). +- Fix interpreter discovery related telemetry by [karrtikr](https://github.com/karrtikr) in ([#19319](https://github.com/microsoft/vscode-python/pull/19319)). +- Simplify and merge async dispose and dispose by [karthiknadig](https://github.com/karthiknadig) in ([#19348](https://github.com/microsoft/vscode-python/pull/19348)). +- Updating required packages by [karthiknadig](https://github.com/karthiknadig) in ([#19375](https://github.com/microsoft/vscode-python/pull/19375)). +- Update the issue notebook by [brettcannon](https://github.com/brettcannon) in ([#19388](https://github.com/microsoft/vscode-python/pull/19388)). +- Remove `notebookeditor` proposed API by [karthiknadig](https://github.com/karthiknadig) in ([#19392](https://github.com/microsoft/vscode-python/pull/19392)). + +**Full Changelog**: https://github.com/microsoft/vscode-python/compare/2022.8.1...2022.10.0 + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.8.1 (28 June 2022) + +### Code Health + +1. Update vscode `extension-telemetry` package. + ([#19375](https://github.com/microsoft/vscode-python/pull/19375)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.8.0 (9 June 2022) + +### Enhancements + +1. Make cursor focus switch automatically to the terminal after launching a python process with configuration option. (Thanks [djplt](https://github.com/djplt)) + ([#14851](https://github.com/Microsoft/vscode-python/issues/14851)) +1. Enable localization using vscode-nls. + ([#18286](https://github.com/Microsoft/vscode-python/issues/18286)) +1. Add support for referencing multiroot-workspace folders in settings using `${workspaceFolder:}`. + ([#18650](https://github.com/Microsoft/vscode-python/issues/18650)) +1. Ensure conda envs lacking an interpreter which do not use a valid python binary are also discovered and is selectable, so that `conda env list` matches with what the extension reports. + ([#18934](https://github.com/Microsoft/vscode-python/issues/18934)) +1. Improve information collected by the `Python: Report Issue` command. + ([#19067](https://github.com/Microsoft/vscode-python/issues/19067)) +1. Only trigger auto environment discovery if a user attempts to choose a different interpreter, or when a particular scope (a workspace folder or globally) is opened for the first time. + ([#19102](https://github.com/Microsoft/vscode-python/issues/19102)) +1. Added a proposed API to report progress of environment discovery in two phases. + ([#19103](https://github.com/Microsoft/vscode-python/issues/19103)) +1. Update to latest LS client (v8.0.0) and server (v8.0.0). + ([#19114](https://github.com/Microsoft/vscode-python/issues/19114)) +1. Update to latest LS client (v8.0.1) and server (v8.0.1) that contain the race condition fix around `LangClient.stop`. + ([#19139](https://github.com/Microsoft/vscode-python/issues/19139)) + +### Fixes + +1. Do not use `--user` flag when installing in a virtual environment. + ([#14327](https://github.com/Microsoft/vscode-python/issues/14327)) +1. Fix error `No such file or directory` on conda activate, and simplify the environment activation code. + ([#18989](https://github.com/Microsoft/vscode-python/issues/18989)) +1. Add proposed async execution API under environments. + ([#19079](https://github.com/Microsoft/vscode-python/issues/19079)) + +### Code Health + +1. Capture whether environment discovery was triggered using Quickpick UI. + ([#19077](https://github.com/Microsoft/vscode-python/issues/19077)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.6.0 (5 May 2022) + +### Enhancements + +1. Rewrite support for unittest test discovery. + ([#17242](https://github.com/Microsoft/vscode-python/issues/17242)) +1. Do not require a reload when swapping between language servers. + ([#18509](https://github.com/Microsoft/vscode-python/issues/18509)) + +### Fixes + +1. Do not show inherit env prompt for conda envs when running "remotely". + ([#18510](https://github.com/Microsoft/vscode-python/issues/18510)) +1. Fixes invalid regular expression logging error occurs when file paths contain special characters. + (Thanks [sunyinqi0508](https://github.com/sunyinqi0508)) + ([#18829](https://github.com/Microsoft/vscode-python/issues/18829)) +1. Do not prompt to select new virtual envrionment if it has already been selected. + ([#18915](https://github.com/Microsoft/vscode-python/issues/18915)) +1. Disable isort when using isort extension. + ([#18945](https://github.com/Microsoft/vscode-python/issues/18945)) +1. Remove `process` check from browser specific entry point for the extension. + ([#18974](https://github.com/Microsoft/vscode-python/issues/18974)) +1. Use built-in test refresh button. + ([#19012](https://github.com/Microsoft/vscode-python/issues/19012)) +1. Update vscode-telemetry-extractor to @vscode/telemetry-extractor@1.9.7. + (Thanks [Quan Zhuo](https://github.com/quanzhuo)) + ([#19036](https://github.com/Microsoft/vscode-python/issues/19036)) +1. Ensure 64-bit interpreters are preferred over 32-bit when auto-selecting. + ([#19042](https://github.com/Microsoft/vscode-python/issues/19042)) + +### Code Health + +1. Update Jedi minimum to python 3.7. + ([#18324](https://github.com/Microsoft/vscode-python/issues/18324)) +1. Stop using `--live-stream` when using `conda run` (see https://github.com/conda/conda/issues/11209 for details). + ([#18511](https://github.com/Microsoft/vscode-python/issues/18511)) +1. Remove prompt to recommend users in old insiders program to switch to pre-release. + ([#18809](https://github.com/Microsoft/vscode-python/issues/18809)) +1. Update requirements to remove python 2.7 version restrictions. + ([#19060](https://github.com/Microsoft/vscode-python/issues/19060)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.4.1 (7 April 2022) + +### Fixes + +1. Ensure `conda info` command isn't run multiple times during startup when large number of conda interpreters are present. + ([#18200](https://github.com/Microsoft/vscode-python/issues/18200)) +1. If a conda environment is not returned via the `conda env list` command, consider it as unknown env type. + ([#18530](https://github.com/Microsoft/vscode-python/issues/18530)) +1. Wrap file paths containing an ampersand in double quotation marks for running commands in a shell. + ([#18722](https://github.com/Microsoft/vscode-python/issues/18722)) +1. Fixes regression with support for python binaries not following the standard names. + ([#18835](https://github.com/Microsoft/vscode-python/issues/18835)) +1. Fix launch of Python Debugger when using conda environments. + ([#18847](https://github.com/Microsoft/vscode-python/issues/18847)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.4.0 (30 March 2022) + +### Enhancements + +1. Use new pre-release mechanism to install insiders. + ([#18144](https://github.com/Microsoft/vscode-python/issues/18144)) +1. Add support for detection and selection of conda environments lacking a python interpreter. + ([#18357](https://github.com/Microsoft/vscode-python/issues/18357)) +1. Retains the state of the TensorBoard webview. + ([#18591](https://github.com/Microsoft/vscode-python/issues/18591)) +1. Move interpreter info status bar item to the right. + ([#18710](https://github.com/Microsoft/vscode-python/issues/18710)) +1. `debugpy` updated to version `v1.6.0`. + ([#18795](https://github.com/Microsoft/vscode-python/issues/18795)) + +### Fixes + +1. Properly dismiss the error popup dialog when having a linter error. (Thanks [Virgil Sisoe](https://github.com/sisoe24)) + ([#18553](https://github.com/Microsoft/vscode-python/issues/18553)) +1. Python files are no longer excluded from Pytest arguments during test discovery. + (thanks [Marc Mueller](https://github.com/cdce8p/)) + ([#18562](https://github.com/Microsoft/vscode-python/issues/18562)) +1. Fixes regression caused due to using `conda run` for executing files. + ([#18634](https://github.com/Microsoft/vscode-python/issues/18634)) +1. Use `conda run` to get the activated environment variables instead of activation using shell scripts. + ([#18698](https://github.com/Microsoft/vscode-python/issues/18698)) + +### Code Health + +1. Remove old settings migrator. + ([#14334](https://github.com/Microsoft/vscode-python/issues/14334)) +1. Remove old language server setting migration. + ([#14337](https://github.com/Microsoft/vscode-python/issues/14337)) +1. Remove dependency on other file system watchers. + ([#18381](https://github.com/Microsoft/vscode-python/issues/18381)) +1. Update TypeScript version to 4.5.5. + ([#18602](https://github.com/Microsoft/vscode-python/issues/18602)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.2.0 (3 March 2022) + +### Enhancements + +1. Implement a "New Python File" command + ([#18376](https://github.com/Microsoft/vscode-python/issues/18376)) +1. Use `conda run` for conda environments for running python files and installing modules. + ([#18479](https://github.com/Microsoft/vscode-python/issues/18479)) +1. Better filename patterns for pip-requirements. + (thanks [Baptiste Darthenay](https://github.com/batisteo)) + ([#18498](https://github.com/Microsoft/vscode-python/issues/18498)) + +### Fixes + +1. Ensure clicking "Discovering Python Interpreters" in the status bar shows the current discovery progress. + ([#18443](https://github.com/Microsoft/vscode-python/issues/18443)) +1. Fixes Pylama output parsing with MyPy. (thanks [Nicola Marella](https://github.com/nicolamarella)) + ([#15609](https://github.com/Microsoft/vscode-python/issues/15609)) +1. Fix CPU load issue caused by poetry plugin by not watching directories which do not exist. + ([#18459](https://github.com/Microsoft/vscode-python/issues/18459)) +1. Explicitly add `"justMyCode": "true"` to all `launch.json` configurations. + (Thanks [Matt Bogosian](https://github.com/posita)) + ([#18471](https://github.com/Microsoft/vscode-python/issues/18471)) +1. Identify base conda environments inside pyenv correctly. + ([#18500](https://github.com/Microsoft/vscode-python/issues/18500)) +1. Fix for a crash when loading environments with no info. + ([#18594](https://github.com/Microsoft/vscode-python/issues/18594)) + +### Code Health + +1. Remove dependency on `ts-mock-imports`. + ([#14757](https://github.com/Microsoft/vscode-python/issues/14757)) +1. Update `vsce` to `v2.6.6`. + ([#18411](https://github.com/Microsoft/vscode-python/issues/18411)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.0.1 (8 February 2022) + +### Fixes + +1. Fix `invalid patch string` error when using conda. + ([#18455](https://github.com/Microsoft/vscode-python/issues/18455)) +1. Revert to old way of running debugger if conda version less than 4.9.0. + ([#18436](https://github.com/Microsoft/vscode-python/issues/18436)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2022.0.0 (3 February 2022) + +### Enhancements + +1. Add support for conda run without output, using `--no-capture-output` flag. + ([#7696](https://github.com/Microsoft/vscode-python/issues/7696)) +1. Add an option to clear interpreter setting for all workspace folders in multiroot scenario. + ([#17693](https://github.com/Microsoft/vscode-python/issues/17693)) +1. Public API for environments (proposed). + ([#17905](https://github.com/Microsoft/vscode-python/issues/17905)) +1. Group interpreters in interpreter quick picker using separators. + ([#17944](https://github.com/Microsoft/vscode-python/issues/17944)) +1. Add support for pylint error ranges. Requires Python 3.8 and pylint 2.12.2 or higher. (thanks [Marc Mueller](https://github.com/cdce8p)) + ([#18068](https://github.com/Microsoft/vscode-python/issues/18068)) +1. Move pinned interpreter status bar item towards the right behind `pythonInterpreterInfoPinned` experiment. + ([#18282](https://github.com/Microsoft/vscode-python/issues/18282)) +1. Move interpreter status bar item into the `Python` language status item behind `pythonInterpreterInfoUnpinned` experiment. + ([#18283](https://github.com/Microsoft/vscode-python/issues/18283)) +1. Update Jedi language server to latest. + ([#18325](https://github.com/Microsoft/vscode-python/issues/18325)) + +### Fixes + +1. Update zh-tw translations. (thanks [ted1030](https://github.com/ted1030)) + ([#17991](https://github.com/Microsoft/vscode-python/issues/17991)) +1. Support selecting conda environments with python `3.10`. + ([#18128](https://github.com/Microsoft/vscode-python/issues/18128)) +1. Fixes to telemetry handler in language server middleware. + ([#18188](https://github.com/Microsoft/vscode-python/issues/18188)) +1. Resolve system variables in `python.defaultInterpreterPath`. + ([#18207](https://github.com/Microsoft/vscode-python/issues/18207)) +1. Ensures interpreters are discovered even when running `interpreterInfo.py` script prints more than just the script output. + ([#18234](https://github.com/Microsoft/vscode-python/issues/18234)) +1. Remove restrictions on using `purpose` in debug configuration. + ([#18248](https://github.com/Microsoft/vscode-python/issues/18248)) +1. Ensure Python Interpreter information in the status bar is updated if Interpreter information changes. + ([#18257](https://github.com/Microsoft/vscode-python/issues/18257)) +1. Fix "Run Selection/Line in Python Terminal" for Python < 3.8 when the code includes decorators. + ([#18258](https://github.com/Microsoft/vscode-python/issues/18258)) +1. Ignore notebook cells for pylance. Jupyter extension is handling notebooks. + ([#18259](https://github.com/Microsoft/vscode-python/issues/18259)) +1. Fix for UriError when using python.interpreterPath command in tasks. + ([#18285](https://github.com/Microsoft/vscode-python/issues/18285)) +1. Ensure linting works under `conda run` (work-around for https://github.com/conda/conda/issues/10972). + ([#18364](https://github.com/Microsoft/vscode-python/issues/18364)) +1. Ensure items are removed from the array in reverse order when using array indices. + ([#18382](https://github.com/Microsoft/vscode-python/issues/18382)) +1. Log experiments only after we finish updating active experiments list. + ([#18393](https://github.com/Microsoft/vscode-python/issues/18393)) + +### Code Health + +1. Improve unit tests for envVarsService, in particular the variable substitution logic (Thanks [Keshav Kini](https://github.com/kini)) + ([#17747](https://github.com/Microsoft/vscode-python/issues/17747)) +1. Remove `python.pythonPath` setting and `pythonDeprecatePythonPath` experiment. + ([#17977](https://github.com/Microsoft/vscode-python/issues/17977)) +1. Remove `pythonTensorboardExperiment` and `PythonPyTorchProfiler` experiments. + ([#18074](https://github.com/Microsoft/vscode-python/issues/18074)) +1. Reduce direct dependency on IOutputChannel. + ([#18132](https://github.com/Microsoft/vscode-python/issues/18132)) +1. Upgrade to Node 14 LTS (v14.18.2). + ([#18148](https://github.com/Microsoft/vscode-python/issues/18148)) +1. Switch `jedils_requirements.txt` to `requirements.txt` under `pythonFiles/jedilsp_requirements/`. + ([#18185](https://github.com/Microsoft/vscode-python/issues/18185)) +1. Removed `experiments.json` file. + ([#18235](https://github.com/Microsoft/vscode-python/issues/18235)) +1. Fixed typescript and namespace errors. (Thanks [Harry-Hopkinson](https://github.com/Harry-Hopkinson)) + ([#18345](https://github.com/Microsoft/vscode-python/issues/18345)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Pylance](https://github.com/microsoft/pylance-release) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.12.0 (9 December 2021) + +### Enhancements + +1. Python extension should activate on onDebugInitialConfigurations. + (thanks [Nayana Vinod](https://github.com/nayana-vinod) and [Jessica Jolly](https://github.com/JessieJolly)). + ([#9557](https://github.com/Microsoft/vscode-python/issues/9557)) +1. Declare limited support when running in virtual workspaces by only supporting language servers. + ([#17519](https://github.com/Microsoft/vscode-python/issues/17519)) +1. Add a "Do not show again" option to the formatter installation prompt. + ([#17937](https://github.com/Microsoft/vscode-python/issues/17937)) +1. Add the ability to install `pip` if missing, when installing missing packages from the `Jupyter Extension`. + ([#17975](https://github.com/Microsoft/vscode-python/issues/17975)) +1. Declare limited support for untrusted workspaces by only supporting Pylance. + ([#18031](https://github.com/Microsoft/vscode-python/issues/18031)) +1. Update to latest jedi language server. + ([#18051](https://github.com/Microsoft/vscode-python/issues/18051)) +1. Add language status item indicating that extension works partially in virtual and untrusted workspaces. + ([#18059](https://github.com/Microsoft/vscode-python/issues/18059)) + +### Fixes + +1. Partial fix for using the same directory as discovery when running tests. + (thanks [Brian Rutledge](https://github.com/bhrutledge)) + ([#9553](https://github.com/Microsoft/vscode-python/issues/9553)) +1. Handle decorators properly when using the `Run Selection/Line in Python Terminal` command. + ([#15058](https://github.com/Microsoft/vscode-python/issues/15058)) +1. Don't interpret `--rootdir` as a test folder for `pytest`. + (thanks [Brian Rutledge](https://github.com/bhrutledge)) + ([#16079](https://github.com/Microsoft/vscode-python/issues/16079)) +1. Ensure debug configuration env variables overwrite env variables defined in .env file. + ([#16984](https://github.com/Microsoft/vscode-python/issues/16984)) +1. Fix for `pytest` run all tests when using `pytest.ini` and `cwd`. + (thanks [Brian Rutledge](https://github.com/bhrutledge)) + ([#17546](https://github.com/Microsoft/vscode-python/issues/17546)) +1. When parsing pytest node ids with parameters, use native pytest information to separate out the parameter decoration rather than try and parse the nodeid as text. + (thanks [Martijn Pieters](https://github.com/mjpieters)) + ([#17676](https://github.com/Microsoft/vscode-python/issues/17676)) +1. Do not process system Python 2 installs on macOS Monterey. + ([#17870](https://github.com/Microsoft/vscode-python/issues/17870)) +1. Remove duplicate "Clear Workspace Interpreter Setting" command from the command palette. + ([#17890](https://github.com/Microsoft/vscode-python/issues/17890)) +1. Ensure that path towards extenal tools like linters are not synched between + machines. (thanks [Sorin Sbarnea](https://github.com/ssbarnea)) + ([#18008](https://github.com/Microsoft/vscode-python/issues/18008)) +1. Increase timeout for activation of conda environments from 30s to 60s. + ([#18017](https://github.com/Microsoft/vscode-python/issues/18017)) + +### Code Health + +1. Removing experiments for refresh and failed tests buttons. + ([#17868](https://github.com/Microsoft/vscode-python/issues/17868)) +1. Remove caching debug configuration experiment only. + ([#17895](https://github.com/Microsoft/vscode-python/issues/17895)) +1. Remove "join mailing list" notification experiment. + ([#17904](https://github.com/Microsoft/vscode-python/issues/17904)) +1. Remove dependency on `winston` logger. + ([#17921](https://github.com/Microsoft/vscode-python/issues/17921)) +1. Bump isort from 5.9.3 to 5.10.0. + ([#17923](https://github.com/Microsoft/vscode-python/issues/17923)) +1. Remove old discovery code and discovery experiments. + ([#17962](https://github.com/Microsoft/vscode-python/issues/17962)) +1. Remove dependency on `azure-storage`. + ([#17972](https://github.com/Microsoft/vscode-python/issues/17972)) +1. Ensure telemetry correctly identifies when users set linter paths. + ([#18019](https://github.com/Microsoft/vscode-python/issues/18019)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.11.0 (4 November 2021) + +### Enhancements + +1. Improve setting description for enabling A/B tests. (Thanks [Thi Le](https://github.com/thi-lee)) + ([#7793](https://github.com/Microsoft/vscode-python/issues/7793)) +1. Support `expectedFailure` when running `unittest` tests using `pytest`. + ([#8427](https://github.com/Microsoft/vscode-python/issues/8427)) +1. Support environment variable substitution in `python` property for `launch.json`. + ([#12289](https://github.com/Microsoft/vscode-python/issues/12289)) +1. Update homebrew instructions to install python 3. + (thanks [Carolinekung2 ](https://github.com/Carolinekung2)) + ([#17590](https://github.com/Microsoft/vscode-python/issues/17590)) + +### Fixes + +1. Reworded message for A/B testing in the output channel to "Experiment 'X' is active/inactive". + (Thanks [Vidushi Gupta](https://github.com/Vidushi-Gupta) for the contribution) + ([#6352](https://github.com/Microsoft/vscode-python/issues/6352)) +1. Change text to "Select at workspace level" instead of "Entire workspace" when selecting or clearing interpreters in a multiroot folder scenario. + (Thanks [Quynh Do](https://github.com/quynhd07)) + ([#10737](https://github.com/Microsoft/vscode-python/issues/10737)) +1. Fix unresponsive extension issues caused by discovery component. + ([#11924](https://github.com/Microsoft/vscode-python/issues/11924)) +1. Remove duplicate 'Run Python file' commands in command palette. + ([#14562](https://github.com/Microsoft/vscode-python/issues/14562)) +1. Change drive first before changing directory in windows, to anticipate running file outside working directory with different storage drive. (thanks [afikrim](https://github.com/afikrim)) + ([#14730](https://github.com/Microsoft/vscode-python/issues/14730)) +1. Support installing Insiders extension in remote sessions. + ([#15145](https://github.com/Microsoft/vscode-python/issues/15145)) +1. If the executeInFileDir setting is enabled, always change to the script directory before running the script, even if the script is in the Workspace folder. (thanks (acash715)[https://github.com/acash715]) + ([#15181](https://github.com/Microsoft/vscode-python/issues/15181)) +1. replaceAll for replacing separators. (thanks [Aliva Das](https://github.com/IceJinx33)) + ([#15288](https://github.com/Microsoft/vscode-python/issues/15288)) +1. When activating environment, creating new Integrated Terminal doesn't take selected workspace into account. (Thanks [Vidushi Gupta](https://github.com/Vidushi-Gupta) for the contribution) + ([#15522](https://github.com/Microsoft/vscode-python/issues/15522)) +1. Fix truncated mypy errors by setting `--no-pretty`. + (thanks [Peter Lithammer](https://github.com/lithammer)) + ([#16836](https://github.com/Microsoft/vscode-python/issues/16836)) +1. Renamed the commands in the Run/Debug button of the editor title. (thanks (Analía Bannura)[https://github.com/analiabs] and (Anna Arsentieva)[https://github.com/arsentieva]) + ([#17019](https://github.com/Microsoft/vscode-python/issues/17019)) +1. Fix for `pytest` run all tests when using `pytest.ini`. + ([#17546](https://github.com/Microsoft/vscode-python/issues/17546)) +1. Ensures test node is updated when `unittest` sub-tests are used. + ([#17561](https://github.com/Microsoft/vscode-python/issues/17561)) +1. Update debugpy to 1.5.1 to ensure user-unhandled exception setting is false by default. + ([#17789](https://github.com/Microsoft/vscode-python/issues/17789)) +1. Ensure we filter out unsupported features in web scenario using `shellExecutionSupported` context key. + ([#17811](https://github.com/Microsoft/vscode-python/issues/17811)) +1. Remove `python.condaPath` from workspace scope. + ([#17819](https://github.com/Microsoft/vscode-python/issues/17819)) +1. Make updateTestItemFromRawData async to prevent blocking the extension. + ([#17823](https://github.com/Microsoft/vscode-python/issues/17823)) +1. Semantic colorization can sometimes require reopening or scrolling of a file. + ([#17878](https://github.com/Microsoft/vscode-python/issues/17878)) + +### Code Health + +1. Remove TSLint comments since we use ESLint. + ([#4060](https://github.com/Microsoft/vscode-python/issues/4060)) +1. Remove unused SHA512 hashing code. + ([#7333](https://github.com/Microsoft/vscode-python/issues/7333)) +1. Remove unused packages. + ([#16840](https://github.com/Microsoft/vscode-python/issues/16840)) +1. Remove old discovery code and discovery experiments. + ([#17795](https://github.com/Microsoft/vscode-python/issues/17795)) +1. Do not query for version and kind if it's not needed when reporting an issue. + ([#17815](https://github.com/Microsoft/vscode-python/issues/17815)) +1. Remove Microsoft Python Language Server support from the extension. + ([#17834](https://github.com/Microsoft/vscode-python/issues/17834)) +1. Bump `packaging` from 21.0 to 21.2. + ([#17886](https://github.com/Microsoft/vscode-python/issues/17886)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.10.1 (13 October 2021) + +### Enhancements + +1. Provide IntelliSense status information when using `github.dev` or any other web platform. + ([#17658](https://github.com/Microsoft/vscode-python/issues/17658)) + +### Fixes + +1. Ensure commands run are not logged twice in Python output channel. + ([#7160](https://github.com/Microsoft/vscode-python/issues/7160)) +1. Ensure we use fragment when formatting notebook cells. + ([#16980](https://github.com/Microsoft/vscode-python/issues/16980)) +1. Hide UI elements that are not applicable when using `github.dev` or any other web platform. + ([#17252](https://github.com/Microsoft/vscode-python/issues/17252)) +1. Localize strings on `github.dev` using VSCode FS API. + ([#17712](https://github.com/Microsoft/vscode-python/issues/17712)) + +### Code Health + +1. Log commands run by the discovery component in the output channel. + ([#16732](https://github.com/Microsoft/vscode-python/issues/16732)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.10.0 (7 October 2021) + +### Enhancements + +1. Set the default value of `python.linting.pylintEnabled` to `false`. + ([#3007](https://github.com/Microsoft/vscode-python/issues/3007)) +1. Phase out Jedi 0.17, and use Jedi behind a language server protocol as the Jedi option. Remove Jedi-related settings `python.jediMemoryLimit` and `python.jediPath`, since they are not used with the new language server implementation. + ([#11995](https://github.com/Microsoft/vscode-python/issues/11995)) +1. Add support for dynamic updates in interpreter list. + ([#17043](https://github.com/Microsoft/vscode-python/issues/17043)) +1. Query for fresh workspace envs when auto-selecting interpreters in a new workspace. + ([#17264](https://github.com/Microsoft/vscode-python/issues/17264)) +1. Increase Microsoft Python Language Server deprecation prompt frequency and update wording. + ([#17361](https://github.com/Microsoft/vscode-python/issues/17361)) +1. Remove "The Python extension will have limited support for Python 2.7 in the next release" notification. + ([#17451](https://github.com/Microsoft/vscode-python/issues/17451)) +1. Added non-blocking discovery APIs for Jupyter. + ([#17452](https://github.com/Microsoft/vscode-python/issues/17452)) +1. Resolve environments using cache if cache has complete env info. + ([#17474](https://github.com/Microsoft/vscode-python/issues/17474)) +1. Ensure debugger contribution points are turned off when using virtual workspaces. + ([#17493](https://github.com/Microsoft/vscode-python/issues/17493)) +1. Display a notification about the end of Jedi support when using Python 2.7. + ([#17512](https://github.com/Microsoft/vscode-python/issues/17512)) +1. If user has selected an interpreter which is not discovery cache, correctly add it to cache. + ([#17575](https://github.com/Microsoft/vscode-python/issues/17575)) +1. Update to latest version of Jedi LS. + ([#17591](https://github.com/Microsoft/vscode-python/issues/17591)) +1. Update to `vscode-extension-telemetry` 0.4.2. + ([#17608](https://github.com/Microsoft/vscode-python/issues/17608)) + +### Fixes + +1. Don't override user provided `--rootdir` in pytest args. + ([#8678](https://github.com/Microsoft/vscode-python/issues/8678)) +1. Don't log error during settings migration if settings.json doesn't exist. + ([#11354](https://github.com/Microsoft/vscode-python/issues/11354)) +1. Fix casing of text in `unittest` patterns quickpick. + (thanks [Anupama Nadig](https://github.com/anu-ka)) + ([#17093](https://github.com/Microsoft/vscode-python/issues/17093)) +1. Use quickpick details for the "Use Python from `python.defaultInterpreterPath` setting" entry. + ([#17124](https://github.com/Microsoft/vscode-python/issues/17124)) +1. Fix refreshing progress display in the status bar. + ([#17338](https://github.com/Microsoft/vscode-python/issues/17338)) +1. Ensure we do not start a new discovery for an event if one is already scheduled. + ([#17339](https://github.com/Microsoft/vscode-python/issues/17339)) +1. Do not display workspace related envs if no workspace is open. + ([#17358](https://github.com/Microsoft/vscode-python/issues/17358)) +1. Ensure we correctly evaluate Unknown type before sending startup telemetry. + ([#17362](https://github.com/Microsoft/vscode-python/issues/17362)) +1. Fix for unittest discovery failure due to root id mismatch. + ([#17386](https://github.com/Microsoft/vscode-python/issues/17386)) +1. Improve pattern matching for shell detection on Windows. + (thanks [Erik Demaine](https://github.com/edemaine/)) + ([#17426](https://github.com/Microsoft/vscode-python/issues/17426)) +1. Changed the way of searching left bracket `[` in case of subsets of tests. + (thanks [ilexei](https://github.com/ilexei)) + ([#17461](https://github.com/Microsoft/vscode-python/issues/17461)) +1. Fix hang caused by loop in getting interpreter information. + ([#17484](https://github.com/Microsoft/vscode-python/issues/17484)) +1. Ensure database storage extension uses to track all storages does not grow unnecessarily. + ([#17488](https://github.com/Microsoft/vscode-python/issues/17488)) +1. Ensure all users use new discovery code regardless of their experiment settings. + ([#17563](https://github.com/Microsoft/vscode-python/issues/17563)) +1. Add timeout when discovery runs `conda info --json` command. + ([#17576](https://github.com/Microsoft/vscode-python/issues/17576)) +1. Use `conda-forge` channel when installing packages into conda environments. + ([#17628](https://github.com/Microsoft/vscode-python/issues/17628)) + +### Code Health + +1. Remove support for `rope`. Refactoring now supported via language servers. + ([#10440](https://github.com/Microsoft/vscode-python/issues/10440)) +1. Remove `pylintMinimalCheckers` setting. Syntax errors now reported via language servers. + ([#13321](https://github.com/Microsoft/vscode-python/issues/13321)) +1. Remove `ctags` support. Workspace symbols now supported via language servers. + ([#16063](https://github.com/Microsoft/vscode-python/issues/16063)) +1. Fix linting for some files in .eslintignore. + ([#17181](https://github.com/Microsoft/vscode-python/issues/17181)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.9.3 (20 September 2021) + +### Fixes + +1. Fix `Python extension loading...` issue for users who have disabled telemetry. + ([#17447](https://github.com/Microsoft/vscode-python/issues/17447)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.9.2 (13 September 2021) + +### Fixes + +1. Ensure line feeds are changed to CRLF in test messages. + ([#17111](https://github.com/Microsoft/vscode-python/issues/17111)) +1. Fix for `unittest` ModuleNotFoundError when discovering tests. + ([#17363](https://github.com/Microsoft/vscode-python/issues/17363)) +1. Ensure we block getting active interpreter on auto-selection. + ([#17370](https://github.com/Microsoft/vscode-python/issues/17370)) +1. Fix to handle undefined uri in debug in terminal command. + ([#17374](https://github.com/Microsoft/vscode-python/issues/17374)) +1. Fix for missing buttons for tests when using multiple test folders. + ([#17378](https://github.com/Microsoft/vscode-python/issues/17378)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.9.1 (9 September 2021) + +### Fixes + +1. Fix for debug configuration used when no launch.json exists is still used after launch.json is created. + ([#17353](https://github.com/Microsoft/vscode-python/issues/17353)) +1. Ensure default python executable to use is 'python' instead of ''. + ([#17089](https://github.com/Microsoft/vscode-python/issues/17089)) +1. Ensure workspace interpreters are discovered and watched when in `pythonDiscoveryModuleWithoutWatcher` experiment. + ([#17144](https://github.com/Microsoft/vscode-python/issues/17144)) +1. Do path comparisons appropriately in the new discovery component. + ([#17244](https://github.com/Microsoft/vscode-python/issues/17244)) +1. Fix for test result not found for files starting with py. + ([#17270](https://github.com/Microsoft/vscode-python/issues/17270)) +1. Fix for unable to import when running unittest. + ([#17280](https://github.com/Microsoft/vscode-python/issues/17280)) +1. Fix for multiple folders in `pytest` args. + ([#17281](https://github.com/Microsoft/vscode-python/issues/17281)) +1. Fix issue with incomplete `unittest` runs. + ([#17282](https://github.com/Microsoft/vscode-python/issues/17282)) +1. Improve detecting lines when using testing wrappers. + ([#17285](https://github.com/Microsoft/vscode-python/issues/17285)) +1. Ensure we trigger discovery for the first time as part of extension activation. + ([#17303](https://github.com/Microsoft/vscode-python/issues/17303)) +1. Correctly indicate when interpreter refresh has finished. + ([#17335](https://github.com/Microsoft/vscode-python/issues/17335)) +1. Missing location info for `async def` functions. + ([#17309](https://github.com/Microsoft/vscode-python/issues/17309)) +1. For CI ensure `tensorboard` is installed in python 3 environments only. + ([#17325](https://github.com/Microsoft/vscode-python/issues/17325)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.9.0 (1 September 2021) + +### Enhancements + +1. Added commands to select and run a set of tests. + ([#3652](https://github.com/Microsoft/vscode-python/issues/3652)) +1. Fix for tests should be re-discovered after switching environment. + ([#5347](https://github.com/Microsoft/vscode-python/issues/5347)) +1. Remove the testing functionality from the status bar. + ([#8405](https://github.com/Microsoft/vscode-python/issues/8405)) +1. Automatically detect new test file in test explorer. + ([#8675](https://github.com/Microsoft/vscode-python/issues/8675)) +1. Search test names in test explorer. + ([#8836](https://github.com/Microsoft/vscode-python/issues/8836)) +1. Added a command for displaying the test explorer. + ([#9026](https://github.com/Microsoft/vscode-python/issues/9026)) +1. Make "run all tests" icon gray instead of green. + ([#9402](https://github.com/Microsoft/vscode-python/issues/9402)) +1. Use VS Code's test UI instead of code lenses above tests. + ([#10898](https://github.com/Microsoft/vscode-python/issues/10898)) +1. Added command to run last executed test. + ([#11864](https://github.com/Microsoft/vscode-python/issues/11864)) +1. Fix for PyTest discovery can fail but not give any clue as to what the problem is. + ([#12043](https://github.com/Microsoft/vscode-python/issues/12043)) +1. Add shortcut to run the current test (at cursor position). + ([#12218](https://github.com/Microsoft/vscode-python/issues/12218)) +1. Run all tests in a multi-root workspace without prompting. + ([#13147](https://github.com/Microsoft/vscode-python/issues/13147)) +1. Plug into VS Code's Test UI. + ([#15750](https://github.com/Microsoft/vscode-python/issues/15750)) +1. Show notification to join insiders after 5 mins. + ([#16833](https://github.com/Microsoft/vscode-python/issues/16833)) +1. Update Simplified Chinese translation. (thanks [FiftysixTimes7](https://github.com/FiftysixTimes7)) + ([#16916](https://github.com/Microsoft/vscode-python/issues/16916)) +1. Added Debug file button to editor run menu. + ([#16924](https://github.com/Microsoft/vscode-python/issues/16924)) +1. Cache last selection for debug configuration when debugging without launch.json. + ([#16934](https://github.com/Microsoft/vscode-python/issues/16934)) +1. Improve display of default interpreter and suggested interpreter in the interpreter selection quick pick. + ([#16971](https://github.com/Microsoft/vscode-python/issues/16971)) +1. Improve discovery component API. + ([#17005](https://github.com/Microsoft/vscode-python/issues/17005)) +1. Add a notification about Python 2.7 support, displayed whenever a tool is used or whenever debugging is started. + ([#17009](https://github.com/Microsoft/vscode-python/issues/17009)) +1. Add caching debug configuration behind experiment. + ([#17025](https://github.com/Microsoft/vscode-python/issues/17025)) +1. Do not query to get all interpreters where it's not needed in the extension code. + ([#17030](https://github.com/Microsoft/vscode-python/issues/17030)) +1. Add a warning prompt for the Microsoft Python Language Server deprecation. + ([#17056](https://github.com/Microsoft/vscode-python/issues/17056)) +1. Update to latest jedi-language-server. + ([#17072](https://github.com/Microsoft/vscode-python/issues/17072)) + +### Fixes + +1. Fix for test code lenses do not disappear even after disabling the unit tests. + ([#1654](https://github.com/Microsoft/vscode-python/issues/1654)) +1. Fix for code lens for a test class run under unittest doesn't show overall results for methods. + ([#2382](https://github.com/Microsoft/vscode-python/issues/2382)) +1. Fix for test code lens do not appear on initial activation of testing support. + ([#2644](https://github.com/Microsoft/vscode-python/issues/2644)) +1. Fix for "No tests ran, please check the configuration settings for the tests". + ([#2660](https://github.com/Microsoft/vscode-python/issues/2660)) +1. Fix for code lenses disappear on save, then re-appear when tabbing on/off the file. + ([#2790](https://github.com/Microsoft/vscode-python/issues/2790)) +1. Fix for code lenses for tests not showing up when test is defined on line 1. + ([#3062](https://github.com/Microsoft/vscode-python/issues/3062)) +1. Fix for command 'python.runtests' not found. + ([#3591](https://github.com/Microsoft/vscode-python/issues/3591)) +1. Fix for navigation to code doesn't work with parameterized tests. + ([#4469](https://github.com/Microsoft/vscode-python/issues/4469)) +1. Fix for tests are not being discovered at first in multiroot workspace. + ([#4848](https://github.com/Microsoft/vscode-python/issues/4848)) +1. Fix for tests not found after upgrade. + ([#5417](https://github.com/Microsoft/vscode-python/issues/5417)) +1. Fix for failed icon of the first failed test doesn't changed to running icon when using unittest framework. + ([#5791](https://github.com/Microsoft/vscode-python/issues/5791)) +1. Fix for failure details in unittest discovery are not always logged. + ([#5889](https://github.com/Microsoft/vscode-python/issues/5889)) +1. Fix for test results not updated if test is run via codelens. + ([#6787](https://github.com/Microsoft/vscode-python/issues/6787)) +1. Fix for "Run Current Test File" is not running tests, just discovering them. + ([#7150](https://github.com/Microsoft/vscode-python/issues/7150)) +1. Fix for testing code lenses don't show for remote sessions to a directory symlink. + ([#7443](https://github.com/Microsoft/vscode-python/issues/7443)) +1. Fix for discover test per folder icon is missing in multi-root workspace after upgrade. + ([#7870](https://github.com/Microsoft/vscode-python/issues/7870)) +1. Fix for clicking on a test in the Test Explorer does not navigate to the correct test. + ([#8448](https://github.com/Microsoft/vscode-python/issues/8448)) +1. Fix for if multiple tests have the same name, only one is run. + ([#8761](https://github.com/Microsoft/vscode-python/issues/8761)) +1. Fix for test failure is reported as a compile error. + ([#9640](https://github.com/Microsoft/vscode-python/issues/9640)) +1. Fix for discovering tests immediately after interpreter change often fails. + ([#9854](https://github.com/Microsoft/vscode-python/issues/9854)) +1. Fix for unittest module invoking wrong TestCase. + ([#10972](https://github.com/Microsoft/vscode-python/issues/10972)) +1. Fix for unable to navigate to test function. + ([#11866](https://github.com/Microsoft/vscode-python/issues/11866)) +1. Fix for running test fails trying to access non-existing file. + ([#12403](https://github.com/Microsoft/vscode-python/issues/12403)) +1. Fix for code lenses don't work after opening files from different projects in workspace. + ([#12995](https://github.com/Microsoft/vscode-python/issues/12995)) +1. Fix for the pytest icons keep spinning when run Test Method. + ([#13285](https://github.com/Microsoft/vscode-python/issues/13285)) +1. Test for any functionality related to testing doesn't work if language server is set to none. + ([#13713](https://github.com/Microsoft/vscode-python/issues/13713)) +1. Fix for cannot configure PyTest from UI. + ([#13916](https://github.com/Microsoft/vscode-python/issues/13916)) +1. Fix for test icons not updating when using pytest. + ([#15260](https://github.com/Microsoft/vscode-python/issues/15260)) +1. Fix for debugging tests is returning errors due to "unsupported status". + ([#15736](https://github.com/Microsoft/vscode-python/issues/15736)) +1. Removes `"request": "test"` as a config option. This can now be done with `"purpose": ["debug-test"]`. + ([#15790](https://github.com/Microsoft/vscode-python/issues/15790)) +1. Fix for "There was an error in running the tests" when stopping debugger. + ([#16475](https://github.com/Microsoft/vscode-python/issues/16475)) +1. Use the vscode API appropriately to find out what terminal is being used. + ([#16577](https://github.com/Microsoft/vscode-python/issues/16577)) +1. Fix unittest discovery. (thanks [JulianEdwards](https://github.com/bigjools)) + ([#16593](https://github.com/Microsoft/vscode-python/issues/16593)) +1. Fix run `installPythonLibs` error in windows. + ([#16844](https://github.com/Microsoft/vscode-python/issues/16844)) +1. Fix for test welcome screen flashes on refresh. + ([#16855](https://github.com/Microsoft/vscode-python/issues/16855)) +1. Show re-run failed test button only when there are failed tests. + ([#16856](https://github.com/Microsoft/vscode-python/issues/16856)) +1. Triggering test refresh shows progress indicator. + ([#16891](https://github.com/Microsoft/vscode-python/issues/16891)) +1. Fix environment sorting for the `Python: Select Interpreter` command. + (thanks [Marc Mueller](https://github.com/cdce8p)) + ([#16893](https://github.com/Microsoft/vscode-python/issues/16893)) +1. Fix for unittest not getting discovered in all cases. + ([#16902](https://github.com/Microsoft/vscode-python/issues/16902)) +1. Don't show full path in the description for each test node. + ([#16927](https://github.com/Microsoft/vscode-python/issues/16927)) +1. Fix for no notification shown if test framework is not configured and run all tests is called. + ([#16941](https://github.com/Microsoft/vscode-python/issues/16941)) +1. In experiments service don't always `await` on `initialfetch` which can be slow depending on the network. + ([#16959](https://github.com/Microsoft/vscode-python/issues/16959)) +1. Ensure 2.7 unittest still work with new test support. + ([#16962](https://github.com/Microsoft/vscode-python/issues/16962)) +1. Fix issue with parsing test run ids for reporting test status. + ([#16963](https://github.com/Microsoft/vscode-python/issues/16963)) +1. Fix cell magics, line magics, and shell escaping in jupyter notebooks to not show error diagnostics. + ([#17058](https://github.com/Microsoft/vscode-python/issues/17058)) +1. Fix for testing ui update issue when `pytest` parameter has '/'. + ([#17079](https://github.com/Microsoft/vscode-python/issues/17079)) + +### Code Health + +1. Remove nose test support. + ([#16371](https://github.com/Microsoft/vscode-python/issues/16371)) +1. Remove custom start page experience in favor of VSCode's built-in walkthrough support. + ([#16453](https://github.com/Microsoft/vscode-python/issues/16453)) +1. Run auto-selection only once, and return the cached value for subsequent calls. + ([#16735](https://github.com/Microsoft/vscode-python/issues/16735)) +1. Add telemetry for when an interpreter gets auto-selected. + ([#16764](https://github.com/Microsoft/vscode-python/issues/16764)) +1. Remove pre-existing environment sorting algorithm and old rule-based auto-selection logic. + ([#16935](https://github.com/Microsoft/vscode-python/issues/16935)) +1. Add API to run code after extension activation. + ([#16983](https://github.com/Microsoft/vscode-python/issues/16983)) +1. Add telemetry sending time it took to load data from experiment service. + ([#17011](https://github.com/Microsoft/vscode-python/issues/17011)) +1. Improve reliability of virtual env tests and disable poetry watcher tests. + ([#17088](https://github.com/Microsoft/vscode-python/issues/17088)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [poetry](https://pypi.org/project/poetry/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.8.3 (23 August 2021) + +### Fixes + +1. Update `vsce` to latest to fix metadata in VSIX for web extension. + ([#17049](https://github.com/Microsoft/vscode-python/issues/17049)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.8.2 (19 August 2021) + +### Enhancements + +1. Add a basic web extension bundle. + ([#16869](https://github.com/Microsoft/vscode-python/issues/16869)) +1. Add basic Pylance support to the web extension. + ([#16870](https://github.com/Microsoft/vscode-python/issues/16870)) + +### Code Health + +1. Update telemetry client to support browser, plumb to Pylance. + ([#16871](https://github.com/Microsoft/vscode-python/issues/16871)) +1. Refactor language server middleware to work in the browser. + ([#16872](https://github.com/Microsoft/vscode-python/issues/16872)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.8.1 (6 August 2021) + +### Fixes + +1. Fix random delay before running python code. + ([#16768](https://github.com/Microsoft/vscode-python/issues/16768)) +1. Fix the order of default unittest arguments. + (thanks [Nikolay Kondratyev](https://github.com/kondratyev-nv/)) + ([#16882](https://github.com/Microsoft/vscode-python/issues/16882)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.8.0 (5 August 2021) + +### Enhancements + +1. Add new getting started page using VS Code's API to replace our custom start page. + ([#16678](https://github.com/Microsoft/vscode-python/issues/16678)) +1. Replace deprecated vscode-test with @vscode/test-electron for CI. (thanks [iChenLei](https://github.com/iChenLei)) + ([#16765](https://github.com/Microsoft/vscode-python/issues/16765)) + +### Code Health + +1. Sort Settings Alphabetically. (thanks [bfarahdel](https://github.com/bfarahdel)) + ([#8406](https://github.com/Microsoft/vscode-python/issues/8406)) +1. Changed default language server to `Pylance` for extension development. (thanks [jasleen101010](https://github.com/jasleen101010)) + ([#13007](https://github.com/Microsoft/vscode-python/issues/13007)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.7.2 (23 July 2021) + +### Enhancements + +1. Update `debugpy` with fix for https://github.com/microsoft/debugpy/issues/669. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.7.1 (21 July 2021) + +### Enhancements + +1. Update `debugpy` to the latest version. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.7.0 (20 July 2021) + +### Enhancements + +1. Support starting a TensorBoard session with a remote URL hosting log files. + ([#16461](https://github.com/Microsoft/vscode-python/issues/16461)) +1. Sort environments in the selection quickpick by assumed usefulness. + ([#16520](https://github.com/Microsoft/vscode-python/issues/16520)) + +### Fixes + +1. Add link to docs page on how to install the Python extension to README. (thanks [KamalSinghKhanna](https://github.com/KamalSinghKhanna)) + ([#15199](https://github.com/Microsoft/vscode-python/issues/15199)) +1. Make test explorer only show file/folder names on nodes. + (thanks [bobwalker99](https://github.com/bobwalker99)) + ([#16368](https://github.com/Microsoft/vscode-python/issues/16368)) +1. Ensure we dispose restart command registration before we create a new instance of Jedi LS. + ([#16441](https://github.com/Microsoft/vscode-python/issues/16441)) +1. Ensure `shellIdentificationSource` is set correctly. (thanks [intrigus-lgtm](https://github.com/intrigus-lgtm)) + ([#16517](https://github.com/Microsoft/vscode-python/issues/16517)) +1. Clear Notebook Cell diagnostics when deleting a cell or closing a notebook. + ([#16528](https://github.com/Microsoft/vscode-python/issues/16528)) +1. The `poetryPath` setting will correctly apply system variable substitutions. (thanks [Anthony Shaw](https://github.com/tonybaloney)) + ([#16607](https://github.com/Microsoft/vscode-python/issues/16607)) +1. The Jupyter Notebook extension will install any missing dependencies using Poetry or Pipenv if those are the selected environments. (thanks [Anthony Shaw](https://github.com/tonybaloney)) + ([#16615](https://github.com/Microsoft/vscode-python/issues/16615)) +1. Ensure we block on autoselection when no interpreter is explictly set by user. + ([#16723](https://github.com/Microsoft/vscode-python/issues/16723)) +1. Fix autoselection when opening a python file directly. + ([#16733](https://github.com/Microsoft/vscode-python/issues/16733)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.6.0 (16 June 2021) + +### Enhancements + +1. Improved telemetry around the availability of `pip` for installation of Jupyter dependencies. + ([#15937](https://github.com/Microsoft/vscode-python/issues/15937)) +1. Move the Jupyter extension from being a hard dependency to an optional one, and display an informational prompt if Jupyter commands try to be executed from the Start Page. + ([#16102](https://github.com/Microsoft/vscode-python/issues/16102)) +1. Add an `enumDescriptions` key under the `python.languageServer` setting to describe all language server options. + ([#16141](https://github.com/Microsoft/vscode-python/issues/16141)) +1. Ensure users upgrade to v0.2.0 of the torch-tb-profiler TensorBoard plugin to access jump-to-source functionality. + ([#16330](https://github.com/Microsoft/vscode-python/issues/16330)) +1. Added `python.defaultInterpreterPath` setting at workspace level when in `pythonDeprecatePythonPath` experiment. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) +1. Added default Interpreter path entry at the bottom of the interpreter list. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) +1. Remove execution isolation script used to run tools. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) +1. Show `python.pythonPath` deprecation prompt when in `pythonDeprecatePythonPath` experiment. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) +1. Do not show safety prompt before auto-selecting a workspace interpreter. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) +1. Assume workspace interpreters are safe to execute for discovery. + ([#16485](https://github.com/Microsoft/vscode-python/issues/16485)) + +### Fixes + +1. Fixes a bug in the bandit linter where messages weren't being propagated to the editor. + (thanks [Anthony Shaw](https://github.com/tonybaloney)) + ([#15561](https://github.com/Microsoft/vscode-python/issues/15561)) +1. Workaround existing MIME type misconfiguration on Windows preventing TensorBoard from loading when starting TensorBoard. + ([#16072](https://github.com/Microsoft/vscode-python/issues/16072)) +1. Changed the version of npm to version 6 instead of 7 in the lockfile. + ([#16208](https://github.com/Microsoft/vscode-python/issues/16208)) +1. Ensure selected interpreter doesn't change when the extension is starting up and in experiment. + ([#16291](https://github.com/Microsoft/vscode-python/issues/16291)) +1. Fix issue with sys.prefix when getting environment details. + ([#16355](https://github.com/Microsoft/vscode-python/issues/16355)) +1. Activate the extension when selecting the command `Clear Internal Extension Cache (python.clearPersistentStorage)`. + ([#16397](https://github.com/Microsoft/vscode-python/issues/16397)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.5.2 (14 May 2021) + +### Fixes + +1. Ensure Pylance is used with Python 2 if explicitly chosen + ([#16246](https://github.com/microsoft/vscode-python/issues/16246)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.5.1 (13 May 2021) + +### Fixes + +1. Allow Pylance to be used with Python 2 if explicitly chosen + ([#16204](https://github.com/microsoft/vscode-python/issues/16204)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.5.0 (10 May 2021) + +### Enhancements + +1. In an integrated TensorBoard session, if the jump to source request is for a file that does not exist on disk, allow the user to manually specify the file using the system file picker. + ([#15695](https://github.com/Microsoft/vscode-python/issues/15695)) +1. Allow running tests for all files within directories from test explorer. + (thanks [Vladimir Kotikov](https://github.com/vladimir-kotikov)) + ([#15862](https://github.com/Microsoft/vscode-python/issues/15862)) +1. Reveal selection in editor after jump to source command. (thanks [Wenlu Wang](https://github.com/Kingwl)) + ([#15924](https://github.com/Microsoft/vscode-python/issues/15924)) +1. Add support for debugger code reloading. + ([#16029](https://github.com/Microsoft/vscode-python/issues/16029)) +1. Add Python: Refresh TensorBoard command, keybinding and editor title button to reload TensorBoard (equivalent to browser refresh). + ([#16053](https://github.com/Microsoft/vscode-python/issues/16053)) +1. Automatically indent following `match` and `case` statements. (thanks [Marc Mueller](https://github.com/cdce8p)) + ([#16104](https://github.com/Microsoft/vscode-python/issues/16104)) +1. Bundle Pylance with the extension as an optional dependency. + ([#16116](https://github.com/Microsoft/vscode-python/issues/16116)) +1. Add a "Default" language server option, which dynamically chooses which language server to use. + ([#16157](https://github.com/Microsoft/vscode-python/issues/16157)) + +### Fixes + +1. Stop `unittest.TestCase` appearing as a test suite in the test explorer tree. + (thanks [Bob](https://github.com/bobwalker99)). + ([#15681](https://github.com/Microsoft/vscode-python/issues/15681)) +1. Support `~` in WORKON_HOME and venvPath setting when in discovery experiment. + ([#15788](https://github.com/Microsoft/vscode-python/issues/15788)) +1. Fix TensorBoard integration in Remote-SSH by auto-configuring port forwards. + ([#15807](https://github.com/Microsoft/vscode-python/issues/15807)) +1. Ensure venvPath and venvFolders setting can only be set at User or Remote settings. + ([#15947](https://github.com/Microsoft/vscode-python/issues/15947)) +1. Added compatability with pypy3.7 interpreter. + (thanks [Oliver Margetts](https://github.com/olliemath)) + ([#15968](https://github.com/Microsoft/vscode-python/issues/15968)) +1. Revert linter installation prompt removal. + ([#16027](https://github.com/Microsoft/vscode-python/issues/16027)) +1. Ensure that `dataclasses` is installed when using Jedi LSP. + ([#16119](https://github.com/Microsoft/vscode-python/issues/16119)) + +### Code Health + +1. Log the failures when checking whether certain modules are installed or getting their version information. + ([#15837](https://github.com/Microsoft/vscode-python/issues/15837)) +1. Better logging (telemetry) when installation of Python packages fail. + ([#15933](https://github.com/Microsoft/vscode-python/issues/15933)) +1. Ensure npm packave `canvas` is setup as an optional dependency. + ([#16127](https://github.com/Microsoft/vscode-python/issues/16127)) +1. Add ability for Jupyter extension to pass addtional installer arguments. + ([#16131](https://github.com/Microsoft/vscode-python/issues/16131)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.4.0 (19 April 2021) + +### Enhancements + +1. Add new command to report an Issue using the vscode-python template. + ([#1119](https://github.com/microsoft/vscode-python/issues/1119)) +1. Highlight `.pypirc`, `.pep8`, and `.pylintrc` as ini-files. (thanks [Jan Pilzer](https://github.com/Hirse)) + ([#11250](https://github.com/Microsoft/vscode-python/issues/11250)) +1. Added `python.linting.cwd` to change the working directory of the linters. (thanks [Matthew Shirley](https://github.com/matthewshirley)) + ([#15170](https://github.com/Microsoft/vscode-python/issues/15170)) +1. Remove prompt to install a linter when none are available. + ([#15465](https://github.com/Microsoft/vscode-python/issues/15465)) +1. Add jump to source integration with the PyTorch profiler TensorBoard plugin during TensorBoard sessions. + ([#15641](https://github.com/Microsoft/vscode-python/issues/15641)) +1. Drop prompt being displayed on first extension launch with a tip or a survey. + ([#15647](https://github.com/Microsoft/vscode-python/issues/15647)) +1. Use the updated logic for normalizing code sent to REPL as the default behavior. + ([#15649](https://github.com/Microsoft/vscode-python/issues/15649)) +1. Open TensorBoard webview panel in the active viewgroup on the first launch or the last viewgroup that it was moved to. + ([#15708](https://github.com/Microsoft/vscode-python/issues/15708)) +1. Support discovering Poetry virtual environments when in discovery experiment. + ([#15765](https://github.com/Microsoft/vscode-python/issues/15765)) +1. Install dev tools using Poetry when the poetry environment related to current folder is selected when in discovery experiment. + ([#15786](https://github.com/Microsoft/vscode-python/issues/15786)) +1. Add a refresh icon next to interpreter list. + ([#15868](https://github.com/Microsoft/vscode-python/issues/15868)) +1. Added command `Python: Clear internal extension cache` to clear extension related cache. + ([#15883](https://github.com/Microsoft/vscode-python/issues/15883)) + +### Fixes + +1. Fix `python.poetryPath` setting for installer on Windows. + ([#9672](https://github.com/Microsoft/vscode-python/issues/9672)) +1. Prevent mypy errors for other files showing in current file. + (thanks [Steve Dignam](https://github.com/sbdchd)) + ([#10190](https://github.com/Microsoft/vscode-python/issues/10190)) +1. Update pytest results when debugging. (thanks [djplt](https://github.com/djplt)) + ([#15353](https://github.com/Microsoft/vscode-python/issues/15353)) +1. Ensure release level is set when using new environment discovery component. + ([#15462](https://github.com/Microsoft/vscode-python/issues/15462)) +1. Ensure right environment is activated in the terminal when installing Python packages. + ([#15503](https://github.com/Microsoft/vscode-python/issues/15503)) +1. Update nosetest results when debugging. (thanks [djplt](https://github.com/djplt)) + ([#15642](https://github.com/Microsoft/vscode-python/issues/15642)) +1. Ensure any stray jedi process is terminated on language server dispose. + ([#15644](https://github.com/Microsoft/vscode-python/issues/15644)) +1. Fix README image indent for VSCode extension page. (thanks [Johnson](https://github.com/j3soon/)) + ([#15662](https://github.com/Microsoft/vscode-python/issues/15662)) +1. Run `conda update` and not `conda install` when installing a compatible version of the `tensorboard` package. + ([#15778](https://github.com/Microsoft/vscode-python/issues/15778)) +1. Temporarily fix support for folders in interpreter path setting. + ([#15782](https://github.com/Microsoft/vscode-python/issues/15782)) +1. In completions.py: jedi.api.names has been deprecated, switch to new syntax. + (thanks [moselhy](https://github.com/moselhy)). + ([#15791](https://github.com/Microsoft/vscode-python/issues/15791)) +1. Fixes activation of prefixed conda environments. + ([#15823](https://github.com/Microsoft/vscode-python/issues/15823)) + +### Code Health + +1. Deprecating on-type line formatter since it isn't used in newer Language servers. + ([#15709](https://github.com/Microsoft/vscode-python/issues/15709)) +1. Removing old way of feature deprecation where we showed notification for each feature we deprecated. + ([#15714](https://github.com/Microsoft/vscode-python/issues/15714)) +1. Remove unused code from extension. + ([#15717](https://github.com/Microsoft/vscode-python/issues/15717)) +1. Add telemetry for identifying torch.profiler users. + ([#15825](https://github.com/Microsoft/vscode-python/issues/15825)) +1. Update notebook code to not use deprecated .cells function on NotebookDocument. + ([#15885](https://github.com/Microsoft/vscode-python/issues/15885)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.3.1 (23 March 2021) + +### Fixes + +1. Fix link to create a new Jupyter notebook in Python start page. + ([#15621](https://github.com/Microsoft/vscode-python/issues/15621)) +1. Upgrade to latest `jedi-language-server` and use it for python >= 3.6. Use `jedi<0.18` for python 2.7 and <=3.5. + ([#15724](https://github.com/Microsoft/vscode-python/issues/15724)) +1. Check if Python executable file exists instead of launching the Python process. + ([#15725](https://github.com/Microsoft/vscode-python/issues/15725)) +1. Fix for Go to definition needs to be pressed twice. + (thanks [djplt](https://github.com/djplt)) + ([#15727](https://github.com/Microsoft/vscode-python/issues/15727)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.3.0 (16 March 2021) + +### Enhancements + +1. Activate the extension when the following files are found: `Pipfile`, `setup.py`, `requirements.txt`, `manage.py`, `app.py` + (thanks [Dhaval Soneji](https://github.com/soneji)) + ([#4765](https://github.com/Microsoft/vscode-python/issues/4765)) +1. Add optional user-level `python.tensorBoard.logDirectory` setting. When starting a TensorBoard session, use this setting if it is present instead of prompting the user to select a log directory. + ([#15476](https://github.com/Microsoft/vscode-python/issues/15476)) + +### Fixes + +1. Fix nosetests to run tests only once. (thanks [djplt](https://github.com/djplt)) + ([#6043](https://github.com/Microsoft/vscode-python/issues/6043)) +1. Make on-enter behaviour after `raise` much more like that of `return`, fixing + handling in the case of pressing enter to wrap the parentheses of an exception + call. + (thanks [PeterJCLaw](https://github.com/PeterJCLaw)) + ([#10583](https://github.com/Microsoft/vscode-python/issues/10583)) +1. Add configuration debugpyPath. (thanks [djplt](https://github.com/djplt)) + ([#14631](https://github.com/Microsoft/vscode-python/issues/14631)) +1. Fix Mypy linter pointing to wrong column number (off by one). + (thanks [anttipessa](https://github.com/anttipessa/), [haalto](https://github.com/haalto/), [JeonCD](https://github.com/JeonCD/) and [junskU](https://github.com/junskU)) + ([#14978](https://github.com/Microsoft/vscode-python/issues/14978)) +1. Show each python.org install only once on Mac when in discovery experiment. + ([#15302](https://github.com/Microsoft/vscode-python/issues/15302)) +1. All relative interpreter path reported start with `~` when in discovery experiment. + ([#15312](https://github.com/Microsoft/vscode-python/issues/15312)) +1. Remove FLASK_DEBUG from flask debug configuration to allow reload. + ([#15373](https://github.com/Microsoft/vscode-python/issues/15373)) +1. Install using pipenv only if the selected environment is pipenv which is related to workspace folder, when in discovery experiment. + ([#15489](https://github.com/Microsoft/vscode-python/issues/15489)) +1. Fixes issue with detecting new installations of Windows Store python. + ([#15541](https://github.com/Microsoft/vscode-python/issues/15541)) +1. Add `cached-property` package to bundled python packages. This is needed by `jedi-language-server` running on `python 3.6` and `python 3.7`. + ([#15566](https://github.com/Microsoft/vscode-python/issues/15566)) +1. Remove limit on workspace symbols when using Jedi language server. + ([#15576](https://github.com/Microsoft/vscode-python/issues/15576)) +1. Use shorter paths for python interpreter when possible. + ([#15580](https://github.com/Microsoft/vscode-python/issues/15580)) +1. Ensure that jedi language server uses jedi shipped with the extension. + ([#15586](https://github.com/Microsoft/vscode-python/issues/15586)) +1. Updates to Proposed API, and fix the failure in VS Code Insider tests. + ([#15638](https://github.com/Microsoft/vscode-python/issues/15638)) + +### Code Health + +1. Add support for "Trusted Workspaces". + + "Trusted Workspaces" is an upcoming feature in VS Code. (See: + https://github.com/microsoft/vscode/issues/106488.) For now you need + the following for the experience: + + - the latest VS Code Insiders + - add `"workspace.trustEnabled": true` to your user settings.json + + At that point, when the Python extension would normally activate, VS Code + will prompt you about whether or not the current workspace is trusted. + If not then the extension will be disabled (but only for that workspace). + As soon as the workspace is marked as trusted, the extension will + activate. + ([#15525](https://github.com/Microsoft/vscode-python/issues/15525)) + +1. Updates to the VSCode Notebook API. + ([#15567](https://github.com/Microsoft/vscode-python/issues/15567)) +1. Fix failing smoke tests on CI. + ([#15573](https://github.com/Microsoft/vscode-python/issues/15573)) +1. Update VS Code engine to 1.54.0 + ([#15604](https://github.com/Microsoft/vscode-python/issues/15604)) +1. Use `onReady` method available on language client to ensure language server is ready. + ([#15612](https://github.com/Microsoft/vscode-python/issues/15612)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.2.4 (9 March 2021) + +### Fixes + +1. Update to latest VSCode Notebook API. + ([#15415](https://github.com/Microsoft/vscode-python/issues/15415)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.2.3 (8 March 2021) + +### Fixes + +1. Add event handlers to stream error events to prevent process from exiting due to errors in process stdout & stderr streams. + ([#15395](https://github.com/Microsoft/vscode-python/issues/15395)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [jedi-language-server](https://pypi.org/project/jedi-language-server/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.2.2 (5 March 2021) + +### Fixes + +1. Fixes issue with Jedi Language Server telemetry. + ([#15419](https://github.com/microsoft/vscode-python/issues/15419)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.2.1 (19 February 2021) + +### Fixes + +1. Fix for missing pyenv virtual environments from selectable environments. + ([#15439](https://github.com/Microsoft/vscode-python/issues/15439)) +1. Register Jedi regardless of what language server is configured. + ([#15452](https://github.com/Microsoft/vscode-python/issues/15452)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.2.0 (17 February 2021) + +### Enhancements + +1. Use Language Server Protocol to work with Jedi. + ([#11995](https://github.com/Microsoft/vscode-python/issues/11995)) + +### Fixes + +1. Don't suggest insiders program nor show start page when in Codespaces. + ([#14833](https://github.com/Microsoft/vscode-python/issues/14833)) +1. Fix description of `Pyramid` debug config. + (thanks [vvijayalakshmi21](https://github.com/vvijayalakshmi21/)) + ([#5479](https://github.com/Microsoft/vscode-python/issues/5479)) +1. Refactored the Enable Linting command to provide the user with a choice of "Enable" or "Disable" linting to make it more intuitive. (thanks [henryboisdequin](https://github.com/henryboisdequin)) + ([#8800](https://github.com/Microsoft/vscode-python/issues/8800)) +1. Fix marketplace links in popups opening a non-browser VS Code instance in Codespaces. + ([#14264](https://github.com/Microsoft/vscode-python/issues/14264)) +1. Fixed the error command suggested when attempting to use "debug tests" configuration + (Thanks [Shahzaib paracha](https://github.com/ShahzaibParacha)) + ([#14729](https://github.com/Microsoft/vscode-python/issues/14729)) +1. Single test run fails sometimes if there is an error in unrelated file imported during discovery. + (thanks [Szymon Janota](https://github.com/sjanota/)) + ([#15147](https://github.com/Microsoft/vscode-python/issues/15147)) +1. Re-enable localization on the start page. It was accidentally + disabled in October when the Jupyter extension was split out. + ([#15232](https://github.com/Microsoft/vscode-python/issues/15232)) +1. Ensure target environment is activated in the terminal when running install scripts. + ([#15285](https://github.com/Microsoft/vscode-python/issues/15285)) +1. Allow support for using notebook APIs in the VS code stable build. + ([#15364](https://github.com/Microsoft/vscode-python/issues/15364)) + +### Code Health + +1. Raised the minimum required VS Code version to 1.51. + ([#15237](https://github.com/Microsoft/vscode-python/issues/15237)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2021.1.0 (21 January 2021) + +### Enhancements + +1. Remove code snippets (you can copy the + [old snippets](https://github.com/microsoft/vscode-python/blob/2020.12.424452561/snippets/python.json) + and use them as + [your own snippets](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets)). + ([#14781](https://github.com/Microsoft/vscode-python/issues/14781)) +1. Add PYTHONPATH to the language server settings response. + ([#15106](https://github.com/Microsoft/vscode-python/issues/15106)) +1. Integration with the bandit linter will highlight the variable, function or method for an issue instead of the entire line. + Requires latest version of the bandit package to be installed. + (thanks [Anthony Shaw](https://github.com/tonybaloney)) + ([#15003](https://github.com/Microsoft/vscode-python/issues/15003)) +1. Translated some more of the Python Extension messages in Simplified Chinese. + (thanks [Shinoyasan](https://github.com/shinoyasan/)) + ([#15079](https://github.com/Microsoft/vscode-python/issues/15079)) +1. Update Simplified Chinese translation. + (thanks [Fiftysixtimes7](https://github.com/FiftysixTimes7)) + ([#14997](https://github.com/Microsoft/vscode-python/issues/14997)) + +### Fixes + +1. Fix environment variables not refreshing on env file edits. + ([#3805](https://github.com/Microsoft/vscode-python/issues/3805)) +1. fix npm audit[high]: [Remote Code Execution](npmjs.com/advisories/1548) + ([#14640](https://github.com/Microsoft/vscode-python/issues/14640)) +1. Ignore false positives when scraping environment variables. + ([#14812](https://github.com/Microsoft/vscode-python/issues/14812)) +1. Fix unittest discovery when using VS Code Insiders by using Inversify's `skipBaseClassChecks` option. + ([#14962](https://github.com/Microsoft/vscode-python/issues/14962)) +1. Make filtering in findInterpretersInDir() faster. + ([#14983](https://github.com/Microsoft/vscode-python/issues/14983)) +1. Remove the Buffer() is deprecated warning from Developer tools. ([#15045](https://github.com/microsoft/vscode-python/issues/15045)) + ([#15045](https://github.com/Microsoft/vscode-python/issues/15045)) +1. Add support for pytest 6 options. + ([#15094](https://github.com/Microsoft/vscode-python/issues/15094)) + +### Code Health + +1. Update to Node 12.20.0. + ([#15046](https://github.com/Microsoft/vscode-python/issues/15046)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.12.2 (15 December 2020) + +### Fixes + +1. Only activate discovery component when in experiment. + ([#14977](https://github.com/Microsoft/vscode-python/issues/14977)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.12.1 (15 December 2020) + +### Fixes + +1. Fix for extension loading issue in the latest release. + ([#14977](https://github.com/Microsoft/vscode-python/issues/14977)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.12.0 (14 December 2020) + +### Enhancements + +1. FastAPI debugger feature. + (thanks [Marcelo Trylesinski](https://github.com/kludex/)!) + ([#14247](https://github.com/Microsoft/vscode-python/issues/14247)) +1. Put linter prompt behind an experiment flag. + ([#14760](https://github.com/Microsoft/vscode-python/issues/14760)) +1. Add Python: Launch TensorBoard command behind an experiment. + ([#14806](https://github.com/Microsoft/vscode-python/issues/14806)) +1. Detect tfevent files in workspace and prompt to launch native TensorBoard session. + ([#14807](https://github.com/Microsoft/vscode-python/issues/14807)) +1. Use default color for "Select Python interpreter" on the status bar. + (thanks [Daniel Rodriguez](https://github.com/danielfrg)!) + ([#14859](https://github.com/Microsoft/vscode-python/issues/14859)) +1. Experiment to use the new environment discovery module. + ([#14868](https://github.com/Microsoft/vscode-python/issues/14868)) +1. Add experimentation API support for Pylance. + ([#14895](https://github.com/Microsoft/vscode-python/issues/14895)) + +### Fixes + +1. Format `.pyi` files correctly when using Black. + (thanks [Steve Dignam](https://github.com/sbdchd)!) + ([#13341](https://github.com/Microsoft/vscode-python/issues/13341)) +1. Add `node-loader` to support `webpack` for `fsevents` package. + ([#14664](https://github.com/Microsoft/vscode-python/issues/14664)) +1. Don't show play icon in diff editor. + (thanks [David Sanders](https://github.com/dsanders11)!) + ([#14800](https://github.com/Microsoft/vscode-python/issues/14800)) +1. Do not show "You need to select a Python interpreter before you start debugging" when "python" in debug configuration is invalid. + ([#14814](https://github.com/Microsoft/vscode-python/issues/14814)) +1. Fix custom language server message handlers being registered too late in startup. + ([#14893](https://github.com/Microsoft/vscode-python/issues/14893)) + +### Code Health + +1. Modified the errors generated when `launch.json` is not properly configured to be more specific about which fields are missing. + (thanks [Shahzaib Paracha](https://github.com/ShahzaibP)!) + ([#14739](https://github.com/Microsoft/vscode-python/issues/14739)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.11.1 (17 November 2020) + +### Enhancements + +1. Replaced "pythonPath" debug configuration property with "python". + ([#12462](https://github.com/Microsoft/vscode-python/issues/12462)) + +### Fixes + +1. Fix for Process Id Picker no longer showing up + ([#14678](https://github.com/Microsoft/vscode-python/issues/14678))) +1. Fix workspace symbol searching always returning empty. + ([#14727](https://github.com/Microsoft/vscode-python/issues/14727)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.11.0 (11 November 2020) + +### Enhancements + +1. Update shipped debugger wheels to python 3.8. + ([#14614](https://github.com/Microsoft/vscode-python/issues/14614)) + +### Fixes + +1. Update the logic for parsing and sending selected code to the REPL. + ([#14048](https://github.com/Microsoft/vscode-python/issues/14048)) +1. Fix "TypeError: message must be set" error when debugging with `pytest`. + ([#14067](https://github.com/Microsoft/vscode-python/issues/14067)) +1. When sending code to the REPL, read input from `sys.stdin` instead of passing it as an argument. + ([#14471](https://github.com/Microsoft/vscode-python/issues/14471)) + +### Code Health + +1. Code for Jupyter Notebooks support has been refactored into the Jupyter extension, which is now a dependency for the Python extension + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.10.0 (27 October 2020) + +### Enhancements + +1. `debugpy` updated to latest stable version. +1. Make data viewer openable from the variables window context menu while debugging. + ([#14406](https://github.com/Microsoft/vscode-python/issues/14406)) +1. Do not opt users out of the insiders program if they have a stable version installed. + ([#14090](https://github.com/Microsoft/vscode-python/issues/14090)) + +### Fixes + +1. Make sure not to set `__file__` unless necessary as this can mess up some modules (like multiprocessing). + ([#12530](https://github.com/Microsoft/vscode-python/issues/12530)) +1. Fix isolate script to only remove current working directory. + ([#13942](https://github.com/Microsoft/vscode-python/issues/13942)) +1. Make sure server name and kernel name show up when connecting. + ([#13955](https://github.com/Microsoft/vscode-python/issues/13955)) +1. Have Custom Editors load on editor show unless autostart is disabled. + ([#14016](https://github.com/Microsoft/vscode-python/issues/14016)) +1. For exporting, first check the notebook or interactive window interpreter before the jupyter selected interpreter. + ([#14143](https://github.com/Microsoft/vscode-python/issues/14143)) +1. Fix interactive debugging starting (trimQuotes error). + ([#14212](https://github.com/Microsoft/vscode-python/issues/14212)) +1. Use the kernel defined in the metadata of Notebook instead of using the default workspace interpreter. + ([#14213](https://github.com/Microsoft/vscode-python/issues/14213)) +1. Fix latex output not showing up without a 'display' call. + ([#14216](https://github.com/Microsoft/vscode-python/issues/14216)) +1. Fix markdown cell marker when exporting a notebook to a Python script. + ([#14359](https://github.com/Microsoft/vscode-python/issues/14359)) + +### Code Health + +1. Add Windows unit tests to the PR validation pipeline. + ([#14013](https://github.com/Microsoft/vscode-python/issues/14013)) +1. Functional test failures related to kernel ports overlapping. + ([#14290](https://github.com/Microsoft/vscode-python/issues/14290)) +1. Change message from `IPython kernel` to `Jupyter kernel`. + ([#14309](https://github.com/Microsoft/vscode-python/issues/14309)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.9.2 (6 October 2020) + +### Fixes + +1. Support nbconvert version 6+ for exporting notebooks to python code. + ([#14169](https://github.com/Microsoft/vscode-python/issues/14169)) +1. Do not escape output in the actual ipynb file. + ([#14182](https://github.com/Microsoft/vscode-python/issues/14182)) +1. Fix exporting from the interactive window. + ([#14210](https://github.com/Microsoft/vscode-python/issues/14210)) +1. Fix for CVE-2020-16977 + ([CVE-2020-16977](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-16977)) +1. Fix for CVE-2020-17163 + ([CVE-2020-17163](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-17163)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.9.1 (29 September 2020) + +### Fixes + +1. Fix IPyKernel install issue with windows paths. + ([#13493](https://github.com/microsoft/vscode-python/issues/13493)) +1. Fix escaping of output to encode HTML chars correctly. + ([#5678](https://github.com/Microsoft/vscode-python/issues/5678)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.9.0 (23 September 2020) + +### Enhancements + +1. Docstrings are added to `class` and `def` snippets (thanks [alannt777](https://github.com/alannt777/)). + ([#5578](https://github.com/Microsoft/vscode-python/issues/5578)) +1. Upgraded isort to `5.3.2`. + ([#12932](https://github.com/Microsoft/vscode-python/issues/12932)) +1. Remove default "--no-reload" from debug configurations. + (thanks [ian910297](https://github.com/ian910297)) + ([#13061](https://github.com/Microsoft/vscode-python/issues/13061)) +1. Update API to expose events for cell excecution and kernel restart. + ([#13306](https://github.com/Microsoft/vscode-python/issues/13306)) +1. Show a general warning prompt pointing to the upgrade guide when users attempt to run isort5 using deprecated settings. + ([#13716](https://github.com/Microsoft/vscode-python/issues/13716)) +1. Upgrade isort to `5.5.2`. + ([#13831](https://github.com/Microsoft/vscode-python/issues/13831)) +1. Enable custom editor support in stable VS code at 20%. + ([#13890](https://github.com/Microsoft/vscode-python/issues/13890)) +1. Upgraded to isort `5.5.3`. + ([#14027](https://github.com/Microsoft/vscode-python/issues/14027)) + +### Fixes + +1. Fixed the output being trimmed. Tables that start with empty space will now display correctly. + ([#10270](https://github.com/Microsoft/vscode-python/issues/10270)) +1. #11729 + Prevent test discovery from picking up stdout from low level file descriptors. + (thanks [Ryo Miyajima](https://github.com/sergeant-wizard)) + ([#11729](https://github.com/Microsoft/vscode-python/issues/11729)) +1. Fix opening new blank notebooks when using the VS code custom editor API. + ([#12245](https://github.com/Microsoft/vscode-python/issues/12245)) +1. Support starting kernels with the same directory as the notebook. + ([#12760](https://github.com/Microsoft/vscode-python/issues/12760)) +1. Fixed `Sort imports` command with setuptools version `49.2`. + ([#12949](https://github.com/Microsoft/vscode-python/issues/12949)) +1. Do not fail interpreter discovery if accessing Windows registry fails. + ([#12962](https://github.com/Microsoft/vscode-python/issues/12962)) +1. Show error output from nbconvert when exporting a notebook fails. + ([#13229](https://github.com/Microsoft/vscode-python/issues/13229)) +1. Prevent daemon from trying to prewarm an execution service. + ([#13258](https://github.com/Microsoft/vscode-python/issues/13258)) +1. Respect stop on error setting for executing cells in native notebook. + ([#13338](https://github.com/Microsoft/vscode-python/issues/13338)) +1. Native notebook launch doesn't hang if the kernel does not start, and notifies the user of the failure. Also does not show the first cell as executing until the kernel is actually started and connected. + ([#13409](https://github.com/Microsoft/vscode-python/issues/13409)) +1. Fix path to isolated script on Windows shell_exec. + ([#13493](https://github.com/Microsoft/vscode-python/issues/13493)) +1. Updating other cells with display.update does not work in native notebooks. + ([#13509](https://github.com/Microsoft/vscode-python/issues/13509)) +1. Fix for notebook using the first kernel every time. It will now use the language in the notebook to determine the most appropriate kernel. + ([#13520](https://github.com/Microsoft/vscode-python/issues/13520)) +1. Shift+enter should execute current cell and select the next cell. + ([#13553](https://github.com/Microsoft/vscode-python/issues/13553)) +1. Fixes typo in export command registration. + (thanks [Anton Kosyakov](https://github.com/akosyakov/)) + ([#13612](https://github.com/Microsoft/vscode-python/issues/13612)) +1. Fix the behavior of the 'python.showStartPage' setting. + ([#13706](https://github.com/Microsoft/vscode-python/issues/13706)) +1. Correctly install ipykernel when launching from an interpreter. + ([#13956](https://github.com/Microsoft/vscode-python/issues/13956)) +1. Backup on custom editors is being ignored. + ([#13981](https://github.com/Microsoft/vscode-python/issues/13981)) + +### Code Health + +1. Fix bandit issues in vscode_datascience_helpers. + ([#13103](https://github.com/Microsoft/vscode-python/issues/13103)) +1. Cast type to `any` to get around issues with `ts-node` (`ts-node` is used by `nyc` for code coverage). + ([#13411](https://github.com/Microsoft/vscode-python/issues/13411)) +1. Drop support for Python 3.5 (it reaches end-of-life on September 13, 2020 and isort 5 does not support it). + ([#13459](https://github.com/Microsoft/vscode-python/issues/13459)) +1. Fix nightly flake test issue with timeout waiting for kernel. + ([#13501](https://github.com/Microsoft/vscode-python/issues/13501)) +1. Disable sorting tests for Python 2.7 as isort5 is not compatible with Python 2.7. + ([#13542](https://github.com/Microsoft/vscode-python/issues/13542)) +1. Fix nightly flake test current directory failing test. + ([#13605](https://github.com/Microsoft/vscode-python/issues/13605)) +1. Rename the `master` branch to `main`. + ([#13645](https://github.com/Microsoft/vscode-python/issues/13645)) +1. Remove usage of the terms "blacklist" and "whitelist". + ([#13647](https://github.com/Microsoft/vscode-python/issues/13647)) +1. Fix a test failure and warning when running test adapter tests under pytest 5. + ([#13726](https://github.com/Microsoft/vscode-python/issues/13726)) +1. Remove unused imports from data science ipython test files. + ([#13729](https://github.com/Microsoft/vscode-python/issues/13729)) +1. Fix nighly failure with beakerx. + ([#13734](https://github.com/Microsoft/vscode-python/issues/13734)) + +## 2020.8.6 (15 September 2020) + +### Fixes + +1. Workaround problem caused by https://github.com/microsoft/vscode/issues/106547 + +## 2020.8.6 (15 September 2020) + +### Fixes + +1. Workaround problem caused by https://github.com/microsoft/vscode/issues/106547 + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.5 (9 September 2020) + +### Fixes + +1. Experiments.json is now read from 'main' branch. + ([#13839](https://github.com/Microsoft/vscode-python/issues/13839)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.4 (2 September 2020) + +### Enhancements + +1. Make Jupyter Server name clickable to select Jupyter server. + ([#13656](https://github.com/Microsoft/vscode-python/issues/13656)) + +### Fixes + +1. Fixed connection to a Compute Instance from the quickpicks history options. + ([#13387](https://github.com/Microsoft/vscode-python/issues/13387)) +1. Fixed the behavior of the 'python.showStartPage' setting. + ([#13347](https://github.com/microsoft/vscode-python/issues/13347)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.3 (31 August 2020) + +### Enhancements + +1. Add telemetry about the install source for the extension. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.2 (27 August 2020) + +### Enhancements + +1. Update "Tip" notification for new users to either show the existing tip, a link to a feedback survey or nothing. + ([#13535](https://github.com/Microsoft/vscode-python/issues/13535)) + +### Fixes + +1. Fix saving during close and auto backup to actually save a notebook. + ([#11711](https://github.com/Microsoft/vscode-python/issues/11711)) +1. Show the server display string that the user is going to connect to after selecting a compute instance and reloading the window. + ([#13551](https://github.com/Microsoft/vscode-python/issues/13551)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.1 (20 August 2020) + +### Fixes + +1. Update LSP to latest to resolve problems with LS settings. + ([#13511](https://github.com/microsoft/vscode-python/pull/13511)) +1. Update debugger to address terminal input issues. +1. Added tooltip to indicate status of server connection + ([#13543](https://github.com/Microsoft/vscode-python/issues/13543)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.8.0 (12 August 2020) + +### Enhancements + +1. Cell id and cell metadata are now passed as the metadata field for execute_request messages. + (thanks [stisa](https://github.com/stisa/)) + ([#13252](https://github.com/Microsoft/vscode-python/issues/13252)) +1. Add "Restart Language Server" command. + ([#3073](https://github.com/Microsoft/vscode-python/issues/3073)) +1. Support multiple and per file interactive windows. See the description for the new 'python.dataScience.interactiveWindowMode' setting. + ([#3104](https://github.com/Microsoft/vscode-python/issues/3104)) +1. Add cell editing shortcuts for python interactive cells. (thanks [@earthastronaut](https://github.com/earthastronaut/)). + ([#12414](https://github.com/Microsoft/vscode-python/issues/12414)) +1. Allow `python.dataScience.runStartupCommands` to be an array. (thanks [@janosh](https://github.com/janosh)). + ([#12827](https://github.com/Microsoft/vscode-python/issues/12827)) +1. Remember remote kernel ids when reopening notebooks. + ([#12828](https://github.com/Microsoft/vscode-python/issues/12828)) +1. The file explorer dialog now has an appropriate title when browsing for an interpreter. (thanks [ziebam](https://github.com/ziebam)). + ([#12959](https://github.com/Microsoft/vscode-python/issues/12959)) +1. Warn users if they are connecting over http without a token. + ([#12980](https://github.com/Microsoft/vscode-python/issues/12980)) +1. Allow a custom display string for remote servers as part of the remote Jupyter server provider extensibility point. + ([#12988](https://github.com/Microsoft/vscode-python/issues/12988)) +1. Update to the latest version of [`jedi`](https://github.com/davidhalter/jedi) (`0.17.2`). This adds support for Python 3.9 and fixes some bugs, but is expected to be the last release to support Python 2.7 and 3.5. (thanks [Peter Law](https://github.com/PeterJCLaw/)). + ([#13037](https://github.com/Microsoft/vscode-python/issues/13037)) +1. Expose `Pylance` setting in `python.languageServer`. If [Pylance extension](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) is not installed, prompt user to install it. + ([#13122](https://github.com/Microsoft/vscode-python/issues/13122)) +1. Added "pythonArgs" to debugpy launch.json schema. + ([#13218](https://github.com/Microsoft/vscode-python/issues/13218)) +1. Use jupyter inspect to get signature of dynamic functions in notebook editor when language server doesn't provide enough hint. + ([#13259](https://github.com/Microsoft/vscode-python/issues/13259)) +1. The gather icon will change and get disabled while gather is executing. + ([#13177](https://github.com/microsoft/vscode-python/issues/13177)) + +### Fixes + +1. Gathered notebooks will now use the same kernelspec as the notebook it was created from. + ([#10924](https://github.com/Microsoft/vscode-python/issues/10924)) +1. Don't loop selection through all failed tests every time tests are run. + ([#11743](https://github.com/Microsoft/vscode-python/issues/11743)) +1. Some tools (like pytest) rely on the existence of `sys.path[0]`, so + deleting it in the isolation script can sometimes cause problems. The + solution is to point `sys.path[0]` to a bogus directory that we know + does not exist (assuming noone modifies the extension install dir). + ([#11875](https://github.com/Microsoft/vscode-python/issues/11875)) +1. Fix missing css for some ipywidget output. + ([#12202](https://github.com/Microsoft/vscode-python/issues/12202)) +1. Delete backing untitled ipynb notebook files as soon as the remote session has been created. + ([#12510](https://github.com/Microsoft/vscode-python/issues/12510)) +1. Make the data science variable explorer support high contrast color theme. + ([#12766](https://github.com/Microsoft/vscode-python/issues/12766)) +1. The change in PR #12795 led to one particular test suite to take longer + to run. Here we increase the timeout for that suite to get the test + passing. + ([#12833](https://github.com/Microsoft/vscode-python/issues/12833)) +1. Refactor data science filesystem usage to correctly handle files which are potentially remote. + ([#12931](https://github.com/Microsoft/vscode-python/issues/12931)) +1. Allow custom Jupyter server URI providers to have an expiration on their authorization headers. + ([#12987](https://github.com/Microsoft/vscode-python/issues/12987)) +1. If a webpanel fails to load, dispose our webviewhost so that it can try again. + ([#13106](https://github.com/Microsoft/vscode-python/issues/13106)) +1. Ensure terminal is not shown or activated if hideFromUser is set to true. + ([#13117](https://github.com/Microsoft/vscode-python/issues/13117)) +1. Do not automatically start kernel for untrusted notebooks. + ([#13124](https://github.com/Microsoft/vscode-python/issues/13124)) +1. Fix settings links to open correctly in the notebook editor. + ([#13156](https://github.com/Microsoft/vscode-python/issues/13156)) +1. "a" and "b" Jupyter shortcuts should not automatically enter edit mode. + ([#13165](https://github.com/Microsoft/vscode-python/issues/13165)) +1. Scope custom notebook keybindings to Jupyter Notebooks. + ([#13172](https://github.com/Microsoft/vscode-python/issues/13172)) +1. Rename "Count" column in variable explorer to "Size". + ([#13205](https://github.com/Microsoft/vscode-python/issues/13205)) +1. Handle `Save As` of preview Notebooks. + ([#13235](https://github.com/Microsoft/vscode-python/issues/13235)) + +### Code Health + +1. Move non-mock jupyter nightly tests to use raw kernel by default. + ([#10772](https://github.com/Microsoft/vscode-python/issues/10772)) +1. Add new services to data science IOC container and rename misspelled service. + ([#12809](https://github.com/Microsoft/vscode-python/issues/12809)) +1. Disable Notebook icons when Notebook is not trusted. + ([#12893](https://github.com/Microsoft/vscode-python/issues/12893)) +1. Removed control tower code for the start page. + ([#12919](https://github.com/Microsoft/vscode-python/issues/12919)) +1. Add better tests for trusted notebooks in the classic notebook editor. + ([#12966](https://github.com/Microsoft/vscode-python/issues/12966)) +1. Custom renderers for `png/jpeg` images in `Notebooks`. + ([#12977](https://github.com/Microsoft/vscode-python/issues/12977)) +1. Fix broken nightly variable explorer tests. + ([#13075](https://github.com/Microsoft/vscode-python/issues/13075)) +1. Fix nightly flake test failures for startup and shutdown native editor test. + ([#13171](https://github.com/Microsoft/vscode-python/issues/13171)) +1. Fix failing interactive window and variable explorer tests. + ([#13269](https://github.com/Microsoft/vscode-python/issues/13269)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [Pylance](https://github.com/microsoft/pylance-release) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.7.1 (22 July 2020) + +1. Fix language server setting when provided an invalid value, send config event more consistently. + ([#13064](https://github.com/Microsoft/vscode-python/pull/13064)) +1. Add banner for pylance, and remove old LS experiment. + ([#12817](https://github.com/microsoft/vscode-python/pull/12817)) + +## 2020.7.0 (16 July 2020) + +### Enhancements + +1. Support connecting to Jupyter hub servers. Use either the base url of the server (i.e. 'https://111.11.11.11:8000') or your user folder (i.e. 'https://111.11.11.11:8000/user/theuser). + Works with password authentication. + ([#9679](https://github.com/Microsoft/vscode-python/issues/9679)) +1. Added "argsExpansion" to debugpy launch.json schema. + ([#11678](https://github.com/Microsoft/vscode-python/issues/11678)) +1. The extension will now automatically load if a `pyproject.toml` file is present in the workspace root directory. + (thanks [Brandon White](https://github.com/BrandonLWhite)) + ([#12056](https://github.com/Microsoft/vscode-python/issues/12056)) +1. Add ability to check and update whether a notebook is trusted. + ([#12146](https://github.com/Microsoft/vscode-python/issues/12146)) +1. Support formatting of Notebook Cells when using the VS Code Insiders API for Notebooks. + ([#12195](https://github.com/Microsoft/vscode-python/issues/12195)) +1. Added exporting notebooks to HTML. + ([#12375](https://github.com/Microsoft/vscode-python/issues/12375)) +1. Change stock launch.json "attach" config to use "connect". + ([#12446](https://github.com/Microsoft/vscode-python/issues/12446)) +1. Update to the latest version of [`jedi`](https://github.com/davidhalter/jedi) (`0.17.1`). This brings completions for Django (via [`django-stubs`](https://github.com/typeddjango/django-stubs)) as well as support for Python 3.9 and various bugfixes (mostly around generic type annotations). (thanks [Peter Law](https://gitlab.com/PeterJCLaw/)) + ([#12486](https://github.com/Microsoft/vscode-python/issues/12486)) +1. Prompt users that we have deleted pythonPath from their workspace settings when in `Deprecate PythonPath` experiment. + ([#12533](https://github.com/Microsoft/vscode-python/issues/12533)) +1. Changed public API for execution to return an object and provide a callback which is called when interpreter setting changes. + ([#12596](https://github.com/Microsoft/vscode-python/issues/12596)) +1. Allow users to opt out of us checking whether their notebooks can be trusted. This setting is turned off by default and must be manually enabled. + ([#12611](https://github.com/Microsoft/vscode-python/issues/12611)) +1. Include the JUPYTER_PATH environment variable when searching the disk for kernels. + ([#12694](https://github.com/Microsoft/vscode-python/issues/12694)) +1. Added exporting to python, HTML and PDF from the interactive window. + ([#12732](https://github.com/Microsoft/vscode-python/issues/12732)) +1. Show a prompt asking user to upgrade Code runner to new version to keep using it when in Deprecate PythonPath experiment. + ([#12764](https://github.com/Microsoft/vscode-python/issues/12764)) +1. Opening notebooks in the preview Notebook editor for [Visual Studio Code Insiders](https://code.visualstudio.com/insiders/). + ([#10496](https://github.com/Microsoft/vscode-python/issues/10496)) + +### Fixes + +1. Ensure we only have a single isort process running on a single file. + ([#10579](https://github.com/Microsoft/vscode-python/issues/10579)) +1. Provided a method for external partners to participate in jupyter server URI picking/authentication. + ([#10993](https://github.com/Microsoft/vscode-python/issues/10993)) +1. Check for hideFromUser before activating current terminal. + ([#11122](https://github.com/Microsoft/vscode-python/issues/11122)) +1. In Markdown cells, turn HTML links to markdown links so that nteract renders them. + ([#11254](https://github.com/Microsoft/vscode-python/issues/11254)) +1. Prevent incorrect ipywidget display (double plots) due to synchronization issues. + ([#11281](https://github.com/Microsoft/vscode-python/issues/11281)) +1. Removed the Kernel Selection toolbar from the Interactive Window when using a local Jupyter Server. + To show it again, set the setting 'Python > Data Science > Show Kernel Selection On Interactive Window'. + ([#11347](https://github.com/Microsoft/vscode-python/issues/11347)) +1. Get Jupyter connections to work with a Windows store installed Python/Jupyter combination. + ([#11412](https://github.com/Microsoft/vscode-python/issues/11412)) +1. Disable hover intellisense in the interactive window unless the code is expanded. + ([#11459](https://github.com/Microsoft/vscode-python/issues/11459)) +1. Make layout of markdown editors much faster to open. + ([#11584](https://github.com/Microsoft/vscode-python/issues/11584)) +1. Watermark in the interactive window can appear on top of entered text. + ([#11691](https://github.com/Microsoft/vscode-python/issues/11691)) +1. Jupyter can fail to run a kernel if the user's environment contains non string values. + ([#11749](https://github.com/Microsoft/vscode-python/issues/11749)) +1. On Mac meta+Z commands are performing both cell and editor undos. + ([#11758](https://github.com/Microsoft/vscode-python/issues/11758)) +1. Paste can sometimes double paste into a notebook or interactive window editor. + ([#11796](https://github.com/Microsoft/vscode-python/issues/11796)) +1. Fix jupyter connections going down when azure-storage or other extensions with node-fetch are installed. + ([#11830](https://github.com/Microsoft/vscode-python/issues/11830)) +1. Variables should not flash when running by line. + ([#12046](https://github.com/Microsoft/vscode-python/issues/12046)) +1. Discard changes on Notebooks when the user selects 'Don't Save' on the save changes dialog. + ([#12180](https://github.com/Microsoft/vscode-python/issues/12180)) +1. Disable `Extract variable & method` commands in `Notebook Cells`. + ([#12206](https://github.com/Microsoft/vscode-python/issues/12206)) +1. Disable linting in Notebook Cells. + ([#12208](https://github.com/Microsoft/vscode-python/issues/12208)) +1. Register services before extension activates. + ([#12227](https://github.com/Microsoft/vscode-python/issues/12227)) +1. Infinite loop of asking to reload the extension when enabling custom editor. + ([#12231](https://github.com/Microsoft/vscode-python/issues/12231)) +1. Fix raw kernel autostart and remove jupyter execution from interactive base. + ([#12330](https://github.com/Microsoft/vscode-python/issues/12330)) +1. If we fail to start a raw kernel daemon then fall back to using process execution. + ([#12355](https://github.com/Microsoft/vscode-python/issues/12355)) +1. Fix the export button from the interactive window to export again. + ([#12460](https://github.com/Microsoft/vscode-python/issues/12460)) +1. Process Jupyter messages synchronously when possible. + ([#12588](https://github.com/Microsoft/vscode-python/issues/12588)) +1. Open variable explorer when opening variable explorer during debugging. + ([#12773](https://github.com/Microsoft/vscode-python/issues/12773)) +1. Use the given interpreter for launching the non-daemon python + ([#12821](https://github.com/Microsoft/vscode-python/issues/12821)) +1. Correct the color of the 'Collapse All' button in the Interactive Window + ([#12838](https://github.com/microsoft/vscode-python/issues/12838)) + +### Code Health + +1. Move all logging to the Python output channel. + ([#9837](https://github.com/Microsoft/vscode-python/issues/9837)) +1. Add a functional test that opens both the interactive window and a notebook at the same time. + ([#11445](https://github.com/Microsoft/vscode-python/issues/11445)) +1. Added setting `python.logging.level` which carries the logging level value the extension will log at. + ([#11699](https://github.com/Microsoft/vscode-python/issues/11699)) +1. Monkeypatch `console.*` calls to the logger only in CI. + ([#11896](https://github.com/Microsoft/vscode-python/issues/11896)) +1. Replace python.dataScience.ptvsdDistPath with python.dataScience.debugpyDistPath. + ([#11993](https://github.com/Microsoft/vscode-python/issues/11993)) +1. Rename ptvsd to debugpy in Telemetry. + ([#11996](https://github.com/Microsoft/vscode-python/issues/11996)) +1. Update JSDoc annotations for many of the APIs (thanks [Anthony Shaw](https://github.com/tonybaloney)) + ([#12101](https://github.com/Microsoft/vscode-python/issues/12101)) +1. Refactor `LinterId` to an enum instead of a string union. + (thanks to [Anthony Shaw](https://github.com/tonybaloney)) + ([#12116](https://github.com/Microsoft/vscode-python/issues/12116)) +1. Remove webserver used to host contents in WebViews. + ([#12140](https://github.com/Microsoft/vscode-python/issues/12140)) +1. Inline interface due to issues with custom types when using `ts-node`. + ([#12238](https://github.com/Microsoft/vscode-python/issues/12238)) +1. Fix linux nightly tests so they run and report results. Also seems to get rid of stream destroyed messages for raw kernel. + ([#12539](https://github.com/Microsoft/vscode-python/issues/12539)) +1. Log ExP experiments the user belongs to in the output panel. + ([#12656](https://github.com/Microsoft/vscode-python/issues/12656)) +1. Add more telemetry for "Select Interpreter" command. + ([#12722](https://github.com/Microsoft/vscode-python/issues/12722)) +1. Add tests for trusted notebooks. + ([#12554](https://github.com/Microsoft/vscode-python/issues/12554)) +1. Update categories in `package.json`. + ([#12844](https://github.com/Microsoft/vscode-python/issues/12844)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.6.3 (30 June 2020) + +### Fixes + +1. Correctly check for ZMQ support, previously it could allow ZMQ to be supported when zmq could not be imported. + ([#12585](https://github.com/Microsoft/vscode-python/issues/12585)) +1. Auto indentation no longer working for notebooks and interactive window. + ([#12389](https://github.com/Microsoft/vscode-python/issues/12389)) +1. Add telemetry for tracking run by line. + ([#12580](https://github.com/Microsoft/vscode-python/issues/12580)) +1. Add more telemetry to distinguish how is the start page opened. + ([#12603](https://github.com/microsoft/vscode-python/issues/12603)) +1. Stop looking for mspythonconfig.json file in subfolders. + ([#12614](https://github.com/Microsoft/vscode-python/issues/12614)) + +## 2020.6.2 (25 June 2020) + +### Fixes + +1. Fix `linting.pylintEnabled` setting check. + ([#12285](https://github.com/Microsoft/vscode-python/issues/12285)) +1. Don't modify LS settings if jediEnabled does not exist. + ([#12429](https://github.com/Microsoft/vscode-python/issues/12429)) + +## 2020.6.1 (17 June 2020) + +### Fixes + +1. Fixed issue when `python.jediEnabled` setting was not removed and `python.languageServer` setting was not updated. + ([#12429](https://github.com/Microsoft/vscode-python/issues/12429)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.6.0 (16 June 2020) + +### Enhancements + +1. Removed `python.jediEnabled` setting in favor of `python.languageServer`. Instead of `"python.jediEnabled": true` please use `"python.languageServer": "Jedi"`. + ([#7010](https://github.com/Microsoft/vscode-python/issues/7010)) +1. Added a start page for the extension. It opens to new users or when there is a new release. It can be disabled with the setting 'Python: Show Start Page'. + ([#11057](https://github.com/Microsoft/vscode-python/issues/11057)) +1. Preliminary support using other languages for the kernel. + ([#11919](https://github.com/Microsoft/vscode-python/issues/11919)) +1. Enable the use of the custom editor for native notebooks. + ([#10744](https://github.com/Microsoft/vscode-python/issues/10744)) + +### Fixes + +1. Ensure sorting imports in a modified file picks up the proper configuration. + thanks [Peter Law](https://github.com/PeterJCLaw)) + ([#4891](https://github.com/Microsoft/vscode-python/issues/4891)) +1. Made variable explorer (from IPython Notebook interface) resizable. + ([#5382](https://github.com/Microsoft/vscode-python/issues/5382)) +1. Add junit family to pytest runner args to remove pytest warning. + ([#10673](https://github.com/Microsoft/vscode-python/issues/10673)) +1. Switch order of restart and cancel buttons in interactive window to be consistent with ordering in notebook toolbar. + ([#11091](https://github.com/Microsoft/vscode-python/issues/11091)) +1. Support opening other URI schemes besides 'file' and 'vsls'. + ([#11393](https://github.com/Microsoft/vscode-python/issues/11393)) +1. Fix issue with formatting when the first line is blank. + ([#11416](https://github.com/Microsoft/vscode-python/issues/11416)) +1. Force interactive window to always scroll long output. Don't allow scrollbars within scrollbars. + ([#11421](https://github.com/Microsoft/vscode-python/issues/11421)) +1. Hover on notebooks or interactive window seems to stutter. + ([#11422](https://github.com/Microsoft/vscode-python/issues/11422)) +1. Make shift+tab work again in the interactive window. Escaping focus from the prompt is now relegated to 'Shift+Esc'. + ([#11495](https://github.com/Microsoft/vscode-python/issues/11495)) +1. Keep import and export working with raw kernel mode. Also allow for installing dependencies if running an import before jupyter was ever launched. + ([#11501](https://github.com/Microsoft/vscode-python/issues/11501)) +1. Extra kernels that just say "Python 3 - python" are showing up in the raw kernel kernel picker. + ([#11552](https://github.com/Microsoft/vscode-python/issues/11552)) +1. Fix intermittent launch failure with raw kernels on windows. + ([#11574](https://github.com/Microsoft/vscode-python/issues/11574)) +1. Don't register a kernelspec when switching to an interpreter in raw kernel mode. + ([#11575](https://github.com/Microsoft/vscode-python/issues/11575)) +1. Keep the notebook input prompt up if you focus out of vscode. + ([#11581](https://github.com/Microsoft/vscode-python/issues/11581)) +1. Fix install message to reference run by line instead of debugging. + ([#11661](https://github.com/Microsoft/vscode-python/issues/11661)) +1. Run by line does not scroll to the line that is being run. + ([#11662](https://github.com/Microsoft/vscode-python/issues/11662)) +1. For direct kernel connection, don't replace a notebook's metadata default kernelspec with a new kernelspec on startup. + ([#11672](https://github.com/Microsoft/vscode-python/issues/11672)) +1. Fixes issue with importing `debupy` in interactive window. + ([#11686](https://github.com/Microsoft/vscode-python/issues/11686)) +1. Reopen all notebooks when rerunning the extension (including untitled ones). + ([#11711](https://github.com/Microsoft/vscode-python/issues/11711)) +1. Make sure to clear 'outputPrepend' when rerunning cells and to also only ever add it once to a cell. + (thanks [Barry Nolte](https://github.com/BarryNolte)) + ([#11726](https://github.com/Microsoft/vscode-python/issues/11726)) +1. Disable pre-warming of Kernel Daemons when user does not belong to the `LocalZMQKernel - experiment` experiment. + ([#11751](https://github.com/Microsoft/vscode-python/issues/11751)) +1. When switching to an invalid kernel (one that is registered but cannot start) in raw mode respect the launch timeout that is passed in. + ([#11752](https://github.com/Microsoft/vscode-python/issues/11752)) +1. Make `python.dataScience.textOutputLimit` apply on subsequent rerun. We were letting the 'outputPrepend' metadata persist from run to run. + (thanks [Barry Nolte](https://github.com/BarryNolte)) + ([#11777](https://github.com/Microsoft/vscode-python/issues/11777)) +1. Use `${command:python.interpreterPath}` to get selected interpreter path in `launch.json` and `tasks.json`. + ([#11789](https://github.com/Microsoft/vscode-python/issues/11789)) +1. Restarting a kernel messes up run by line. + ([#11793](https://github.com/Microsoft/vscode-python/issues/11793)) +1. Correctly show kernel status in raw kernel mode. + ([#11797](https://github.com/Microsoft/vscode-python/issues/11797)) +1. Hovering over variables in a python file can show two hover values if the interactive window is closed and reopened. + ([#11800](https://github.com/Microsoft/vscode-python/issues/11800)) +1. Make sure to use webView.cspSource for all csp sources. + ([#11855](https://github.com/Microsoft/vscode-python/issues/11855)) +1. Use command line arguments to launch our raw kernels as opposed to a connection file. The connection file seems to be causing issues in particular on windows CI machines with permissions. + ([#11883](https://github.com/Microsoft/vscode-python/issues/11883)) +1. Improve our status reporting when launching and connecting to a raw kernel. + ([#11951](https://github.com/Microsoft/vscode-python/issues/11951)) +1. Prewarm raw kernels based on raw kernel support and don't prewarm if jupyter autostart is disabled. + ([#11956](https://github.com/Microsoft/vscode-python/issues/11956)) +1. Don't flood the hard drive when typing in a large notebook file. + ([#12058](https://github.com/Microsoft/vscode-python/issues/12058)) +1. Disable run-by-line and continue buttons in run by line mode when running. + ([#12169](https://github.com/Microsoft/vscode-python/issues/12169)) +1. Disable `Sort Imports` command in `Notebook Cells`. + ([#12193](https://github.com/Microsoft/vscode-python/issues/12193)) +1. Fix debugger continue event to actually change a cell. + ([#12155](https://github.com/Microsoft/vscode-python/issues/12155)) +1. Make Jedi the Default value for the python.languageServer setting. + ([#12225](https://github.com/Microsoft/vscode-python/issues/12225)) +1. Make stop during run by line interrupt the kernel. + ([#12249](https://github.com/Microsoft/vscode-python/issues/12249)) +1. Have raw kernel respect the jupyter server disable auto start setting. + ([#12246](https://github.com/Microsoft/vscode-python/issues/12246)) + +### Code Health + +1. Use ts-loader as a tyepscript loader in webpack. + ([#9061](https://github.com/Microsoft/vscode-python/issues/9061)) +1. Fixed typo from unitest -> unittest. + (thanks [Rameez Khan](https://github.com/Rxmeez)). + ([#10919](https://github.com/Microsoft/vscode-python/issues/10919)) +1. Make functional tests more deterministic. + ([#11058](https://github.com/Microsoft/vscode-python/issues/11058)) +1. Reenable CDN unit tests. + ([#11442](https://github.com/Microsoft/vscode-python/issues/11442)) +1. Run by line for notebook cells minimal implementation. + ([#11607](https://github.com/Microsoft/vscode-python/issues/11607)) +1. Get shape and count when showing debugger variables. + ([#11657](https://github.com/Microsoft/vscode-python/issues/11657)) +1. Add more tests to verify data frames can be opened. + ([#11658](https://github.com/Microsoft/vscode-python/issues/11658)) +1. Support data tips overtop of python files that have had cells run. + ([#11659](https://github.com/Microsoft/vscode-python/issues/11659)) +1. Functional test for run by line functionality. + ([#11660](https://github.com/Microsoft/vscode-python/issues/11660)) +1. Fixed typo in a test from lanaguage -> language. + (thanks [Ashwin Ramaswami](https://github.com/epicfaace)). + ([#11775](https://github.com/Microsoft/vscode-python/issues/11775)) +1. Add bitness information to interpreter telemetry. + ([#11904](https://github.com/Microsoft/vscode-python/issues/11904)) +1. Fix failing linux debugger tests. + ([#11935](https://github.com/Microsoft/vscode-python/issues/11935)) +1. Faster unit tests on CI Pipeline. + ([#12017](https://github.com/Microsoft/vscode-python/issues/12017)) +1. Ensure we can use proposed VS Code API with `ts-node`. + ([#12025](https://github.com/Microsoft/vscode-python/issues/12025)) +1. Faster node unit tests on Azure pipeline. + ([#12027](https://github.com/Microsoft/vscode-python/issues/12027)) +1. Use [deemon](https://www.npmjs.com/package/deemon) package for background compilation with support for restarting VS Code during development. + ([#12059](https://github.com/Microsoft/vscode-python/issues/12059)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.5.3 (10 June 2020) + +1. Update `debugpy` to use `1.0.0b11` or greater. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.5.2 (8 June 2020) + +### Fixes + +1. Double-check for interpreters when running diagnostics before displaying the "Python is not installed" message. + ([#11870](https://github.com/Microsoft/vscode-python/issues/11870)) +1. Ensure user cannot belong to all experiments in an experiment group. + ([#11943](https://github.com/Microsoft/vscode-python/issues/11943)) +1. Ensure extension features are started when in `Deprecate PythonPath` experiment and opening a file without any folder opened. + ([#12177](https://github.com/Microsoft/vscode-python/issues/12177)) + +### Code Health + +1. Integrate VS Code experiment framework in the extension. + ([#10790](https://github.com/Microsoft/vscode-python/issues/10790)) +1. Update telemetry on errors and exceptions to use [vscode-extension-telemetry](https://www.npmjs.com/package/vscode-extension-telemetry). + ([#11597](https://github.com/Microsoft/vscode-python/issues/11597)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.5.1 (19 May 2020) + +### Fixes + +1. Do not execute shebang as an interpreter until user has clicked on the codelens enclosing the shebang. + ([#11687](https://github.com/Microsoft/vscode-python/issues/11687)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.5.0 (12 May 2020) + +### Enhancements + +1. Added ability to manually enter a path to interpreter in the select interpreter dropdown. + ([#216](https://github.com/Microsoft/vscode-python/issues/216)) +1. Add status bar item with icon when installing Insiders/Stable build. + (thanks to [ErwanDL](https://github.com/ErwanDL/)) + ([#10495](https://github.com/Microsoft/vscode-python/issues/10495)) +1. Support for language servers that don't allow incremental document updates inside of notebooks and the interactive window. + ([#10818](https://github.com/Microsoft/vscode-python/issues/10818)) +1. Add telemetry for "Python is not installed" prompt. + ([#10885](https://github.com/Microsoft/vscode-python/issues/10885)) +1. Add basic liveshare support for raw kernels. + ([#10988](https://github.com/Microsoft/vscode-python/issues/10988)) +1. Do a one-off transfer of existing values for `python.pythonPath` setting to new Interpreter storage if in DeprecatePythonPath experiment. + ([#11052](https://github.com/Microsoft/vscode-python/issues/11052)) +1. Ensure the language server can query pythonPath when in the Deprecate PythonPath experiment. + ([#11083](https://github.com/Microsoft/vscode-python/issues/11083)) +1. Added prompt asking users to delete `python.pythonPath` key from their workspace settings when in Deprecate PythonPath experiment. + ([#11108](https://github.com/Microsoft/vscode-python/issues/11108)) +1. Added `getDebuggerPackagePath` extension API to get the debugger package path. + ([#11236](https://github.com/Microsoft/vscode-python/issues/11236)) +1. Expose currently selected interpreter path using API. + ([#11294](https://github.com/Microsoft/vscode-python/issues/11294)) +1. Show a prompt asking user to upgrade Code runner to new version to keep using it when in Deprecate PythonPath experiment. + ([#11327](https://github.com/Microsoft/vscode-python/issues/11327)) +1. Rename string `${config:python.pythonPath}` which is used in `launch.json` to refer to interpreter path set in settings, to `${config:python.interpreterPath}`. + ([#11446](https://github.com/Microsoft/vscode-python/issues/11446)) + +### Fixes + +1. Added 'Enable Scrolling For Cell Outputs' setting. Works together with the 'Max Output Size' setting. + ([#9801](https://github.com/Microsoft/vscode-python/issues/9801)) +1. Fix ctrl+enter on markdown cells. Now they render. + ([#10006](https://github.com/Microsoft/vscode-python/issues/10006)) +1. Cancelling the prompt to restart the kernel should not leave the toolbar buttons disabled. + ([#10356](https://github.com/Microsoft/vscode-python/issues/10356)) +1. Getting environment variables of activated environments should ignore the setting `python.terminal.activateEnvironment`. + ([#10370](https://github.com/Microsoft/vscode-python/issues/10370)) +1. Show notebook path when listing remote kernels. + ([#10521](https://github.com/Microsoft/vscode-python/issues/10521)) +1. Allow filtering on '0' for the Data Viewer. + ([#10552](https://github.com/Microsoft/vscode-python/issues/10552)) +1. Allow interrupting the kernel more than once. + ([#10587](https://github.com/Microsoft/vscode-python/issues/10587)) +1. Make error links in exception tracebacks support multiple cells in the stack and extra spaces. + ([#10708](https://github.com/Microsoft/vscode-python/issues/10708)) +1. Add channel property onto returned ZMQ messages. + ([#10785](https://github.com/Microsoft/vscode-python/issues/10785)) +1. Fix problem with shape not being computed for some types in the variable explorer. + ([#10825](https://github.com/Microsoft/vscode-python/issues/10825)) +1. Enable cell related commands when a Python file is already open. + ([#10884](https://github.com/Microsoft/vscode-python/issues/10884)) +1. Fix issue with parsing long conda environment names. + ([#10942](https://github.com/Microsoft/vscode-python/issues/10942)) +1. Hide progress indicator once `Interactive Window` has loaded. + ([#11065](https://github.com/Microsoft/vscode-python/issues/11065)) +1. Do not perform pipenv interpreter discovery on extension activation. + Fix for [CVE-2020-1171](https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-1171). + ([#11127](https://github.com/Microsoft/vscode-python/issues/11127)) +1. Ensure arguments are included in log messages when using decorators. + ([#11153](https://github.com/Microsoft/vscode-python/issues/11153)) +1. Fix for opening the interactive window when no workspace is open. + ([#11291](https://github.com/Microsoft/vscode-python/issues/11291)) +1. Conda environments working with raw kernels. + ([#11306](https://github.com/Microsoft/vscode-python/issues/11306)) +1. Ensure isolate script is passed as command argument when installing modules. + ([#11399](https://github.com/Microsoft/vscode-python/issues/11399)) +1. Make raw kernel launch respect launched resource environment. + ([#11451](https://github.com/Microsoft/vscode-python/issues/11451)) +1. When using a kernelspec without a fully qualified python path make sure we use the resource to get the active interpreter. + ([#11469](https://github.com/Microsoft/vscode-python/issues/11469)) +1. For direct kernel launch correctly detect if interpreter has changed since last launch. + ([#11530](https://github.com/Microsoft/vscode-python/issues/11530)) +1. Performance improvements when executing multiple cells in `Notebook` and `Interactive Window`. + ([#11576](https://github.com/Microsoft/vscode-python/issues/11576)) +1. Ensure kernel daemons are disposed correctly when closing notebooks. + ([#11579](https://github.com/Microsoft/vscode-python/issues/11579)) +1. When VS quits, make sure to save contents of notebook for next reopen. + ([#11557](https://github.com/Microsoft/vscode-python/issues/11557)) +1. Fix scrolling when clicking in the interactive window to not jump around. + ([#11554](https://github.com/Microsoft/vscode-python/issues/11554)) +1. Setting "Data Science: Run Startup Commands" is now limited to being a user setting. + Fix for [CVE-2020-1192](https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-1192). + +### Code Health + +1. Enable the `Self Cert` tests for Notebooks. + ([#10447](https://github.com/Microsoft/vscode-python/issues/10447)) +1. Remove deprecated telemetry and old way of searching for `Jupyter`. + ([#10809](https://github.com/Microsoft/vscode-python/issues/10809)) +1. Add telemetry for pipenv interpreter discovery. + ([#11128](https://github.com/Microsoft/vscode-python/issues/11128)) +1. Update to the latest version of [`jedi`](https://github.com/davidhalter/jedi) (`0.17`). Note that this may be the last version of Jedi to support Python 2 and Python 3.5. (#11221; thanks Peter Law) + ([#11221](https://github.com/Microsoft/vscode-python/issues/11221)) +1. Lazy load types from `jupyterlab/services` and similar `npm modules`. + ([#11297](https://github.com/Microsoft/vscode-python/issues/11297)) +1. Remove IJMPConnection implementation while maintaining tests written for it. + ([#11470](https://github.com/Microsoft/vscode-python/issues/11470)) +1. Implement an IJupyterVariables provider for the debugger. + ([#11542](https://github.com/Microsoft/vscode-python/issues/11542)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.4.1 (27 April 2020) + +### Fixes + +1. Use node FS APIs when searching for python. This is a temporary change until VSC FS APIs are fixed. + ([#10850](https://github.com/Microsoft/vscode-python/issues/10850)) +1. Show unhandled widget messages in the jupyter output window. + ([#11239](https://github.com/Microsoft/vscode-python/issues/11239)) +1. Warn when using a version of the widget `qgrid` greater than `1.1.1` with the recommendation to downgrade to `1.1.1`. + ([#11245](https://github.com/Microsoft/vscode-python/issues/11245)) +1. Allow user modules import when discovering tests. + ([#11264](https://github.com/Microsoft/vscode-python/issues/11264)) +1. Fix issue where downloading ipywidgets from the CDN might be busy. + ([#11274](https://github.com/Microsoft/vscode-python/issues/11274)) +1. Error: Timeout is shown after running any widget more than once. + ([#11334](https://github.com/Microsoft/vscode-python/issues/11334)) +1. Change "python.dataScience.runStartupCommands" commands to be a global setting, not a workspace setting. + ([#11352](https://github.com/Microsoft/vscode-python/issues/11352)) +1. Closing the interactive window shuts down other active notebook sessions. + ([#11404](https://github.com/Microsoft/vscode-python/issues/11404)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.4.0 (20 April 2020) + +### Enhancements + +1. Add support for `ipywidgets`. + ([#3429](https://github.com/Microsoft/vscode-python/issues/3429)) +1. Support output and interact ipywidgets. + ([#9524](https://github.com/Microsoft/vscode-python/issues/9524)) +1. Support using 'esc' or 'ctrl+u' to clear the contents of the interactive window input box. + ([#10198](https://github.com/Microsoft/vscode-python/issues/10198)) +1. Use new interpreter storage supporting multiroot workspaces when in Deprecate PythonPath experiment. + ([#10325](https://github.com/Microsoft/vscode-python/issues/10325)) +1. Modified `Select interpreter` command to support setting interpreter at workspace level. + ([#10372](https://github.com/Microsoft/vscode-python/issues/10372)) +1. Added a command `Clear Workspace Interpreter Setting` to clear value of Python interpreter from workspace settings. + ([#10374](https://github.com/Microsoft/vscode-python/issues/10374)) +1. Support reverse connection ("listen" in launch.json) from debug adapter to VSCode. + ([#10437](https://github.com/Microsoft/vscode-python/issues/10437)) +1. Use specific icons when downloading MPLS and Insiders instead of the spinner. + ([#10495](https://github.com/Microsoft/vscode-python/issues/10495)) +1. Notebook metadata is now initialized in alphabetical order. + ([#10571](https://github.com/Microsoft/vscode-python/issues/10571)) +1. Added command translations for Hindi Language. + (thanks [Pai026](https://github.com/Pai026/)) + ([#10711](https://github.com/Microsoft/vscode-python/issues/10711)) +1. Prompt when an "untrusted" workspace Python environment is to be auto selected when in Deprecate PythonPath experiment. + ([#10879](https://github.com/Microsoft/vscode-python/issues/10879)) +1. Added a command `Reset stored info for untrusted Interpreters` to reset "untrusted" interpreters storage when in Deprecate PythonPath experiment. + ([#10912](https://github.com/Microsoft/vscode-python/issues/10912)) +1. Added a user setting `python.defaultInterpreterPath` to set up the default interpreter path when in Deprecate PythonPath experiment. + ([#11021](https://github.com/Microsoft/vscode-python/issues/11021)) +1. Hide "untrusted" interpreters from 'Select interpreter' dropdown list when in DeprecatePythonPath Experiment. + ([#11046](https://github.com/Microsoft/vscode-python/issues/11046)) +1. Make spacing of icons on notebook toolbars match spacing on other VS code toolbars. + ([#10464](https://github.com/Microsoft/vscode-python/issues/10464)) +1. Make jupyter server status centered in the UI and use the same font as the rest of VS code. + ([#10465](https://github.com/Microsoft/vscode-python/issues/10465)) +1. Performa validation of interpreter only when a Notebook is opened instead of when extension activates. + ([#10893](https://github.com/Microsoft/vscode-python/issues/10893)) +1. Scrolling in cells doesn't happen on new line. + ([#10952](https://github.com/Microsoft/vscode-python/issues/10952)) +1. Ensure images in workspace folder are supported within markdown cells in a `Notebook`. + ([#11040](https://github.com/Microsoft/vscode-python/issues/11040)) +1. Make sure ipywidgets have a white background so they display in dark themes. + ([#11060](https://github.com/Microsoft/vscode-python/issues/11060)) +1. Arrowing down through cells put the cursor in the wrong spot. + ([#11094](https://github.com/Microsoft/vscode-python/issues/11094)) + +### Fixes + +1. Ensure plot fits within the page of the `PDF`. + ([#9403](https://github.com/Microsoft/vscode-python/issues/9403)) +1. Fix typing in output of cells to not delete or modify any cells. + ([#9519](https://github.com/Microsoft/vscode-python/issues/9519)) +1. Show an error when ipywidgets cannot be found. + ([#9523](https://github.com/Microsoft/vscode-python/issues/9523)) +1. Experiments no longer block on telemetry. + ([#10008](https://github.com/Microsoft/vscode-python/issues/10008)) +1. Fix interactive window debugging after running cells in a notebook. + ([#10206](https://github.com/Microsoft/vscode-python/issues/10206)) +1. Fix problem with Data Viewer not working when builtin functions are overridden (like max). + ([#10280](https://github.com/Microsoft/vscode-python/issues/10280)) +1. Fix interactive window debugging when debugging the first cell to be run. + ([#10395](https://github.com/Microsoft/vscode-python/issues/10395)) +1. Fix interactive window debugging for extra lines in a function. + ([#10396](https://github.com/Microsoft/vscode-python/issues/10396)) +1. Notebook metadata is now initialized in the correct place. + ([#10544](https://github.com/Microsoft/vscode-python/issues/10544)) +1. Fix save button not working on notebooks. + ([#10647](https://github.com/Microsoft/vscode-python/issues/10647)) +1. Fix toolbars on 3rd party widgets to show correct icons. + ([#10734](https://github.com/Microsoft/vscode-python/issues/10734)) +1. Clicking or double clicking in output of a cell selects or gives focus to a cell. It should only affect the controls in the output. + ([#10749](https://github.com/Microsoft/vscode-python/issues/10749)) +1. Fix for notebooks not becoming dirty when changing a kernel. + ([#10795](https://github.com/Microsoft/vscode-python/issues/10795)) +1. Auto save for focusChange is not respected when switching to non text documents. Menu focus will still not cause a save (no callback from VS code for this), but should work for switching to other apps and non text documents. + ([#10853](https://github.com/Microsoft/vscode-python/issues/10853)) +1. Handle display.update inside of cells. + ([#10873](https://github.com/Microsoft/vscode-python/issues/10873)) +1. ZMQ should not cause local server to fail. + ([#10877](https://github.com/Microsoft/vscode-python/issues/10877)) +1. Fixes issue with spaces in debugger paths when using `getRemoteLauncherCommand`. + ([#10905](https://github.com/Microsoft/vscode-python/issues/10905)) +1. Fix output and interact widgets to work again. + ([#10915](https://github.com/Microsoft/vscode-python/issues/10915)) +1. Make sure the same python is used for the data viewer as the notebook so that pandas can be found. + ([#10926](https://github.com/Microsoft/vscode-python/issues/10926)) +1. Ensure user code in cell is preserved between cell execution and cell edits. + ([#10949](https://github.com/Microsoft/vscode-python/issues/10949)) +1. Make sure the interpreter in the notebook matches the kernel. + ([#10953](https://github.com/Microsoft/vscode-python/issues/10953)) +1. Jupyter notebooks and interactive window crashing on startup. + ([#11035](https://github.com/Microsoft/vscode-python/issues/11035)) +1. Fix perf problems after running the interactive window for an extended period of time. + ([#10971](https://github.com/Microsoft/vscode-python/issues/10971)) +1. Fix problem with opening a notebook in jupyter after saving in VS code. + ([#11151](https://github.com/Microsoft/vscode-python/issues/11151)) +1. Fix CTRL+Z and Z for undo on notebooks. + ([#11160](https://github.com/Microsoft/vscode-python/issues/11160)) +1. Fix saving to PDF for viewed plots. + ([#11157](https://github.com/Microsoft/vscode-python/issues/11157)) +1. Fix scrolling in a notebook whenever resizing or opening. + ([#11238](https://github.com/Microsoft/vscode-python/issues/11238)) + +### Code Health + +1. Add conda environments to nightly test runs. + ([#10134](https://github.com/Microsoft/vscode-python/issues/10134)) +1. Refactor the extension activation code to split on phases. + ([#10454](https://github.com/Microsoft/vscode-python/issues/10454)) +1. Added a kernel launcher to spawn python kernels without Jupyter. + ([#10479](https://github.com/Microsoft/vscode-python/issues/10479)) +1. Add ZMQ library to extension. + ([#10483](https://github.com/Microsoft/vscode-python/issues/10483)) +1. Added test harness for `ipywidgets` in `notebooks`. + ([#10655](https://github.com/Microsoft/vscode-python/issues/10655)) +1. Run internal modules and scripts in isolated manner. + This helps avoid problems like shadowing stdlib modules. + ([#10681](https://github.com/Microsoft/vscode-python/issues/10681)) +1. Add telemetry for .env files. + ([#10780](https://github.com/Microsoft/vscode-python/issues/10780)) +1. Update prettier to latest version. + ([#10837](https://github.com/Microsoft/vscode-python/issues/10837)) +1. Update typescript to `3.8`. + ([#10839](https://github.com/Microsoft/vscode-python/issues/10839)) +1. Add telemetry around ipywidgets usage, failures, and overhead. + ([#11027](https://github.com/Microsoft/vscode-python/issues/11027)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.3.2 (2 April 2020) + +### Fixes + +1. Update `debugpy` to latest (v1.0.0b5). Fixes issue with connections with multi-process. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.3.1 (31 March 2020) + +### Fixes + +1. Update `debugpy` to latest (v1.0.0b4). Fixes issue with locale. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.3.0 (19 March 2020) + +### Enhancements + +1. Make interactive window wrap like the notebook editor does. + ([#4466](https://github.com/Microsoft/vscode-python/issues/4466)) +1. Support scrolling beyond the last line in the notebook editor and the interactive window. Uses the `editor.scrollBeyondLastLine` setting. + ([#7892](https://github.com/Microsoft/vscode-python/issues/7892)) +1. Allow user to override the arguments passed to Jupyter on startup. To change the arguments, run the 'Python: Specify Jupyter command line arguments" command. + ([#8698](https://github.com/Microsoft/vscode-python/issues/8698)) +1. When entering remote Jupyter Server, default the input value to uri in clipboard. + ([#9163](https://github.com/Microsoft/vscode-python/issues/9163)) +1. Added a command to allow users to select a kernel for a `Notebook`. + ([#9228](https://github.com/Microsoft/vscode-python/issues/9228)) +1. When saving new `notebooks`, default to the current workspace folder. + ([#9331](https://github.com/Microsoft/vscode-python/issues/9331)) +1. When the output of a cell gets trimmed for the first time, the user will be informed of it and which setting changes it. + ([#9401](https://github.com/Microsoft/vscode-python/issues/9401)) +1. Change the parameters for when a Data Science survey prompt comes up. After opening 5 notebooks (ever) or running 100 cells (ever). + ([#10186](https://github.com/Microsoft/vscode-python/issues/10186)) +1. Show quickfixes for launch.json. + ([#10245](https://github.com/Microsoft/vscode-python/issues/10245)) + +### Fixes + +1. Jupyter autocompletion will only show magic commands on empty lines, preventing them of appearing in functions. + ([#10023](https://github.com/Microsoft/vscode-python/issues/10023)) +1. Remove extra lines at the end of the file when formatting with Black. + ([#1877](https://github.com/Microsoft/vscode-python/issues/1877)) +1. Capitalize `Activate.ps1` in code for PowerShell Core on Linux. + ([#2607](https://github.com/Microsoft/vscode-python/issues/2607)) +1. Change interactive window to use the python interpreter associated with the file being run. + ([#3123](https://github.com/Microsoft/vscode-python/issues/3123)) +1. Make line numbers in errors for the Interactive window match the original file and make them clickable for jumping back to an error location. + ([#6370](https://github.com/Microsoft/vscode-python/issues/6370)) +1. Fix magic commands that return 'paged' output. + ([#6900](https://github.com/Microsoft/vscode-python/issues/6900)) +1. Ensure model is updated with user changes after user types into the editor. + ([#8589](https://github.com/Microsoft/vscode-python/issues/8589)) +1. Fix latex output from a code cell to render correctly. + ([#8742](https://github.com/Microsoft/vscode-python/issues/8742)) +1. Toggling cell type from `code` to `markdown` will not set focus to the editor in cells of a `Notebook`. + ([#9102](https://github.com/Microsoft/vscode-python/issues/9102)) +1. Remove whitespace from code before pushing to the interactive window. + ([#9116](https://github.com/Microsoft/vscode-python/issues/9116)) +1. Have sys info show that we have connected to an existing server. + ([#9132](https://github.com/Microsoft/vscode-python/issues/9132)) +1. Fix IPython.clear_output to behave like Jupyter. + ([#9174](https://github.com/Microsoft/vscode-python/issues/9174)) +1. Jupyter output tab was not showing anything when connecting to a remote server. + ([#9177](https://github.com/Microsoft/vscode-python/issues/9177)) +1. Fixed our css generation from custom color themes which caused the Data Viewer to not load. + ([#9242](https://github.com/Microsoft/vscode-python/issues/9242)) +1. Allow a user to skip switching to a kernel if the kernel dies during startup. + ([#9250](https://github.com/Microsoft/vscode-python/issues/9250)) +1. Clean up interative window styling and set focus to input box if clicking in the interactive window. + ([#9282](https://github.com/Microsoft/vscode-python/issues/9282)) +1. Change icon spacing to match vscode icon spacing in native editor toolbars and interactive window toolbar. + ([#9283](https://github.com/Microsoft/vscode-python/issues/9283)) +1. Display diff viewer for `ipynb` files without opening `Notebooks`. + ([#9395](https://github.com/Microsoft/vscode-python/issues/9395)) +1. Python environments will not be activated in terminals hidden from the user. + ([#9503](https://github.com/Microsoft/vscode-python/issues/9503)) +1. Disable `Restart Kernel` and `Interrupt Kernel` buttons when a `kernel` has not yet started. + ([#9731](https://github.com/Microsoft/vscode-python/issues/9731)) +1. Fixed an issue with multiple latex formulas in the same '\$\$' block. + ([#9766](https://github.com/Microsoft/vscode-python/issues/9766)) +1. Make notebook editor and interactive window honor undocumented editor.scrollbar.verticalScrollbarSize option + increase default to match vscode. + ([#9803](https://github.com/Microsoft/vscode-python/issues/9803)) +1. Ensure that invalid kernels don't hang notebook startup or running. + ([#9845](https://github.com/Microsoft/vscode-python/issues/9845)) +1. Switching kernels should disable the run/interrupt/restart buttons. + ([#9935](https://github.com/Microsoft/vscode-python/issues/9935)) +1. Prompt to install `pandas` if not found when opening the `Data Viewer`. + ([#9944](https://github.com/Microsoft/vscode-python/issues/9944)) +1. Prompt to reload VS Code when changing the Jupyter Server connection. + ([#9945](https://github.com/Microsoft/vscode-python/issues/9945)) +1. Support opening spark dataframes in the data viewer. + ([#9959](https://github.com/Microsoft/vscode-python/issues/9959)) +1. Make sure metadata in a cell survives execution. + ([#9997](https://github.com/Microsoft/vscode-python/issues/9997)) +1. Fix run all cells to force each cell to finish before running the next one. + ([#10016](https://github.com/Microsoft/vscode-python/issues/10016)) +1. Fix interrupts from always thinking a restart occurred. + ([#10050](https://github.com/Microsoft/vscode-python/issues/10050)) +1. Do not delay activation of extension by waiting for terminal to get activated. + ([#10094](https://github.com/Microsoft/vscode-python/issues/10094)) +1. LiveShare can prevent the jupyter server from starting if it crashes. + ([#10097](https://github.com/Microsoft/vscode-python/issues/10097)) +1. Mark `poetry.lock` file as toml syntax. + (thanks to [remcohaszing](https://github.com/remcohaszing/)) + ([#10111](https://github.com/Microsoft/vscode-python/issues/10111)) +1. Hide input in `Interactive Window` based on the setting `allowInput`. + ([#10124](https://github.com/Microsoft/vscode-python/issues/10124)) +1. Fix scrolling for output to consistently scroll even during execution. + ([#10137](https://github.com/Microsoft/vscode-python/issues/10137)) +1. Correct image backgrounds for notebook editor. + ([#10154](https://github.com/Microsoft/vscode-python/issues/10154)) +1. Fix empty variables to show an empty string in the Notebook/Interactive Window variable explorer. + ([#10204](https://github.com/Microsoft/vscode-python/issues/10204)) +1. In addition to updating current working directory also add on our notebook file path to sys.path to match Jupyter. + ([#10227](https://github.com/Microsoft/vscode-python/issues/10227)) +1. Ensure message (about trimmed output) displayed in an output cell looks like a link. + ([#10231](https://github.com/Microsoft/vscode-python/issues/10231)) +1. Users can opt into or opt out of experiments in remote scenarios. + ([#10232](https://github.com/Microsoft/vscode-python/issues/10232)) +1. Ensure to correctly return env variables of the activated interpreter, when dealing with non-workspace interpreters. + ([#10250](https://github.com/Microsoft/vscode-python/issues/10250)) +1. Update kernel environments before each run to use the latest environment. Only do this for kernel specs created by the python extension. + ([#10255](https://github.com/Microsoft/vscode-python/issues/10255)) +1. Don't start up and shutdown an extra Jupyter notebook on server startup. + ([#10311](https://github.com/Microsoft/vscode-python/issues/10311)) +1. When you install missing dependencies for Jupyter successfully in an active interpreter also set that interpreter as the Jupyter selected interpreter. + ([#10359](https://github.com/Microsoft/vscode-python/issues/10359)) +1. Ensure default `host` is not set, if `connect` or `listen` settings are available. + ([#10597](https://github.com/Microsoft/vscode-python/issues/10597)) + +### Code Health + +1. Use the new VS Code filesystem API as much as possible. + ([#6911](https://github.com/Microsoft/vscode-python/issues/6911)) +1. Functional tests using real jupyter can take 30-90 seconds each. Most of this time is searching for interpreters. Cache the interpreter search. + ([#7997](https://github.com/Microsoft/vscode-python/issues/7997)) +1. Use Python 3.8 in tests run on Azure DevOps. + ([#8298](https://github.com/Microsoft/vscode-python/issues/8298)) +1. Display `Commands` related to `Interactive Window` and `Notebooks` only when necessary. + ([#8869](https://github.com/Microsoft/vscode-python/issues/8869)) +1. Change cursor styles of buttons `pointer` in `Interactive Window` and `Native Editor`. + ([#9341](https://github.com/Microsoft/vscode-python/issues/9341)) +1. Update Jedi to 0.16.0. + ([#9765](https://github.com/Microsoft/vscode-python/issues/9765)) +1. Update version of `VSCode` in `package.json` to `1.42`. + ([#10046](https://github.com/Microsoft/vscode-python/issues/10046)) +1. Capture `mimetypes` of cell outputs. + ([#10182](https://github.com/Microsoft/vscode-python/issues/10182)) +1. Use debugpy in the core extension instead of ptvsd. + ([#10184](https://github.com/Microsoft/vscode-python/issues/10184)) +1. Add telemetry for imports in notebooks. + ([#10209](https://github.com/Microsoft/vscode-python/issues/10209)) +1. Update data science component to use `debugpy`. + ([#10211](https://github.com/Microsoft/vscode-python/issues/10211)) +1. Use new MacOS VM in Pipelines. + ([#10288](https://github.com/Microsoft/vscode-python/issues/10288)) +1. Split the windows PR tests into two sections so they do not time out. + ([#10293](https://github.com/Microsoft/vscode-python/issues/10293)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [debugpy](https://pypi.org/project/debugpy/) +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.2.3 (21 February 2020) + +### Fixes + +1. Ensure to correctly return env variables of the activated interpreter, when dealing with non-workspace interpreters. + ([#10250](https://github.com/Microsoft/vscode-python/issues/10250)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.2.2 (19 February 2020) + +### Fixes + +1. Improve error messaging when the jupyter notebook cannot be started. + ([#9904](https://github.com/Microsoft/vscode-python/issues/9904)) +1. Clear variables in notebooks and interactive-window when restarting. + ([#9991](https://github.com/Microsoft/vscode-python/issues/9991)) +1. Re-install `Jupyter` instead of installing `kernelspec` if `kernelspec` cannot be found in the python environment. + ([#10071](https://github.com/Microsoft/vscode-python/issues/10071)) +1. Fixes problem with showing ndarrays in the data viewer. + ([#10074](https://github.com/Microsoft/vscode-python/issues/10074)) +1. Fix data viewer not opening on certain data frames. + ([#10075](https://github.com/Microsoft/vscode-python/issues/10075)) +1. Fix svg mimetype so it shows up correctly in richest mimetype order. + ([#10168](https://github.com/Microsoft/vscode-python/issues/10168)) +1. Perf improvements to executing startup code for `Data Science` features when extension loads. + ([#10170](https://github.com/Microsoft/vscode-python/issues/10170)) + +### Code Health + +1. Add telemetry to track notebook languages + ([#9819](https://github.com/Microsoft/vscode-python/issues/9819)) +1. Telemetry around kernels not working and installs not working. + ([#9883](https://github.com/Microsoft/vscode-python/issues/9883)) +1. Change select kernel telemetry to track duration till quick pick appears. + ([#10049](https://github.com/Microsoft/vscode-python/issues/10049)) +1. Track cold/warm times to execute notebook cells. + ([#10176](https://github.com/Microsoft/vscode-python/issues/10176)) +1. Telemetry to capture connections to `localhost` using the connect to remote Jupyter server feature. + ([#10098](https://github.com/Microsoft/vscode-python/issues/10098)) +1. Telemetry to capture perceived startup times of Jupyter and time to execute a cell. + ([#10212](https://github.com/Microsoft/vscode-python/issues/10212)) + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.2.1 (12 February 2020) + +### Fixes + +1. Re-install `Jupyter` instead of installing `kernelspec` if `kernelspec` cannot be found in the python environment. + ([#10071](https://github.com/Microsoft/vscode-python/issues/10071)) +1. Fix zh-tw localization file loading issue. + (thanks to [ChenKB91](https://github.com/ChenKB91/)) + ([#10072](https://github.com/Microsoft/vscode-python/issues/10072)) + +### Note + +1. Please only set the `python.languageServer` setting if you want to turn IntelliSense off. To switch between language servers, please keep using the `python.jediEnabled` setting for now. + +### Thanks + +Thanks to the following projects which we fully rely on to provide some of +our features: + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) + +Also thanks to the various projects we provide integrations with which help +make this extension useful: + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +And finally thanks to the [Python](https://www.python.org/) development team and +community for creating a fantastic programming language and community to be a +part of! + +## 2020.2.0 (11 February 2020) ### Enhancements @@ -42,11 +6131,24 @@ 1. Update Chinese (Traditional) translation. (thanks [pan93412](https://github.com/pan93412)) ([#9548](https://github.com/Microsoft/vscode-python/issues/9548)) -1. Look for Conda interpreters in '~/opt/*conda*/' directory as well. +1. Look for Conda interpreters in `~/opt/*conda*/` directory as well. ([#9701](https://github.com/Microsoft/vscode-python/issues/9701)) ### Fixes +1. add --ip=127.0.0.1 argument of jupyter server when running in k8s container + ([#9976](https://github.com/Microsoft/vscode-python/issues/9976)) +1. Correct the server and kernel text for when not connected to a server. + ([#9933](https://github.com/Microsoft/vscode-python/issues/9933)) +1. Make sure to clear variable list on restart kernel. + ([#9740](https://github.com/Microsoft/vscode-python/issues/9740)) +1. Use the autoStart server when available. + ([#9926](https://github.com/Microsoft/vscode-python/issues/9926)) +1. Removed unnecessary warning when executing cells that use Scrapbook, + Fix an html crash when using not supported mime types + ([#9796](https://github.com/microsoft/vscode-python/issues/9796)) +1. Fixed the focus on the interactive window when pressing ctrl + 1/ ctrl + 2 + ([#9693](https://github.com/microsoft/vscode-python/issues/9693)) 1. Fix variable explorer in Interactive and Notebook editors from interfering with execution. ([#5980](https://github.com/Microsoft/vscode-python/issues/5980)) 1. Fix a crash when using pytest to discover doctests with unknown line number. @@ -116,6 +6218,8 @@ ([#9780](https://github.com/Microsoft/vscode-python/issues/9780)) 1. When comitting intellisense in Notebook Editor with Jedi place code in correct position. ([#9857](https://github.com/Microsoft/vscode-python/issues/9857)) +1. Ignore errors coming from stat(), where appropriate. + ([#9901](https://github.com/Microsoft/vscode-python/issues/9901)) ### Code Health @@ -154,48 +6258,50 @@ Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -269,7 +6375,7 @@ part of! ([#7853](https://github.com/Microsoft/vscode-python/issues/7853)) 1. Fix clear_output(True) to work in notebook cells. ([#7970](https://github.com/Microsoft/vscode-python/issues/7970)) -1. Prevented '$0' from appearing inside brackets when using intellisense autocomplete. +1. Prevented '\$0' from appearing inside brackets when using intellisense autocomplete. ([#8101](https://github.com/Microsoft/vscode-python/issues/8101)) 1. Intellisense can sometimes not appear in notebooks or the interactive window, especially when something is a large list. ([#8140](https://github.com/Microsoft/vscode-python/issues/8140)) @@ -364,48 +6470,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -428,48 +6536,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -490,7 +6600,7 @@ part of! ([#8000](https://github.com/Microsoft/vscode-python/issues/8000)) 1. Prompt to open exported `Notebook` in the `Notebook Editor`. ([#8078](https://github.com/Microsoft/vscode-python/issues/8078)) -1. Add commands translation for Farsi locale. +1. Add commands translation for Persian locale. (thanks [Nikronic](https://github.com/Nikronic)) ([#8092](https://github.com/Microsoft/vscode-python/issues/8092)) 1. Enhance "select a workspace" message when selecting interpreter. @@ -542,7 +6652,7 @@ part of! ([#7873](https://github.com/Microsoft/vscode-python/issues/7873)) 1. When creating a new blank notebook, it has existing text in it already. ([#7980](https://github.com/Microsoft/vscode-python/issues/7980)) -1. Can now include a LaTeX-style equation without surrounding the equation with '$' in a markdown cell. +1. Can now include a LaTeX-style equation without surrounding the equation with '\$' in a markdown cell. ([#7992](https://github.com/Microsoft/vscode-python/issues/7992)) 1. Make a spinner appear during executing a cell. ([#8003](https://github.com/Microsoft/vscode-python/issues/8003)) @@ -640,49 +6750,51 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [pyparsing](https://pypi.org/project/pyparsing/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [pyparsing](https://pypi.org/project/pyparsing/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -758,48 +6870,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -849,13 +6963,13 @@ part of! 1. Replaced occurrences of `pep8` with `pycodestyle.` All mentions of pep8 have been replaced with pycodestyle. Add script to replace outdated settings with the new ones in user settings.json - * python.linting.pep8Args -> python.linting.pycodestyleArgs - * python.linting.pep8CategorySeverity.E -> python.linting.pycodestyleCategorySeverity.E - * python.linting.pep8CategorySeverity.W -> python.linting.pycodestyleCategorySeverity.W - * python.linting.pep8Enabled -> python.linting.pycodestyleEnabled - * python.linting.pep8Path -> python.linting.pycodestylePath - * (thanks [Marsfan](https://github.com/Marsfan)) - ([#410](https://github.com/Microsoft/vscode-python/issues/410)) + - python.linting.pep8Args -> python.linting.pycodestyleArgs + - python.linting.pep8CategorySeverity.E -> python.linting.pycodestyleCategorySeverity.E + - python.linting.pep8CategorySeverity.W -> python.linting.pycodestyleCategorySeverity.W + - python.linting.pep8Enabled -> python.linting.pycodestyleEnabled + - python.linting.pep8Path -> python.linting.pycodestylePath + - (thanks [Marsfan](https://github.com/Marsfan)) + ([#410](https://github.com/Microsoft/vscode-python/issues/410)) 1. Do not change `foreground` colors in test statusbar. ([#4387](https://github.com/Microsoft/vscode-python/issues/4387)) 1. Set the `__file__` variable whenever running code so that `__file__` usage works in the interactive window. @@ -867,11 +6981,11 @@ part of! 1. Changed the way scrolling is treated. Now we only check for the position of the scroll, the size of the cell won't matter. Still the interactive window will snap to the bottom if you already are at the bottom, and will stay in place if you are not. Like a chat window. Tested to work with: - - regular code - - dataframes - - big and regular plots - Turned the check of the scroll at the bottom from checking equal to checking a range to make it work with fractions. - ([#6580](https://github.com/Microsoft/vscode-python/issues/6580)) + - regular code + - dataframes + - big and regular plots + Turned the check of the scroll at the bottom from checking equal to checking a range to make it work with fractions. + ([#6580](https://github.com/Microsoft/vscode-python/issues/6580)) 1. Changed the name of the setting 'Run Magic Commands' to 'Run Startup Commands' to avoid confusion. ([#6842](https://github.com/Microsoft/vscode-python/issues/6842)) 1. Fix the debugger being installed even when available from the VSCode install. @@ -1032,7 +7146,7 @@ part of! ([#7376](https://github.com/Microsoft/vscode-python/issues/7376)) 1. Refactor Azure Pipelines to use stages. ([#7431](https://github.com/Microsoft/vscode-python/issues/7431)) -1. Add unit tests to guarantee that the extension version in the master branch has the '-dev' suffix. +1. Add unit tests to guarantee that the extension version in the main branch has the '-dev' suffix. ([#7471](https://github.com/Microsoft/vscode-python/issues/7471)) 1. Add a smoke test for the `Interactive Window`. ([#7653](https://github.com/Microsoft/vscode-python/issues/7653)) @@ -1043,48 +7157,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -1175,10 +7291,11 @@ part of! ([#6938](https://github.com/Microsoft/vscode-python/issues/6938)) 1. Bump version of [PTVSD](https://pypi.org/project/ptvsd/) to `4.3.2`. - * Fix an issue with Jump to cursor command. [#1667](https://github.com/microsoft/ptvsd/issues/1667) - * Fix "Unable to find threadStateIndex for the current thread" message in terminal. [#1587](https://github.com/microsoft/ptvsd/issues/1587) - * Fixes crash when using python 3.7.4. [#1688](https://github.com/microsoft/ptvsd/issues/1688) - ([#6961](https://github.com/Microsoft/vscode-python/issues/6961)) + - Fix an issue with Jump to cursor command. [#1667](https://github.com/microsoft/ptvsd/issues/1667) + - Fix "Unable to find threadStateIndex for the current thread" message in terminal. [#1587](https://github.com/microsoft/ptvsd/issues/1587) + - Fixes crash when using python 3.7.4. [#1688](https://github.com/microsoft/ptvsd/issues/1688) + ([#6961](https://github.com/Microsoft/vscode-python/issues/6961)) + 1. Move nightly functional tests to use mock jupyter and create a new pipeline for flakey tests which use real jupyter. ([#7066](https://github.com/Microsoft/vscode-python/issues/7066)) 1. Corrected spelling of name for method to be `hasConfigurationFileInWorkspace`. @@ -1190,48 +7307,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -1328,7 +7447,7 @@ part of! 1. Fix overwriting of cwd in the path list when discovering tests. ([#6417](https://github.com/Microsoft/vscode-python/issues/6417)) 1. Fixes a bug in pytest test discovery. - (thanks Rainer Dreyer) + (thanks Rainer Dreyer) ([#6463](https://github.com/Microsoft/vscode-python/issues/6463)) 1. Fix debugging to work on restarting the jupyter kernel. ([#6502](https://github.com/Microsoft/vscode-python/issues/6502)) @@ -1366,7 +7485,7 @@ part of! ([#6729](https://github.com/Microsoft/vscode-python/issues/6729)) 1. Debugging an untitled file causes an error 'Untitled-1 cannot be opened'. ([#6738](https://github.com/Microsoft/vscode-python/issues/6738)) -1. Eliminate 'History_\' from the problems list when using the interactive panel. +1. Eliminate 'History\_\' from the problems list when using the interactive panel. ([#6748](https://github.com/Microsoft/vscode-python/issues/6748)) ### Code Health @@ -1412,58 +7531,60 @@ part of! ([#6711](https://github.com/Microsoft/vscode-python/issues/6711)) 1. Bump version of [PTVSD](https://pypi.org/project/ptvsd/) to 4.3.0. ([#6771](https://github.com/Microsoft/vscode-python/issues/6771)) - * Support for Jupyter debugging - * Support for ipython cells - * API to enable and disable tracing via ptvsd.tracing - * ptvsd.enable_attach accepts address=('localhost', 0) and returns server port - * Known issue: Unable to find threadStateIndex for the current thread. curPyThread ([#11587](https://github.com/microsoft/ptvsd/issues/1587)) + - Support for Jupyter debugging + - Support for ipython cells + - API to enable and disable tracing via ptvsd.tracing + - ptvsd.enable_attach accepts address=('localhost', 0) and returns server port + - Known issue: Unable to find threadStateIndex for the current thread. curPyThread ([#11587](https://github.com/microsoft/ptvsd/issues/1587)) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort](https://pypi.org/project/isort/) -- [jedi](https://pypi.org/project/jedi/) - and [parso](https://pypi.org/project/parso/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort](https://pypi.org/project/isort/) +- [jedi](https://pypi.org/project/jedi/) + and [parso](https://pypi.org/project/parso/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -1640,48 +7761,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.20](https://pypi.org/project/isort/4.3.20/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.20](https://pypi.org/project/isort/4.3.20/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -1703,7 +7826,6 @@ part of! 1. Fixes to detection of the shell. ([#5916](https://github.com/microsoft/vscode-python/issues/5916)) - ## 2019.5.18875 (6 June 2019) ### Fixes @@ -1734,7 +7856,6 @@ part of! 1. Revert changes related to pathMappings in `launch.json` for `debugging` [#3568](https://github.com/Microsoft/vscode-python/issues/3568) ([#5833](https://github.com/microsoft/vscode-python/issues/5833)) - ## 2019.5.17059 (28 May 2019) ### Enhancements @@ -1834,11 +7955,11 @@ part of! 1. Changed synchronous file system operation into async ([#4895](https://github.com/Microsoft/vscode-python/issues/4895)) 1. Update ptvsd to [4.2.10](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.10). - * No longer switch off getpass on import. - * Fixes a crash on evaluate request. - * Fix a issue with running no-debug. - * Fixes issue with forwarding sys.stdin.read(). - * Remove sys.prefix form library roots. + - No longer switch off getpass on import. + - Fixes a crash on evaluate request. + - Fix a issue with running no-debug. + - Fixes issue with forwarding sys.stdin.read(). + - Remove sys.prefix form library roots. ### Code Health @@ -1862,53 +7983,54 @@ part of! (Thanks [Andrew Blakey](https://github.com/ablakey)) ([#5642](https://github.com/Microsoft/vscode-python/issues/5642)) - ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.20](https://pypi.org/project/isort/4.3.20/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.20](https://pypi.org/project/isort/4.3.20/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -2051,10 +8173,10 @@ part of! 1. Fix error with bad len() values in variable explorer ([#5420](https://github.com/Microsoft/vscode-python/issues/5420)) 1. Update ptvsd to [4.2.8](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.8). - * Path mapping bug fixes. - * Fix for hang when using debug console. - * Fix for set next statement. - * Fix for multi-threading. + - Path mapping bug fixes. + - Fix for hang when using debug console. + - Fix for set next statement. + - Fix for multi-threading. ### Code Health @@ -2133,60 +8255,61 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a part of! - ## 2019.3.3 (8 April 2019) ### Fixes 1. Update ptvsd to [4.2.7](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.7). - * Fix issues related to debugging Django templates. + - Fix issues related to debugging Django templates. 1. Update the Python language server to 0.2.47. ### Code Health @@ -2194,7 +8317,6 @@ part of! 1. Capture telemetry to track switching to and from the Language Server. ([#5162](https://github.com/Microsoft/vscode-python/issues/5162)) - ## 2019.3.2 (2 April 2019) ### Fixes @@ -2205,15 +8327,14 @@ part of! ([#5064](https://github.com/Microsoft/vscode-python/issues/5064)) 1. Update ptvsd to [4.2.6](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.6). ([#5083](https://github.com/Microsoft/vscode-python/issues/5083)) - * Fix issue with expanding variables in watch window and hover. - * Fix issue with launching a sub-module. + - Fix issue with expanding variables in watch window and hover. + - Fix issue with launching a sub-module. ### Code Health 1. Capture telemetry to track which installer was used when installing packages via the extension. ([#5063](https://github.com/Microsoft/vscode-python/issues/5063)) - ## 2019.3.1 (28 March 2019) ### Enhancements @@ -2322,11 +8443,11 @@ part of! ([#4868](https://github.com/Microsoft/vscode-python/issues/4868)) 1. Update ptvsd to [4.2.5](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.5). ([#4932](https://github.com/Microsoft/vscode-python/issues/4932)) - * Fix issues with django and jinja2 exceptions. - * Detaching sometimes throws ValueError. - * StackTrace request respecting just-my-code. - * Don't give error redirecting output with pythonw. - * Fix for stop on entry issue. + - Fix issues with django and jinja2 exceptions. + - Detaching sometimes throws ValueError. + - StackTrace request respecting just-my-code. + - Don't give error redirecting output with pythonw. + - Fix for stop on entry issue. 1. Update the Python language server to 0.2.31. ### Code Health @@ -2375,48 +8496,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -2437,7 +8560,6 @@ part of! ### Fixes - 1. Exclude files `travis*.log`, `pythonFiles/tests/**`, `types/**` from the extension. ([#4554](https://github.com/Microsoft/vscode-python/issues/4554)) ([#4566](https://github.com/Microsoft/vscode-python/issues/4566)) @@ -2448,48 +8570,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -2542,8 +8666,8 @@ part of! ([#4371](https://github.com/Microsoft/vscode-python/issues/4371)) 1. Update ptvsd to [4.2.4](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.4). ([#4457](https://github.com/Microsoft/vscode-python/issues/4457)) - * Validate breakpoint targets. - * Properly exclude certain files from showing up in the debugger. + - Validate breakpoint targets. + - Properly exclude certain files from showing up in the debugger. ### Fixes @@ -2572,8 +8696,8 @@ part of! ([#4418](https://github.com/Microsoft/vscode-python/issues/4418)) 1. Update ptvsd to [4.2.4](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.4). ([#4457](https://github.com/Microsoft/vscode-python/issues/4457)) - * `BreakOnSystemExitZero` now respected. - * Fix a bug causing breakpoints not to be hit when attached to a remote target. + - `BreakOnSystemExitZero` now respected. + - Fix a bug causing breakpoints not to be hit when attached to a remote target. 1. Fix double running of cells with the context menu ([#4532](https://github.com/Microsoft/vscode-python/issues/4532)) 1. Update the Python language server to 0.1.80. @@ -2595,56 +8719,56 @@ part of! 1. Fixes to smoke tests on CI. ([#4201](https://github.com/Microsoft/vscode-python/issues/4201)) - - ## 2019.1.0 (29 Jan 2019) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -2855,7 +8979,6 @@ part of! ### Fixes - 1. Lowering threshold for Language Server support on a platform. ([#3693](https://github.com/Microsoft/vscode-python/issues/3693)) 1. Fix bug affecting multiple linters used in a workspace. @@ -2868,48 +8991,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -2960,11 +9085,10 @@ part of! 1. Fix crash when `kernelspec` is missing path or language. ([#3561](https://github.com/Microsoft/vscode-python/issues/3561)) 1. Update the Microsoft Python Language Server to 0.1.72/[2018.12.1](https://github.com/Microsoft/python-language-server/releases/tag/2018.12.1) ([#3657](https://github.com/Microsoft/vscode-python/issues/3657)): - * Properly resolve namespace packages and relative imports. - * `Go to Definition` now supports namespace packages. - * Fixed `null` reference exceptions. - * Fixed erroneously reporting `None`, `True`, and `False` as undefined. - + - Properly resolve namespace packages and relative imports. + - `Go to Definition` now supports namespace packages. + - Fixed `null` reference exceptions. + - Fixed erroneously reporting `None`, `True`, and `False` as undefined. ### Code Health @@ -2987,48 +9111,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.13.1](https://pypi.org/project/jedi/0.13.1/) - and [parso 0.3.1](https://pypi.org/project/parso/0.3.1/) -- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) -- [ptvsd](https://pypi.org/project/ptvsd/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.13.1](https://pypi.org/project/jedi/0.13.1/) + and [parso 0.3.1](https://pypi.org/project/parso/0.3.1/) +- [Microsoft Python Language Server](https://github.com/microsoft/python-language-server) +- [ptvsd](https://pypi.org/project/ptvsd/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3043,8 +9169,8 @@ part of! 1. Expose an API that can be used by other extensions to interact with the Python Extension. ([#3121](https://github.com/Microsoft/vscode-python/issues/3121)) 1. Updated the language server to [0.1.65](https://github.com/Microsoft/python-language-server/releases/tag/2018.11.1): - - Improved `formatOnType` so it handles mismatched braces better - ([#3482](https://github.com/Microsoft/vscode-python/issues/3482)) + - Improved `formatOnType` so it handles mismatched braces better + ([#3482](https://github.com/Microsoft/vscode-python/issues/3482)) ### Fixes @@ -3053,12 +9179,12 @@ part of! ([#793](https://github.com/Microsoft/vscode-python/issues/793)) 1. Always use bundled version of [`ptvsd`](https://github.com/microsoft/ptvsd), unless specified. To use a custom version of `ptvsd` in the debugger, add `customDebugger` into your `launch.json` configuration as follows: - ```json - "type": "python", - "request": "launch", - "customDebugger": true - ``` - ([#3283](https://github.com/Microsoft/vscode-python/issues/3283)) + ```json + "type": "python", + "request": "launch", + "customDebugger": true + ``` + ([#3283](https://github.com/Microsoft/vscode-python/issues/3283)) 1. Fix problems with virtual environments not matching the loaded python when running cells. ([#3294](https://github.com/Microsoft/vscode-python/issues/3294)) 1. Add button for interrupting the jupyter kernel @@ -3072,11 +9198,11 @@ part of! 1. Re-run Jupyter notebook setup when the kernel is restarted. This correctly picks up dark color themes for matplotlib. ([#3418](https://github.com/Microsoft/vscode-python/issues/3418)) 1. Update the language server to [0.1.65](https://github.com/Microsoft/python-language-server/releases/tag/2018.11.1): - - Fixed `null` reference exception when executing "Find symbol in workspace" - - Fixed `null` argument exception that could happen when a function used tuples - - Fixed issue when variables in nested list comprehensions were marked as undefined - - Fixed exception that could be thrown with certain generic syntax - ([#3482](https://github.com/Microsoft/vscode-python/issues/3482)) + - Fixed `null` reference exception when executing "Find symbol in workspace" + - Fixed `null` argument exception that could happen when a function used tuples + - Fixed issue when variables in nested list comprehensions were marked as undefined + - Fixed exception that could be thrown with certain generic syntax + ([#3482](https://github.com/Microsoft/vscode-python/issues/3482)) ### Code Health @@ -3095,13 +9221,12 @@ part of! ([#3317](https://github.com/Microsoft/vscode-python/issues/3317)) 1. Add YAML file specification for CI builds ([#3350](https://github.com/Microsoft/vscode-python/issues/3350)) -1. Stop running CI tests against the `master` branch of ptvsd. +1. Stop running CI tests against the `main` branch of ptvsd. ([#3414](https://github.com/Microsoft/vscode-python/issues/3414)) 1. Be more aggressive in searching for a Python environment that can run Jupyter (make sure to cleanup any kernelspecs that are created during this process). ([#3433](https://github.com/Microsoft/vscode-python/issues/3433)) - ## 2018.10.1 (09 Nov 2018) ### Fixes @@ -3115,48 +9240,50 @@ part of! Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- Microsoft Python Language Server -- ptvsd -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- Microsoft Python Language Server +- ptvsd +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3183,13 +9310,13 @@ part of! 1. Updated the [language server](https://github.com/Microsoft/python-language-server) to [0.1.57/2018.11.0](https://github.com/Microsoft/python-language-server/releases/tag/2018.11.0) (from 2018.10.0) and the [debugger](https://pypi.org/project/ptvsd/) to [4.2.0](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.0) (from 4.1.3). Highlights include: - * Language server - - Completion support for [`collections.namedtuple`](https://docs.python.org/3/library/collections.html#collections.namedtuple). - - Support [`typing.NewType`](https://docs.python.org/3/library/typing.html#typing.NewType) - and [`typing.TypeVar`](https://docs.python.org/3/library/typing.html#typing.TypeVar). - * Debugger - - Add support for sub-process debugging (set `"subProcess": true` in your `launch.json` to use). - - Add support for [pyside2](https://pypi.org/project/PySide2/). + - Language server + - Completion support for [`collections.namedtuple`](https://docs.python.org/3/library/collections.html#collections.namedtuple). + - Support [`typing.NewType`](https://docs.python.org/3/library/typing.html#typing.NewType) + and [`typing.TypeVar`](https://docs.python.org/3/library/typing.html#typing.TypeVar). + - Debugger + - Add support for sub-process debugging (set `"subProcess": true` in your `launch.json` to use). + - Add support for [pyside2](https://pypi.org/project/PySide2/). 1. Add localization of strings. Localized versions are specified in the package.nls.\.json files. ([#463](https://github.com/Microsoft/vscode-python/issues/463)) 1. Clear cached list of interpreters when an interpeter is created in the workspace folder (this allows for virtual environments created in one's workspace folder to be detectable immediately). @@ -3219,17 +9346,17 @@ part of! 1. Updated the [language server](https://github.com/Microsoft/python-language-server) to [0.1.57/2018.11.0](https://github.com/Microsoft/python-language-server/releases/tag/2018.11.0) (from 2018.10.0) and the [debugger](https://pypi.org/project/ptvsd/) to [4.2.0](https://github.com/Microsoft/ptvsd/releases/tag/v4.2.0) (from 4.1.3). Highlights include: - * Language server - - Completions on generic containers work (e.g. `x: List[T]` now have completions for `x`, not just `x[]`). - - Fixed issues relating to `Go to Definition` for `from ... import` statements. - - `None` is no longer flagged as undefined. - - `BadSourceException` should no longer be raised. - - Fixed a null reference exception when handling certain function overloads. - * Debugger - - Properly deal with handled or unhandled exception in top level frames. - - Any folder ending with `site-packages` is considered a library. - - Treat any code not in `site-packages` as user code. - - Handle case where no completions are provided by the debugger. + - Language server + - Completions on generic containers work (e.g. `x: List[T]` now have completions for `x`, not just `x[]`). + - Fixed issues relating to `Go to Definition` for `from ... import` statements. + - `None` is no longer flagged as undefined. + - `BadSourceException` should no longer be raised. + - Fixed a null reference exception when handling certain function overloads. + - Debugger + - Properly deal with handled or unhandled exception in top level frames. + - Any folder ending with `site-packages` is considered a library. + - Treat any code not in `site-packages` as user code. + - Handle case where no completions are provided by the debugger. ### Code Health @@ -3261,10 +9388,6 @@ part of! 1. Pin extension to a minimum version of the language server. ([#3125](https://github.com/Microsoft/vscode-python/issues/3125)) - - - - ## 2018.9.2 (29 Oct 2018) ### Fixes @@ -3277,7 +9400,6 @@ part of! 1. Forward telemetry from the language server. ([#2940](https://github.com/Microsoft/vscode-python/issues/2940)) - ## 2018.9.1 (18 Oct 2018) ### Fixes @@ -3294,55 +9416,56 @@ part of! 1. Add ability to publish extension builds from `release` branches into the blob store. ([#2874](https://github.com/Microsoft/vscode-python/issues/2874)) - ## 2018.9.0 (9 Oct 2018) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [Microsoft Python Language Server 2018.9.0](https://github.com/Microsoft/python-language-server/releases/tag/2018.9.0) -- [ptvsd 4.1.3](https://github.com/Microsoft/ptvsd/releases/tag/v4.1.3) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [Microsoft Python Language Server 2018.9.0](https://github.com/Microsoft/python-language-server/releases/tag/2018.9.0) +- [ptvsd 4.1.3](https://github.com/Microsoft/ptvsd/releases/tag/v4.1.3) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [bandit](https://pypi.org/project/bandit/), - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [bandit](https://pypi.org/project/bandit/), + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3398,7 +9521,7 @@ part of! 1. Fix the regex expression to match MyPy linter messages that expects the file name to have a `.py` extension, that isn't always the case, to catch any filename. E.g., .pyi files that describes interfaces wouldn't get the linter messages to Problems tab. ([#2380](https://github.com/Microsoft/vscode-python/issues/2380)) -1. Do not use variable substitution when updating `python.pythonPath`. This matters +1. Do not use variable substitution when updating `python.pythonPath`. This matters because VS Code does not do variable substitution in settings values. ([#2459](https://github.com/Microsoft/vscode-python/issues/2459)) 1. Use a python script to launch the debugger, instead of using `-m` which requires changes to the `PYTHONPATH` variable. @@ -3433,53 +9556,54 @@ part of! 1. Update `vscode-extension-telemetry` to `0.0.22`. ([#2745](https://github.com/Microsoft/vscode-python/issues/2745)) - ## 2018.8.0 (04 September 2018) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [4.1.1](https://pypi.org/project/ptvsd/4.1.1/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [4.1.1](https://pypi.org/project/ptvsd/4.1.1/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3585,7 +9709,6 @@ part of! 1. Only use the current stable version of PTVSD in CI builds/releases. ([#2432](https://github.com/Microsoft/vscode-python/issues/2432)) - ## 2018.7.1 (23 July 2018) ### Fixes @@ -3594,53 +9717,54 @@ part of! [651468731500ec1cc644029c3666c57b82f77d76](https://github.com/Microsoft/PTVS/commit/651468731500ec1cc644029c3666c57b82f77d76). ([#2233](https://github.com/Microsoft/vscode-python/issues/2233)) - ## 2018.7.0 (18 July 2018) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.11a5](https://pypi.org/project/ptvsd/4.1.11a5/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.11a5](https://pypi.org/project/ptvsd/4.1.11a5/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3693,54 +9817,54 @@ part of! 1. Change the download links of the language server files. ([#2180](https://github.com/Microsoft/vscode-python/issues/2180)) - - ## 2018.6.0 (20 June 2018) ### Thanks Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) -- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.11a5](https://pypi.org/project/ptvsd/4.1.11a5/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.3.4](https://pypi.org/project/isort/4.3.4/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.1](https://pypi.org/project/parso/0.2.1/) +- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.11a5](https://pypi.org/project/ptvsd/4.1.11a5/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) Also thanks to the various projects we provide integrations with which help make this extension useful: -- Debugging support: - [Django](https://pypi.org/project/Django/), - [Flask](https://pypi.org/project/Flask/), - [gevent](https://pypi.org/project/gevent/), - [Jinja](https://pypi.org/project/Jinja/), - [Pyramid](https://pypi.org/project/pyramid/), - [PySpark](https://pypi.org/project/pyspark/), - [Scrapy](https://pypi.org/project/Scrapy/), - [Watson](https://pypi.org/project/Watson/) -- Formatting: - [autopep8](https://pypi.org/project/autopep8/), - [black](https://pypi.org/project/black/), - [yapf](https://pypi.org/project/yapf/) -- Interpreter support: - [conda](https://conda.io/), - [direnv](https://direnv.net/), - [pipenv](https://pypi.org/project/pipenv/), - [pyenv](https://github.com/pyenv/pyenv), - [venv](https://docs.python.org/3/library/venv.html#module-venv), - [virtualenv](https://pypi.org/project/virtualenv/) -- Linting: - [flake8](https://pypi.org/project/flake8/), - [mypy](https://pypi.org/project/mypy/), - [prospector](https://pypi.org/project/prospector/), - [pylint](https://pypi.org/project/pylint/), - [pydocstyle](https://pypi.org/project/pydocstyle/), - [pylama](https://pypi.org/project/pylama/) -- Testing: - [nose](https://pypi.org/project/nose/), - [pytest](https://pypi.org/project/pytest/), - [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) + +- Debugging support: + [Django](https://pypi.org/project/Django/), + [Flask](https://pypi.org/project/Flask/), + [gevent](https://pypi.org/project/gevent/), + [Jinja](https://pypi.org/project/Jinja/), + [Pyramid](https://pypi.org/project/pyramid/), + [PySpark](https://pypi.org/project/pyspark/), + [Scrapy](https://pypi.org/project/Scrapy/), + [Watson](https://pypi.org/project/Watson/) +- Formatting: + [autopep8](https://pypi.org/project/autopep8/), + [black](https://pypi.org/project/black/), + [yapf](https://pypi.org/project/yapf/) +- Interpreter support: + [conda](https://conda.io/), + [direnv](https://direnv.net/), + [pipenv](https://pypi.org/project/pipenv/), + [pyenv](https://github.com/pyenv/pyenv), + [venv](https://docs.python.org/3/library/venv.html#module-venv), + [virtualenv](https://pypi.org/project/virtualenv/) +- Linting: + [flake8](https://pypi.org/project/flake8/), + [mypy](https://pypi.org/project/mypy/), + [prospector](https://pypi.org/project/prospector/), + [pylint](https://pypi.org/project/pylint/), + [pydocstyle](https://pypi.org/project/pydocstyle/), + [pylama](https://pypi.org/project/pylama/) +- Testing: + [nose](https://pypi.org/project/nose/), + [pytest](https://pypi.org/project/pytest/), + [unittest](https://docs.python.org/3/library/unittest.html#module-unittest) And finally thanks to the [Python](https://www.python.org/) development team and community for creating a fantastic programming language and community to be a @@ -3755,14 +9879,14 @@ part of! (thanks [Bence Nagy](https://github.com/underyx)) ([#127](https://github.com/Microsoft/vscode-python/issues/127)) 1. Add support for the `"source.organizeImports"` setting for `"editor.codeActionsOnSave"` (thanks [Nathan Gaberel](https://github.com/n6g7)); you can turn this on just for Python using: - ```json - "[python]": { - "editor.codeActionsOnSave": { - "source.organizeImports": true - } - } - ``` - ([#156](https://github.com/Microsoft/vscode-python/issues/156)) + ```json + "[python]": { + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + } + ``` + ([#156](https://github.com/Microsoft/vscode-python/issues/156)) 1. Added Spanish translation. (thanks [Mario Rubio](https://github.com/mario-mra/)) ([#1902](https://github.com/Microsoft/vscode-python/issues/1902)) @@ -3865,20 +9989,17 @@ part of! 1. Create tests to measure activation times for the extension. ([#932](https://github.com/Microsoft/vscode-python/issues/932)) - - - - ## 2018.5.0 (05 Jun 2018) Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.2.15](https://pypi.org/project/isort/4.2.15/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.0](https://pypi.org/project/parso/0.2.0/) -- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.1a5](https://pypi.org/project/ptvsd/4.1.1a5/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.2.15](https://pypi.org/project/isort/4.2.15/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.0](https://pypi.org/project/parso/0.2.0/) +- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.1a5](https://pypi.org/project/ptvsd/4.1.1a5/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) And thanks to the many other projects which users can optionally choose from and install to work with the extension. Without them the extension would not be @@ -3971,7 +10092,7 @@ nearly as feature-rich and useful as it is. ([#1703](https://github.com/Microsoft/vscode-python/issues/1703)) 1. Update debug capabilities to add support for the setting `supportTerminateDebuggee` due to an upstream update from [PTVSD](https://github.com/Microsoft/ptvsd/issues). ([#1719](https://github.com/Microsoft/vscode-python/issues/1719)) -1. Build and upload development build of the extension to the Azure blob store even if CI tests fail on the `master` branch. +1. Build and upload development build of the extension to the Azure blob store even if CI tests fail on the `main` branch. ([#1730](https://github.com/Microsoft/vscode-python/issues/1730)) 1. Changes to the script used to upload the extension to the Azure blob store. ([#1732](https://github.com/Microsoft/vscode-python/issues/1732)) @@ -3984,20 +10105,17 @@ nearly as feature-rich and useful as it is. 1. Ensure `Outline` view doesn't overload the language server with too many requests, while user is editing text in the editor. ([#1856](https://github.com/Microsoft/vscode-python/issues/1856)) - - - - ## 2018.4.0 (2 May 2018) Thanks to the following projects which we fully rely on to provide some of our features: -- [isort 4.2.15](https://pypi.org/project/isort/4.2.15/) -- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) - and [parso 0.2.0](https://pypi.org/project/parso/0.2.0/) -- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.1a1](https://pypi.org/project/ptvsd/4.1.1a1/) -- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) -- [rope](https://pypi.org/project/rope/) (user-installed) + +- [isort 4.2.15](https://pypi.org/project/isort/4.2.15/) +- [jedi 0.12.0](https://pypi.org/project/jedi/0.12.0/) + and [parso 0.2.0](https://pypi.org/project/parso/0.2.0/) +- [ptvsd 3.0.0](https://pypi.org/project/ptvsd/3.0.0/) and [4.1.1a1](https://pypi.org/project/ptvsd/4.1.1a1/) +- [exuberant ctags](http://ctags.sourceforge.net/) (user-installed) +- [rope](https://pypi.org/project/rope/) (user-installed) And a special thanks to [Patryk Zawadzki](https://github.com/patrys) for all of his help on [our issue tracker](https://github.com/Microsoft/vscode-python)! @@ -4006,12 +10124,12 @@ his help on [our issue tracker](https://github.com/Microsoft/vscode-python)! 1. Enable debugging of Jinja templates in the experimental debugger. This is made possible with the addition of the `jinja` setting in the `launch.json` file as follows: - ```json - "request": "launch or attach", - ... - "jinja": true - ``` - ([#1206](https://github.com/Microsoft/vscode-python/issues/1206)) + ```json + "request": "launch or attach", + ... + "jinja": true + ``` + ([#1206](https://github.com/Microsoft/vscode-python/issues/1206)) 1. Remove empty spaces from the selected text of the active editor when executing in a terminal. ([#1207](https://github.com/Microsoft/vscode-python/issues/1207)) 1. Add prelimnary support for remote debugging using the experimental debugger. @@ -4037,15 +10155,15 @@ his help on [our issue tracker](https://github.com/Microsoft/vscode-python)! ([#1492](https://github.com/Microsoft/vscode-python/issues/1492)) 1. Add prelimnary support for remote debugging using the experimental debugger. Attach to a Python program after having imported `ptvsd` and enabling the debugger to attach as follows: - ```python - import ptvsd - ptvsd.enable_attach(('0.0.0.0', 5678)) - ``` - Additional capabilities: - * `ptvsd.break_into_debugger()` to break into the attached debugger. - * `ptvsd.wait_for_attach(timeout)` to cause the program to wait until a debugger attaches. - * `ptvsd.is_attached()` to determine whether a debugger is attached to the program. - ([#907](https://github.com/Microsoft/vscode-python/issues/907)) + ```python + import ptvsd + ptvsd.enable_attach(('0.0.0.0', 5678)) + ``` + Additional capabilities: + - `ptvsd.break_into_debugger()` to break into the attached debugger. + - `ptvsd.wait_for_attach(timeout)` to cause the program to wait until a debugger attaches. + - `ptvsd.is_attached()` to determine whether a debugger is attached to the program. + ([#907](https://github.com/Microsoft/vscode-python/issues/907)) ### Fixes @@ -4104,7 +10222,7 @@ his help on [our issue tracker](https://github.com/Microsoft/vscode-python)! ([#1216](https://github.com/Microsoft/vscode-python/issues/1216)) 1. Parallelize jobs (unit tests) on CI server. ([#1247](https://github.com/Microsoft/vscode-python/issues/1247)) -1. Run CI tests against the release version and master branch of PTVSD (experimental debugger), allowing tests to fail against the master branch of PTVSD. +1. Run CI tests against the release version and main branch of PTVSD (experimental debugger), allowing tests to fail against the main branch of PTVSD. ([#1253](https://github.com/Microsoft/vscode-python/issues/1253)) 1. Only trigger the extension for `file` and `untitled` in preparation for [Visual Studio Live Share](https://aka.ms/vsls) @@ -4123,118 +10241,117 @@ his help on [our issue tracker](https://github.com/Microsoft/vscode-python)! 1. Register language server functionality in the extension against specific resource types supporting the python language. ([#1530](https://github.com/Microsoft/vscode-python/issues/1530)) - ## 2018.3.1 (29 Mar 2018) ### Fixes 1. Fixes issue that causes linter to fail when file path contains spaces. -([#1239](https://github.com/Microsoft/vscode-python/issues/1239)) + ([#1239](https://github.com/Microsoft/vscode-python/issues/1239)) ## 2018.3.0 (28 Mar 2018) ### Enhancements 1. Add a PySpark debug configuration for the experimental debugger. - ([#1029](https://github.com/Microsoft/vscode-python/issues/1029)) + ([#1029](https://github.com/Microsoft/vscode-python/issues/1029)) 1. Add a Pyramid debug configuration for the experimental debugger. - ([#1030](https://github.com/Microsoft/vscode-python/issues/1030)) + ([#1030](https://github.com/Microsoft/vscode-python/issues/1030)) 1. Add a Watson debug configuration for the experimental debugger. - ([#1031](https://github.com/Microsoft/vscode-python/issues/1031)) + ([#1031](https://github.com/Microsoft/vscode-python/issues/1031)) 1. Add a Scrapy debug configuration for the experimental debugger. - ([#1032](https://github.com/Microsoft/vscode-python/issues/1032)) + ([#1032](https://github.com/Microsoft/vscode-python/issues/1032)) 1. When using pipenv, install packages (such as linters, test frameworks) in dev-packages. - ([#1110](https://github.com/Microsoft/vscode-python/issues/1110)) + ([#1110](https://github.com/Microsoft/vscode-python/issues/1110)) 1. Added commands translation for italian locale. -(thanks [Dotpys](https://github.com/Dotpys/)) ([#1152](https://github.com/Microsoft/vscode-python/issues/1152)) + (thanks [Dotpys](https://github.com/Dotpys/)) ([#1152](https://github.com/Microsoft/vscode-python/issues/1152)) 1. Add support for Django Template debugging in experimental debugger. - ([#1189](https://github.com/Microsoft/vscode-python/issues/1189)) + ([#1189](https://github.com/Microsoft/vscode-python/issues/1189)) 1. Add support for Flask Template debugging in experimental debugger. - ([#1190](https://github.com/Microsoft/vscode-python/issues/1190)) + ([#1190](https://github.com/Microsoft/vscode-python/issues/1190)) 1. Add support for Jinja template debugging. ([#1210](https://github.com/Microsoft/vscode-python/issues/1210)) 1. When debugging, use `Integrated Terminal` as the default console. - ([#526](https://github.com/Microsoft/vscode-python/issues/526)) + ([#526](https://github.com/Microsoft/vscode-python/issues/526)) 1. Disable the display of errors messages when rediscovering of tests fail in response to changes to files, e.g. don't show a message if there's a syntax error in the test code. - ([#704](https://github.com/Microsoft/vscode-python/issues/704)) + ([#704](https://github.com/Microsoft/vscode-python/issues/704)) 1. Bundle python dependencies (PTVSD package) in the extension for the experimental debugger. - ([#741](https://github.com/Microsoft/vscode-python/issues/741)) -1. Add support for experimental debugger when debugging Python Unit Tests. - ([#906](https://github.com/Microsoft/vscode-python/issues/906)) + ([#741](https://github.com/Microsoft/vscode-python/issues/741)) +1. Add support for experimental debugger when debugging Python Unit Tests. + ([#906](https://github.com/Microsoft/vscode-python/issues/906)) 1. Support `Debug Console` as a `console` option for the Experimental Debugger. - ([#950](https://github.com/Microsoft/vscode-python/issues/950)) + ([#950](https://github.com/Microsoft/vscode-python/issues/950)) 1. Enable syntax highlighting for `requirements.in` files as used by -e.g. [pip-tools](https://github.com/jazzband/pip-tools) -(thanks [Lorenzo Villani](https://github.com/lvillani)) - ([#961](https://github.com/Microsoft/vscode-python/issues/961)) + e.g. [pip-tools](https://github.com/jazzband/pip-tools) + (thanks [Lorenzo Villani](https://github.com/lvillani)) + ([#961](https://github.com/Microsoft/vscode-python/issues/961)) 1. Add support to read name of Pipfile from environment variable. - ([#999](https://github.com/Microsoft/vscode-python/issues/999)) + ([#999](https://github.com/Microsoft/vscode-python/issues/999)) ### Fixes 1. Fixes issue that causes debugging of unit tests to hang indefinitely. ([#1009](https://github.com/Microsoft/vscode-python/issues/1009)) 1. Add ability to disable the check on memory usage of language server (Jedi) process. -To turn off this check, add `"python.jediMemoryLimit": -1` to your user or workspace settings (`settings.json`) file. - ([#1036](https://github.com/Microsoft/vscode-python/issues/1036)) + To turn off this check, add `"python.jediMemoryLimit": -1` to your user or workspace settings (`settings.json`) file. + ([#1036](https://github.com/Microsoft/vscode-python/issues/1036)) 1. Ignore test results when debugging unit tests. - ([#1043](https://github.com/Microsoft/vscode-python/issues/1043)) + ([#1043](https://github.com/Microsoft/vscode-python/issues/1043)) 1. Fixes auto formatting of conditional statements containing expressions with `<=` symbols. - ([#1096](https://github.com/Microsoft/vscode-python/issues/1096)) + ([#1096](https://github.com/Microsoft/vscode-python/issues/1096)) 1. Resolve debug configuration information in `launch.json` when debugging without opening a python file. - ([#1098](https://github.com/Microsoft/vscode-python/issues/1098)) + ([#1098](https://github.com/Microsoft/vscode-python/issues/1098)) 1. Disables auto completion when editing text at the end of a comment string. - ([#1123](https://github.com/Microsoft/vscode-python/issues/1123)) + ([#1123](https://github.com/Microsoft/vscode-python/issues/1123)) 1. Ensures file paths are properly encoded when passing them as arguments to linters. - ([#199](https://github.com/Microsoft/vscode-python/issues/199)) + ([#199](https://github.com/Microsoft/vscode-python/issues/199)) 1. Fix occasionally having unverified breakpoints - ([#87](https://github.com/Microsoft/vscode-python/issues/87)) + ([#87](https://github.com/Microsoft/vscode-python/issues/87)) 1. Ensure conda installer is not used for non-conda environments. - ([#969](https://github.com/Microsoft/vscode-python/issues/969)) + ([#969](https://github.com/Microsoft/vscode-python/issues/969)) 1. Fixes issue that display incorrect interpreter briefly before updating it to the right value. - ([#981](https://github.com/Microsoft/vscode-python/issues/981)) + ([#981](https://github.com/Microsoft/vscode-python/issues/981)) ### Code Health 1. Exclude 'news' folder from getting packaged into the extension. - ([#1020](https://github.com/Microsoft/vscode-python/issues/1020)) + ([#1020](https://github.com/Microsoft/vscode-python/issues/1020)) 1. Remove Jupyter commands. -(thanks [Yu Zhang](https://github.com/neilsustc)) - ([#1034](https://github.com/Microsoft/vscode-python/issues/1034)) + (thanks [Yu Zhang](https://github.com/neilsustc)) + ([#1034](https://github.com/Microsoft/vscode-python/issues/1034)) 1. Trigger incremental build compilation only when typescript files are modified. - ([#1040](https://github.com/Microsoft/vscode-python/issues/1040)) + ([#1040](https://github.com/Microsoft/vscode-python/issues/1040)) 1. Updated npm dependencies in devDependencies and fix TypeScript compilation issues. - ([#1042](https://github.com/Microsoft/vscode-python/issues/1042)) + ([#1042](https://github.com/Microsoft/vscode-python/issues/1042)) 1. Enable unit testing of stdout and stderr redirection for the experimental debugger. - ([#1048](https://github.com/Microsoft/vscode-python/issues/1048)) + ([#1048](https://github.com/Microsoft/vscode-python/issues/1048)) 1. Update npm package `vscode-extension-telemetry` to fix the warning 'os.tmpDir() deprecation'. -(thanks [osya](https://github.com/osya)) - ([#1066](https://github.com/Microsoft/vscode-python/issues/1066)) + (thanks [osya](https://github.com/osya)) + ([#1066](https://github.com/Microsoft/vscode-python/issues/1066)) 1. Prevent the debugger stepping into JS code while developing the extension when debugging async TypeScript code. - ([#1090](https://github.com/Microsoft/vscode-python/issues/1090)) + ([#1090](https://github.com/Microsoft/vscode-python/issues/1090)) 1. Increase timeouts for the debugger unit tests. - ([#1094](https://github.com/Microsoft/vscode-python/issues/1094)) + ([#1094](https://github.com/Microsoft/vscode-python/issues/1094)) 1. Change the command used to install pip on AppVeyor to avoid installation errors. - ([#1107](https://github.com/Microsoft/vscode-python/issues/1107)) + ([#1107](https://github.com/Microsoft/vscode-python/issues/1107)) 1. Check whether a document is active when detecthing changes in the active document. - ([#1114](https://github.com/Microsoft/vscode-python/issues/1114)) + ([#1114](https://github.com/Microsoft/vscode-python/issues/1114)) 1. Remove SIGINT handler in debugger adapter, thereby preventing it from shutting down the debugger. - ([#1122](https://github.com/Microsoft/vscode-python/issues/1122)) + ([#1122](https://github.com/Microsoft/vscode-python/issues/1122)) 1. Improve compilation speed of the extension's TypeScript code. - ([#1146](https://github.com/Microsoft/vscode-python/issues/1146)) + ([#1146](https://github.com/Microsoft/vscode-python/issues/1146)) 1. Changes to how debug options are passed into the experimental version of PTVSD (debugger). - ([#1168](https://github.com/Microsoft/vscode-python/issues/1168)) + ([#1168](https://github.com/Microsoft/vscode-python/issues/1168)) 1. Ensure file paths are not sent in telemetry when running unit tests. - ([#1180](https://github.com/Microsoft/vscode-python/issues/1180)) + ([#1180](https://github.com/Microsoft/vscode-python/issues/1180)) 1. Change `DjangoDebugging` to `Django` in `debugOptions` of launch.json. - ([#1198](https://github.com/Microsoft/vscode-python/issues/1198)) + ([#1198](https://github.com/Microsoft/vscode-python/issues/1198)) 1. Changed property name used to capture the trigger source of Unit Tests. ([#1213](https://github.com/Microsoft/vscode-python/issues/1213)) 1. Enable unit testing of the experimental debugger on CI servers - ([#742](https://github.com/Microsoft/vscode-python/issues/742)) + ([#742](https://github.com/Microsoft/vscode-python/issues/742)) 1. Generate code coverage for debug adapter unit tests. - ([#778](https://github.com/Microsoft/vscode-python/issues/778)) + ([#778](https://github.com/Microsoft/vscode-python/issues/778)) 1. Execute prospector as a module (using -m). - ([#982](https://github.com/Microsoft/vscode-python/issues/982)) + ([#982](https://github.com/Microsoft/vscode-python/issues/982)) 1. Launch unit tests in debug mode as opposed to running and attaching the debugger to the already-running interpreter. - ([#983](https://github.com/Microsoft/vscode-python/issues/983)) + ([#983](https://github.com/Microsoft/vscode-python/issues/983)) ## 2018.2.1 (09 Mar 2018) @@ -4255,11 +10372,11 @@ those who reported bugs or provided feedback)! A special thanks goes out to the following external contributors who contributed code in this release: -* [Andrea D'Amore](https://github.com/Microsoft/vscode-python/commits?author=anddam) -* [Tzu-ping Chung](https://github.com/Microsoft/vscode-python/commits?author=uranusjr) -* [Elliott Beach](https://github.com/Microsoft/vscode-python/commits?author=elliott-beach) -* [Manuja Jay](https://github.com/Microsoft/vscode-python/commits?author=manujadev) -* [philipwasserman](https://github.com/Microsoft/vscode-python/commits?author=philipwasserman) +- [Andrea D'Amore](https://github.com/Microsoft/vscode-python/commits?author=anddam) +- [Tzu-ping Chung](https://github.com/Microsoft/vscode-python/commits?author=uranusjr) +- [Elliott Beach](https://github.com/Microsoft/vscode-python/commits?author=elliott-beach) +- [Manuja Jay](https://github.com/Microsoft/vscode-python/commits?author=manujadev) +- [philipwasserman](https://github.com/Microsoft/vscode-python/commits?author=philipwasserman) ### Enhancements @@ -4293,9 +10410,9 @@ contributed code in this release: 1. Better detection of a `pylintrc` is available to automatically disable our default Pylint checks ([#728](https://github.com/Microsoft/vscode-python/issues/728), - [#788](https://github.com/Microsoft/vscode-python/issues/788), - [#838](https://github.com/Microsoft/vscode-python/issues/838), - [#442](https://github.com/Microsoft/vscode-python/issues/442)) + [#788](https://github.com/Microsoft/vscode-python/issues/788), + [#838](https://github.com/Microsoft/vscode-python/issues/838), + [#442](https://github.com/Microsoft/vscode-python/issues/442)) 1. Fix `Got to Python object` ([#403](https://github.com/Microsoft/vscode-python/issues/403)) 1. When reformatting a file, put the temporary file in the workspace folder so e.g. yapf detect their configuration files appropriately @@ -4318,14 +10435,14 @@ contributed code in this release: automatically killing the process; reload VS Code to start the process again if desired ([#926](https://github.com/Microsoft/vscode-python/issues/926), - [#263](https://github.com/Microsoft/vscode-python/issues/263)) + [#263](https://github.com/Microsoft/vscode-python/issues/263)) 1. Support multiple linters again ([#913](https://github.com/Microsoft/vscode-python/issues/913)) 1. Don't over-escape markup found in docstrings ([#911](https://github.com/Microsoft/vscode-python/issues/911), - [#716](https://github.com/Microsoft/vscode-python/issues/716), - [#627](https://github.com/Microsoft/vscode-python/issues/627), - [#692](https://github.com/Microsoft/vscode-python/issues/692)) + [#716](https://github.com/Microsoft/vscode-python/issues/716), + [#627](https://github.com/Microsoft/vscode-python/issues/627), + [#692](https://github.com/Microsoft/vscode-python/issues/692)) 1. Fix when the `Problems` pane lists file paths prefixed with `git:` ([#916](https://github.com/Microsoft/vscode-python/issues/916)) 1. Fix inline documentation when an odd number of quotes exists @@ -4341,8 +10458,8 @@ contributed code in this release: 1. Upgrade to Jedi 0.11.1 ([#674](https://github.com/Microsoft/vscode-python/issues/674), - [#607](https://github.com/Microsoft/vscode-python/issues/607), - [#99](https://github.com/Microsoft/vscode-python/issues/99)) + [#607](https://github.com/Microsoft/vscode-python/issues/607), + [#99](https://github.com/Microsoft/vscode-python/issues/99)) 1. Removed the banner announcing the extension moving over to Microsoft ([#830](https://github.com/Microsoft/vscode-python/issues/830)) 1. Renamed the default debugger configurations ([#412](https://github.com/Microsoft/vscode-python/issues/412)) @@ -4356,607 +10473,667 @@ contributed code in this release: Thanks to everyone who contributed to this release, including the following people who contributed code: -* [jpfarias](https://github.com/jpfarias) -* [Hongbo He](https://github.com/graycarl) -* [JohnstonCode](https://github.com/JohnstonCode) -* [Yuichi Nukiyama](https://github.com/YuichiNukiyama) -* [MichaelSuen](https://github.com/MichaelSuen-thePointer) +- [jpfarias](https://github.com/jpfarias) +- [Hongbo He](https://github.com/graycarl) +- [JohnstonCode](https://github.com/JohnstonCode) +- [Yuichi Nukiyama](https://github.com/YuichiNukiyama) +- [MichaelSuen](https://github.com/MichaelSuen-thePointer) ### Fixed issues -* Support cached interpreter locations for faster interpreter selection ([#666](https://github.com/Microsoft/vscode-python/issues/259)) -* Sending a block of code with multiple global-level scopes now works ([#259](https://github.com/Microsoft/vscode-python/issues/259)) -* Automatic activation of virtual or conda environment in terminal when executing Python code/file ([#383](https://github.com/Microsoft/vscode-python/issues/383)) -* Introduce a `Python: Create Terminal` to create a terminal that activates the selected virtual/conda environment ([#622](https://github.com/Microsoft/vscode-python/issues/622)) -* Add a `ko-kr` translation ([#540](https://github.com/Microsoft/vscode-python/pull/540)) -* Add a `ru` translation ([#411](https://github.com/Microsoft/vscode-python/pull/411)) -* Performance improvements to detection of virtual environments in current workspace ([#372](https://github.com/Microsoft/vscode-python/issues/372)) -* Correctly detect 64-bit python ([#414](https://github.com/Microsoft/vscode-python/issues/414)) -* Display parameter information while typing ([#70](https://github.com/Microsoft/vscode-python/issues/70)) -* Use `localhost` instead of `0.0.0.0` when starting debug servers ([#205](https://github.com/Microsoft/vscode-python/issues/205)) -* Ability to configure host name of debug server ([#227](https://github.com/Microsoft/vscode-python/issues/227)) -* Use environment variable PYTHONPATH defined in `.env` for intellisense and code navigation ([#316](https://github.com/Microsoft/vscode-python/issues/316)) -* Support path variable when debugging ([#436](https://github.com/Microsoft/vscode-python/issues/436)) -* Ensure virtual environments can be created in `.env` directory ([#435](https://github.com/Microsoft/vscode-python/issues/435), [#482](https://github.com/Microsoft/vscode-python/issues/482), [#486](https://github.com/Microsoft/vscode-python/issues/486)) -* Reload environment variables from `.env` without having to restart VS Code ([#183](https://github.com/Microsoft/vscode-python/issues/183)) -* Support debugging of Pyramid framework on Windows ([#519](https://github.com/Microsoft/vscode-python/issues/519)) -* Code snippet for `pubd` ([#545](https://github.com/Microsoft/vscode-python/issues/545)) -* Code clean up ([#353](https://github.com/Microsoft/vscode-python/issues/353), [#352](https://github.com/Microsoft/vscode-python/issues/352), [#354](https://github.com/Microsoft/vscode-python/issues/354), [#456](https://github.com/Microsoft/vscode-python/issues/456), [#491](https://github.com/Microsoft/vscode-python/issues/491), [#228](https://github.com/Microsoft/vscode-python/issues/228), [#549](https://github.com/Microsoft/vscode-python/issues/545), [#594](https://github.com/Microsoft/vscode-python/issues/594), [#617](https://github.com/Microsoft/vscode-python/issues/617), [#556](https://github.com/Microsoft/vscode-python/issues/556)) -* Move to `yarn` from `npm` ([#421](https://github.com/Microsoft/vscode-python/issues/421)) -* Add code coverage for extension itself ([#464](https://github.com/Microsoft/vscode-python/issues/464)) -* Releasing [insiders build](https://pvsc.blob.core.windows.net/extension-builds/ms-python-insiders.vsix) of the extension and uploading to cloud storage ([#429](https://github.com/Microsoft/vscode-python/issues/429)) -* Japanese translation ([#434](https://github.com/Microsoft/vscode-python/pull/434)) -* Russian translation ([#411](https://github.com/Microsoft/vscode-python/pull/411)) -* Support paths with spaces when generating tags with `Build Workspace Symbols` ([#44](https://github.com/Microsoft/vscode-python/issues/44)) -* Add ability to configure the linters ([#572](https://github.com/Microsoft/vscode-python/issues/572)) -* Add default set of rules for Pylint ([#554](https://github.com/Microsoft/vscode-python/issues/554)) -* Prompt to install formatter if not available ([#524](https://github.com/Microsoft/vscode-python/issues/524)) -* work around `editor.formatOnSave` failing when taking more then 750ms ([#124](https://github.com/Microsoft/vscode-python/issues/124), [#590](https://github.com/Microsoft/vscode-python/issues/590), [#624](https://github.com/Microsoft/vscode-python/issues/624), [#427](https://github.com/Microsoft/vscode-python/issues/427), [#492](https://github.com/Microsoft/vscode-python/issues/492)) -* Function argument completion no longer automatically includes the default argument ([#522](https://github.com/Microsoft/vscode-python/issues/522)) -* When sending a selection to the terminal, keep the focus in the editor window ([#60](https://github.com/Microsoft/vscode-python/issues/60)) -* Install packages for non-environment Pythons as `--user` installs ([#527](https://github.com/Microsoft/vscode-python/issues/527)) -* No longer suggest the system Python install on macOS when running `Select Interpreter` as it's too outdated (e.g. lacks `pip`) ([#440](https://github.com/Microsoft/vscode-python/issues/440)) -* Fix potential hang from Intellisense ([#423](https://github.com/Microsoft/vscode-python/issues/423)) +- Support cached interpreter locations for faster interpreter selection ([#666](https://github.com/Microsoft/vscode-python/issues/259)) +- Sending a block of code with multiple global-level scopes now works ([#259](https://github.com/Microsoft/vscode-python/issues/259)) +- Automatic activation of virtual or conda environment in terminal when executing Python code/file ([#383](https://github.com/Microsoft/vscode-python/issues/383)) +- Introduce a `Python: Create Terminal` to create a terminal that activates the selected virtual/conda environment ([#622](https://github.com/Microsoft/vscode-python/issues/622)) +- Add a `ko-kr` translation ([#540](https://github.com/Microsoft/vscode-python/pull/540)) +- Add a `ru` translation ([#411](https://github.com/Microsoft/vscode-python/pull/411)) +- Performance improvements to detection of virtual environments in current workspace ([#372](https://github.com/Microsoft/vscode-python/issues/372)) +- Correctly detect 64-bit python ([#414](https://github.com/Microsoft/vscode-python/issues/414)) +- Display parameter information while typing ([#70](https://github.com/Microsoft/vscode-python/issues/70)) +- Use `localhost` instead of `0.0.0.0` when starting debug servers ([#205](https://github.com/Microsoft/vscode-python/issues/205)) +- Ability to configure host name of debug server ([#227](https://github.com/Microsoft/vscode-python/issues/227)) +- Use environment variable PYTHONPATH defined in `.env` for intellisense and code navigation ([#316](https://github.com/Microsoft/vscode-python/issues/316)) +- Support path variable when debugging ([#436](https://github.com/Microsoft/vscode-python/issues/436)) +- Ensure virtual environments can be created in `.env` directory ([#435](https://github.com/Microsoft/vscode-python/issues/435), [#482](https://github.com/Microsoft/vscode-python/issues/482), [#486](https://github.com/Microsoft/vscode-python/issues/486)) +- Reload environment variables from `.env` without having to restart VS Code ([#183](https://github.com/Microsoft/vscode-python/issues/183)) +- Support debugging of Pyramid framework on Windows ([#519](https://github.com/Microsoft/vscode-python/issues/519)) +- Code snippet for `pubd` ([#545](https://github.com/Microsoft/vscode-python/issues/545)) +- Code clean up ([#353](https://github.com/Microsoft/vscode-python/issues/353), [#352](https://github.com/Microsoft/vscode-python/issues/352), [#354](https://github.com/Microsoft/vscode-python/issues/354), [#456](https://github.com/Microsoft/vscode-python/issues/456), [#491](https://github.com/Microsoft/vscode-python/issues/491), [#228](https://github.com/Microsoft/vscode-python/issues/228), [#549](https://github.com/Microsoft/vscode-python/issues/545), [#594](https://github.com/Microsoft/vscode-python/issues/594), [#617](https://github.com/Microsoft/vscode-python/issues/617), [#556](https://github.com/Microsoft/vscode-python/issues/556)) +- Move to `yarn` from `npm` ([#421](https://github.com/Microsoft/vscode-python/issues/421)) +- Add code coverage for extension itself ([#464](https://github.com/Microsoft/vscode-python/issues/464)) +- Releasing [insiders build](https://pvsc.blob.core.windows.net/extension-builds/ms-python-insiders.vsix) of the extension and uploading to cloud storage ([#429](https://github.com/Microsoft/vscode-python/issues/429)) +- Japanese translation ([#434](https://github.com/Microsoft/vscode-python/pull/434)) +- Russian translation ([#411](https://github.com/Microsoft/vscode-python/pull/411)) +- Support paths with spaces when generating tags with `Build Workspace Symbols` ([#44](https://github.com/Microsoft/vscode-python/issues/44)) +- Add ability to configure the linters ([#572](https://github.com/Microsoft/vscode-python/issues/572)) +- Add default set of rules for Pylint ([#554](https://github.com/Microsoft/vscode-python/issues/554)) +- Prompt to install formatter if not available ([#524](https://github.com/Microsoft/vscode-python/issues/524)) +- work around `editor.formatOnSave` failing when taking more then 750ms ([#124](https://github.com/Microsoft/vscode-python/issues/124), [#590](https://github.com/Microsoft/vscode-python/issues/590), [#624](https://github.com/Microsoft/vscode-python/issues/624), [#427](https://github.com/Microsoft/vscode-python/issues/427), [#492](https://github.com/Microsoft/vscode-python/issues/492)) +- Function argument completion no longer automatically includes the default argument ([#522](https://github.com/Microsoft/vscode-python/issues/522)) +- When sending a selection to the terminal, keep the focus in the editor window ([#60](https://github.com/Microsoft/vscode-python/issues/60)) +- Install packages for non-environment Pythons as `--user` installs ([#527](https://github.com/Microsoft/vscode-python/issues/527)) +- No longer suggest the system Python install on macOS when running `Select Interpreter` as it's too outdated (e.g. lacks `pip`) ([#440](https://github.com/Microsoft/vscode-python/issues/440)) +- Fix potential hang from Intellisense ([#423](https://github.com/Microsoft/vscode-python/issues/423)) ## Version 0.9.1 (19 December 2017) -* Fixes the compatibility issue with the [Visual Studio Code Tools for AI](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-ai) [#432](https://github.com/Microsoft/vscode-python/issues/432) -* Display runtime errors encountered when running a python program without debugging [#454](https://github.com/Microsoft/vscode-python/issues/454) +- Fixes the compatibility issue with the [Visual Studio Code Tools for AI](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-ai) [#432](https://github.com/Microsoft/vscode-python/issues/432) +- Display runtime errors encountered when running a python program without debugging [#454](https://github.com/Microsoft/vscode-python/issues/454) ## Version 0.9.0 (14 December 2017) -* Translated the commands to simplified Chinese [#240](https://github.com/Microsoft/vscode-python/pull/240) (thanks [Wai Sui kei](https://github.com/WaiSiuKei)) -* Change all links to point to their Python 3 equivalents instead of Python 2[#203](https://github.com/Microsoft/vscode-python/issues/203) -* Respect `{workspaceFolder}` [#258](https://github.com/Microsoft/vscode-python/issues/258) -* Running a program using Ctrl-F5 will work more than once [#25](https://github.com/Microsoft/vscode-python/issues/25) -* Removed the feedback service to rely on VS Code's own support (which fixed an issue of document reformatting failing) [#245](https://github.com/Microsoft/vscode-python/issues/245), [#303](https://github.com/Microsoft/vscode-python/issues/303), [#363](https://github.com/Microsoft/vscode-python/issues/365) -* Do not create empty '.vscode' directory [#253](https://github.com/Microsoft/vscode-python/issues/253), [#277](https://github.com/Microsoft/vscode-python/issues/277) -* Ensure python execution environment handles unicode characters [#393](https://github.com/Microsoft/vscode-python/issues/393) -* Remove Jupyter support in favour of the [Jupyter extension](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter) [#223](https://github.com/microsoft/vscode-python/issues/223) +- Translated the commands to simplified Chinese [#240](https://github.com/Microsoft/vscode-python/pull/240) (thanks [Wai Sui kei](https://github.com/WaiSiuKei)) +- Change all links to point to their Python 3 equivalents instead of Python 2[#203](https://github.com/Microsoft/vscode-python/issues/203) +- Respect `{workspaceFolder}` [#258](https://github.com/Microsoft/vscode-python/issues/258) +- Running a program using Ctrl-F5 will work more than once [#25](https://github.com/Microsoft/vscode-python/issues/25) +- Removed the feedback service to rely on VS Code's own support (which fixed an issue of document reformatting failing) [#245](https://github.com/Microsoft/vscode-python/issues/245), [#303](https://github.com/Microsoft/vscode-python/issues/303), [#363](https://github.com/Microsoft/vscode-python/issues/365) +- Do not create empty '.vscode' directory [#253](https://github.com/Microsoft/vscode-python/issues/253), [#277](https://github.com/Microsoft/vscode-python/issues/277) +- Ensure python execution environment handles unicode characters [#393](https://github.com/Microsoft/vscode-python/issues/393) +- Remove Jupyter support in favour of the [Jupyter extension](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter) [#223](https://github.com/microsoft/vscode-python/issues/223) ### `conda` -* Support installing Pylint using conda or pip when an Anaconda installation of Python is selected as the active interpreter [#301](https://github.com/Microsoft/vscode-python/issues/301) -* Add JSON schema support for conda's meta.yaml [#281](https://github.com/Microsoft/vscode-python/issues/281) -* Add JSON schema support for conda's environment.yml [#280](https://github.com/Microsoft/vscode-python/issues/280) -* Add JSON schema support for .condarc [#189](https://github.com/Microsoft/vscode-python/issues/280) -* Ensure company name 'Continuum Analytics' is replaced with 'Ananconda Inc' in the list of interpreters [#390](https://github.com/Microsoft/vscode-python/issues/390) -* Display the version of the interpreter instead of conda [#378](https://github.com/Microsoft/vscode-python/issues/378) -* Detect Anaconda on Linux even if it is not in the current path [#22](https://github.com/Microsoft/vscode-python/issues/22) +- Support installing Pylint using conda or pip when an Anaconda installation of Python is selected as the active interpreter [#301](https://github.com/Microsoft/vscode-python/issues/301) +- Add JSON schema support for conda's meta.yaml [#281](https://github.com/Microsoft/vscode-python/issues/281) +- Add JSON schema support for conda's environment.yml [#280](https://github.com/Microsoft/vscode-python/issues/280) +- Add JSON schema support for .condarc [#189](https://github.com/Microsoft/vscode-python/issues/280) +- Ensure company name 'Continuum Analytics' is replaced with 'Ananconda Inc' in the list of interpreters [#390](https://github.com/Microsoft/vscode-python/issues/390) +- Display the version of the interpreter instead of conda [#378](https://github.com/Microsoft/vscode-python/issues/378) +- Detect Anaconda on Linux even if it is not in the current path [#22](https://github.com/Microsoft/vscode-python/issues/22) ### Interpreter selection -* Fixes in the discovery and display of interpreters, including virtual environments [#56](https://github.com/Microsoft/vscode-python/issues/56) -* Retrieve the right value from the registry when determining the version of an interpreter on Windows [#389](https://github.com/Microsoft/vscode-python/issues/389) +- Fixes in the discovery and display of interpreters, including virtual environments [#56](https://github.com/Microsoft/vscode-python/issues/56) +- Retrieve the right value from the registry when determining the version of an interpreter on Windows [#389](https://github.com/Microsoft/vscode-python/issues/389) ### Intellisense -* Fetch intellisense details on-demand instead of for all possible completions [#152](https://github.com/Microsoft/vscode-python/issues/152) -* Disable auto completion in comments and strings [#110](https://github.com/Microsoft/vscode-python/issues/110), [#921](https://github.com/Microsoft/vscode-python/issues/921), [#34](https://github.com/Microsoft/vscode-python/issues/34) +- Fetch intellisense details on-demand instead of for all possible completions [#152](https://github.com/Microsoft/vscode-python/issues/152) +- Disable auto completion in comments and strings [#110](https://github.com/Microsoft/vscode-python/issues/110), [#921](https://github.com/Microsoft/vscode-python/issues/921), [#34](https://github.com/Microsoft/vscode-python/issues/34) ### Linting -* Deprecate `python.linting.lintOnTextChange` [#313](https://github.com/Microsoft/vscode-python/issues/313), [#297](https://github.com/Microsoft/vscode-python/issues/297), [#28](https://github.com/Microsoft/vscode-python/issues/28), [#272](https://github.com/Microsoft/vscode-python/issues/272) -* Refactor code for executing linters (fixes running the proper linter under the selected interpreter) [#351](https://github.com/Microsoft/vscode-python/issues/351), [#397](https://github.com/Microsoft/vscode-python/issues/397) -* Don't attempt to install linters when not in a workspace [#42](https://github.com/Microsoft/vscode-python/issues/42) -* Honour `python.linting.enabled` [#26](https://github.com/Microsoft/vscode-python/issues/26) -* Don't display message 'Linter pylint is not installed' when changing settings [#260](https://github.com/Microsoft/vscode-python/issues/260) -* Display a meaningful message if pip is unavailable to install necessary module such as 'pylint' [#266](https://github.com/Microsoft/vscode-python/issues/266) -* Improvement environment variable parsing in the debugging (allows for embedded `=`) [#149](https://github.com/Microsoft/vscode-python/issues/149), [#361](https://github.com/Microsoft/vscode-python/issues/361) +- Deprecate `python.linting.lintOnTextChange` [#313](https://github.com/Microsoft/vscode-python/issues/313), [#297](https://github.com/Microsoft/vscode-python/issues/297), [#28](https://github.com/Microsoft/vscode-python/issues/28), [#272](https://github.com/Microsoft/vscode-python/issues/272) +- Refactor code for executing linters (fixes running the proper linter under the selected interpreter) [#351](https://github.com/Microsoft/vscode-python/issues/351), [#397](https://github.com/Microsoft/vscode-python/issues/397) +- Don't attempt to install linters when not in a workspace [#42](https://github.com/Microsoft/vscode-python/issues/42) +- Honour `python.linting.enabled` [#26](https://github.com/Microsoft/vscode-python/issues/26) +- Don't display message 'Linter pylint is not installed' when changing settings [#260](https://github.com/Microsoft/vscode-python/issues/260) +- Display a meaningful message if pip is unavailable to install necessary module such as 'pylint' [#266](https://github.com/Microsoft/vscode-python/issues/266) +- Improvement environment variable parsing in the debugging (allows for embedded `=`) [#149](https://github.com/Microsoft/vscode-python/issues/149), [#361](https://github.com/Microsoft/vscode-python/issues/361) ### Debugging -* Improve selecting the port used when debugging [#304](https://github.com/Microsoft/vscode-python/pull/304) -* Don't block debugging in other extensions [#58](https://github.com/Microsoft/vscode-python/issues/58) -* Don't trigger an error to the Console Window when trying to debug an invalid Python file [#157](https://github.com/Microsoft/vscode-python/issues/157) -* No longer prompt to `Press any key to continue . . .` once debugging finishes [#239](https://github.com/Microsoft/vscode-python/issues/239) -* Do not start the extension when debugging non-Python projects [#57](https://github.com/Microsoft/vscode-python/issues/57) -* Support custom external terminals in debugger [#250](https://github.com/Microsoft/vscode-python/issues/250), [#114](https://github.com/Microsoft/vscode-python/issues/114) -* Debugging a python program should not display the message 'Cannot read property …' [#247](https://github.com/Microsoft/vscode-python/issues/247) +- Improve selecting the port used when debugging [#304](https://github.com/Microsoft/vscode-python/pull/304) +- Don't block debugging in other extensions [#58](https://github.com/Microsoft/vscode-python/issues/58) +- Don't trigger an error to the Console Window when trying to debug an invalid Python file [#157](https://github.com/Microsoft/vscode-python/issues/157) +- No longer prompt to `Press any key to continue . . .` once debugging finishes [#239](https://github.com/Microsoft/vscode-python/issues/239) +- Do not start the extension when debugging non-Python projects [#57](https://github.com/Microsoft/vscode-python/issues/57) +- Support custom external terminals in debugger [#250](https://github.com/Microsoft/vscode-python/issues/250), [#114](https://github.com/Microsoft/vscode-python/issues/114) +- Debugging a python program should not display the message 'Cannot read property …' [#247](https://github.com/Microsoft/vscode-python/issues/247) ### Testing -* Refactor unit test library execution code [#350](https://github.com/Microsoft/vscode-python/issues/350) +- Refactor unit test library execution code [#350](https://github.com/Microsoft/vscode-python/issues/350) ### Formatting -* Deprecate the setting `python.formatting.formatOnSave` with an appropriate message [#285](https://github.com/Microsoft/vscode-python/issues/285), [#309](https://github.com/Microsoft/vscode-python/issues/309) +- Deprecate the setting `python.formatting.formatOnSave` with an appropriate message [#285](https://github.com/Microsoft/vscode-python/issues/285), [#309](https://github.com/Microsoft/vscode-python/issues/309) ## Version 0.8.0 (9 November 2017) -* Add support for multi-root workspaces [#1228](https://github.com/DonJayamanne/pythonVSCode/issues/1228), [#1302](https://github.com/DonJayamanne/pythonVSCode/pull/1302), [#1328](https://github.com/DonJayamanne/pythonVSCode/issues/1328), [#1357](https://github.com/DonJayamanne/pythonVSCode/pull/1357) -* Add code snippet for ```ipdb``` [#1141](https://github.com/DonJayamanne/pythonVSCode/pull/1141) -* Add ability to resolving environment variables in path to ```mypy``` [#1195](https://github.com/DonJayamanne/pythonVSCode/issues/1195) -* Add ability to disable a linter globally and disable prompts to install linters [#1207](https://github.com/DonJayamanne/pythonVSCode/issues/1207) -* Auto-selecting an interpreter from a virtual environment if only one is found in the root directory of the project [#1216](https://github.com/DonJayamanne/pythonVSCode/issues/1216) -* Add support for specifying the working directory for unit tests [#1155](https://github.com/DonJayamanne/pythonVSCode/issues/1155), [#1185](https://github.com/DonJayamanne/pythonVSCode/issues/1185) -* Add syntax highlighting of pip requirements files [#1247](https://github.com/DonJayamanne/pythonVSCode/pull/1247) -* Add ability to select an interpreter even when a workspace is not open [#1260](https://github.com/DonJayamanne/pythonVSCode/issues/1260), [#1263](https://github.com/DonJayamanne/pythonVSCode/pull/1263) -* Display a code lens to change the selected interpreter to the one specified in the shebang line [#1257](https://github.com/DonJayamanne/pythonVSCode/pull/1257), [#1263](https://github.com/DonJayamanne/pythonVSCode/pull/1263), [#1267](https://github.com/DonJayamanne/pythonVSCode/pull/1267), [#1280](https://github.com/DonJayamanne/pythonVSCode/issues/1280), [#1261](https://github.com/DonJayamanne/pythonVSCode/issues/1261), [#1290](https://github.com/DonJayamanne/pythonVSCode/pull/1290) -* Expand list of interpreters displayed for selection [#1147](https://github.com/DonJayamanne/pythonVSCode/issues/1147), [#1148](https://github.com/DonJayamanne/pythonVSCode/issues/1148), [#1224](https://github.com/DonJayamanne/pythonVSCode/pull/1224), [#1240](https://github.com/DonJayamanne/pythonVSCode/pull/1240) -* Display details of current or selected interpreter in statusbar [#1147](https://github.com/DonJayamanne/pythonVSCode/issues/1147), [#1217](https://github.com/DonJayamanne/pythonVSCode/issues/1217) -* Ensure paths in workspace symbols are not prefixed with ```.vscode``` [#816](https://github.com/DonJayamanne/pythonVSCode/issues/816), [#1066](https://github.com/DonJayamanne/pythonVSCode/pull/1066), [#829](https://github.com/DonJayamanne/pythonVSCode/issues/829) -* Ensure paths in ```PYTHONPATH``` environment variable are delimited using the OS-specific path delimiter [#832](https://github.com/DonJayamanne/pythonVSCode/issues/832) -* Ensure ```Rope``` is not packaged with the extension [#1208](https://github.com/DonJayamanne/pythonVSCode/issues/1208), [#1207](https://github.com/DonJayamanne/pythonVSCode/issues/1207), [#1243](https://github.com/DonJayamanne/pythonVSCode/pull/1243), [#1229](https://github.com/DonJayamanne/pythonVSCode/issues/1229) -* Ensure ctags are rebuilt as expected upon file save [#624](https://github.com/DonJayamanne/pythonVSCode/issues/1212) -* Ensure right test method is executed when two test methods exist with the same name in different classes [#1203](https://github.com/DonJayamanne/pythonVSCode/issues/1203) -* Ensure unit tests run successfully on Travis for both Python 2.7 and 3.6 [#1255](https://github.com/DonJayamanne/pythonVSCode/pull/1255), [#1241](https://github.com/DonJayamanne/pythonVSCode/issues/1241), [#1315](https://github.com/DonJayamanne/pythonVSCode/issues/1315) -* Fix building of ctags when a path contains a space [#1064](https://github.com/DonJayamanne/pythonVSCode/issues/1064), [#1144](https://github.com/DonJayamanne/pythonVSCode/issues/1144),, [#1213](https://github.com/DonJayamanne/pythonVSCode/pull/1213) -* Fix autocompletion in unsaved Python files [#1194](https://github.com/DonJayamanne/pythonVSCode/issues/1194) -* Fix running of test methods in nose [#597](https://github.com/DonJayamanne/pythonVSCode/issues/597), [#1225](https://github.com/DonJayamanne/pythonVSCode/pull/1225) -* Fix to disable linting of diff windows [#1221](https://github.com/DonJayamanne/pythonVSCode/issues/1221), [#1244](https://github.com/DonJayamanne/pythonVSCode/pull/1244) -* Fix docstring formatting [#1188](https://github.com/DonJayamanne/pythonVSCode/issues/1188) -* Fix to ensure language features can run in parallel without interference with one another [#1314](https://github.com/DonJayamanne/pythonVSCode/issues/1314), [#1318](https://github.com/DonJayamanne/pythonVSCode/pull/1318) -* Fix to ensure unit tests can be debugged more than once per run [#948](https://github.com/DonJayamanne/pythonVSCode/issues/948), [#1353](https://github.com/DonJayamanne/pythonVSCode/pull/1353) -* Fix to ensure parameterized unit tests can be debugged [#1284](https://github.com/DonJayamanne/pythonVSCode/issues/1284), [#1299](https://github.com/DonJayamanne/pythonVSCode/pull/1299) -* Fix issue that causes debugger to freeze/hang [#1041](https://github.com/DonJayamanne/pythonVSCode/issues/1041), [#1354](https://github.com/DonJayamanne/pythonVSCode/pull/1354) -* Fix to support unicode characters in Python tests [#1282](https://github.com/DonJayamanne/pythonVSCode/issues/1282), [#1291](https://github.com/DonJayamanne/pythonVSCode/pull/1291) -* Changes as a result of VS Code API changes [#1270](https://github.com/DonJayamanne/pythonVSCode/issues/1270), [#1288](https://github.com/DonJayamanne/pythonVSCode/pull/1288), [#1372](https://github.com/DonJayamanne/pythonVSCode/issues/1372), [#1300](https://github.com/DonJayamanne/pythonVSCode/pull/1300), [#1298](https://github.com/DonJayamanne/pythonVSCode/issues/1298) -* Updates to Readme [#1212](https://github.com/DonJayamanne/pythonVSCode/issues/1212), [#1222](https://github.com/DonJayamanne/pythonVSCode/issues/1222) -* Fix executing a command under PowerShell [#1098](https://github.com/DonJayamanne/pythonVSCode/issues/1098) +- Add support for multi-root workspaces [#1228](https://github.com/DonJayamanne/pythonVSCode/issues/1228), [#1302](https://github.com/DonJayamanne/pythonVSCode/pull/1302), [#1328](https://github.com/DonJayamanne/pythonVSCode/issues/1328), [#1357](https://github.com/DonJayamanne/pythonVSCode/pull/1357) +- Add code snippet for `ipdb` [#1141](https://github.com/DonJayamanne/pythonVSCode/pull/1141) +- Add ability to resolving environment variables in path to `mypy` [#1195](https://github.com/DonJayamanne/pythonVSCode/issues/1195) +- Add ability to disable a linter globally and disable prompts to install linters [#1207](https://github.com/DonJayamanne/pythonVSCode/issues/1207) +- Auto-selecting an interpreter from a virtual environment if only one is found in the root directory of the project [#1216](https://github.com/DonJayamanne/pythonVSCode/issues/1216) +- Add support for specifying the working directory for unit tests [#1155](https://github.com/DonJayamanne/pythonVSCode/issues/1155), [#1185](https://github.com/DonJayamanne/pythonVSCode/issues/1185) +- Add syntax highlighting of pip requirements files [#1247](https://github.com/DonJayamanne/pythonVSCode/pull/1247) +- Add ability to select an interpreter even when a workspace is not open [#1260](https://github.com/DonJayamanne/pythonVSCode/issues/1260), [#1263](https://github.com/DonJayamanne/pythonVSCode/pull/1263) +- Display a code lens to change the selected interpreter to the one specified in the shebang line [#1257](https://github.com/DonJayamanne/pythonVSCode/pull/1257), [#1263](https://github.com/DonJayamanne/pythonVSCode/pull/1263), [#1267](https://github.com/DonJayamanne/pythonVSCode/pull/1267), [#1280](https://github.com/DonJayamanne/pythonVSCode/issues/1280), [#1261](https://github.com/DonJayamanne/pythonVSCode/issues/1261), [#1290](https://github.com/DonJayamanne/pythonVSCode/pull/1290) +- Expand list of interpreters displayed for selection [#1147](https://github.com/DonJayamanne/pythonVSCode/issues/1147), [#1148](https://github.com/DonJayamanne/pythonVSCode/issues/1148), [#1224](https://github.com/DonJayamanne/pythonVSCode/pull/1224), [#1240](https://github.com/DonJayamanne/pythonVSCode/pull/1240) +- Display details of current or selected interpreter in statusbar [#1147](https://github.com/DonJayamanne/pythonVSCode/issues/1147), [#1217](https://github.com/DonJayamanne/pythonVSCode/issues/1217) +- Ensure paths in workspace symbols are not prefixed with `.vscode` [#816](https://github.com/DonJayamanne/pythonVSCode/issues/816), [#1066](https://github.com/DonJayamanne/pythonVSCode/pull/1066), [#829](https://github.com/DonJayamanne/pythonVSCode/issues/829) +- Ensure paths in `PYTHONPATH` environment variable are delimited using the OS-specific path delimiter [#832](https://github.com/DonJayamanne/pythonVSCode/issues/832) +- Ensure `Rope` is not packaged with the extension [#1208](https://github.com/DonJayamanne/pythonVSCode/issues/1208), [#1207](https://github.com/DonJayamanne/pythonVSCode/issues/1207), [#1243](https://github.com/DonJayamanne/pythonVSCode/pull/1243), [#1229](https://github.com/DonJayamanne/pythonVSCode/issues/1229) +- Ensure ctags are rebuilt as expected upon file save [#624](https://github.com/DonJayamanne/pythonVSCode/issues/1212) +- Ensure right test method is executed when two test methods exist with the same name in different classes [#1203](https://github.com/DonJayamanne/pythonVSCode/issues/1203) +- Ensure unit tests run successfully on Travis for both Python 2.7 and 3.6 [#1255](https://github.com/DonJayamanne/pythonVSCode/pull/1255), [#1241](https://github.com/DonJayamanne/pythonVSCode/issues/1241), [#1315](https://github.com/DonJayamanne/pythonVSCode/issues/1315) +- Fix building of ctags when a path contains a space [#1064](https://github.com/DonJayamanne/pythonVSCode/issues/1064), [#1144](https://github.com/DonJayamanne/pythonVSCode/issues/1144),, [#1213](https://github.com/DonJayamanne/pythonVSCode/pull/1213) +- Fix autocompletion in unsaved Python files [#1194](https://github.com/DonJayamanne/pythonVSCode/issues/1194) +- Fix running of test methods in nose [#597](https://github.com/DonJayamanne/pythonVSCode/issues/597), [#1225](https://github.com/DonJayamanne/pythonVSCode/pull/1225) +- Fix to disable linting of diff windows [#1221](https://github.com/DonJayamanne/pythonVSCode/issues/1221), [#1244](https://github.com/DonJayamanne/pythonVSCode/pull/1244) +- Fix docstring formatting [#1188](https://github.com/DonJayamanne/pythonVSCode/issues/1188) +- Fix to ensure language features can run in parallel without interference with one another [#1314](https://github.com/DonJayamanne/pythonVSCode/issues/1314), [#1318](https://github.com/DonJayamanne/pythonVSCode/pull/1318) +- Fix to ensure unit tests can be debugged more than once per run [#948](https://github.com/DonJayamanne/pythonVSCode/issues/948), [#1353](https://github.com/DonJayamanne/pythonVSCode/pull/1353) +- Fix to ensure parameterized unit tests can be debugged [#1284](https://github.com/DonJayamanne/pythonVSCode/issues/1284), [#1299](https://github.com/DonJayamanne/pythonVSCode/pull/1299) +- Fix issue that causes debugger to freeze/hang [#1041](https://github.com/DonJayamanne/pythonVSCode/issues/1041), [#1354](https://github.com/DonJayamanne/pythonVSCode/pull/1354) +- Fix to support unicode characters in Python tests [#1282](https://github.com/DonJayamanne/pythonVSCode/issues/1282), [#1291](https://github.com/DonJayamanne/pythonVSCode/pull/1291) +- Changes as a result of VS Code API changes [#1270](https://github.com/DonJayamanne/pythonVSCode/issues/1270), [#1288](https://github.com/DonJayamanne/pythonVSCode/pull/1288), [#1372](https://github.com/DonJayamanne/pythonVSCode/issues/1372), [#1300](https://github.com/DonJayamanne/pythonVSCode/pull/1300), [#1298](https://github.com/DonJayamanne/pythonVSCode/issues/1298) +- Updates to Readme [#1212](https://github.com/DonJayamanne/pythonVSCode/issues/1212), [#1222](https://github.com/DonJayamanne/pythonVSCode/issues/1222) +- Fix executing a command under PowerShell [#1098](https://github.com/DonJayamanne/pythonVSCode/issues/1098) ## Version 0.7.0 (3 August 2017) -* Displaying internal documentation [#1008](https://github.com/DonJayamanne/pythonVSCode/issues/1008), [#10860](https://github.com/DonJayamanne/pythonVSCode/issues/10860) -* Fixes to 'async with' snippet [#1108](https://github.com/DonJayamanne/pythonVSCode/pull/1108), [#996](https://github.com/DonJayamanne/pythonVSCode/issues/996) -* Add support for environment variable in unit tests [#1074](https://github.com/DonJayamanne/pythonVSCode/issues/1074) -* Fixes to unit test code lenses not being displayed [#1115](https://github.com/DonJayamanne/pythonVSCode/issues/1115) -* Fix to empty brackets being added [#1110](https://github.com/DonJayamanne/pythonVSCode/issues/1110), [#1031](https://github.com/DonJayamanne/pythonVSCode/issues/1031) -* Fix debugging of Django applications [#819](https://github.com/DonJayamanne/pythonVSCode/issues/819), [#999](https://github.com/DonJayamanne/pythonVSCode/issues/999) -* Update isort to the latest version [#1134](https://github.com/DonJayamanne/pythonVSCode/issues/1134), [#1135](https://github.com/DonJayamanne/pythonVSCode/pull/1135) -* Fix issue causing intellisense and similar functionality to stop working [#1072](https://github.com/DonJayamanne/pythonVSCode/issues/1072), [#1118](https://github.com/DonJayamanne/pythonVSCode/pull/1118), [#1089](https://github.com/DonJayamanne/pythonVSCode/issues/1089) -* Bunch of unit tests and code cleanup -* Resolve issue where navigation to decorated function goes to decorator [#742](https://github.com/DonJayamanne/pythonVSCode/issues/742) -* Go to symbol in workspace leads to nonexisting files [#816](https://github.com/DonJayamanne/pythonVSCode/issues/816), [#829](https://github.com/DonJayamanne/pythonVSCode/issues/829) + +- Displaying internal documentation [#1008](https://github.com/DonJayamanne/pythonVSCode/issues/1008), [#10860](https://github.com/DonJayamanne/pythonVSCode/issues/10860) +- Fixes to 'async with' snippet [#1108](https://github.com/DonJayamanne/pythonVSCode/pull/1108), [#996](https://github.com/DonJayamanne/pythonVSCode/issues/996) +- Add support for environment variable in unit tests [#1074](https://github.com/DonJayamanne/pythonVSCode/issues/1074) +- Fixes to unit test code lenses not being displayed [#1115](https://github.com/DonJayamanne/pythonVSCode/issues/1115) +- Fix to empty brackets being added [#1110](https://github.com/DonJayamanne/pythonVSCode/issues/1110), [#1031](https://github.com/DonJayamanne/pythonVSCode/issues/1031) +- Fix debugging of Django applications [#819](https://github.com/DonJayamanne/pythonVSCode/issues/819), [#999](https://github.com/DonJayamanne/pythonVSCode/issues/999) +- Update isort to the latest version [#1134](https://github.com/DonJayamanne/pythonVSCode/issues/1134), [#1135](https://github.com/DonJayamanne/pythonVSCode/pull/1135) +- Fix issue causing intellisense and similar functionality to stop working [#1072](https://github.com/DonJayamanne/pythonVSCode/issues/1072), [#1118](https://github.com/DonJayamanne/pythonVSCode/pull/1118), [#1089](https://github.com/DonJayamanne/pythonVSCode/issues/1089) +- Bunch of unit tests and code cleanup +- Resolve issue where navigation to decorated function goes to decorator [#742](https://github.com/DonJayamanne/pythonVSCode/issues/742) +- Go to symbol in workspace leads to nonexisting files [#816](https://github.com/DonJayamanne/pythonVSCode/issues/816), [#829](https://github.com/DonJayamanne/pythonVSCode/issues/829) ## Version 0.6.9 (22 July 2017) -* Fix to enure custom linter paths are respected [#1106](https://github.com/DonJayamanne/pythonVSCode/issues/1106) + +- Fix to enure custom linter paths are respected [#1106](https://github.com/DonJayamanne/pythonVSCode/issues/1106) ## Version 0.6.8 (20 July 2017) -* Add new editor menu 'Run Current Unit Test File' [#1061](https://github.com/DonJayamanne/pythonVSCode/issues/1061) -* Changed 'mypy-lang' to mypy [#930](https://github.com/DonJayamanne/pythonVSCode/issues/930), [#998](https://github.com/DonJayamanne/pythonVSCode/issues/998), [#505](https://github.com/DonJayamanne/pythonVSCode/issues/505) -* Using "Python -m" to launch linters [#716](https://github.com/DonJayamanne/pythonVSCode/issues/716), [#923](https://github.com/DonJayamanne/pythonVSCode/issues/923), [#1059](https://github.com/DonJayamanne/pythonVSCode/issues/1059) -* Add PEP 526 AutoCompletion [#1102](https://github.com/DonJayamanne/pythonVSCode/pull/1102), [#1101](https://github.com/DonJayamanne/pythonVSCode/issues/1101) -* Resolved issues in Go To and Peek Definitions [#1085](https://github.com/DonJayamanne/pythonVSCode/pull/1085), [#961](https://github.com/DonJayamanne/pythonVSCode/issues/961), [#870](https://github.com/DonJayamanne/pythonVSCode/issues/870) + +- Add new editor menu 'Run Current Unit Test File' [#1061](https://github.com/DonJayamanne/pythonVSCode/issues/1061) +- Changed 'mypy-lang' to mypy [#930](https://github.com/DonJayamanne/pythonVSCode/issues/930), [#998](https://github.com/DonJayamanne/pythonVSCode/issues/998), [#505](https://github.com/DonJayamanne/pythonVSCode/issues/505) +- Using "Python -m" to launch linters [#716](https://github.com/DonJayamanne/pythonVSCode/issues/716), [#923](https://github.com/DonJayamanne/pythonVSCode/issues/923), [#1059](https://github.com/DonJayamanne/pythonVSCode/issues/1059) +- Add PEP 526 AutoCompletion [#1102](https://github.com/DonJayamanne/pythonVSCode/pull/1102), [#1101](https://github.com/DonJayamanne/pythonVSCode/issues/1101) +- Resolved issues in Go To and Peek Definitions [#1085](https://github.com/DonJayamanne/pythonVSCode/pull/1085), [#961](https://github.com/DonJayamanne/pythonVSCode/issues/961), [#870](https://github.com/DonJayamanne/pythonVSCode/issues/870) ## Version 0.6.7 (02 July 2017) -* Updated icon from jpg to png (transparent background) + +- Updated icon from jpg to png (transparent background) ## Version 0.6.6 (02 July 2017) -* Provide details of error with solution for changes to syntax in launch.json [#1047](https://github.com/DonJayamanne/pythonVSCode/issues/1047), [#1025](https://github.com/DonJayamanne/pythonVSCode/issues/1025) -* Provide a warning about known issues with having pyenv.cfg whilst debugging [#913](https://github.com/DonJayamanne/pythonVSCode/issues/913) -* Create .vscode directory if not found [#1043](https://github.com/DonJayamanne/pythonVSCode/issues/1043) -* Highlighted text due to linter errors is off by one column [#965](https://github.com/DonJayamanne/pythonVSCode/issues/965), [#970](https://github.com/DonJayamanne/pythonVSCode/pull/970) -* Added preliminary support for WSL Bash and Cygwin [#1049](https://github.com/DonJayamanne/pythonVSCode/pull/1049) -* Ability to configure the linter severity levels [#941](https://github.com/DonJayamanne/pythonVSCode/pull/941), [#895](https://github.com/DonJayamanne/pythonVSCode/issues/895) -* Fixes to unit tests [#1051](https://github.com/DonJayamanne/pythonVSCode/pull/1051), [#1050](https://github.com/DonJayamanne/pythonVSCode/pull/1050) -* Outdent lines following `continue`, `break` and `return` [#1050](https://github.com/DonJayamanne/pythonVSCode/pull/1050) -* Change location of cache for Jedi files [#1035](https://github.com/DonJayamanne/pythonVSCode/pull/1035) -* Fixes to the way directories are searched for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569), [#1040](https://github.com/DonJayamanne/pythonVSCode/pull/1040) -* Handle outputs from Python packages that interfere with the way autocompletion is handled [#602](https://github.com/DonJayamanne/pythonVSCode/issues/602) + +- Provide details of error with solution for changes to syntax in launch.json [#1047](https://github.com/DonJayamanne/pythonVSCode/issues/1047), [#1025](https://github.com/DonJayamanne/pythonVSCode/issues/1025) +- Provide a warning about known issues with having pyenv.cfg whilst debugging [#913](https://github.com/DonJayamanne/pythonVSCode/issues/913) +- Create .vscode directory if not found [#1043](https://github.com/DonJayamanne/pythonVSCode/issues/1043) +- Highlighted text due to linter errors is off by one column [#965](https://github.com/DonJayamanne/pythonVSCode/issues/965), [#970](https://github.com/DonJayamanne/pythonVSCode/pull/970) +- Added preliminary support for WSL Bash and Cygwin [#1049](https://github.com/DonJayamanne/pythonVSCode/pull/1049) +- Ability to configure the linter severity levels [#941](https://github.com/DonJayamanne/pythonVSCode/pull/941), [#895](https://github.com/DonJayamanne/pythonVSCode/issues/895) +- Fixes to unit tests [#1051](https://github.com/DonJayamanne/pythonVSCode/pull/1051), [#1050](https://github.com/DonJayamanne/pythonVSCode/pull/1050) +- Outdent lines following `continue`, `break` and `return` [#1050](https://github.com/DonJayamanne/pythonVSCode/pull/1050) +- Change location of cache for Jedi files [#1035](https://github.com/DonJayamanne/pythonVSCode/pull/1035) +- Fixes to the way directories are searched for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569), [#1040](https://github.com/DonJayamanne/pythonVSCode/pull/1040) +- Handle outputs from Python packages that interfere with the way autocompletion is handled [#602](https://github.com/DonJayamanne/pythonVSCode/issues/602) ## Version 0.6.5 (13 June 2017) -* Fix error in launch.json [#1006](https://github.com/DonJayamanne/pythonVSCode/issues/1006) -* Detect current workspace interpreter when selecting interpreter [#1006](https://github.com/DonJayamanne/pythonVSCode/issues/979) -* Disable output buffering when debugging [#1005](https://github.com/DonJayamanne/pythonVSCode/issues/1005) -* Updated snippets to use correct placeholder syntax [#976](https://github.com/DonJayamanne/pythonVSCode/pull/976) -* Fix hover and auto complete unit tests [#1012](https://github.com/DonJayamanne/pythonVSCode/pull/1012) -* Fix hover definition variable test for Python 3.5 [#1013](https://github.com/DonJayamanne/pythonVSCode/pull/1013) -* Better formatting of docstring [#821](https://github.com/DonJayamanne/pythonVSCode/pull/821), [#919](https://github.com/DonJayamanne/pythonVSCode/pull/919) -* Supporting more paths when searching for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) -* Increase buffer output (to support detection large number of tests) [#927](https://github.com/DonJayamanne/pythonVSCode/issues/927) + +- Fix error in launch.json [#1006](https://github.com/DonJayamanne/pythonVSCode/issues/1006) +- Detect current workspace interpreter when selecting interpreter [#1006](https://github.com/DonJayamanne/pythonVSCode/issues/979) +- Disable output buffering when debugging [#1005](https://github.com/DonJayamanne/pythonVSCode/issues/1005) +- Updated snippets to use correct placeholder syntax [#976](https://github.com/DonJayamanne/pythonVSCode/pull/976) +- Fix hover and auto complete unit tests [#1012](https://github.com/DonJayamanne/pythonVSCode/pull/1012) +- Fix hover definition variable test for Python 3.5 [#1013](https://github.com/DonJayamanne/pythonVSCode/pull/1013) +- Better formatting of docstring [#821](https://github.com/DonJayamanne/pythonVSCode/pull/821), [#919](https://github.com/DonJayamanne/pythonVSCode/pull/919) +- Supporting more paths when searching for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) +- Increase buffer output (to support detection large number of tests) [#927](https://github.com/DonJayamanne/pythonVSCode/issues/927) ## Version 0.6.4 (4 May 2017) -* Fix dates in changelog [#899](https://github.com/DonJayamanne/pythonVSCode/pull/899) -* Using charriage return or line feeds to split a document into multiple lines [#917](https://github.com/DonJayamanne/pythonVSCode/pull/917), [#821](https://github.com/DonJayamanne/pythonVSCode/issues/821) -* Doc string not being displayed [#888](https://github.com/DonJayamanne/pythonVSCode/issues/888) -* Supporting paths that begin with the ~/ [#909](https://github.com/DonJayamanne/pythonVSCode/issues/909) -* Supporting more paths when searching for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) -* Supporting ~/ paths when providing the path to ctag file [#910](https://github.com/DonJayamanne/pythonVSCode/issues/910) -* Disable linting of python files opened in diff viewer [#896](https://github.com/DonJayamanne/pythonVSCode/issues/896) -* Added a new command ```Go to Python Object``` [#928](https://github.com/DonJayamanne/pythonVSCode/issues/928) -* Restored the menu item to rediscover tests [#863](https://github.com/DonJayamanne/pythonVSCode/issues/863) -* Changes to rediscover tests when test files are altered and saved [#863](https://github.com/DonJayamanne/pythonVSCode/issues/863) + +- Fix dates in changelog [#899](https://github.com/DonJayamanne/pythonVSCode/pull/899) +- Using charriage return or line feeds to split a document into multiple lines [#917](https://github.com/DonJayamanne/pythonVSCode/pull/917), [#821](https://github.com/DonJayamanne/pythonVSCode/issues/821) +- Doc string not being displayed [#888](https://github.com/DonJayamanne/pythonVSCode/issues/888) +- Supporting paths that begin with the ~/ [#909](https://github.com/DonJayamanne/pythonVSCode/issues/909) +- Supporting more paths when searching for Python interpreters [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) +- Supporting ~/ paths when providing the path to ctag file [#910](https://github.com/DonJayamanne/pythonVSCode/issues/910) +- Disable linting of python files opened in diff viewer [#896](https://github.com/DonJayamanne/pythonVSCode/issues/896) +- Added a new command `Go to Python Object` [#928](https://github.com/DonJayamanne/pythonVSCode/issues/928) +- Restored the menu item to rediscover tests [#863](https://github.com/DonJayamanne/pythonVSCode/issues/863) +- Changes to rediscover tests when test files are altered and saved [#863](https://github.com/DonJayamanne/pythonVSCode/issues/863) ## Version 0.6.3 (19 April 2017) -* Fix debugger issue [#893](https://github.com/DonJayamanne/pythonVSCode/issues/893) -* Improvements to debugging unit tests (check if string starts with, instead of comparing equality) [#797](https://github.com/DonJayamanne/pythonVSCode/issues/797) + +- Fix debugger issue [#893](https://github.com/DonJayamanne/pythonVSCode/issues/893) +- Improvements to debugging unit tests (check if string starts with, instead of comparing equality) [#797](https://github.com/DonJayamanne/pythonVSCode/issues/797) ## Version 0.6.2 (13 April 2017) -* Fix incorrect indenting [#880](https://github.com/DonJayamanne/pythonVSCode/issues/880) + +- Fix incorrect indenting [#880](https://github.com/DonJayamanne/pythonVSCode/issues/880) ### Thanks -* [Yuwei Ba](https://github.com/ibigbug) + +- [Yuwei Ba](https://github.com/ibigbug) ## Version 0.6.1 (10 April 2017) -* Add support for new variable syntax in upcoming VS Code release [#774](https://github.com/DonJayamanne/pythonVSCode/issues/774), [#855](https://github.com/DonJayamanne/pythonVSCode/issues/855), [#873](https://github.com/DonJayamanne/pythonVSCode/issues/873), [#823](https://github.com/DonJayamanne/pythonVSCode/issues/823) -* Resolve issues in code refactoring [#802](https://github.com/DonJayamanne/pythonVSCode/issues/802), [#824](https://github.com/DonJayamanne/pythonVSCode/issues/824), [#825](https://github.com/DonJayamanne/pythonVSCode/pull/825) -* Changes to labels in Python Interpreter lookup [#815](https://github.com/DonJayamanne/pythonVSCode/pull/815) -* Resolve Typos [#852](https://github.com/DonJayamanne/pythonVSCode/issues/852) -* Use fully qualitified Python Path when installing dependencies [#866](https://github.com/DonJayamanne/pythonVSCode/issues/866) -* Commands for running tests from a file [#502](https://github.com/DonJayamanne/pythonVSCode/pull/502) -* Fix Sorting of imports when path contains spaces [#811](https://github.com/DonJayamanne/pythonVSCode/issues/811) -* Fixing occasional failure of linters [#793](https://github.com/DonJayamanne/pythonVSCode/issues/793), [#833](https://github.com/DonJayamanne/pythonVSCode/issues/838), [#860](https://github.com/DonJayamanne/pythonVSCode/issues/860) -* Added ability to pre-load some modules to improve autocompletion [#581](https://github.com/DonJayamanne/pythonVSCode/issues/581) + +- Add support for new variable syntax in upcoming VS Code release [#774](https://github.com/DonJayamanne/pythonVSCode/issues/774), [#855](https://github.com/DonJayamanne/pythonVSCode/issues/855), [#873](https://github.com/DonJayamanne/pythonVSCode/issues/873), [#823](https://github.com/DonJayamanne/pythonVSCode/issues/823) +- Resolve issues in code refactoring [#802](https://github.com/DonJayamanne/pythonVSCode/issues/802), [#824](https://github.com/DonJayamanne/pythonVSCode/issues/824), [#825](https://github.com/DonJayamanne/pythonVSCode/pull/825) +- Changes to labels in Python Interpreter lookup [#815](https://github.com/DonJayamanne/pythonVSCode/pull/815) +- Resolve Typos [#852](https://github.com/DonJayamanne/pythonVSCode/issues/852) +- Use fully qualitified Python Path when installing dependencies [#866](https://github.com/DonJayamanne/pythonVSCode/issues/866) +- Commands for running tests from a file [#502](https://github.com/DonJayamanne/pythonVSCode/pull/502) +- Fix Sorting of imports when path contains spaces [#811](https://github.com/DonJayamanne/pythonVSCode/issues/811) +- Fixing occasional failure of linters [#793](https://github.com/DonJayamanne/pythonVSCode/issues/793), [#833](https://github.com/DonJayamanne/pythonVSCode/issues/838), [#860](https://github.com/DonJayamanne/pythonVSCode/issues/860) +- Added ability to pre-load some modules to improve autocompletion [#581](https://github.com/DonJayamanne/pythonVSCode/issues/581) ### Thanks -* [Ashwin Mathews](https://github.com/ajmathews) -* [Alexander Ioannidis](https://github.com/slint) -* [Andreas Schlapsi](https://github.com/aschlapsi) + +- [Ashwin Mathews](https://github.com/ajmathews) +- [Alexander Ioannidis](https://github.com/slint) +- [Andreas Schlapsi](https://github.com/aschlapsi) ## Version 0.6.0 (10 March 2017) -* Moved Jupyter functionality into a separate extension [Jupyter]() -* Updated readme [#779](https://github.com/DonJayamanne/pythonVSCode/issues/779) -* Changing default arguments of ```mypy``` [#658](https://github.com/DonJayamanne/pythonVSCode/issues/658) -* Added ability to disable formatting [#559](https://github.com/DonJayamanne/pythonVSCode/issues/559) -* Fixing ability to run a Python file in a terminal [#784](https://github.com/DonJayamanne/pythonVSCode/issues/784) -* Added support for Proxy settings when installing Python packages using Pip [#778](https://github.com/DonJayamanne/pythonVSCode/issues/778) + +- Moved Jupyter functionality into a separate extension [Jupyter]() +- Updated readme [#779](https://github.com/DonJayamanne/pythonVSCode/issues/779) +- Changing default arguments of `mypy` [#658](https://github.com/DonJayamanne/pythonVSCode/issues/658) +- Added ability to disable formatting [#559](https://github.com/DonJayamanne/pythonVSCode/issues/559) +- Fixing ability to run a Python file in a terminal [#784](https://github.com/DonJayamanne/pythonVSCode/issues/784) +- Added support for Proxy settings when installing Python packages using Pip [#778](https://github.com/DonJayamanne/pythonVSCode/issues/778) ## Version 0.5.9 (3 March 2017) -* Fixed navigating to definitions [#711](https://github.com/DonJayamanne/pythonVSCode/issues/711) -* Support auto detecting binaries from Python Path [#716](https://github.com/DonJayamanne/pythonVSCode/issues/716) -* Setting PYTHONPATH environment variable [#686](https://github.com/DonJayamanne/pythonVSCode/issues/686) -* Improving Linter performance, killing redundant processes [4a8319e](https://github.com/DonJayamanne/pythonVSCode/commit/4a8319e0859f2d49165c9a08fe147a647d03ece9) -* Changed default path of the CATAS file to `.vscode/tags` [#722](https://github.com/DonJayamanne/pythonVSCode/issues/722) -* Add parsing severity level for flake8 and pep8 linters [#709](https://github.com/DonJayamanne/pythonVSCode/pull/709) -* Fix to restore function descriptions (intellisense) [#727](https://github.com/DonJayamanne/pythonVSCode/issues/727) -* Added default configuration for debugging Pyramid [#287](https://github.com/DonJayamanne/pythonVSCode/pull/287) -* Feature request: Run current line in Terminal [#738](https://github.com/DonJayamanne/pythonVSCode/issues/738) -* Miscellaneous improvements to hover provider [6a7a3f3](https://github.com/DonJayamanne/pythonVSCode/commit/6a7a3f32ab8add830d13399fec6f0cdd14cd66fc), [6268306](https://github.com/DonJayamanne/pythonVSCode/commit/62683064d01cfc2b76d9be45587280798a96460b) -* Fixes to rename refactor (due to 'LF' EOL in Windows) [#748](https://github.com/DonJayamanne/pythonVSCode/pull/748) -* Fixes to ctag file being generated in home folder when no workspace is opened [#753](https://github.com/DonJayamanne/pythonVSCode/issues/753) -* Fixes to ctag file being generated in home folder when no workspace is opened [#753](https://github.com/DonJayamanne/pythonVSCode/issues/753) -* Disabling auto-completion in single line comments [#74](https://github.com/DonJayamanne/pythonVSCode/issues/74) -* Fixes to debugging of modules [#518](https://github.com/DonJayamanne/pythonVSCode/issues/518) -* Displaying unit test status icons against unit test code lenses [#678](https://github.com/DonJayamanne/pythonVSCode/issues/678) -* Fix issue where causing 'python.python-debug.startSession' not found message to be displayed when debugging single file [#708](https://github.com/DonJayamanne/pythonVSCode/issues/708) -* Ability to include packages directory when generating tags file [#735](https://github.com/DonJayamanne/pythonVSCode/issues/735) -* Fix issue where running selected text in terminal does not work [#758](https://github.com/DonJayamanne/pythonVSCode/issues/758) -* Fix issue where disabling linter doesn't disable it (when no workspace is open) [#763](https://github.com/DonJayamanne/pythonVSCode/issues/763) -* Search additional directories for Python Interpreters (~/.virtualenvs, ~/Envs, ~/.pyenv) [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) -* Added ability to pre-load some modules to improve autocompletion [#581](https://github.com/DonJayamanne/pythonVSCode/issues/581) -* Removed invalid default value in launch.json file [#586](https://github.com/DonJayamanne/pythonVSCode/issues/586) -* Added ability to configure the pylint executable path [#766](https://github.com/DonJayamanne/pythonVSCode/issues/766) -* Fixed single file debugger to ensure the Python interpreter configured in python.PythonPath is being used [#769](https://github.com/DonJayamanne/pythonVSCode/issues/769) + +- Fixed navigating to definitions [#711](https://github.com/DonJayamanne/pythonVSCode/issues/711) +- Support auto detecting binaries from Python Path [#716](https://github.com/DonJayamanne/pythonVSCode/issues/716) +- Setting PYTHONPATH environment variable [#686](https://github.com/DonJayamanne/pythonVSCode/issues/686) +- Improving Linter performance, killing redundant processes [4a8319e](https://github.com/DonJayamanne/pythonVSCode/commit/4a8319e0859f2d49165c9a08fe147a647d03ece9) +- Changed default path of the CATAS file to `.vscode/tags` [#722](https://github.com/DonJayamanne/pythonVSCode/issues/722) +- Add parsing severity level for flake8 and pep8 linters [#709](https://github.com/DonJayamanne/pythonVSCode/pull/709) +- Fix to restore function descriptions (intellisense) [#727](https://github.com/DonJayamanne/pythonVSCode/issues/727) +- Added default configuration for debugging Pyramid [#287](https://github.com/DonJayamanne/pythonVSCode/pull/287) +- Feature request: Run current line in Terminal [#738](https://github.com/DonJayamanne/pythonVSCode/issues/738) +- Miscellaneous improvements to hover provider [6a7a3f3](https://github.com/DonJayamanne/pythonVSCode/commit/6a7a3f32ab8add830d13399fec6f0cdd14cd66fc), [6268306](https://github.com/DonJayamanne/pythonVSCode/commit/62683064d01cfc2b76d9be45587280798a96460b) +- Fixes to rename refactor (due to 'LF' EOL in Windows) [#748](https://github.com/DonJayamanne/pythonVSCode/pull/748) +- Fixes to ctag file being generated in home folder when no workspace is opened [#753](https://github.com/DonJayamanne/pythonVSCode/issues/753) +- Fixes to ctag file being generated in home folder when no workspace is opened [#753](https://github.com/DonJayamanne/pythonVSCode/issues/753) +- Disabling auto-completion in single line comments [#74](https://github.com/DonJayamanne/pythonVSCode/issues/74) +- Fixes to debugging of modules [#518](https://github.com/DonJayamanne/pythonVSCode/issues/518) +- Displaying unit test status icons against unit test code lenses [#678](https://github.com/DonJayamanne/pythonVSCode/issues/678) +- Fix issue where causing 'python.python-debug.startSession' not found message to be displayed when debugging single file [#708](https://github.com/DonJayamanne/pythonVSCode/issues/708) +- Ability to include packages directory when generating tags file [#735](https://github.com/DonJayamanne/pythonVSCode/issues/735) +- Fix issue where running selected text in terminal does not work [#758](https://github.com/DonJayamanne/pythonVSCode/issues/758) +- Fix issue where disabling linter doesn't disable it (when no workspace is open) [#763](https://github.com/DonJayamanne/pythonVSCode/issues/763) +- Search additional directories for Python Interpreters (~/.virtualenvs, ~/Envs, ~/.pyenv) [#569](https://github.com/DonJayamanne/pythonVSCode/issues/569) +- Added ability to pre-load some modules to improve autocompletion [#581](https://github.com/DonJayamanne/pythonVSCode/issues/581) +- Removed invalid default value in launch.json file [#586](https://github.com/DonJayamanne/pythonVSCode/issues/586) +- Added ability to configure the pylint executable path [#766](https://github.com/DonJayamanne/pythonVSCode/issues/766) +- Fixed single file debugger to ensure the Python interpreter configured in python.PythonPath is being used [#769](https://github.com/DonJayamanne/pythonVSCode/issues/769) ## Version 0.5.8 (3 February 2017) -* Fixed a bug in [debugging single files without a launch configuration](https://code.visualstudio.com/updates/v1_9#_debugging-without-a-launch-configuration) [#700](https://github.com/DonJayamanne/pythonVSCode/issues/700) -* Fixed error when starting REPL [#692](https://github.com/DonJayamanne/pythonVSCode/issues/692) + +- Fixed a bug in [debugging single files without a launch configuration](https://code.visualstudio.com/updates/v1_9#_debugging-without-a-launch-configuration) [#700](https://github.com/DonJayamanne/pythonVSCode/issues/700) +- Fixed error when starting REPL [#692](https://github.com/DonJayamanne/pythonVSCode/issues/692) ## Version 0.5.7 (3 February 2017) -* Added support for [debugging single files without a launch configuration](https://code.visualstudio.com/updates/v1_9#_debugging-without-a-launch-configuration) -* Adding support for debug snippets [#660](https://github.com/DonJayamanne/pythonVSCode/issues/660) -* Ability to run a selected text in a Django shell [#652](https://github.com/DonJayamanne/pythonVSCode/issues/652) -* Adding support for the use of a customized 'isort' for sorting of imports [#632](https://github.com/DonJayamanne/pythonVSCode/pull/632) -* Debugger auto-detecting python interpreter from the path provided [#688](https://github.com/DonJayamanne/pythonVSCode/issues/688) -* Showing symbol type on hover [#657](https://github.com/DonJayamanne/pythonVSCode/pull/657) -* Fixes to running Python file when terminal uses Powershell [#651](https://github.com/DonJayamanne/pythonVSCode/issues/651) -* Fixes to linter issues when displaying Git diff view for Python files [#665](https://github.com/DonJayamanne/pythonVSCode/issues/665) -* Fixes to 'Go to definition' functionality [#662](https://github.com/DonJayamanne/pythonVSCode/issues/662) -* Fixes to Jupyter cells numbered larger than '10' [#681](https://github.com/DonJayamanne/pythonVSCode/issues/681) + +- Added support for [debugging single files without a launch configuration](https://code.visualstudio.com/updates/v1_9#_debugging-without-a-launch-configuration) +- Adding support for debug snippets [#660](https://github.com/DonJayamanne/pythonVSCode/issues/660) +- Ability to run a selected text in a Django shell [#652](https://github.com/DonJayamanne/pythonVSCode/issues/652) +- Adding support for the use of a customized 'isort' for sorting of imports [#632](https://github.com/DonJayamanne/pythonVSCode/pull/632) +- Debugger auto-detecting python interpreter from the path provided [#688](https://github.com/DonJayamanne/pythonVSCode/issues/688) +- Showing symbol type on hover [#657](https://github.com/DonJayamanne/pythonVSCode/pull/657) +- Fixes to running Python file when terminal uses Powershell [#651](https://github.com/DonJayamanne/pythonVSCode/issues/651) +- Fixes to linter issues when displaying Git diff view for Python files [#665](https://github.com/DonJayamanne/pythonVSCode/issues/665) +- Fixes to 'Go to definition' functionality [#662](https://github.com/DonJayamanne/pythonVSCode/issues/662) +- Fixes to Jupyter cells numbered larger than '10' [#681](https://github.com/DonJayamanne/pythonVSCode/issues/681) ## Version 0.5.6 (16 January 2017) -* Added support for Python 3.6 [#646](https://github.com/DonJayamanne/pythonVSCode/issues/646), [#631](https://github.com/DonJayamanne/pythonVSCode/issues/631), [#619](https://github.com/DonJayamanne/pythonVSCode/issues/619), [#613](https://github.com/DonJayamanne/pythonVSCode/issues/613) -* Autodetect in python path in virtual environments [#353](https://github.com/DonJayamanne/pythonVSCode/issues/353) -* Add syntax highlighting of code samples in hover defintion [#555](https://github.com/DonJayamanne/pythonVSCode/issues/555) -* Launch REPL for currently selected interpreter [#560](https://github.com/DonJayamanne/pythonVSCode/issues/560) -* Fixes to debugging of modules [#589](https://github.com/DonJayamanne/pythonVSCode/issues/589) -* Reminder to install jedi and ctags in Quick Start [#642](https://github.com/DonJayamanne/pythonVSCode/pull/642) -* Improvements to Symbol Provider [#622](https://github.com/DonJayamanne/pythonVSCode/pull/622) -* Changes to disable unit test prompts for workspace [#559](https://github.com/DonJayamanne/pythonVSCode/issues/559) -* Minor fixes [#627](https://github.com/DonJayamanne/pythonVSCode/pull/627) + +- Added support for Python 3.6 [#646](https://github.com/DonJayamanne/pythonVSCode/issues/646), [#631](https://github.com/DonJayamanne/pythonVSCode/issues/631), [#619](https://github.com/DonJayamanne/pythonVSCode/issues/619), [#613](https://github.com/DonJayamanne/pythonVSCode/issues/613) +- Autodetect in python path in virtual environments [#353](https://github.com/DonJayamanne/pythonVSCode/issues/353) +- Add syntax highlighting of code samples in hover defintion [#555](https://github.com/DonJayamanne/pythonVSCode/issues/555) +- Launch REPL for currently selected interpreter [#560](https://github.com/DonJayamanne/pythonVSCode/issues/560) +- Fixes to debugging of modules [#589](https://github.com/DonJayamanne/pythonVSCode/issues/589) +- Reminder to install jedi and ctags in Quick Start [#642](https://github.com/DonJayamanne/pythonVSCode/pull/642) +- Improvements to Symbol Provider [#622](https://github.com/DonJayamanne/pythonVSCode/pull/622) +- Changes to disable unit test prompts for workspace [#559](https://github.com/DonJayamanne/pythonVSCode/issues/559) +- Minor fixes [#627](https://github.com/DonJayamanne/pythonVSCode/pull/627) ## Version 0.5.5 (25 November 2016) -* Fixes to debugging of unittests (nose and pytest) [#543](https://github.com/DonJayamanne/pythonVSCode/issues/543) -* Fixes to debugging of Django [#546](https://github.com/DonJayamanne/pythonVSCode/issues/546) + +- Fixes to debugging of unittests (nose and pytest) [#543](https://github.com/DonJayamanne/pythonVSCode/issues/543) +- Fixes to debugging of Django [#546](https://github.com/DonJayamanne/pythonVSCode/issues/546) ## Version 0.5.4 (24 November 2016) -* Fixes to installing missing packages [#544](https://github.com/DonJayamanne/pythonVSCode/issues/544) -* Fixes to indentation of blocks of code [#432](https://github.com/DonJayamanne/pythonVSCode/issues/432) -* Fixes to debugging of unittests [#543](https://github.com/DonJayamanne/pythonVSCode/issues/543) -* Fixes to extension when a workspace (folder) isn't open [#542](https://github.com/DonJayamanne/pythonVSCode/issues/542) + +- Fixes to installing missing packages [#544](https://github.com/DonJayamanne/pythonVSCode/issues/544) +- Fixes to indentation of blocks of code [#432](https://github.com/DonJayamanne/pythonVSCode/issues/432) +- Fixes to debugging of unittests [#543](https://github.com/DonJayamanne/pythonVSCode/issues/543) +- Fixes to extension when a workspace (folder) isn't open [#542](https://github.com/DonJayamanne/pythonVSCode/issues/542) ## Version 0.5.3 (23 November 2016) -* Added support for [PySpark](http://spark.apache.org/docs/0.9.0/python-programming-guide.html) [#539](https://github.com/DonJayamanne/pythonVSCode/pull/539), [#540](https://github.com/DonJayamanne/pythonVSCode/pull/540) -* Debugging unittests (UnitTest, pytest, nose) [#333](https://github.com/DonJayamanne/pythonVSCode/issues/333) -* Displaying progress for formatting [#327](https://github.com/DonJayamanne/pythonVSCode/issues/327) -* Auto indenting ```else:``` inside ```if``` and similar code blocks [#432](https://github.com/DonJayamanne/pythonVSCode/issues/432) -* Prefixing new lines with '#' when new lines are added in the middle of a comment string [#365](https://github.com/DonJayamanne/pythonVSCode/issues/365) -* Debugging python modules [#518](https://github.com/DonJayamanne/pythonVSCode/issues/518), [#354](https://github.com/DonJayamanne/pythonVSCode/issues/354) - + Use new debug configuration ```Python Module``` -* Added support for workspace symbols using Exuberant CTags [#138](https://github.com/DonJayamanne/pythonVSCode/issues/138) - + New command ```Python: Build Workspace Symbols``` -* Added ability for linter to ignore paths or files [#501](https://github.com/DonJayamanne/pythonVSCode/issues/501) - + Add the following setting in ```settings.json``` + +- Added support for [PySpark](http://spark.apache.org/docs/0.9.0/python-programming-guide.html) [#539](https://github.com/DonJayamanne/pythonVSCode/pull/539), [#540](https://github.com/DonJayamanne/pythonVSCode/pull/540) +- Debugging unittests (UnitTest, pytest, nose) [#333](https://github.com/DonJayamanne/pythonVSCode/issues/333) +- Displaying progress for formatting [#327](https://github.com/DonJayamanne/pythonVSCode/issues/327) +- Auto indenting `else:` inside `if` and similar code blocks [#432](https://github.com/DonJayamanne/pythonVSCode/issues/432) +- Prefixing new lines with '#' when new lines are added in the middle of a comment string [#365](https://github.com/DonJayamanne/pythonVSCode/issues/365) +- Debugging python modules [#518](https://github.com/DonJayamanne/pythonVSCode/issues/518), [#354](https://github.com/DonJayamanne/pythonVSCode/issues/354) + - Use new debug configuration `Python Module` +- Added support for workspace symbols using Exuberant CTags [#138](https://github.com/DonJayamanne/pythonVSCode/issues/138) + - New command `Python: Build Workspace Symbols` +- Added ability for linter to ignore paths or files [#501](https://github.com/DonJayamanne/pythonVSCode/issues/501) + - Add the following setting in `settings.json` + ```python "python.linting.ignorePatterns": [ ".vscode/*.py", "**/site-packages/**/*.py" ], ``` -* Automatically adding brackets when autocompleting functions/methods [#425](https://github.com/DonJayamanne/pythonVSCode/issues/425) - + To enable this feature, turn on the setting ```"python.autoComplete.addBrackets": true``` -* Running nose tests with the arguments '--with-xunit' and '--xunit-file' [#517](https://github.com/DonJayamanne/pythonVSCode/issues/517) -* Added support for workspaceRootFolderName in settings.json [#525](https://github.com/DonJayamanne/pythonVSCode/pull/525), [#522](https://github.com/DonJayamanne/pythonVSCode/issues/522) -* Added support for workspaceRootFolderName in settings.json [#525](https://github.com/DonJayamanne/pythonVSCode/pull/525), [#522](https://github.com/DonJayamanne/pythonVSCode/issues/522) -* Fixes to running code in terminal [#515](https://github.com/DonJayamanne/pythonVSCode/issues/515) + +- Automatically adding brackets when autocompleting functions/methods [#425](https://github.com/DonJayamanne/pythonVSCode/issues/425) + - To enable this feature, turn on the setting `"python.autoComplete.addBrackets": true` +- Running nose tests with the arguments '--with-xunit' and '--xunit-file' [#517](https://github.com/DonJayamanne/pythonVSCode/issues/517) +- Added support for workspaceRootFolderName in settings.json [#525](https://github.com/DonJayamanne/pythonVSCode/pull/525), [#522](https://github.com/DonJayamanne/pythonVSCode/issues/522) +- Added support for workspaceRootFolderName in settings.json [#525](https://github.com/DonJayamanne/pythonVSCode/pull/525), [#522](https://github.com/DonJayamanne/pythonVSCode/issues/522) +- Fixes to running code in terminal [#515](https://github.com/DonJayamanne/pythonVSCode/issues/515) ## Version 0.5.2 -* Fix issue with mypy linter [#505](https://github.com/DonJayamanne/pythonVSCode/issues/505) -* Fix auto completion for files with different encodings [#496](https://github.com/DonJayamanne/pythonVSCode/issues/496) -* Disable warnings when debugging Django version prior to 1.8 [#479](https://github.com/DonJayamanne/pythonVSCode/issues/479) -* Prompt to save changes when refactoring without saving any changes [#441](https://github.com/DonJayamanne/pythonVSCode/issues/441) -* Prompt to save changes when renaminv without saving any changes [#443](https://github.com/DonJayamanne/pythonVSCode/issues/443) -* Use editor indentation size when refactoring code [#442](https://github.com/DonJayamanne/pythonVSCode/issues/442) -* Add support for custom jedi paths [#500](https://github.com/DonJayamanne/pythonVSCode/issues/500) + +- Fix issue with mypy linter [#505](https://github.com/DonJayamanne/pythonVSCode/issues/505) +- Fix auto completion for files with different encodings [#496](https://github.com/DonJayamanne/pythonVSCode/issues/496) +- Disable warnings when debugging Django version prior to 1.8 [#479](https://github.com/DonJayamanne/pythonVSCode/issues/479) +- Prompt to save changes when refactoring without saving any changes [#441](https://github.com/DonJayamanne/pythonVSCode/issues/441) +- Prompt to save changes when renaminv without saving any changes [#443](https://github.com/DonJayamanne/pythonVSCode/issues/443) +- Use editor indentation size when refactoring code [#442](https://github.com/DonJayamanne/pythonVSCode/issues/442) +- Add support for custom jedi paths [#500](https://github.com/DonJayamanne/pythonVSCode/issues/500) ## Version 0.5.1 -* Prompt to install linter if not installed [#255](https://github.com/DonJayamanne/pythonVSCode/issues/255) -* Prompt to configure and install test framework -* Added support for pylama [#495](https://github.com/DonJayamanne/pythonVSCode/pull/495) -* Partial support for PEP484 -* Linting python files when they are opened [#462](https://github.com/DonJayamanne/pythonVSCode/issues/462) -* Fixes to unit tests discovery [#307](https://github.com/DonJayamanne/pythonVSCode/issues/307), -[#459](https://github.com/DonJayamanne/pythonVSCode/issues/459) -* Fixes to intellisense [#438](https://github.com/DonJayamanne/pythonVSCode/issues/438), -[#433](https://github.com/DonJayamanne/pythonVSCode/issues/433), -[#457](https://github.com/DonJayamanne/pythonVSCode/issues/457), -[#436](https://github.com/DonJayamanne/pythonVSCode/issues/436), -[#434](https://github.com/DonJayamanne/pythonVSCode/issues/434), -[#447](https://github.com/DonJayamanne/pythonVSCode/issues/447), -[#448](https://github.com/DonJayamanne/pythonVSCode/issues/448), -[#293](https://github.com/DonJayamanne/pythonVSCode/issues/293), -[#381](https://github.com/DonJayamanne/pythonVSCode/pull/381) -* Supporting additional search paths for interpreters on windows [#446](https://github.com/DonJayamanne/pythonVSCode/issues/446) -* Fixes to code refactoring [#440](https://github.com/DonJayamanne/pythonVSCode/issues/440), -[#467](https://github.com/DonJayamanne/pythonVSCode/issues/467), -[#468](https://github.com/DonJayamanne/pythonVSCode/issues/468), -[#445](https://github.com/DonJayamanne/pythonVSCode/issues/445) -* Fixes to linters [#463](https://github.com/DonJayamanne/pythonVSCode/issues/463) -[#439](https://github.com/DonJayamanne/pythonVSCode/issues/439), -* Bug fix in handling nosetest arguments [#407](https://github.com/DonJayamanne/pythonVSCode/issues/407) -* Better error handling when linter fails [#402](https://github.com/DonJayamanne/pythonVSCode/issues/402) -* Restoring extension specific formatting [#421](https://github.com/DonJayamanne/pythonVSCode/issues/421) -* Fixes to debugger (unwanted breakpoints) [#392](https://github.com/DonJayamanne/pythonVSCode/issues/392), [#379](https://github.com/DonJayamanne/pythonVSCode/issues/379) -* Support spaces in python path when executing in terminal [#428](https://github.com/DonJayamanne/pythonVSCode/pull/428) -* Changes to snippets [#429](https://github.com/DonJayamanne/pythonVSCode/pull/429) -* Marketplace changes [#430](https://github.com/DonJayamanne/pythonVSCode/pull/430) -* Cleanup and miscellaneous fixes (typos, keyboard bindings and the liks) + +- Prompt to install linter if not installed [#255](https://github.com/DonJayamanne/pythonVSCode/issues/255) +- Prompt to configure and install test framework +- Added support for pylama [#495](https://github.com/DonJayamanne/pythonVSCode/pull/495) +- Partial support for PEP484 +- Linting python files when they are opened [#462](https://github.com/DonJayamanne/pythonVSCode/issues/462) +- Fixes to unit tests discovery [#307](https://github.com/DonJayamanne/pythonVSCode/issues/307), + [#459](https://github.com/DonJayamanne/pythonVSCode/issues/459) +- Fixes to intellisense [#438](https://github.com/DonJayamanne/pythonVSCode/issues/438), + [#433](https://github.com/DonJayamanne/pythonVSCode/issues/433), + [#457](https://github.com/DonJayamanne/pythonVSCode/issues/457), + [#436](https://github.com/DonJayamanne/pythonVSCode/issues/436), + [#434](https://github.com/DonJayamanne/pythonVSCode/issues/434), + [#447](https://github.com/DonJayamanne/pythonVSCode/issues/447), + [#448](https://github.com/DonJayamanne/pythonVSCode/issues/448), + [#293](https://github.com/DonJayamanne/pythonVSCode/issues/293), + [#381](https://github.com/DonJayamanne/pythonVSCode/pull/381) +- Supporting additional search paths for interpreters on windows [#446](https://github.com/DonJayamanne/pythonVSCode/issues/446) +- Fixes to code refactoring [#440](https://github.com/DonJayamanne/pythonVSCode/issues/440), + [#467](https://github.com/DonJayamanne/pythonVSCode/issues/467), + [#468](https://github.com/DonJayamanne/pythonVSCode/issues/468), + [#445](https://github.com/DonJayamanne/pythonVSCode/issues/445) +- Fixes to linters [#463](https://github.com/DonJayamanne/pythonVSCode/issues/463) + [#439](https://github.com/DonJayamanne/pythonVSCode/issues/439), +- Bug fix in handling nosetest arguments [#407](https://github.com/DonJayamanne/pythonVSCode/issues/407) +- Better error handling when linter fails [#402](https://github.com/DonJayamanne/pythonVSCode/issues/402) +- Restoring extension specific formatting [#421](https://github.com/DonJayamanne/pythonVSCode/issues/421) +- Fixes to debugger (unwanted breakpoints) [#392](https://github.com/DonJayamanne/pythonVSCode/issues/392), [#379](https://github.com/DonJayamanne/pythonVSCode/issues/379) +- Support spaces in python path when executing in terminal [#428](https://github.com/DonJayamanne/pythonVSCode/pull/428) +- Changes to snippets [#429](https://github.com/DonJayamanne/pythonVSCode/pull/429) +- Marketplace changes [#430](https://github.com/DonJayamanne/pythonVSCode/pull/430) +- Cleanup and miscellaneous fixes (typos, keyboard bindings and the liks) ## Version 0.5.0 -* Remove dependency on zmq when using Jupyter or IPython (pure python solution) -* Added a default keybinding for ```Jupyter:Run Selection/Line``` of ```ctrl+alt+enter``` -* Changes to update settings.json with path to python using [native API](https://github.com/DonJayamanne/pythonVSCode/commit/bce22a2b4af87eaf40669c6360eff3675280cdad) -* Changes to use [native API](https://github.com/DonJayamanne/pythonVSCode/commit/bce22a2b4af87eaf40669c6360eff3675280cdad) for formatting when saving documents -* Reusing existing terminal instead of creating new terminals -* Limiting linter messages to opened documents (hide messages if document is closed) [#375](https://github.com/DonJayamanne/pythonVSCode/issues/375) -* Resolving extension load errors when [#375](https://github.com/DonJayamanne/pythonVSCode/issues/375) -* Fixes to discovering unittests [#386](https://github.com/DonJayamanne/pythonVSCode/issues/386) -* Fixes to sending code to terminal on Windows [#387](https://github.com/DonJayamanne/pythonVSCode/issues/387) -* Fixes to executing python file in terminal on Windows [#385](https://github.com/DonJayamanne/pythonVSCode/issues/385) -* Fixes to launching local help (documentation) on Linux -* Fixes to typo in configuration documentation [#391](https://github.com/DonJayamanne/pythonVSCode/pull/391) -* Fixes to use ```python.pythonPath``` when sorting imports [#393](https://github.com/DonJayamanne/pythonVSCode/pull/393) -* Fixes to linters to handle situations when line numbers aren't returned [#399](https://github.com/DonJayamanne/pythonVSCode/pull/399) -* Fixes to signature tooltips when docstring is very long [#368](https://github.com/DonJayamanne/pythonVSCode/issues/368), [#113](https://github.com/DonJayamanne/pythonVSCode/issues/113) + +- Remove dependency on zmq when using Jupyter or IPython (pure python solution) +- Added a default keybinding for `Jupyter:Run Selection/Line` of `ctrl+alt+enter` +- Changes to update settings.json with path to python using [native API](https://github.com/DonJayamanne/pythonVSCode/commit/bce22a2b4af87eaf40669c6360eff3675280cdad) +- Changes to use [native API](https://github.com/DonJayamanne/pythonVSCode/commit/bce22a2b4af87eaf40669c6360eff3675280cdad) for formatting when saving documents +- Reusing existing terminal instead of creating new terminals +- Limiting linter messages to opened documents (hide messages if document is closed) [#375](https://github.com/DonJayamanne/pythonVSCode/issues/375) +- Resolving extension load errors when [#375](https://github.com/DonJayamanne/pythonVSCode/issues/375) +- Fixes to discovering unittests [#386](https://github.com/DonJayamanne/pythonVSCode/issues/386) +- Fixes to sending code to terminal on Windows [#387](https://github.com/DonJayamanne/pythonVSCode/issues/387) +- Fixes to executing python file in terminal on Windows [#385](https://github.com/DonJayamanne/pythonVSCode/issues/385) +- Fixes to launching local help (documentation) on Linux +- Fixes to typo in configuration documentation [#391](https://github.com/DonJayamanne/pythonVSCode/pull/391) +- Fixes to use `python.pythonPath` when sorting imports [#393](https://github.com/DonJayamanne/pythonVSCode/pull/393) +- Fixes to linters to handle situations when line numbers aren't returned [#399](https://github.com/DonJayamanne/pythonVSCode/pull/399) +- Fixes to signature tooltips when docstring is very long [#368](https://github.com/DonJayamanne/pythonVSCode/issues/368), [#113](https://github.com/DonJayamanne/pythonVSCode/issues/113) ## Version 0.4.2 -* Fix for autocompletion and code navigation with unicode characters [#372](https://github.com/DonJayamanne/pythonVSCode/issues/372), [#364](https://github.com/DonJayamanne/pythonVSCode/issues/364) + +- Fix for autocompletion and code navigation with unicode characters [#372](https://github.com/DonJayamanne/pythonVSCode/issues/372), [#364](https://github.com/DonJayamanne/pythonVSCode/issues/364) ## Version 0.4.1 -* Debugging of [Django templates](https://github.com/DonJayamanne/pythonVSCode/wiki/Debugging-Django#templates) -* Linting with [mypy](https://github.com/DonJayamanne/pythonVSCode/wiki/Linting#mypy) -* Improved error handling when loading [Jupyter/IPython](https://github.com/DonJayamanne/pythonVSCode/wiki/Jupyter-(IPython)) -* Fixes to unittests + +- Debugging of [Django templates](https://github.com/DonJayamanne/pythonVSCode/wiki/Debugging-Django#templates) +- Linting with [mypy](https://github.com/DonJayamanne/pythonVSCode/wiki/Linting#mypy) +- Improved error handling when loading [Jupyter/IPython]() +- Fixes to unittests ## Version 0.4.0 -* Added support for [Jupyter/IPython](https://github.com/DonJayamanne/pythonVSCode/wiki/Jupyter-(IPython)) -* Added local help (offline documentation) -* Added ability to pass in extra arguments to interpreter when executing scripts ([#316](https://github.com/DonJayamanne/pythonVSCode/issues/316)) -* Added ability set current working directory as the script file directory, when to executing a Python script -* Rendering intellisense icons correctly ([#322](https://github.com/DonJayamanne/pythonVSCode/issues/322)) -* Changes to capitalization of context menu text ([#320](https://github.com/DonJayamanne/pythonVSCode/issues/320)) -* Bug fix to running pydocstyle linter on windows ([#317](https://github.com/DonJayamanne/pythonVSCode/issues/317)) -* Fixed performance issues with regards to code navigation, displaying code Symbols and the like ([#324](https://github.com/DonJayamanne/pythonVSCode/issues/324)) -* Fixed code renaming issue when renaming imports ([#325](https://github.com/DonJayamanne/pythonVSCode/issues/325)) -* Fixed issue with the execution of the command ```python.execInTerminal``` via a shortcut ([#340](https://github.com/DonJayamanne/pythonVSCode/issues/340)) -* Fixed issue with code refactoring ([#363](https://github.com/DonJayamanne/pythonVSCode/issues/363)) + +- Added support for [Jupyter/IPython]() +- Added local help (offline documentation) +- Added ability to pass in extra arguments to interpreter when executing scripts ([#316](https://github.com/DonJayamanne/pythonVSCode/issues/316)) +- Added ability set current working directory as the script file directory, when to executing a Python script +- Rendering intellisense icons correctly ([#322](https://github.com/DonJayamanne/pythonVSCode/issues/322)) +- Changes to capitalization of context menu text ([#320](https://github.com/DonJayamanne/pythonVSCode/issues/320)) +- Bug fix to running pydocstyle linter on windows ([#317](https://github.com/DonJayamanne/pythonVSCode/issues/317)) +- Fixed performance issues with regards to code navigation, displaying code Symbols and the like ([#324](https://github.com/DonJayamanne/pythonVSCode/issues/324)) +- Fixed code renaming issue when renaming imports ([#325](https://github.com/DonJayamanne/pythonVSCode/issues/325)) +- Fixed issue with the execution of the command `python.execInTerminal` via a shortcut ([#340](https://github.com/DonJayamanne/pythonVSCode/issues/340)) +- Fixed issue with code refactoring ([#363](https://github.com/DonJayamanne/pythonVSCode/issues/363)) ## Version 0.3.24 -* Added support for clearing cached tests [#307](https://github.com/DonJayamanne/pythonVSCode/issues/307) -* Added support for executing files in terminal with spaces in paths [#308](https://github.com/DonJayamanne/pythonVSCode/issues/308) -* Fix issue related to running unittests on Windows [#309](https://github.com/DonJayamanne/pythonVSCode/issues/309) -* Support custom environment variables when launching external terminal [#311](https://github.com/DonJayamanne/pythonVSCode/issues/311) + +- Added support for clearing cached tests [#307](https://github.com/DonJayamanne/pythonVSCode/issues/307) +- Added support for executing files in terminal with spaces in paths [#308](https://github.com/DonJayamanne/pythonVSCode/issues/308) +- Fix issue related to running unittests on Windows [#309](https://github.com/DonJayamanne/pythonVSCode/issues/309) +- Support custom environment variables when launching external terminal [#311](https://github.com/DonJayamanne/pythonVSCode/issues/311) ## Version 0.3.23 -* Added support for the attribute supportsRunInTerminal attribute in debugger [#304](https://github.com/DonJayamanne/pythonVSCode/issues/304) -* Changes to ensure remote debugging resolves remote paths correctly [#302](https://github.com/DonJayamanne/pythonVSCode/issues/302) -* Added support for custom pytest and nosetest paths [#301](https://github.com/DonJayamanne/pythonVSCode/issues/301) -* Resolved issue in ```Watch``` window displaying ```" - ], -``` -...this will only run the suite with the tests you care about during a test run (be sure to set the debugger to run the `Debug Unit Tests` launcher). - -### Running Functional Tests - -Functional tests are those in files with extension `.functional.test.ts`. -These tests are similar to system tests in scope, but are run like unit tests. - -You can run functional tests in a similar way to that for unit tests: - -* via the "Functional Tests" launch option, or -* on the command line via `npm run test:functional` - -### Running System Tests - -Note: System tests are those in files with extension `.test*.ts` but which are neither `.functional.test.ts` nor `.unit.test.ts`. - -1. Make sure you have compiled all code (done automatically when using incremental building) -1. Ensure you have disabled breaking into 'Uncaught Exceptions' when running the Unit Tests -1. For the linters and formatters tests to pass successfully, you will need to have those corresponding Python libraries installed locally by using the `./requirements.txt` and `build/test-requirements.txt` files -1. Run the tests via `npm run` or the Debugger launch options (you can "Start Without Debugging"). -1. **Note** you will be running tests under the default Python interpreter for the system. - -*Change the version of python the tests are executed with by setting the `CI_PYTHON_PATH`.* - -Tests will be executed using the system default interpreter (whatever that is for your local machine), unless you explicitly set the `CI_PYTHON_PATH` environment variable. To test against different versions of Python you *must* use this. - -In the launch.json file, you can add the following to the appropriate configuration you want to run to easily change the interpreter used during testing: - -```js - "env":{ - "CI_PYTHON_PATH": "/absolute/path/to/interpreter/of/choice/python" - } -``` - -You can also run the tests from the command-line (after compiling): - -```shell -npm run testSingleWorkspace # will launch the VSC UI -npm run testMultiWorkspace # will launch the VSC UI -``` -...note this will use the Python interpreter that your current shell is making use of, no need to set `CI_PYTHON_PATH` here. - -*To limit system tests to a specific suite* - -If you are running system tests (we call them *system* tests, others call them *integration* or otherwise) and you wish to run a specific test suite, edit the `src/test/index.ts` file here: - -https://github.com/Microsoft/vscode-python/blob/b328ba12331ed34a267e32e77e3e4b1eff235c13/src/test/index.ts#L21 - -...and identify the test suite you want to run/debug like this: - -```ts -const grep = '[The suite name of your *test.ts file]'; // IS_CI_SERVER &&... -``` -...and then use the `Launch Tests` debugger launcher. This will run only the suite you name in the grep. - -And be sure to escape any grep-sensitive characters in your suite name (and to remove the change from src/test/index.ts before you submit). - -### Testing Python Scripts - -The extension has a number of scripts in ./pythonFiles. Tests for these -scripts are found in ./pythonFiles/tests. To run those tests: - -* `python2.7 pythonFiles/tests/run_all.py` -* `python3 -m pythonFiles.tests` - -By default, functional tests are included. To exclude them: - -`python3 -m pythonFiles.tests --no-functional` - -To run only the functional tests: - -`python3 -m pythonFiles.tests --functional` - -### Standard Debugging - -Clone the repo into any directory, open that directory in VSCode, and use the `Extension` launch option within VSCode. - -### Debugging the Python Extension Debugger - -The easiest way to debug the Python Debugger (in our opinion) is to clone this git repo directory into [your](https://code.visualstudio.com/docs/extensions/install-extension#_your-extensions-folder) extensions directory. -From there use the ```Extension + Debugger``` launch option. - -### Coding Standards - -Information on our coding standards can be found [here](https://github.com/Microsoft/vscode-python/blob/master/CODING_STANDARDS.md). -We have CI tests to ensure the code committed will adhere to the above coding standards. *You can run this locally by executing the command `npx gulp precommit` or use the `precommit` Task. - -Messages displayed to the user must ve localized using/created constants from/in the [localize.ts](https://github.com/Microsoft/vscode-python/blob/master/src/client/common/utils/localize.ts) file. - -## Development process - -To effectively contribute to this extension, it helps to know how its -development process works. That way you know not only why the -project maintainers do what they do to keep this project running -smoothly, but it allows you to help out by noticing when a step is -missed or to learn in case someday you become a project maintainer as -well! - -### Helping others - -First and foremost, we try to be helpful to users of the extension. -We monitor -[Stack Overflow questions](https://stackoverflow.com/questions/tagged/visual-studio-code+python) -to see where people might need help. We also try to respond to all -issues in some way in a timely manner (typically in less than one -business day, definitely no more than a week). We also answer -questions that reach us in other ways, e.g. Twitter. - -For pull requests, we aim to review any externally contributed PR no later -than the next sprint from when it was submitted (see -[Release Cycle](#release-cycle) below for our sprint schedule). - -### Release cycle - -Planning is done as two week sprints. We start a sprint every other Wednesday. -You can look at the newest -[milestone](https://github.com/Microsoft/vscode-python/milestones) to see when -the current sprint ends. All -[P0](https://github.com/Microsoft/vscode-python/labels/P0) issues are expected -to be fixed in the current sprint, else the next release will be blocked. -[P1](https://github.com/Microsoft/vscode-python/labels/P1) issues are a -top-priority and we try to close before the next release. All other issues are -considered best-effort for that sprint. - -The extension aims to do a new release every four weeks (two sprints). A -[release plan](https://github.com/Microsoft/vscode-python/labels/release%20plan) -is created for each release to help track anything that requires a -person to do (long-term this project aims to automate as much of the -development process as possible). - -All development is actively done in the `master` branch of the -repository. This allows us to have a -[development build](#development-build) which is expected to be stable at -all times. Once we reach a release candidate, it becomes -our [release branch](https://github.com/microsoft/vscode-python/branches). -At that point only what is in the release branch will make it into the next -release. - -### Issue triaging - -#### Classifying issues - -To help actively track what stage -[issues](https://github.com/Microsoft/vscode-python/issues) -are at, various labels are used. The following label types are expected to -be set on all open issues (otherwise the issue is not considered triaged): - -1. `needs`/`triage`/`classify` -1. `feature` -1. `type` - -These labels cover what is blocking the issue from closing, what is affected by -the issue, and what kind of issue it is. (The `feature` label should be `feature-*` if the issue doesn't fit into any other `feature` label appropriately.) - -It is also very important to make the title accurate. People often write very brief, quick titles or ones that describe what they think the problem is. By updating the title to be appropriately descriptive for what _you_ think the issue is, you not only make finding older issues easier, but you also help make sure that you and the original reporter agree on what the issue is. - -#### Post-classification - -Once an issue has been appropriately classified, there are two keys ways to help out. One is to go through open issues that -have a merged fix and verify that the fix did in fact work. The other is to try to fix issues marked as `needs PR`. - -### Pull requests - -Key details that all pull requests are expected to handle should be -in the [pull request template](https://github.com/Microsoft/vscode-python/blob/master/.github/PULL_REQUEST_TEMPLATE.md). We do expect CI to be passing for a pull request before we will consider merging it. - -### Versioning - -Starting in 2018, the extension switched to -[calendar versioning](http://calver.org/) since the extension -auto-updates and thus there is no need to track its version -number for backwards-compatibility. In 2020, the extension switched to -having the the major version be the year of release, the minor version the -release count for that year, and the build number is a number that increments -for every build. -For example the first release made in 2020 is `2020.1.`. - -## Releasing - -Overall steps for releasing are covered in the -[release plan](https://github.com/Microsoft/vscode-python/labels/release%20plan) -([template](https://github.com/Microsoft/vscode-python/blob/master/.github/release_plan.md)). - - -### Building a release - -To create a release _build_, follow the steps outlined in the [release plan](https://github.com/Microsoft/vscode-python/labels/release%20plan) (which has a [template](https://github.com/Microsoft/vscode-python/blob/master/.github/release_plan.md)). - -## Development Build - -We publish the latest development -build of the extension onto a cloud storage provider. -If you are interested in helping us test our development builds or would like -to stay ahead of the curve, then please feel free to download and install the -extension from the following -[location](https://pvsc.blob.core.windows.net/extension-builds/ms-python-insiders.vsix). -Once you have downloaded the -[ms-python-insiders.vsix](https://pvsc.blob.core.windows.net/extension-builds/ms-python-insiders.vsix) -file, please follow the instructions on -[this page](https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix) -to install the extension. - -The development build of the extension: - -* Will be replaced with new releases published onto the - [VS Code Marketplace](https://marketplace.visualstudio.com/VSCode). -* Does not get updated with new development builds of the extension (if you want to - test a newer development build, uninstall the old version of the - extension and then install the new version) -* Is built every time a PR is committed into the [`master` branch](https://github.com/Microsoft/vscode-python). +Please see [our wiki](https://github.com/microsoft/vscode-python/wiki) on how to contribute to this project. diff --git a/PYTHON_INTERACTIVE_TROUBLESHOOTING.md b/PYTHON_INTERACTIVE_TROUBLESHOOTING.md deleted file mode 100644 index 35e3f779e765..000000000000 --- a/PYTHON_INTERACTIVE_TROUBLESHOOTING.md +++ /dev/null @@ -1,64 +0,0 @@ -# Troubleshooting Jupyter issues in the Python Interactive Window or Notebook Editor - -This document is intended to help troubleshoot problems with starting Jupyter in the Python Interactive Window or Notebook Editor. - ---- -## Jupyter Not Starting -This error can happen when - -* Jupyter is out of date -* Jupyter is not installed -* You picked the wrong Python environment (one that doesn't have Jupyter installed). - -### The first step is to verify you are running the Python environment that you have Jupyter installed into. - -The first time that you start the Interactive Window or the Notebook Editor VS Code will attempt to locate a Python environment that has Jupyter installed in it and can start a notebook. - -The first Python interpreter to check will be the one selected with the selection dropdown on the bottom left of the VS Code window: - -![selector](resources/PythonSelector.png) - -Once a suitable interpreter with Jupyter has been located, VS Code will continue to use that interpreter for starting up Jupyter servers. -If no interpreters are found with Jupyter installed a popup message will ask if you would like to install Jupyter into the current interpreter. - -![install Jupyter](resources/InstallJupyter.png) - -If you would like to change from using the saved Python interpreter to a new interpreter for launching Jupyter just use the "Python: Select interpreter to start Jupyter server" VS Code command to change it. - -### The second step is to check that jupyter isn't giving any errors on startup. - -Run the following command from an environment that matches the Python you selected: -``` python -m jupyter notebook --version ``` - -If this command shows any warnings, you need to upgrade or fix the warnings to continue with this version of Python. -If this command says 'no module named jupyter', you need to install Jupyter. - -### How to install Jupyter - -You can do this in a number of different ways: - -#### Anaconda - -Anaconda is a popular Python distribution. It makes it super easy to get Jupyter up and running. - -If you're already using Anaconda, follow these steps to get Jupyter -1. Start anaconda environment -1. Run 'conda install jupyter' -1. Restart VS Code -1. Pick the conda version of Python in the python selector - -Otherwise you can install Anaconda and pick the default options -https://www.anaconda.com/download - - -#### Pip - -You can also install Jupyter using pip. - -1. python -m pip install --upgrade pip -1. python -m pip install jupyter -1. Restart VS Code -1. Pick the Python environment you did the pip install in - -For more information see -http://jupyter.org/install diff --git a/README.md b/README.md index f30d314d2a70..e9dd52a538cd 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,119 @@ # Python extension for Visual Studio Code -A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marketplace.visualstudio.com/VSCode) with rich support for the [Python language](https://www.python.org/) (for all [actively supported versions](https://devguide.python.org/#status-of-python-branches) of the language: 2.7, >=3.5), including features such as IntelliSense, linting, debugging, code navigation, code formatting, Jupyter notebook support, refactoring, variable explorer, test explorer, snippets, and more! +A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marketplace.visualstudio.com/VSCode) with rich support for the [Python language](https://www.python.org/) (for all [actively supported Python versions](https://devguide.python.org/versions/#supported-versions)), providing access points for extensions to seamlessly integrate and offer support for IntelliSense (Pylance), debugging (Python Debugger), formatting, linting, code navigation, refactoring, variable explorer, test explorer, environment management (**NEW** Python Environments Extension). + +## Support for [vscode.dev](https://vscode.dev/) + +The Python extension does offer [some support](https://github.com/microsoft/vscode-python/wiki/Partial-mode) when running on [vscode.dev](https://vscode.dev/) (which includes [github.dev](http://github.dev/)). This includes partial IntelliSense for open files in the editor. + + +## Installed extensions + +The Python extension will automatically install the following extensions by default to provide the best Python development experience in VS Code: + +- [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) – performant Python language support +- [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) – seamless debug experience with debugpy +- **(NEW)** [Python Environments](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-python-envs) – dedicated environment management (see below) + +These extensions are optional dependencies, meaning the Python extension will remain fully functional if they fail to be installed. Any or all of these extensions can be [disabled](https://code.visualstudio.com/docs/editor/extension-marketplace#_disable-an-extension) or [uninstalled](https://code.visualstudio.com/docs/editor/extension-marketplace#_uninstall-an-extension) at the expense of some features. Extensions installed through the marketplace are subject to the [Marketplace Terms of Use](https://cdn.vsassets.io/v/M146_20190123.39/_content/Microsoft-Visual-Studio-Marketplace-Terms-of-Use.pdf). + +### About the Python Environments Extension + +You may now see that the **Python Environments Extension** is installed for you, but it may or may not be "enabled" in your VS Code experience. Enablement is controlled by the setting `"python.useEnvironmentsExtension": true` (or `false`). + +- If you set this setting to `true`, you will manually opt in to using the Python Environments Extension for environment management. +- If you do not have this setting specified, you may be randomly assigned to have it turned on as we roll it out until it becomes the default experience for all users. + +The Python Environments Extension is still under active development and experimentation. Its goal is to provide a dedicated view and improved workflows for creating, deleting, and switching between Python environments, as well as managing packages. If you have feedback, please let us know via [issues](https://github.com/microsoft/vscode-python/issues). + +## Extensibility + +The Python extension provides pluggable access points for extensions that extend various feature areas to further improve your Python development experience. These extensions are all optional and depend on your project configuration and preferences. + +- [Python formatters](https://code.visualstudio.com/docs/python/formatting#_choose-a-formatter) +- [Python linters](https://code.visualstudio.com/docs/python/linting#_choose-a-linter) + +If you encounter issues with any of the listed extensions, please file an issue in its corresponding repo. ## Quick start -* **Step 1.** [Install a supported version of Python on your system](https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites) (note: that the system install of Python on macOS is not supported). -* **Step 2.** Install the Python extension for Visual Studio Code. -* **Step 3.** Open or create a Python file and start coding! +- **Step 1.** [Install a supported version of Python on your system](https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites) (note: the system install of Python on macOS is not supported). +- **Step 2.** [Install the Python extension for Visual Studio Code](https://code.visualstudio.com/docs/editor/extension-gallery). +- **Step 3.** Open or create a Python file and start coding! ## Set up your environment + -* Select your Python interpreter by clicking on the status bar - +- Select your Python interpreter by clicking on the status bar + + -* Configure the debugger through the Debug Activity Bar +- Configure the debugger through the Debug Activity Bar - + -* Configure tests by running the ``Configure Tests`` command +- Configure tests by running the `Configure Tests` command - + ## Jupyter Notebook quick start -* Open or create a Jupyter Notebook file (.ipynb) and start coding in our Notebook Editor! +The Python extension offers support for Jupyter notebooks via the [Jupyter extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) to provide you a great Python notebook experience in VS Code. - +- Install the [Jupyter extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter). +- Open or create a Jupyter Notebook file (.ipynb) and start coding in our Notebook Editor! + + For more information you can: -* [Follow our Python tutorial](https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites) with step-by-step instructions for building a simple app. -* Check out the [Python documentation on the VS Code site](https://code.visualstudio.com/docs/languages/python) for general information about using the extension. -* Check out the [Jupyter Notebook documentation on the VS Code site](https://code.visualstudio.com/docs/python/jupyter-support) for information about using Jupyter Notebooks in VS Code. + +- [Follow our Python tutorial](https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites) with step-by-step instructions for building a simple app. +- Check out the [Python documentation on the VS Code site](https://code.visualstudio.com/docs/languages/python) for general information about using the extension. +- Check out the [Jupyter Notebook documentation on the VS Code site](https://code.visualstudio.com/docs/python/jupyter-support) for information about using Jupyter Notebooks in VS Code. ## Useful commands -Open the Command Palette (Command+Shift+P on macOS and Ctrl+Shift+P on Windows/Linux) and type in one of the following commands: -Command | Description ---- | --- -```Python: Select Interpreter``` | Switch between Python interpreters, versions, and environments. -```Python: Start REPL``` | Start an interactive Python REPL using the selected interpreter in the VS Code terminal. -```Python: Run Python File in Terminal``` | Runs the active Python file in the VS Code terminal. You can also run a Python file by right-clicking on the file and selecting ```Run Python File in Terminal```. -```Python: Select Linter``` | Switch from Pylint to Flake8 or other supported linters. -```Format Document``` |Formats code using the provided [formatter](https://code.visualstudio.com/docs/python/editing#_formatting) in the ``settings.json`` file. | -```Python: Configure Tests``` | Select a test framework and configure it to display the Test Explorer.| +Open the Command Palette (Command+Shift+P on macOS and Ctrl+Shift+P on Windows/Linux) and type in one of the following commands: +| Command | Description | +| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Python: Select Interpreter` | Switch between Python interpreters, versions, and environments. | +| `Python: Start Terminal REPL` | Start an interactive Python REPL using the selected interpreter in the VS Code terminal. | +| `Python: Run Python File in Terminal` | Runs the active Python file in the VS Code terminal. You can also run a Python file by right-clicking on the file and selecting `Run Python File in Terminal`. | +| `Python: Configure Tests` | Select a test framework and configure it to display the Test Explorer. | -To see all available Python commands, open the Command Palette and type ```Python```. +To see all available Python commands, open the Command Palette and type `Python`. For Jupyter extension commands, just type `Jupyter`. ## Feature details Learn more about the rich features of the Python extension: -* [IntelliSense](https://code.visualstudio.com/docs/python/editing#_autocomplete-and-intellisense): Edit your code with auto-completion, code navigation, syntax checking and more -* [Linting](https://code.visualstudio.com/docs/python/linting): Get additional code analysis with Pylint, Flake8 and more -* [Code formatting](https://code.visualstudio.com/docs/python/editing#_formatting): Format your code with black, autopep or yapf - -* [Debugging](https://code.visualstudio.com/docs/python/debugging): Debug your Python scripts, web apps, remote or multi-threaded processes - -* [Testing](https://code.visualstudio.com/docs/python/unit-testing): Run and debug tests through the Test Explorer with unittest, pytest or nose +- [IntelliSense](https://code.visualstudio.com/docs/python/editing#_autocomplete-and-intellisense): Edit your code with auto-completion, code navigation, syntax checking and more. +- [Linting](https://code.visualstudio.com/docs/python/linting): Get additional code analysis with Pylint, Flake8 and more. +- [Code formatting](https://code.visualstudio.com/docs/python/formatting): Format your code with black, autopep or yapf. +- [Debugging](https://code.visualstudio.com/docs/python/debugging): Debug your Python scripts, web apps, remote or multi-threaded processes. +- [Testing](https://code.visualstudio.com/docs/python/unit-testing): Run and debug tests through the Test Explorer with unittest or pytest. +- [Jupyter Notebooks](https://code.visualstudio.com/docs/python/jupyter-support): Create and edit Jupyter Notebooks, add and run code cells, render plots, visualize variables through the variable explorer, visualize dataframes with the data viewer, and more. +- [Environments](https://code.visualstudio.com/docs/python/environments): Automatically activate and switch between virtualenv, venv, pipenv, conda and pyenv environments. +- [Refactoring](https://code.visualstudio.com/docs/python/editing#_refactoring): Restructure your Python code with variable extraction and method extraction. Additionally, there is componentized support to enable additional refactoring, such as import sorting, through extensions including [isort](https://marketplace.visualstudio.com/items?itemName=ms-python.isort) and [Ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff). -* [Jupyter Notebooks](https://code.visualstudio.com/docs/python/jupyter-support): Create and edit Jupyter Notebooks, add and run code cells, render plots, visualize variables through the variable explorer, visualize dataframes with the data viewer, and more - -* [Environments](https://code.visualstudio.com/docs/python/environments): Automatically activate and switch between virtualenv, venv, pipenv, conda and pyenv environments - -* [Refactoring](https://code.visualstudio.com/docs/python/editing#_refactoring): Restructure your Python code with variable extraction, method extraction and import sorting ## Supported locales -The extension is available in multiple languages thanks to external -contributors (if you would like to contribute a translation, see the -[pull request which added Italian](https://github.com/Microsoft/vscode-python/pull/1152)): `de`, `en`, `es`, `fa`, `fr`, `it`, `ja`, `ko-kr`, `nl`, `pl`, `pt-br`, `ru`, `tr`, `zh-cn`, `zh-tw` +The extension is available in multiple languages: `de`, `en`, `es`, `fa`, `fr`, `it`, `ja`, `ko-kr`, `nl`, `pl`, `pt-br`, `ru`, `tr`, `zh-cn`, `zh-tw` ## Questions, issues, feature requests, and contributions -* If you have a question about how to accomplish something with the extension, please [ask on Stack Overflow](https://stackoverflow.com/questions/tagged/visual-studio-code+python) -* If you come across a problem with the extension, please [file an issue](https://github.com/microsoft/vscode-python) -* Contributions are always welcome! Please see our [contributing guide](https://github.com/Microsoft/vscode-python/blob/master/CONTRIBUTING.md) for more details -* Any and all feedback is appreciated and welcome! - - If someone has already [filed an issue](https://github.com/Microsoft/vscode-python) that encompasses your feedback, please leave a 👍/👎 reaction on the issue - - Otherwise please file a new issue -* If you're interested in the development of the extension, you can read about our [development process](https://github.com/Microsoft/vscode-python/blob/master/CONTRIBUTING.md#development-process) - +- If you have a question about how to accomplish something with the extension, please [ask on our Discussions page](https://github.com/microsoft/vscode-python/discussions/categories/q-a). +- If you come across a problem with the extension, please [file an issue](https://github.com/microsoft/vscode-python). +- Contributions are always welcome! Please see our [contributing guide](https://github.com/Microsoft/vscode-python/blob/main/CONTRIBUTING.md) for more details. +- Any and all feedback is appreciated and welcome! + - If someone has already [filed an issue](https://github.com/Microsoft/vscode-python) that encompasses your feedback, please leave a 👍/👎 reaction on the issue. + - Otherwise please start a [new discussion](https://github.com/microsoft/vscode-python/discussions/categories/ideas). +- If you're interested in the development of the extension, you can read about our [development process](https://github.com/Microsoft/vscode-python/blob/main/CONTRIBUTING.md#development-process). ## Data and telemetry @@ -91,6 +121,6 @@ The Microsoft Python Extension for Visual Studio Code collects usage data and sends it to Microsoft to help improve our products and services. Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` +learn more. This extension respects the `telemetry.telemetryLevel` setting which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. diff --git a/SECURITY.md b/SECURITY.md index 8a5d128f360a..1ceb287afafa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). -If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability]() of a security vulnerability, please report it to us as described below. ## Reporting Security Issues @@ -12,19 +12,19 @@ If you believe you have found a security vulnerability in any Microsoft-owned re Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). -If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: - * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - * Full paths of source file(s) related to the manifestation of the issue - * The location of the affected source code (tag/branch/commit or direct URL) - * Any special configuration required to reproduce the issue - * Step-by-step instructions to reproduce the issue - * Proof-of-concept or exploit code (if possible) - * Impact of the issue, including how an attacker might exploit the issue +- Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) +- Full paths of source file(s) related to the manifestation of the issue +- The location of the affected source code (tag/branch/commit or direct URL) +- Any special configuration required to reproduce the issue +- Step-by-step instructions to reproduce the issue +- Proof-of-concept or exploit code (if possible) +- Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 000000000000..b1afe54cc555 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,11 @@ +# Support + +## How to file issues and get help + +This project uses GitHub Issues to track bugs and feature requests. Please search the [existing issues](https://github.com/microsoft/vscode-python/issues) before filing new issues to avoid duplicates. For new issues, file your bug or feature request as a new Issue. + +For help and questions about using this project, please see the [`python`+`visual-studio-code` labels on Stack Overflow](https://stackoverflow.com/questions/tagged/visual-studio-code+python) or the `#vscode` channel on the [`microsoft-python` server on Discord](https://aka.ms/python-discord-invite). + +## Microsoft Support Policy + +Support for this project is limited to the resources listed above. diff --git a/ThirdPartyNotices-Distribution.txt b/ThirdPartyNotices-Distribution.txt deleted file mode 100644 index 39f4538262db..000000000000 --- a/ThirdPartyNotices-Distribution.txt +++ /dev/null @@ -1,16546 +0,0 @@ -THIRD-PARTY SOFTWARE NOTICES AND INFORMATION -Do Not Translate or Localize - -Microsoft Python extension for Visual Studio Code incorporates third party material from the projects listed below. - - - -1. @babel/runtime 7.5.4 (https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz) -2. @babel/runtime-corejs2 7.5.4 (https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.4.tgz) -3. @blueprintjs/core 3.22.3 (https://registry.npmjs.org/@blueprintjs/core/-/core-3.22.3.tgz) -4. @blueprintjs/icons 3.13.0 (https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.13.0.tgz) -5. @blueprintjs/select 3.11.2 (https://registry.npmjs.org/@blueprintjs/select/-/select-3.11.2.tgz) -6. @emotion/hash 0.6.6 (https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz) -7. @emotion/memoize 0.6.6 (https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz) -8. @emotion/stylis 0.7.1 (https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz) -9. @emotion/unitless 0.6.7 (https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz) -10. @icons/material 0.2.4 (https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz) -11. @jupyterlab/coreutils 3.1.0 (https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-3.1.0.tgz) -12. @jupyterlab/observables 2.4.0 (https://registry.npmjs.org/@jupyterlab/observables/-/observables-2.4.0.tgz) -13. @jupyterlab/services 4.2.0 (https://registry.npmjs.org/@jupyterlab/services/-/services-4.2.0.tgz) -14. @koa/cors 3.0.0 (https://registry.npmjs.org/@koa/cors/-/cors-3.0.0.tgz) -15. @loadable/component 5.12.0 (https://registry.npmjs.org/@loadable/component/-/component-5.12.0.tgz) -16. @mapbox/polylabel 1.0.2 (https://registry.npmjs.org/@mapbox/polylabel/-/polylabel-1.0.2.tgz) -17. @msrvida/python-program-analysis 0.4.1 (https://registry.npmjs.org/@msrvida/python-program-analysis/-/python-program-analysis-0.4.1.tgz) -18. @nteract/markdown 3.0.1 (https://registry.npmjs.org/@nteract/markdown/-/markdown-3.0.1.tgz) -19. @nteract/mathjax 3.0.1 (https://registry.npmjs.org/@nteract/mathjax/-/mathjax-3.0.1.tgz) -20. @nteract/octicons 0.5.1 (https://registry.npmjs.org/@nteract/octicons/-/octicons-0.5.1.tgz) -21. @nteract/styled-blueprintjsx 1.1.1 (https://registry.npmjs.org/@nteract/styled-blueprintjsx/-/styled-blueprintjsx-1.1.1.tgz) -22. @nteract/transform-dataresource 4.5.2 (https://registry.npmjs.org/@nteract/transform-dataresource/-/transform-dataresource-4.5.2.tgz) -23. @nteract/transform-geojson 3.2.5 (https://registry.npmjs.org/@nteract/transform-geojson/-/transform-geojson-3.2.5.tgz) -24. @nteract/transform-model-debug 3.2.5 (https://registry.npmjs.org/@nteract/transform-model-debug/-/transform-model-debug-3.2.5.tgz) -25. @nteract/transform-plotly 6.0.0 (https://registry.npmjs.org/@nteract/transform-plotly/-/transform-plotly-6.0.0.tgz) -26. @nteract/transform-vdom 2.2.5 (https://registry.npmjs.org/@nteract/transform-vdom/-/transform-vdom-2.2.5.tgz) -27. @nteract/transform-vega 6.0.3 (https://registry.npmjs.org/@nteract/transform-vega/-/transform-vega-6.0.3.tgz) -28. @nteract/transforms 4.4.7 (https://registry.npmjs.org/@nteract/transforms/-/transforms-4.4.7.tgz) -29. @nteract/vega-embed-v2 1.1.0 (https://registry.npmjs.org/@nteract/vega-embed-v2/-/vega-embed-v2-1.1.0.tgz) -30. @nteract/vega-embed-v3 1.1.1 (https://registry.npmjs.org/@nteract/vega-embed-v3/-/vega-embed-v3-1.1.1.tgz) -31. @phosphor/algorithm 1.1.3 (https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.1.3.tgz) -32. @phosphor/collections 1.2.0 (https://registry.npmjs.org/@phosphor/collections/-/collections-1.2.0.tgz) -33. @phosphor/commands 1.7.2 (https://registry.npmjs.org/@phosphor/commands/-/commands-1.7.2.tgz) -34. @phosphor/coreutils 1.3.1 (https://registry.npmjs.org/@phosphor/coreutils/-/coreutils-1.3.1.tgz) -35. @phosphor/disposable 1.2.0 (https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.2.0.tgz) -36. @phosphor/domutils 1.1.4 (https://registry.npmjs.org/@phosphor/domutils/-/domutils-1.1.4.tgz) -37. @phosphor/keyboard 1.1.3 (https://registry.npmjs.org/@phosphor/keyboard/-/keyboard-1.1.3.tgz) -38. @phosphor/messaging 1.3.0 (https://registry.npmjs.org/@phosphor/messaging/-/messaging-1.3.0.tgz) -39. @phosphor/properties 1.1.3 (https://registry.npmjs.org/@phosphor/properties/-/properties-1.1.3.tgz) -40. @phosphor/signaling 1.2.3 (https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.2.3.tgz) -41. _pydev_calltip_util.py (for PyDev.Debugger) (https://github.com/fabioz/PyDev.Debugger/blob/master/_pydev_bundle/_pydev_calltip_util.py) -42. accepts 1.3.7 (https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz) -43. acorn 5.7.3 (https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz) -44. ajv 6.10.1 (https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz) -45. amdefine 1.0.1 (https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz) -46. angular.io (for RxJS 5.5) (https://angular.io/) -47. anser 1.4.8 (https://registry.npmjs.org/anser/-/anser-1.4.8.tgz) -48. ansi-regex 4.1.0 (https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz) -49. ansi-styles 3.2.1 (https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz) -50. ansi-to-html 0.6.11 (https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.11.tgz) -51. ansi-to-react 3.3.5 (https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-3.3.5.tgz) -52. any-promise 1.3.0 (https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz) -53. applicationinsights 1.0.6 (https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.6.tgz) -54. arch 2.1.1 (https://registry.npmjs.org/arch/-/arch-2.1.1.tgz) -55. asn1 0.2.4 (https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz) -56. assert-plus 1.0.0 (https://github.com/joyent/node-assert-plus/tree/v1.0.0) -57. ast-transform 0.0.0 (https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz) -58. ast-types 0.7.8 (https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz) -59. async 2.6.2 (https://registry.npmjs.org/async/-/async-2.6.2.tgz) -60. async-limiter 1.0.0 (https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz) -61. asynckit 0.4.0 (https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz) -62. aws-sign2 0.7.0 (https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz) -63. aws4 1.8.0 (https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz) -64. azure-storage 2.10.3 (https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.3.tgz) -65. babel-polyfill 6.26.0 (https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz) -66. babel-runtime 6.26.0 (https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz) -67. bail 1.0.4 (https://registry.npmjs.org/bail/-/bail-1.0.4.tgz) -68. balanced-match 1.0.0 (https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz) -69. base16 1.0.0 (https://registry.npmjs.org/base16/-/base16-1.0.0.tgz) -70. base64-js 1.3.0 (https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz) -71. bcrypt-pbkdf 1.0.2 (https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz) -72. bintrees 1.0.2 (https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz) -73. bootstrap-less 3.3.8 (https://github.com/distros/bootstrap-less) -74. brace-expansion 1.1.11 (https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz) -75. brotli 1.3.2 (https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz) -76. browser-resolve 1.11.3 (https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz) -77. browserify-mime 1.2.9 (https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz) -78. browserify-optional 1.0.1 (https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz) -79. buffer-equal 0.0.1 (https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz) -80. buffer-from 1.1.1 (https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz) -81. bytes 3.1.0 (https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz) -82. cache-content-type 1.0.1 (https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz) -83. canvas 2.6.0 (https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz) -84. caseless 0.12.0 (https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz) -85. chalk 2.4.2 (https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz) -86. character-entities-legacy 1.1.3 (https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz) -87. character-reference-invalid 1.1.3 (https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz) -88. charenc 0.0.2 (https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz) -89. classnames 2.2.6 (https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz) -90. clone 1.0.4 (https://registry.npmjs.org/clone/-/clone-1.0.4.tgz) -91. clsx 1.0.4 (https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz) -92. co 4.6.0 (https://registry.npmjs.org/co/-/co-4.6.0.tgz) -93. collapse-white-space 1.0.5 (https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz) -94. color 3.0.0 (https://registry.npmjs.org/color/-/color-3.0.0.tgz) -95. color-convert 1.9.3 (https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz) -96. color-name 1.1.3 (https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz) -97. color-string 1.5.3 (https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz) -98. colornames 1.1.1 (https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz) -99. colors 1.3.3 (https://registry.npmjs.org/colors/-/colors-1.3.3.tgz) -100. colorspace 1.1.2 (https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz) -101. combined-stream 1.0.8 (https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz) -102. compressible 2.0.17 (https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz) -103. concat-map 0.0.1 (https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz) -104. concat-stream 1.6.2 (https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz) -105. content-disposition 0.5.3 (https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz) -106. content-type 1.0.4 (https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz) -107. convert-source-map 1.6.0 (https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz) -108. cookies 0.8.0 (https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz) -109. core-util-is 1.0.2 (https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz) -110. create-emotion 9.2.12 (https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz) -111. create-react-context 0.3.0 (https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz) -112. crypt 0.0.2 (https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz) -113. crypto-js 3.1.9-1 (https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz) -114. css-loader 1.0.1 (https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz) -115. d3 3.5.17 (https://registry.npmjs.org/d3/-/d3-3.5.17.tgz) -116. d3-array 1.2.4 (https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz) -117. d3-bboxCollide 1.0.4 (https://registry.npmjs.org/d3-bboxCollide/-/d3-bboxCollide-1.0.4.tgz) -118. d3-brush 1.0.6 (https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz) -119. d3-chord 1.0.6 (https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz) -120. d3-cloud 1.2.5 (https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.5.tgz) -121. d3-collection 1.0.7 (https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz) -122. d3-color 1.2.8 (https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz) -123. d3-contour 1.3.2 (https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz) -124. d3-delaunay 5.1.6 (https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.1.6.tgz) -125. d3-dispatch 1.0.5 (https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz) -126. d3-drag 1.2.3 (https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz) -127. d3-dsv 0.1.14 (https://registry.npmjs.org/d3-dsv/-/d3-dsv-0.1.14.tgz) -128. d3-ease 1.0.5 (https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz) -129. d3-force 1.2.1 (https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz) -130. d3-format 1.3.2 (https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz) -131. d3-geo 1.11.6 (https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz) -132. d3-glyphedge 1.2.0 (https://registry.npmjs.org/d3-glyphedge/-/d3-glyphedge-1.2.0.tgz) -133. d3-hexbin 0.2.2 (https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz) -134. d3-hierarchy 1.1.8 (https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz) -135. d3-interpolate 1.3.2 (https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz) -136. d3-path 1.0.7 (https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz) -137. d3-polygon 1.0.5 (https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz) -138. d3-quadtree 1.0.1 (https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.1.tgz) -139. d3-request 1.0.6 (https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz) -140. d3-sankey-circular 0.25.0 (https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.25.0.tgz) -141. d3-scale 2.2.2 (https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz) -142. d3-scale-chromatic 1.5.0 (https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz) -143. d3-selection 1.4.0 (https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz) -144. d3-shape 1.3.5 (https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz) -145. d3-time 1.0.11 (https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz) -146. d3-time-format 2.1.3 (https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz) -147. d3-timer 1.0.9 (https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz) -148. d3-transition 1.2.0 (https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz) -149. d3-voronoi 1.1.4 (https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz) -150. dashdash 1.14.1 (https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz) -151. datalib 1.9.2 (https://registry.npmjs.org/datalib/-/datalib-1.9.2.tgz) -152. deep-equal 1.0.1 (https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz) -153. deep-is 0.1.3 (https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz) -154. define-properties 1.1.3 (https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz) -155. delaunator 4.0.1 (https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz) -156. delayed-stream 1.0.0 (https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz) -157. delegates 1.0.0 (https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz) -158. depd 1.1.2 (https://registry.npmjs.org/depd/-/depd-1.1.2.tgz) -159. destroy 1.0.4 (https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz) -160. detect-indent 6.0.0 (https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz) -161. dfa 1.2.0 (https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz) -162. diagnostic-channel 0.2.0 (https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz) -163. diagnostic-channel-publishers 0.2.1 (https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz) -164. diagnostics 1.1.1 (https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz) -165. diff-match-patch 1.0.4 (https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz) -166. dom-helpers 3.4.0 (https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz) -167. dom4 2.1.5 (https://registry.npmjs.org/dom4/-/dom4-2.1.5.tgz) -168. duplexer2 0.1.4 (https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz) -169. ecc-jsbn 0.1.2 (https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz) -170. ee-first 1.1.1 (https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz) -171. emotion 9.2.12 (https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz) -172. enabled 1.0.2 (https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz) -173. encodeurl 1.0.2 (https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz) -174. encoding 0.1.12 (https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz) -175. entities 1.1.2 (https://registry.npmjs.org/entities/-/entities-1.1.2.tgz) -176. env-variable 0.0.5 (https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz) -177. error-inject 1.0.0 (https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz) -178. escape-carriage 1.3.0 (https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz) -179. escape-html 1.0.3 (https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz) -180. escape-string-regexp 1.0.5 (https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz) -181. estraverse 1.5.1 (https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz) -182. esutils 1.0.0 (https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz) -183. extend 3.0.2 (https://registry.npmjs.org/extend/-/extend-3.0.2.tgz) -184. extsprintf 1.3.0 (https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz) -185. falafel 2.1.0 (https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz) -186. fast-deep-equal 2.0.1 (https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz) -187. fast-json-stable-stringify 2.0.0 (https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz) -188. fast-levenshtein 2.0.6 (https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz) -189. fast-plist 0.1.2 (https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.2.tgz) -190. fast-safe-stringify 2.0.6 (https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz) -191. fecha 2.3.3 (https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz) -192. fontkit 1.8.0 (https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz) -193. foreach 2.0.5 (https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz) -194. forever-agent 0.6.1 (https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz) -195. form-data 2.3.3 (https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz) -196. fresh 0.5.2 (https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz) -197. fs-extra 4.0.3 (https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz) -198. fs.realpath 1.0.0 (https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz) -199. function-bind 1.1.1 (https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz) -200. fuzzy 0.1.3 (https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz) -201. get-port 3.2.0 (https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz) -202. getpass 0.1.7 (https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz) -203. glob 7.1.4 (https://registry.npmjs.org/glob/-/glob-7.1.4.tgz) -204. graceful-fs 4.2.0 (https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz) -205. gud 1.0.0 (https://registry.npmjs.org/gud/-/gud-1.0.0.tgz) -206. har-schema 2.0.0 (https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz) -207. har-validator 5.1.3 (https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz) -208. has 1.0.3 (https://registry.npmjs.org/has/-/has-1.0.3.tgz) -209. has-flag 3.0.0 (https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz) -210. hash-base 3.0.4 (https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz) -211. hash.js 1.1.7 (https://github.com/indutny/hash.js/tree/v1.1.7) -212. hoist-non-react-statics 3.3.0 (https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz) -213. http-assert 1.4.1 (https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz) -214. http-errors 1.7.3 (https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz) -215. http-signature 1.2.0 (https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz) -216. humanize-number 0.0.2 (https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz) -217. iconv-lite 0.4.24 (https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz) -218. ieee754 1.1.13 (https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz) -219. inflight 1.0.6 (https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz) -220. inherits 2.0.4 (https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz) -221. invariant 2.2.4 (https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz) -222. inversify 4.13.0 (https://registry.npmjs.org/inversify/-/inversify-4.13.0.tgz) -223. IPython (for PyDev.Debugger) (https://ipython.org/) -224. is-alphabetical 1.0.3 (https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz) -225. is-alphanumerical 1.0.3 (https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz) -226. is-arguments 1.0.4 (https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz) -227. is-arrayish 0.3.2 (https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz) -228. is-buffer 1.1.6 (https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz) -229. is-date-object 1.0.1 (https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz) -230. is-decimal 1.0.3 (https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz) -231. is-generator-function 1.0.7 (https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz) -232. is-hexadecimal 1.0.3 (https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz) -233. is-plain-obj 1.1.0 (https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz) -234. is-regex 1.0.4 (https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz) -235. is-stream 1.1.0 (https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz) -236. is-typedarray 1.0.0 (https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz) -237. is-whitespace-character 1.0.3 (https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz) -238. is-word-character 1.0.3 (https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz) -239. isarray 1.0.0 (https://github.com/juliangruber/isarray/blob/v1.0.0) -240. isort 4.3.4 (https://github.com/timothycrosley/isort/tree/4.3.4) -241. isstream 0.1.2 (https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz) -242. Jedi 0.13.3 (https://github.com/davidhalter/jedi/tree/v0.13.3) -243. jsbn 0.1.1 (https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz) -244. json-edm-parser 0.1.2 (https://registry.npmjs.org/json-edm-parser/-/json-edm-parser-0.1.2.tgz) -245. json-schema 0.2.3 (https://www.npmjs.com/package/json-schema) -246. json-schema-traverse 0.4.1 (https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz) -247. json-stable-stringify 1.0.1 (https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz) -248. json-stringify-pretty-compact 2.0.0 (https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz) -249. json-stringify-safe 5.0.1 (https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz) -250. json2csv 4.5.2 (https://registry.npmjs.org/json2csv/-/json2csv-4.5.2.tgz) -251. json5 2.1.0 (https://registry.npmjs.org/json5/-/json5-2.1.0.tgz) -252. jsonc-parser 2.1.0 (https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.1.0.tgz) -253. jsonfile 4.0.0 (https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz) -254. jsonify 0.0.0 (https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz) -255. jsonparse 1.2.0 (https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz) -256. jsprim 1.4.1 (https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz) -257. keygrip 1.1.0 (https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz) -258. koa 2.11.0 (https://registry.npmjs.org/koa/-/koa-2.11.0.tgz) -259. koa-compose 4.1.0 (https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz) -260. koa-compress 3.0.0 (https://registry.npmjs.org/koa-compress/-/koa-compress-3.0.0.tgz) -261. koa-convert 1.2.0 (https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz) -262. koa-is-json 1.0.0 (https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz) -263. koa-logger 3.2.1 (https://registry.npmjs.org/koa-logger/-/koa-logger-3.2.1.tgz) -264. kuler 1.0.1 (https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz) -265. labella 1.1.4 (https://registry.npmjs.org/labella/-/labella-1.1.4.tgz) -266. leaflet 1.5.1 (https://registry.npmjs.org/leaflet/-/leaflet-1.5.1.tgz) -267. levn 0.3.0 (https://registry.npmjs.org/levn/-/levn-0.3.0.tgz) -268. line-by-line 0.1.6 (https://registry.npmjs.org/line-by-line/-/line-by-line-0.1.6.tgz) -269. linear-layout-vector 0.0.1 (https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz) -270. linebreak 0.3.0 (https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz) -271. lodash 4.17.15 (https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz) -272. lodash.curry 4.1.1 (https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz) -273. lodash.flow 3.5.0 (https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz) -274. logform 2.1.2 (https://registry.npmjs.org/logform/-/logform-2.1.2.tgz) -275. lru-cache 4.1.5 (https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz) -276. magic-string 0.22.5 (https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz) -277. markdown-escapes 1.0.3 (https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz) -278. martinez-polygon-clipping 0.1.5 (https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.1.5.tgz) -279. material-colors 1.2.6 (https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz) -280. md5 2.2.1 (https://registry.npmjs.org/md5/-/md5-2.2.1.tgz) -281. md5.js 1.3.4 (https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz) -282. mdast-add-list-metadata 1.0.1 (https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz) -283. media-typer 0.3.0 (https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz) -284. merge-source-map 1.0.4 (https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz) -285. mime-db 1.40.0 (https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz) -286. mime-types 2.1.24 (https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz) -287. minimalistic-assert 1.0.1 (https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz) -288. minimatch 3.0.4 (https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz) -289. minimist 1.2.0 (https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz) -290. mkdirp 0.5.1 (https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz) -291. moment 2.24.0 (https://registry.npmjs.org/moment/-/moment-2.24.0.tgz) -292. monaco-editor 0.18.1 (https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.18.1.tgz) -293. monaco-editor-textmate 2.2.1 (https://registry.npmjs.org/monaco-editor-textmate/-/monaco-editor-textmate-2.2.1.tgz) -294. monaco-textmate 3.0.1 (https://registry.npmjs.org/monaco-textmate/-/monaco-textmate-3.0.1.tgz) -295. ms 2.1.2 (https://registry.npmjs.org/ms/-/ms-2.1.2.tgz) -296. named-js-regexp 1.3.5 (https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz) -297. negotiator 0.6.2 (https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz) -298. node-fetch 1.7.3 (https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz) -299. node-libs-browser 2.2.1 (https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz) -300. node-stream-zip 1.8.2 (https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz) -301. numeral 2.0.6 (https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz) -302. oauth-sign 0.9.0 (https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz) -303. object-assign 4.1.1 (https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz) -304. object-inspect 1.4.1 (https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz) -305. object-is 1.0.1 (https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz) -306. object-keys 1.1.1 (https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz) -307. on-finished 2.3.0 (https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz) -308. once 1.4.0 (https://registry.npmjs.org/once/-/once-1.4.0.tgz) -309. one-time 0.0.4 (https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz) -310. onigasm 2.2.2 (https://registry.npmjs.org/onigasm/-/onigasm-2.2.2.tgz) -311. only 0.0.2 (https://registry.npmjs.org/only/-/only-0.0.2.tgz) -312. optionator 0.8.2 (https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz) -313. os-tmpdir 1.0.2 (https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz) -314. pako 0.2.9 (https://registry.npmjs.org/pako/-/pako-0.2.9.tgz) -315. parse-entities 1.2.2 (https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz) -316. parseurl 1.3.3 (https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz) -317. parso 0.5.0 (https://github.com/davidhalter/parso/tree/v0.5.0) -318. passthrough-counter 1.0.0 (https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz) -319. path-browserify 0.0.1 (https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz) -320. path-is-absolute 1.0.1 (https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz) -321. path-parse 1.0.6 (https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz) -322. path-posix 1.0.0 (https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz) -323. pdfkit 0.10.0 (https://registry.npmjs.org/pdfkit/-/pdfkit-0.10.0.tgz) -324. performance-now 2.1.0 (https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz) -325. pidusage 1.2.0 (https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz) -326. plotly.js-dist 1.51.1 (https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-1.51.1.tgz) -327. png-js 0.1.1 (https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz) -328. polygon-offset 0.3.1 (https://registry.npmjs.org/polygon-offset/-/polygon-offset-0.3.1.tgz) -329. popper.js 1.16.0 (https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz) -330. portfinder 1.0.25 (https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz) -331. prelude-ls 1.1.2 (https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz) -332. process 0.11.10 (https://registry.npmjs.org/process/-/process-0.11.10.tgz) -333. process-nextick-args 1.0.7 (https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz) -334. prop-types 15.7.2 (https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz) -335. pseudomap 1.0.2 (https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz) -336. psl 1.2.0 (https://registry.npmjs.org/psl/-/psl-1.2.0.tgz) -337. ptvsd 4.3.2 (https://github.com/Microsoft/ptvsd/tree/v4.3.2) -338. punycode 2.1.1 (https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz) -339. pure-color 1.3.0 (https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz) -340. py2app (for PyDev.Debugger) (https://bitbucket.org/ronaldoussoren/py2app) -341. PyDev.Debugger (for ptvsd 4) (https://pypi.org/project/pydevd/) -342. pyparsing 2.4.0 (https://github.com/pyparsing/pyparsing/tree/pyparsing_2.4.0) -343. python-jsonrpc-server 0.2.0 (https://github.com/palantir/python-jsonrpc-server/releases/tag/0.2.0) -344. qs 6.5.2 (https://registry.npmjs.org/qs/-/qs-6.5.2.tgz) -345. querystringify 2.1.1 (https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz) -346. quote-stream 1.0.2 (https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz) -347. react 16.8.6 (https://registry.npmjs.org/react/-/react-16.8.6.tgz) -348. react-annotation 2.1.6 (https://registry.npmjs.org/react-annotation/-/react-annotation-2.1.6.tgz) -349. react-base16-styling 0.5.3 (https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz) -350. react-color 2.17.3 (https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz) -351. react-data-grid 6.1.0 (https://registry.npmjs.org/react-data-grid/-/react-data-grid-6.1.0.tgz) -352. react-dom 16.8.6 (https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz) -353. react-hot-loader 4.12.6 (https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.6.tgz) -354. react-is 16.8.6 (https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz) -355. react-json-tree 0.11.2 (https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz) -356. react-lifecycles-compat 3.0.4 (https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz) -357. react-markdown 4.1.0 (https://registry.npmjs.org/react-markdown/-/react-markdown-4.1.0.tgz) -358. react-popper 1.3.7 (https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz) -359. react-redux 7.1.1 (https://registry.npmjs.org/react-redux/-/react-redux-7.1.1.tgz) -360. react-svg-pan-zoom 3.1.0 (https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz) -361. react-svgmt 1.1.8 (https://registry.npmjs.org/react-svgmt/-/react-svgmt-1.1.8.tgz) -362. react-table 6.10.0 (https://registry.npmjs.org/react-table/-/react-table-6.10.0.tgz) -363. react-table-hoc-fixed-columns 1.0.2 (https://registry.npmjs.org/react-table-hoc-fixed-columns/-/react-table-hoc-fixed-columns-1.0.2.tgz) -364. react-transition-group 2.9.0 (https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz) -365. react-virtualized 9.21.1 (https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz) -366. reactcss 1.2.3 (https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz) -367. readable-stream 3.4.0 (https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz) -368. redux 4.0.4 (https://registry.npmjs.org/redux/-/redux-4.0.4.tgz) -369. redux-logger 3.0.6 (https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz) -370. reflect-metadata 0.1.13 (https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz) -371. regenerator-runtime 0.13.2 (https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz) -372. regexp.prototype.flags 1.3.0 (https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz) -373. regression 2.0.1 (https://registry.npmjs.org/regression/-/regression-2.0.1.tgz) -374. remark-parse 5.0.0 (https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz) -375. repeat-string 1.6.1 (https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz) -376. replace-ext 1.0.0 (https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz) -377. request 2.88.0 (https://registry.npmjs.org/request/-/request-2.88.0.tgz) -378. request-progress 3.0.0 (https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz) -379. requires-port 1.0.0 (https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz) -380. resize-observer-polyfill 1.5.1 (https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz) -381. resolve 1.11.1 (https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz) -382. restructure 0.5.4 (https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz) -383. roughjs-es5 0.1.0 (https://registry.npmjs.org/roughjs-es5/-/roughjs-es5-0.1.0.tgz) -384. rxjs 5.5.12 (https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz) -385. safe-buffer 5.1.2 (https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz) -386. safer-buffer 2.1.2 (https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz) -387. sax 0.5.8 (https://registry.npmjs.org/sax/-/sax-0.5.8.tgz) -388. scheduler 0.13.6 (https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz) -389. semiotic 1.19.11 (https://registry.npmjs.org/semiotic/-/semiotic-1.19.11.tgz) -390. semiotic-mark 0.3.1 (https://registry.npmjs.org/semiotic-mark/-/semiotic-mark-0.3.1.tgz) -391. semver 5.7.0 (https://registry.npmjs.org/semver/-/semver-5.7.0.tgz) -392. setImmediate (for RxJS 5.5) (https://github.com/YuzuJS/setImmediate) -393. setimmediate 1.0.5 (https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz) -394. setprototypeof 1.1.1 (https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz) -395. shallow-copy 0.0.1 (https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz) -396. simple-swizzle 0.2.2 (https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz) -397. sizzle (for lodash 4.17) (https://sizzlejs.com/) -398. slickgrid 2.4.17 (https://registry.npmjs.org/slickgrid/-/slickgrid-2.4.17.tgz) -399. source-map 0.6.1 (https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz) -400. sshpk 1.16.1 (https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz) -401. stack-trace 0.0.10 (https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz) -402. state-toggle 1.0.2 (https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz) -403. static-eval 2.0.2 (https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz) -404. static-module 2.2.5 (https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz) -405. statuses 1.5.0 (https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz) -406. string-hash 1.1.3 (https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz) -407. string_decoder 1.2.0 (https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz) -408. strip-ansi 5.2.0 (https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz) -409. style-loader 0.23.1 (https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz) -410. styled-jsx 3.2.1 (https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.2.1.tgz) -411. stylis-rule-sheet 0.0.10 (https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz) -412. sudo-prompt 8.2.5 (https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz) -413. supports-color 5.5.0 (https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz) -414. svg-inline-react 3.1.0 (https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz) -415. svg-path-bounding-box 1.0.4 (https://registry.npmjs.org/svg-path-bounding-box/-/svg-path-bounding-box-1.0.4.tgz) -416. svg-to-pdfkit 0.1.7 (https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.7.tgz) -417. svgpath 2.2.2 (https://registry.npmjs.org/svgpath/-/svgpath-2.2.2.tgz) -418. symbol-observable 1.0.1 (https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz) -419. text-hex 1.0.0 (https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz) -420. throttleit 1.0.0 (https://github.com/component/throttle/tree/1.0.0) -421. through 2.3.8 (https://registry.npmjs.org/through/-/through-2.3.8.tgz) -422. through2 2.0.5 (https://registry.npmjs.org/through2/-/through2-2.0.5.tgz) -423. timers-browserify 2.0.10 (https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz) -424. tiny-inflate 1.0.2 (https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz) -425. tinycolor2 1.4.1 (https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz) -426. tinyqueue 1.2.3 (https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz) -427. tmp 0.0.29 (https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz) -428. toidentifier 1.0.0 (https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz) -429. topojson-client 3.1.0 (https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz) -430. tough-cookie 2.4.3 (https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz) -431. transformation-matrix 2.0.5 (https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz) -432. tree-kill 1.2.2 (https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz) -433. trim 0.0.1 (https://registry.npmjs.org/trim/-/trim-0.0.1.tgz) -434. trim-trailing-lines 1.1.2 (https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz) -435. triple-beam 1.3.0 (https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz) -436. trough 1.0.4 (https://registry.npmjs.org/trough/-/trough-1.0.4.tgz) -437. tslib 1.10.0 (https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz) -438. tsscmp 1.0.6 (https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz) -439. tunnel-agent 0.6.0 (https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz) -440. tweetnacl 0.14.5 (https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz) -441. type-check 0.3.2 (https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz) -442. type-is 1.6.18 (https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz) -443. typedarray 0.0.6 (https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz) -444. typescript-char 0.0.0 (https://github.com/mason-lang/typescript-char) -445. uint64be 1.0.1 (https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz) -446. underscore 1.8.3 (https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz) -447. unherit 1.1.2 (https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz) -448. unicode 10.0.0 (https://registry.npmjs.org/unicode/-/unicode-10.0.0.tgz) -449. unicode-trie 0.3.1 (https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz) -450. unified 6.2.0 (https://registry.npmjs.org/unified/-/unified-6.2.0.tgz) -451. uniqid 5.0.3 (https://registry.npmjs.org/uniqid/-/uniqid-5.0.3.tgz) -452. unist-util-is 3.0.0 (https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz) -453. unist-util-remove-position 1.1.3 (https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz) -454. unist-util-stringify-position 1.1.2 (https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz) -455. unist-util-visit 1.4.1 (https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz) -456. unist-util-visit-parents 1.1.2 (https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz) -457. universalify 0.1.2 (https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz) -458. untildify 3.0.3 (https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz) -459. uri-js 4.2.2 (https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz) -460. url-parse 1.4.7 (https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz) -461. util 0.11.1 (https://registry.npmjs.org/util/-/util-0.11.1.tgz) -462. util-deprecate 1.0.2 (https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz) -463. uuid 3.3.2 (https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz) -464. validator 9.4.1 (https://registry.npmjs.org/validator/-/validator-9.4.1.tgz) -465. vary 1.1.2 (https://registry.npmjs.org/vary/-/vary-1.1.2.tgz) -466. vega 5.7.3 (https://registry.npmjs.org/vega/-/vega-5.7.3.tgz) -467. vega-canvas 1.2.1 (https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz) -468. vega-crossfilter 4.0.1 (https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz) -469. vega-dataflow 5.4.1 (https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.4.1.tgz) -470. vega-embed 4.2.5 (https://registry.npmjs.org/vega-embed/-/vega-embed-4.2.5.tgz) -471. vega-encode 4.4.1 (https://registry.npmjs.org/vega-encode/-/vega-encode-4.4.1.tgz) -472. vega-event-selector 2.0.1 (https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.1.tgz) -473. vega-expression 2.6.2 (https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.2.tgz) -474. vega-force 4.0.3 (https://registry.npmjs.org/vega-force/-/vega-force-4.0.3.tgz) -475. vega-functions 5.4.1 (https://registry.npmjs.org/vega-functions/-/vega-functions-5.4.1.tgz) -476. vega-geo 4.1.0 (https://registry.npmjs.org/vega-geo/-/vega-geo-4.1.0.tgz) -477. vega-hierarchy 4.0.3 (https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz) -478. vega-lite 3.4.0 (https://registry.npmjs.org/vega-lite/-/vega-lite-3.4.0.tgz) -479. vega-loader 4.1.2 (https://registry.npmjs.org/vega-loader/-/vega-loader-4.1.2.tgz) -480. vega-parser 5.10.1 (https://registry.npmjs.org/vega-parser/-/vega-parser-5.10.1.tgz) -481. vega-projection 1.3.0 (https://registry.npmjs.org/vega-projection/-/vega-projection-1.3.0.tgz) -482. vega-regression 1.0.1 (https://registry.npmjs.org/vega-regression/-/vega-regression-1.0.1.tgz) -483. vega-runtime 5.0.2 (https://registry.npmjs.org/vega-runtime/-/vega-runtime-5.0.2.tgz) -484. vega-scale 4.1.3 (https://registry.npmjs.org/vega-scale/-/vega-scale-4.1.3.tgz) -485. vega-scenegraph 4.3.1 (https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.3.1.tgz) -486. vega-schema-url-parser 1.1.0 (https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz) -487. vega-selections 5.0.1 (https://registry.npmjs.org/vega-selections/-/vega-selections-5.0.1.tgz) -488. vega-statistics 1.6.1 (https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.6.1.tgz) -489. vega-themes 2.5.0 (https://registry.npmjs.org/vega-themes/-/vega-themes-2.5.0.tgz) -490. vega-tooltip 0.18.1 (https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.18.1.tgz) -491. vega-transforms 4.4.3 (https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.4.3.tgz) -492. vega-util 1.12.0 (https://registry.npmjs.org/vega-util/-/vega-util-1.12.0.tgz) -493. vega-view 5.3.1 (https://registry.npmjs.org/vega-view/-/vega-view-5.3.1.tgz) -494. vega-view-transforms 4.4.1 (https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.4.1.tgz) -495. vega-voronoi 4.1.1 (https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.1.tgz) -496. vega-wordcloud 4.0.2 (https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.0.2.tgz) -497. verror 1.10.0 (https://registry.npmjs.org/verror/-/verror-1.10.0.tgz) -498. vfile 2.3.0 (https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz) -499. vfile-location 2.0.5 (https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz) -500. vfile-message 1.1.1 (https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz) -501. viz-annotation 0.0.3 (https://registry.npmjs.org/viz-annotation/-/viz-annotation-0.0.3.tgz) -502. vlq 0.2.3 (https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz) -503. vscode-debugadapter 1.35.0 (https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.35.0.tgz) -504. vscode-debugprotocol 1.35.0 (https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.35.0.tgz) -505. vscode-extension-telemetry 0.1.0 (https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.0.tgz) -506. vscode-jsonrpc 4.0.0 (https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz) -507. vscode-languageclient 5.2.1 (https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz) -508. vscode-languageserver 5.2.1 (https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz) -509. vscode-languageserver-protocol 3.14.1 (https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz) -510. vscode-languageserver-types 3.14.0 (https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz) -511. vsls 0.3.1291 (https://registry.npmjs.org/vsls/-/vsls-0.3.1291.tgz) -512. warning 4.0.3 (https://registry.npmjs.org/warning/-/warning-4.0.3.tgz) -513. webpack (for lodash 4) (https://webpack.js.org/) -514. winreg 1.2.4 (https://github.com/fresc81/node-winreg/tree/v1.2.4) -515. winston 3.2.1 (https://registry.npmjs.org/winston/-/winston-3.2.1.tgz) -516. winston-transport 4.3.0 (https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz) -517. wordwrap 1.0.0 (https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz) -518. wrappy 1.0.2 (https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz) -519. ws 6.2.1 (https://registry.npmjs.org/ws/-/ws-6.2.1.tgz) -520. x-is-string 0.1.0 (https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz) -521. xml2js 0.4.19 (https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz) -522. xmlbuilder 9.0.7 (https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz) -523. xtend 4.0.2 (https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz) -524. yallist 2.1.2 (https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz) -525. ylru 1.2.1 (https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz) -526. zone.js 0.7.6 (https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz) - - -%% @babel/runtime 7.5.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz) -========================================= -MIT License - -Copyright (c) 2014-present Sebastian McKenzie and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF @babel/runtime NOTICES AND INFORMATION - -%% @babel/runtime-corejs2 7.5.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.4.tgz) -========================================= -MIT License - -Copyright (c) 2014-present Sebastian McKenzie and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF @babel/runtime-corejs2 NOTICES AND INFORMATION - -%% @blueprintjs/core 3.22.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@blueprintjs/core/-/core-3.22.3.tgz) -========================================= - 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 - -========================================= -END OF @blueprintjs/core NOTICES AND INFORMATION - -%% @blueprintjs/icons 3.13.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.13.0.tgz) -========================================= - 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 - -========================================= -END OF @blueprintjs/icons NOTICES AND INFORMATION - -%% @blueprintjs/select 3.11.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@blueprintjs/select/-/select-3.11.2.tgz) -========================================= - 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 - -========================================= -END OF @blueprintjs/select NOTICES AND INFORMATION - -%% @emotion/hash 0.6.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @emotion/hash NOTICES AND INFORMATION - -%% @emotion/memoize 0.6.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @emotion/memoize NOTICES AND INFORMATION - -%% @emotion/stylis 0.7.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @emotion/stylis NOTICES AND INFORMATION - -%% @emotion/unitless 0.6.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @emotion/unitless NOTICES AND INFORMATION - -%% @icons/material 0.2.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz) -========================================= -The MIT License - -Copyright 2019 @icons/material developers - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF @icons/material NOTICES AND INFORMATION - -%% @jupyterlab/coreutils 3.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-3.1.0.tgz) -========================================= -Copyright (c) 2015 Project Jupyter Contributors -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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -Semver File License -=================== - -The semver.py file is from https://github.com/podhmo/python-semver -which is licensed under the "MIT" license. See the semver.py file for details. - - -========================================= -END OF @jupyterlab/coreutils NOTICES AND INFORMATION - -%% @jupyterlab/observables 2.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@jupyterlab/observables/-/observables-2.4.0.tgz) -========================================= -Copyright (c) 2015 Project Jupyter Contributors -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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -Semver File License -=================== - -The semver.py file is from https://github.com/podhmo/python-semver -which is licensed under the "MIT" license. See the semver.py file for details. - - -========================================= -END OF @jupyterlab/observables NOTICES AND INFORMATION - -%% @jupyterlab/services 4.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@jupyterlab/services/-/services-4.2.0.tgz) -========================================= -Copyright (c) 2015 Project Jupyter Contributors -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. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -Semver File License -=================== - -The semver.py file is from https://github.com/podhmo/python-semver -which is licensed under the "MIT" license. See the semver.py file for details. - - -========================================= -END OF @jupyterlab/services NOTICES AND INFORMATION - -%% @koa/cors 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@koa/cors/-/cors-3.0.0.tgz) -========================================= -This software is licensed under the MIT License. - -Copyright (c) 2015 - 2018 koajs and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF @koa/cors NOTICES AND INFORMATION - -%% @loadable/component 5.12.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@loadable/component/-/component-5.12.0.tgz) -========================================= -Copyright 2019 Greg Bergé - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF @loadable/component NOTICES AND INFORMATION - -%% @mapbox/polylabel 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@mapbox/polylabel/-/polylabel-1.0.2.tgz) -========================================= -ISC License -Copyright (c) 2016 Mapbox - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA -OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -========================================= -END OF @mapbox/polylabel NOTICES AND INFORMATION - -%% @msrvida/python-program-analysis 0.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@msrvida/python-program-analysis/-/python-program-analysis-0.4.1.tgz) -========================================= - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - -========================================= -END OF @msrvida/python-program-analysis NOTICES AND INFORMATION - -%% @nteract/markdown 3.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/markdown/-/markdown-3.0.1.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/markdown NOTICES AND INFORMATION - -%% @nteract/mathjax 3.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/mathjax/-/mathjax-3.0.1.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/mathjax NOTICES AND INFORMATION - -%% @nteract/octicons 0.5.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/octicons/-/octicons-0.5.1.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/octicons NOTICES AND INFORMATION - -%% @nteract/styled-blueprintjsx 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/styled-blueprintjsx/-/styled-blueprintjsx-1.1.1.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/styled-blueprintjsx NOTICES AND INFORMATION - -%% @nteract/transform-dataresource 4.5.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-dataresource/-/transform-dataresource-4.5.2.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-dataresource NOTICES AND INFORMATION - -%% @nteract/transform-geojson 3.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-geojson/-/transform-geojson-3.2.5.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-geojson NOTICES AND INFORMATION - -%% @nteract/transform-model-debug 3.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-model-debug/-/transform-model-debug-3.2.5.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-model-debug NOTICES AND INFORMATION - -%% @nteract/transform-plotly 6.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-plotly/-/transform-plotly-6.0.0.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-plotly NOTICES AND INFORMATION - -%% @nteract/transform-vdom 2.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-vdom/-/transform-vdom-2.2.5.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-vdom NOTICES AND INFORMATION - -%% @nteract/transform-vega 6.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transform-vega/-/transform-vega-6.0.3.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transform-vega NOTICES AND INFORMATION - -%% @nteract/transforms 4.4.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/transforms/-/transforms-4.4.7.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF @nteract/transforms NOTICES AND INFORMATION - -%% @nteract/vega-embed-v2 1.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/vega-embed-v2/-/vega-embed-v2-1.1.0.tgz) -========================================= -MIT License - -Copyright (c) 2018 nteract - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @nteract/vega-embed-v2 NOTICES AND INFORMATION - -%% @nteract/vega-embed-v3 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@nteract/vega-embed-v3/-/vega-embed-v3-1.1.1.tgz) -========================================= -MIT License - -Copyright (c) 2018 nteract - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF @nteract/vega-embed-v3 NOTICES AND INFORMATION - -%% @phosphor/algorithm 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.1.3.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/algorithm NOTICES AND INFORMATION - -%% @phosphor/collections 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/collections/-/collections-1.2.0.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/collections NOTICES AND INFORMATION - -%% @phosphor/commands 1.7.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/commands/-/commands-1.7.2.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/commands NOTICES AND INFORMATION - -%% @phosphor/coreutils 1.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/coreutils/-/coreutils-1.3.1.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/coreutils NOTICES AND INFORMATION - -%% @phosphor/disposable 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.2.0.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/disposable NOTICES AND INFORMATION - -%% @phosphor/domutils 1.1.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/domutils/-/domutils-1.1.4.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/domutils NOTICES AND INFORMATION - -%% @phosphor/keyboard 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/keyboard/-/keyboard-1.1.3.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/keyboard NOTICES AND INFORMATION - -%% @phosphor/messaging 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/messaging/-/messaging-1.3.0.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/messaging NOTICES AND INFORMATION - -%% @phosphor/properties 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/properties/-/properties-1.1.3.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/properties NOTICES AND INFORMATION - -%% @phosphor/signaling 1.2.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.2.3.tgz) -========================================= -Copyright (c) 2014-2017, PhosphorJS Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF @phosphor/signaling NOTICES AND INFORMATION - -%% _pydev_calltip_util.py (for PyDev.Debugger) NOTICES AND INFORMATION BEGIN HERE (https://github.com/fabioz/PyDev.Debugger/blob/master/_pydev_bundle/_pydev_calltip_util.py) -========================================= -Copyright (c) Yuli Fitterman - -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 OF _pydev_calltip_util.py NOTICES AND INFORMATION - -%% accepts 1.3.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF accepts NOTICES AND INFORMATION - -%% acorn 5.7.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz) -========================================= -Copyright (C) 2012-2018 by various contributors (see AUTHORS) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF acorn NOTICES AND INFORMATION - -%% ajv 6.10.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015-2017 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF ajv NOTICES AND INFORMATION - -%% amdefine 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz) -========================================= -amdefine is released under two licenses: new BSD, and MIT. You may pick the -license that best suits your development needs. The text of both licenses are -provided below. - - -The "New" BSD License: ----------------------- - -Copyright (c) 2011-2016, The Dojo Foundation -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * 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. - * Neither the name of the Dojo Foundation nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - -MIT License ------------ - -Copyright (c) 2011-2016, The Dojo Foundation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF amdefine NOTICES AND INFORMATION - -%% angular.io (for RxJS 5.5) NOTICES AND INFORMATION BEGIN HERE (https://angular.io/) -========================================= -The MIT License - -Copyright (c) 2014-2017 Google, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF angular.io NOTICES AND INFORMATION - -%% anser 1.4.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/anser/-/anser-1.4.8.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2012-19 Ionică Bizău (https://ionicabizau.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF anser NOTICES AND INFORMATION - -%% ansi-regex 4.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF ansi-regex NOTICES AND INFORMATION - -%% ansi-styles 3.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF ansi-styles NOTICES AND INFORMATION - -%% ansi-to-html 0.6.11 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.11.tgz) -========================================= -Copyright (c) 2012 Rob Burns - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF ansi-to-html NOTICES AND INFORMATION - -%% ansi-to-react 3.3.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-3.3.5.tgz) -========================================= -Copyright (c) 2016, nteract contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of nteract nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - - -========================================= -END OF ansi-to-react NOTICES AND INFORMATION - -%% any-promise 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz) -========================================= -Copyright (C) 2014-2016 Kevin Beaty - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF any-promise NOTICES AND INFORMATION - -%% applicationinsights 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.6.tgz) -========================================= -The MIT License (MIT) -Copyright © Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF applicationinsights NOTICES AND INFORMATION - -%% arch 2.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/arch/-/arch-2.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF arch NOTICES AND INFORMATION - -%% asn1 0.2.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz) -========================================= -Copyright (c) 2011 Mark Cavage, All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE - -========================================= -END OF asn1 NOTICES AND INFORMATION - -%% assert-plus 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/joyent/node-assert-plus/tree/v1.0.0) -========================================= -The MIT License (MIT) -Copyright (c) 2012 Mark Cavage - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF assert-plus NOTICES AND INFORMATION - -%% ast-transform 0.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz) -========================================= -## The MIT License (MIT) ## - -Copyright (c) 2014 Hugh Kennedy - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF ast-transform NOTICES AND INFORMATION - -%% ast-types 0.7.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz) -========================================= -Copyright (c) 2013 Ben Newman - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF ast-types NOTICES AND INFORMATION - -%% async 2.6.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/async/-/async-2.6.2.tgz) -========================================= -Copyright (c) 2010-2018 Caolan McMahon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF async NOTICES AND INFORMATION - -%% async-limiter 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz) -========================================= -The MIT License (MIT) -Copyright (c) 2017 Samuel Reed - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF async-limiter NOTICES AND INFORMATION - -%% asynckit 0.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Alex Indigo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF asynckit NOTICES AND INFORMATION - -%% aws-sign2 0.7.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF aws-sign2 NOTICES AND INFORMATION - -%% aws4 1.8.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz) -========================================= -Copyright 2013 Michael Hart (michael.hart.au@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF aws4 NOTICES AND INFORMATION - -%% azure-storage 2.10.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.3.tgz) -========================================= - 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 -========================================= -END OF azure-storage NOTICES AND INFORMATION - -%% babel-polyfill 6.26.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz) -========================================= -MIT License - -Copyright (c) 2014-2018 Sebastian McKenzie and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF babel-polyfill NOTICES AND INFORMATION - -%% babel-runtime 6.26.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz) -========================================= -MIT License - -Copyright (c) 2014-2018 Sebastian McKenzie and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF babel-runtime NOTICES AND INFORMATION - -%% bail 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/bail/-/bail-1.0.4.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF bail NOTICES AND INFORMATION - -%% balanced-match 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz) -========================================= -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF balanced-match NOTICES AND INFORMATION - -%% base16 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/base16/-/base16-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF base16 NOTICES AND INFORMATION - -%% base64-js 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF base64-js NOTICES AND INFORMATION - -%% bcrypt-pbkdf 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz) -========================================= -The Blowfish portions are under the following license: - -Blowfish block cipher for OpenBSD -Copyright 1997 Niels Provos -All rights reserved. - -Implementation advice by David Mazieres . - -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. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - - - -The bcrypt_pbkdf portions are under the following license: - -Copyright (c) 2013 Ted Unangst - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - - -Performance improvements (Javascript-specific): - -Copyright 2016, Joyent Inc -Author: Alex Wilson - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF bcrypt-pbkdf NOTICES AND INFORMATION - -%% bintrees 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz) -========================================= -Copyright (C) 2011 by Vadim Graboys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF bintrees NOTICES AND INFORMATION - -%% bootstrap-less 3.3.8 NOTICES AND INFORMATION BEGIN HERE (https://github.com/distros/bootstrap-less) -========================================= -The MIT License (MIT) - -Copyright (c) 2011-2019 Twitter, Inc. -Copyright (c) 2011-2019 The Bootstrap Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF bootstrap-less NOTICES AND INFORMATION - -%% brace-expansion 1.1.11 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz) -========================================= -MIT License - -Copyright (c) 2013 Julian Gruber - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF brace-expansion NOTICES AND INFORMATION - -%% brotli 1.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz) -========================================= -Copyright 2019 brotli developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF brotli NOTICES AND INFORMATION - -%% browser-resolve 1.11.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2013-2015 Roman Shtylman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF browser-resolve NOTICES AND INFORMATION - -%% browserify-mime 1.2.9 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz) -========================================= -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF browserify-mime NOTICES AND INFORMATION - -%% browserify-optional 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz) -========================================= -Copyright 2019 browserify-optional developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF browserify-optional NOTICES AND INFORMATION - -%% buffer-equal 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF buffer-equal NOTICES AND INFORMATION - -%% buffer-from 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz) -========================================= -MIT License - -Copyright (c) 2016, 2018 Linus Unnebäck - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF buffer-from NOTICES AND INFORMATION - -%% bytes 3.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015 Jed Watson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF bytes NOTICES AND INFORMATION - -%% cache-content-type 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz) -========================================= -MIT - -========================================= -END OF cache-content-type NOTICES AND INFORMATION - -%% canvas 2.6.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF canvas NOTICES AND INFORMATION - -%% caseless 0.12.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz) -========================================= -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: -You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and -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 -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 -========================================= -END OF caseless NOTICES AND INFORMATION - -%% chalk 2.4.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF chalk NOTICES AND INFORMATION - -%% character-entities-legacy 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF character-entities-legacy NOTICES AND INFORMATION - -%% character-reference-invalid 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF character-reference-invalid NOTICES AND INFORMATION - -%% charenc 0.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz) -========================================= -Copyright © 2011, Paul Vorbach. All rights reserved. -Copyright © 2009, Jeff Mott. All rights reserved. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* 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. -* Neither the name Crypto-JS nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF charenc NOTICES AND INFORMATION - -%% classnames 2.2.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2017 Jed Watson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF classnames NOTICES AND INFORMATION - -%% clone 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/clone/-/clone-1.0.4.tgz) -========================================= -Copyright © 2011-2015 Paul Vorbach - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF clone NOTICES AND INFORMATION - -%% clsx 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz) -========================================= -MIT License - -Copyright (c) Luke Edwards (lukeed.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF clsx NOTICES AND INFORMATION - -%% co 4.6.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/co/-/co-4.6.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF co NOTICES AND INFORMATION - -%% collapse-white-space 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF collapse-white-space NOTICES AND INFORMATION - -%% color 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/color/-/color-3.0.0.tgz) -========================================= -Copyright (c) 2012 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF color NOTICES AND INFORMATION - -%% color-convert 1.9.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz) -========================================= -Copyright (c) 2011-2016 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF color-convert NOTICES AND INFORMATION - -%% color-name 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz) -========================================= -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF color-name NOTICES AND INFORMATION - -%% color-string 1.5.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz) -========================================= -Copyright (c) 2011 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF color-string NOTICES AND INFORMATION - -%% colornames 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Tim Oxley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF colornames NOTICES AND INFORMATION - -%% colors 1.3.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/colors/-/colors-1.3.3.tgz) -========================================= -MIT License - -Original Library - - Copyright (c) Marak Squires - -Additional Functionality - - Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF colors NOTICES AND INFORMATION - -%% colorspace 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF colorspace NOTICES AND INFORMATION - -%% combined-stream 1.0.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz) -========================================= -Copyright (c) 2011 Debuggable Limited - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF combined-stream NOTICES AND INFORMATION - -%% compressible 2.0.17 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz) -========================================= -(The MIT License) - -Copyright (c) 2013 Jonathan Ong -Copyright (c) 2014 Jeremiah Senkpiel -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF compressible NOTICES AND INFORMATION - -%% concat-map 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF concat-map NOTICES AND INFORMATION - -%% concat-stream 1.6.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz) -========================================= -The MIT License - -Copyright (c) 2013 Max Ogden - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF concat-stream NOTICES AND INFORMATION - -%% content-disposition 0.5.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF content-disposition NOTICES AND INFORMATION - -%% content-type 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF content-type NOTICES AND INFORMATION - -%% convert-source-map 1.6.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz) -========================================= -Copyright 2013 Thorsten Lorenz. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF convert-source-map NOTICES AND INFORMATION - -%% cookies 0.8.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Jed Schmidt, http://jed.is/ -Copyright (c) 2015-2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF cookies NOTICES AND INFORMATION - -%% core-util-is 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz) -========================================= -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF core-util-is NOTICES AND INFORMATION - -%% create-emotion 9.2.12 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF create-emotion NOTICES AND INFORMATION - -%% create-react-context 0.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz) -========================================= -Copyright (c) 2017-present James Kyle - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF create-react-context NOTICES AND INFORMATION - -%% crypt 0.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz) -========================================= -Copyright © 2011, Paul Vorbach. All rights reserved. -Copyright © 2009, Jeff Mott. All rights reserved. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* 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. -* Neither the name Crypto-JS nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF crypt NOTICES AND INFORMATION - -%% crypto-js 3.1.9-1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz) -========================================= -# License - -[The MIT License (MIT)](http://opensource.org/licenses/MIT) - -Copyright (c) 2009-2013 Jeff Mott -Copyright (c) 2013-2016 Evan Vosberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF crypto-js NOTICES AND INFORMATION - -%% css-loader 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz) -========================================= -Copyright JS Foundation and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF css-loader NOTICES AND INFORMATION - -%% d3 3.5.17 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3/-/d3-3.5.17.tgz) -========================================= -Copyright (c) 2010-2016, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK 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. - -========================================= -END OF d3 NOTICES AND INFORMATION - -%% d3-array 1.2.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-array NOTICES AND INFORMATION - -%% d3-bboxCollide 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-bboxCollide/-/d3-bboxCollide-1.0.4.tgz) -========================================= -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - -========================================= -END OF d3-bboxCollide NOTICES AND INFORMATION - -%% d3-brush 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-brush NOTICES AND INFORMATION - -%% d3-chord 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-chord NOTICES AND INFORMATION - -%% d3-cloud 1.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.5.tgz) -========================================= -Copyright (c) 2013, Jason Davies. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * 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. - - * The name Jason Davies may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL JASON DAVIES 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. - -========================================= -END OF d3-cloud NOTICES AND INFORMATION - -%% d3-collection 1.0.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz) -========================================= -Copyright 2010-2016, Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-collection NOTICES AND INFORMATION - -%% d3-color 1.2.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-color NOTICES AND INFORMATION - -%% d3-contour 1.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz) -========================================= -Copyright 2012-2017 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-contour NOTICES AND INFORMATION - -%% d3-delaunay 5.1.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.1.6.tgz) -========================================= -Copyright 2018 Observable, Inc. - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -========================================= -END OF d3-delaunay NOTICES AND INFORMATION - -%% d3-dispatch 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-dispatch NOTICES AND INFORMATION - -%% d3-drag 1.2.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-drag NOTICES AND INFORMATION - -%% d3-dsv 0.1.14 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-dsv/-/d3-dsv-0.1.14.tgz) -========================================= -Copyright 2013-2015 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-dsv NOTICES AND INFORMATION - -%% d3-ease 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -Copyright 2001 Robert Penner -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-ease NOTICES AND INFORMATION - -%% d3-force 1.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-force NOTICES AND INFORMATION - -%% d3-format 1.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz) -========================================= -Copyright 2010-2015 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-format NOTICES AND INFORMATION - -%% d3-geo 1.11.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This license applies to GeographicLib, versions 1.12 and later. - -Copyright (c) 2008-2012, Charles Karney - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF d3-geo NOTICES AND INFORMATION - -%% d3-glyphedge 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-glyphedge/-/d3-glyphedge-1.2.0.tgz) -========================================= -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - - -========================================= -END OF d3-glyphedge NOTICES AND INFORMATION - -%% d3-hexbin 0.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz) -========================================= -Copyright Mike Bostock, 2012-2016 -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-hexbin NOTICES AND INFORMATION - -%% d3-hierarchy 1.1.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-hierarchy NOTICES AND INFORMATION - -%% d3-interpolate 1.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-interpolate NOTICES AND INFORMATION - -%% d3-path 1.0.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz) -========================================= -Copyright 2015-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-path NOTICES AND INFORMATION - -%% d3-polygon 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-polygon NOTICES AND INFORMATION - -%% d3-quadtree 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.1.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-quadtree NOTICES AND INFORMATION - -%% d3-request 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-request NOTICES AND INFORMATION - -%% d3-sankey-circular 0.25.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.25.0.tgz) -========================================= -MIT License - -Copyright (c) 2017 Tom Shanley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF d3-sankey-circular NOTICES AND INFORMATION - -%% d3-scale 2.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz) -========================================= -Copyright 2010-2015 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-scale NOTICES AND INFORMATION - -%% d3-scale-chromatic 1.5.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz) -========================================= -Copyright 2010-2018 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Apache-Style Software License for ColorBrewer software and ColorBrewer Color -Schemes - -Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State -University. - -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 OF d3-scale-chromatic NOTICES AND INFORMATION - -%% d3-selection 1.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz) -========================================= -Copyright (c) 2010-2018, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK 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. - -========================================= -END OF d3-selection NOTICES AND INFORMATION - -%% d3-shape 1.3.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz) -========================================= -Copyright 2010-2015 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-shape NOTICES AND INFORMATION - -%% d3-time 1.0.11 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-time NOTICES AND INFORMATION - -%% d3-time-format 2.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz) -========================================= -Copyright 2010-2017 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-time-format NOTICES AND INFORMATION - -%% d3-timer 1.0.9 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-timer NOTICES AND INFORMATION - -%% d3-transition 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz) -========================================= -Copyright (c) 2010-2015, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK 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. - -TERMS OF USE - EASING EQUATIONS - -Open source under the BSD License. - -Copyright 2001 Robert Penner -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- 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. - -- Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF d3-transition NOTICES AND INFORMATION - -%% d3-voronoi 1.1.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz) -========================================= -Copyright 2010-2016 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Copyright (C) 2010-2013 Raymond Hill -https://github.com/gorhill/Javascript-Voronoi - -Licensed under The MIT License -http://en.wikipedia.org/wiki/MIT_License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF d3-voronoi NOTICES AND INFORMATION - -%% dashdash 1.14.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz) -========================================= -# This is the MIT license - -Copyright (c) 2013 Trent Mick. All rights reserved. -Copyright (c) 2013 Joyent Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF dashdash NOTICES AND INFORMATION - -%% datalib 1.9.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/datalib/-/datalib-1.9.2.tgz) -========================================= -Copyright (c) 2015, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF datalib NOTICES AND INFORMATION - -%% deep-equal 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF deep-equal NOTICES AND INFORMATION - -%% deep-is 0.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz) -========================================= -Copyright (c) 2012, 2013 Thorsten Lorenz -Copyright (c) 2012 James Halliday -Copyright (c) 2009 Thomas Robinson <280north.com> - -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF deep-is NOTICES AND INFORMATION - -%% define-properties 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (C) 2015 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF define-properties NOTICES AND INFORMATION - -%% delaunator 4.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz) -========================================= -ISC License - -Copyright (c) 2017, Mapbox - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -========================================= -END OF delaunator NOTICES AND INFORMATION - -%% delayed-stream 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz) -========================================= -Copyright (c) 2011 Debuggable Limited - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF delayed-stream NOTICES AND INFORMATION - -%% delegates 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz) -========================================= -Copyright (c) 2015 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF delegates NOTICES AND INFORMATION - -%% depd 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/depd/-/depd-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF depd NOTICES AND INFORMATION - -%% destroy 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF destroy NOTICES AND INFORMATION - -%% detect-indent 6.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF detect-indent NOTICES AND INFORMATION - -%% dfa 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz) -========================================= -Copyright 2019 dfa developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF dfa NOTICES AND INFORMATION - -%% diagnostic-channel 0.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz) -========================================= - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - -========================================= -END OF diagnostic-channel NOTICES AND INFORMATION - -%% diagnostic-channel-publishers 0.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz) -========================================= - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - -========================================= -END OF diagnostic-channel-publishers NOTICES AND INFORMATION - -%% diagnostics 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF diagnostics NOTICES AND INFORMATION - -%% diff-match-patch 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz) -========================================= - - 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. -========================================= -END OF diff-match-patch NOTICES AND INFORMATION - -%% dom-helpers 3.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Jason Quense - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -========================================= -END OF dom-helpers NOTICES AND INFORMATION - -%% dom4 2.1.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/dom4/-/dom4-2.1.5.tgz) -========================================= -Copyright (C) 2013-2015 by Andrea Giammarchi - @WebReflection - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF dom4 NOTICES AND INFORMATION - -%% duplexer2 0.1.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz) -========================================= -Copyright (c) 2013, Deoxxa Development -====================================== -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. -3. Neither the name of Deoxxa Development nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY DEOXXA DEVELOPMENT ''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 DEOXXA DEVELOPMENT 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. - -========================================= -END OF duplexer2 NOTICES AND INFORMATION - -%% ecc-jsbn 0.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Jeremie Miller - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -========================================= -END OF ecc-jsbn NOTICES AND INFORMATION - -%% ee-first 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF ee-first NOTICES AND INFORMATION - -%% emotion 9.2.12 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kye Hohenberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF emotion NOTICES AND INFORMATION - -%% enabled 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF enabled NOTICES AND INFORMATION - -%% encodeurl 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF encodeurl NOTICES AND INFORMATION - -%% encoding 0.1.12 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz) -========================================= -Copyright (c) 2012-2014 Andris Reinman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF encoding NOTICES AND INFORMATION - -%% entities 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/entities/-/entities-1.1.2.tgz) -========================================= -Copyright (c) Felix Böhm -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -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 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, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF entities NOTICES AND INFORMATION - -%% env-variable 0.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz) -========================================= -Copyright 2014 Arnout Kazemier - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF env-variable NOTICES AND INFORMATION - -%% error-inject 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 dead_horse - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF error-inject NOTICES AND INFORMATION - -%% escape-carriage 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz) -========================================= -MIT License - -Copyright (c) 2016 Lukas Geiger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF escape-carriage NOTICES AND INFORMATION - -%% escape-html 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012-2013 TJ Holowaychuk -Copyright (c) 2015 Andreas Lubbe -Copyright (c) 2015 Tiancheng "Timothy" Gu - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF escape-html NOTICES AND INFORMATION - -%% escape-string-regexp 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF escape-string-regexp NOTICES AND INFORMATION - -%% estraverse 1.5.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz) -========================================= -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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 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. - -========================================= -END OF estraverse NOTICES AND INFORMATION - -%% esutils 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz) -========================================= -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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 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. - -========================================= -END OF esutils NOTICES AND INFORMATION - -%% extend 3.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/extend/-/extend-3.0.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Stefan Thomas - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF extend NOTICES AND INFORMATION - -%% extsprintf 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz) -========================================= -Copyright (c) 2012, Joyent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE - -========================================= -END OF extsprintf NOTICES AND INFORMATION - -%% falafel 2.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz) -========================================= -Copyright 2019 falafel developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF falafel NOTICES AND INFORMATION - -%% fast-deep-equal 2.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz) -========================================= -MIT License - -Copyright (c) 2017 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF fast-deep-equal NOTICES AND INFORMATION - -%% fast-json-stable-stringify 2.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF fast-json-stable-stringify NOTICES AND INFORMATION - -%% fast-levenshtein 2.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz) -========================================= -(MIT License) - -Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/) - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF fast-levenshtein NOTICES AND INFORMATION - -%% fast-plist 0.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF fast-plist NOTICES AND INFORMATION - -%% fast-safe-stringify 2.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 David Mark Clements -Copyright (c) 2017 David Mark Clements & Matteo Collina -Copyright (c) 2018 David Mark Clements, Matteo Collina & Ruben Bridgewater - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF fast-safe-stringify NOTICES AND INFORMATION - -%% fecha 2.3.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Taylor Hakes - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF fecha NOTICES AND INFORMATION - -%% fontkit 1.8.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz) -========================================= -Copyright 2019 fontkit developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF fontkit NOTICES AND INFORMATION - -%% foreach 2.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz) -========================================= -The MIT License - -Copyright (c) 2013 Manuel Stofer - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF foreach NOTICES AND INFORMATION - -%% forever-agent 0.6.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF forever-agent NOTICES AND INFORMATION - -%% form-data 2.3.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz) -========================================= -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -========================================= -END OF form-data NOTICES AND INFORMATION - -%% fresh 0.5.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF fresh NOTICES AND INFORMATION - -%% fs-extra 4.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2011-2017 JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF fs-extra NOTICES AND INFORMATION - -%% fs.realpath 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----- - -This library bundles a version of the `fs.realpath` and `fs.realpathSync` -methods from Node.js v0.10 under the terms of the Node.js MIT license. - -Node's license follows, also included at the header of `old.js` which contains -the licensed code: - - Copyright Joyent, Inc. and other Node contributors. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -========================================= -END OF fs.realpath NOTICES AND INFORMATION - -%% function-bind 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz) -========================================= -Copyright (c) 2013 Raynos. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -========================================= -END OF function-bind NOTICES AND INFORMATION - -%% fuzzy 0.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz) -========================================= -Copyright (c) 2012 Matt York - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF fuzzy NOTICES AND INFORMATION - -%% get-port 3.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF get-port NOTICES AND INFORMATION - -%% getpass 0.1.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz) -========================================= -Copyright Joyent, Inc. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF getpass NOTICES AND INFORMATION - -%% glob 7.1.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/glob/-/glob-7.1.4.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -## Glob Logo - -Glob's logo created by Tanya Brassie , licensed -under a Creative Commons Attribution-ShareAlike 4.0 International License -https://creativecommons.org/licenses/by-sa/4.0/ - -========================================= -END OF glob NOTICES AND INFORMATION - -%% graceful-fs 4.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF graceful-fs NOTICES AND INFORMATION - -%% gud 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/gud/-/gud-1.0.0.tgz) -========================================= -Copyright 2018 gud contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF gud NOTICES AND INFORMATION - -%% har-schema 2.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz) -========================================= -Copyright (c) 2015, Ahmad Nassri - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF har-schema NOTICES AND INFORMATION - -%% har-validator 5.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz) -========================================= -MIT License - -Copyright (c) 2018 Ahmad Nassri - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF har-validator NOTICES AND INFORMATION - -%% has 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/has/-/has-1.0.3.tgz) -========================================= -Copyright (c) 2013 Thiago de Arruda - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF has NOTICES AND INFORMATION - -%% has-flag 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF has-flag NOTICES AND INFORMATION - -%% hash-base 3.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kirill Fomichev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF hash-base NOTICES AND INFORMATION - -%% hash.js 1.1.7 NOTICES AND INFORMATION BEGIN HERE (https://github.com/indutny/hash.js/tree/v1.1.7) -========================================= -This software is licensed under the MIT License. - -Copyright Fedor Indutny, 2014. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF hash.js NOTICES AND INFORMATION - -%% hoist-non-react-statics 3.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz) -========================================= -Software License Agreement (BSD License) -======================================== - -Copyright (c) 2015, Yahoo! Inc. All rights reserved. ----------------------------------------------------- - -Redistribution and use of this software in source and binary forms, with or -without modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * 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. - * Neither the name of Yahoo! Inc. nor the names of YUI's contributors may be - used to endorse or promote products derived from this software without - specific prior written permission of Yahoo! Inc. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF hoist-non-react-statics NOTICES AND INFORMATION - -%% http-assert 1.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF http-assert NOTICES AND INFORMATION - -%% http-errors 1.7.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com -Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF http-errors NOTICES AND INFORMATION - -%% http-signature 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz) -========================================= -Copyright Joyent, Inc. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF http-signature NOTICES AND INFORMATION - -%% humanize-number 0.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz) -========================================= -MIT - -========================================= -END OF humanize-number NOTICES AND INFORMATION - -%% iconv-lite 0.4.24 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz) -========================================= -Copyright (c) 2011 Alexander Shtuchkin - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF iconv-lite NOTICES AND INFORMATION - -%% ieee754 1.1.13 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz) -========================================= -Copyright 2008 Fair Oaks Labs, Inc. - -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. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF ieee754 NOTICES AND INFORMATION - -%% inflight 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF inflight NOTICES AND INFORMATION - -%% inherits 2.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - -========================================= -END OF inherits NOTICES AND INFORMATION - -%% invariant 2.2.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz) -========================================= -MIT License - -Copyright (c) 2013-present, Facebook, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF invariant NOTICES AND INFORMATION - -%% inversify 4.13.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/inversify/-/inversify-4.13.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015-2017 Remo H. Jansen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF inversify NOTICES AND INFORMATION - -%% IPython (for PyDev.Debugger) NOTICES AND INFORMATION BEGIN HERE (https://ipython.org/) -========================================= -Copyright (c) 2008-2010, IPython Development Team -Copyright (c) 2001-2007, Fernando Perez. -Copyright (c) 2001, Janko Hauser -Copyright (c) 2001, Nathaniel Gray - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -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. - -Neither the name of the IPython Development Team nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF IPython NOTICES AND INFORMATION - -%% is-alphabetical 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-alphabetical NOTICES AND INFORMATION - -%% is-alphanumerical 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-alphanumerical NOTICES AND INFORMATION - -%% is-arguments 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-arguments NOTICES AND INFORMATION - -%% is-arrayish 0.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 JD Ballard - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF is-arrayish NOTICES AND INFORMATION - -%% is-buffer 1.1.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF is-buffer NOTICES AND INFORMATION - -%% is-date-object 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF is-date-object NOTICES AND INFORMATION - -%% is-decimal 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-decimal NOTICES AND INFORMATION - -%% is-generator-function 1.0.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-generator-function NOTICES AND INFORMATION - -%% is-hexadecimal 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-hexadecimal NOTICES AND INFORMATION - -%% is-plain-obj 1.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF is-plain-obj NOTICES AND INFORMATION - -%% is-regex 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-regex NOTICES AND INFORMATION - -%% is-stream 1.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF is-stream NOTICES AND INFORMATION - -%% is-typedarray 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-typedarray NOTICES AND INFORMATION - -%% is-whitespace-character 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-whitespace-character NOTICES AND INFORMATION - -%% is-word-character 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF is-word-character NOTICES AND INFORMATION - -%% isarray 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/juliangruber/isarray/blob/v1.0.0) -========================================= -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF isarray NOTICES AND INFORMATION - -%% isort 4.3.4 NOTICES AND INFORMATION BEGIN HERE (https://github.com/timothycrosley/isort/tree/4.3.4) -========================================= -The MIT License (MIT) - -Copyright (c) 2013 Timothy Edmund Crosley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF isort NOTICES AND INFORMATION - -%% isstream 0.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz) -========================================= -The MIT License (MIT) -===================== - -Copyright (c) 2015 Rod Vagg ---------------------------- - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF isstream NOTICES AND INFORMATION - -%% Jedi 0.13.3 NOTICES AND INFORMATION BEGIN HERE (https://github.com/davidhalter/jedi/tree/v0.13.3) -========================================= -All contributions towards Jedi are MIT licensed. - -------------------------------------------------------------------------------- -The MIT License (MIT) - -Copyright (c) <2013> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF Jedi NOTICES AND INFORMATION - -%% jsbn 0.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz) -========================================= -Licensing ---------- - -This software is covered under the following copyright: - -/* - * Copyright (c) 2003-2005 Tom Wu - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF - * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * In addition, the following condition applies: - * - * All redistributions must retain an intact copy of this copyright notice - * and disclaimer. - */ - -Address all questions regarding this license to: - - Tom Wu - tjw@cs.Stanford.EDU -========================================= -END OF jsbn NOTICES AND INFORMATION - -%% json-edm-parser 0.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json-edm-parser/-/json-edm-parser-0.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Yang Xia - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF json-edm-parser NOTICES AND INFORMATION - -%% json-schema 0.2.3 NOTICES AND INFORMATION BEGIN HERE (https://www.npmjs.com/package/json-schema) -========================================= -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. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF json-schema NOTICES AND INFORMATION - -%% json-schema-traverse 0.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz) -========================================= -MIT License - -Copyright (c) 2017 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF json-schema-traverse NOTICES AND INFORMATION - -%% json-stable-stringify 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF json-stable-stringify NOTICES AND INFORMATION - -%% json-stringify-pretty-compact 2.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014, 2016, 2017, 2019 Simon Lydell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF json-stringify-pretty-compact NOTICES AND INFORMATION - -%% json-stringify-safe 5.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF json-stringify-safe NOTICES AND INFORMATION - -%% json2csv 4.5.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json2csv/-/json2csv-4.5.2.tgz) -========================================= -Copyright (C) 2012 [Mirco Zeiss](mailto: mirco.zeiss@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE -OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF json2csv NOTICES AND INFORMATION - -%% json5 2.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/json5/-/json5-2.1.0.tgz) -========================================= -MIT License - -Copyright (c) 2012-2018 Aseem Kishore, and [others]. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -[others]: https://github.com/json5/json5/contributors - -========================================= -END OF json5 NOTICES AND INFORMATION - -%% jsonc-parser 2.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.1.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF jsonc-parser NOTICES AND INFORMATION - -%% jsonfile 4.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012-2015, JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF jsonfile NOTICES AND INFORMATION - -%% jsonify 0.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz) -========================================= -public domain - -========================================= -END OF jsonify NOTICES AND INFORMATION - -%% jsonparse 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz) -========================================= -The MIT License - -Copyright (c) 2012 Tim Caswell - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF jsonparse NOTICES AND INFORMATION - -%% jsprim 1.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz) -========================================= -Copyright (c) 2012, Joyent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE - -========================================= -END OF jsprim NOTICES AND INFORMATION - -%% keygrip 1.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2011-2014 Jed Schmidt (http://jedschmidt.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF keygrip NOTICES AND INFORMATION - -%% koa 2.11.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa/-/koa-2.11.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2019 Koa contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF koa NOTICES AND INFORMATION - -%% koa-compose 4.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz) -========================================= -MIT - -========================================= -END OF koa-compose NOTICES AND INFORMATION - -%% koa-compress 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa-compress/-/koa-compress-3.0.0.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF koa-compress NOTICES AND INFORMATION - -%% koa-convert 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 yunsong - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF koa-convert NOTICES AND INFORMATION - -%% koa-is-json 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF koa-is-json NOTICES AND INFORMATION - -%% koa-logger 3.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/koa-logger/-/koa-logger-3.2.1.tgz) -========================================= -MIT - -========================================= -END OF koa-logger NOTICES AND INFORMATION - -%% kuler 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz) -========================================= -Copyright 2014 Arnout Kazemier - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF kuler NOTICES AND INFORMATION - -%% labella 1.1.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/labella/-/labella-1.1.4.tgz) -========================================= -Copyright 2015 Twitter, Inc. - -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 OF labella NOTICES AND INFORMATION - -%% leaflet 1.5.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/leaflet/-/leaflet-1.5.1.tgz) -========================================= -Copyright (c) 2010-2018, Vladimir Agafonkin -Copyright (c) 2010-2011, CloudMade -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. - -========================================= -END OF leaflet NOTICES AND INFORMATION - -%% levn 0.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/levn/-/levn-0.3.0.tgz) -========================================= -Copyright (c) George Zahariev - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF levn NOTICES AND INFORMATION - -%% line-by-line 0.1.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/line-by-line/-/line-by-line-0.1.6.tgz) -========================================= - -Copyright (c) 2012 Markus von der Wehd - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE -OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF line-by-line NOTICES AND INFORMATION - -%% linear-layout-vector 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz) -========================================= -Copyright 2019 linear-layout-vector developers - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF linear-layout-vector NOTICES AND INFORMATION - -%% linebreak 0.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz) -========================================= -Copyright 2019 linebreak developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF linebreak NOTICES AND INFORMATION - -%% lodash 4.17.15 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz) -========================================= -Copyright OpenJS Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. - -========================================= -END OF lodash NOTICES AND INFORMATION - -%% lodash.curry 4.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz) -========================================= -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. - -========================================= -END OF lodash.curry NOTICES AND INFORMATION - -%% lodash.flow 3.5.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz) -========================================= -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. - -========================================= -END OF lodash.flow NOTICES AND INFORMATION - -%% logform 2.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/logform/-/logform-2.1.2.tgz) -========================================= -MIT License - -Copyright (c) 2017 Charlie Robbins & the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF logform NOTICES AND INFORMATION - -%% lru-cache 4.1.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF lru-cache NOTICES AND INFORMATION - -%% magic-string 0.22.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz) -========================================= -Copyright 2018 Rich Harris - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF magic-string NOTICES AND INFORMATION - -%% markdown-escapes 1.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF markdown-escapes NOTICES AND INFORMATION - -%% martinez-polygon-clipping 0.1.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.1.5.tgz) -========================================= -MIT License - -Copyright (c) 2018 Alexander Milevski - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF martinez-polygon-clipping NOTICES AND INFORMATION - -%% material-colors 1.2.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz) -========================================= -ISC License - -Copyright 2014 Shuhei Kagawa - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF material-colors NOTICES AND INFORMATION - -%% md5 2.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/md5/-/md5-2.2.1.tgz) -========================================= -Copyright © 2011-2012, Paul Vorbach. -Copyright © 2009, Jeff Mott. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* 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. -* Neither the name Crypto-JS nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF md5 NOTICES AND INFORMATION - -%% md5.js 1.3.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Kirill Fomichev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF md5.js NOTICES AND INFORMATION - -%% mdast-add-list-metadata 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2018 André Staltz (staltz.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF mdast-add-list-metadata NOTICES AND INFORMATION - -%% media-typer 0.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF media-typer NOTICES AND INFORMATION - -%% merge-source-map 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) keik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF merge-source-map NOTICES AND INFORMATION - -%% mime-db 1.40.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF mime-db NOTICES AND INFORMATION - -%% mime-types 2.1.24 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF mime-types NOTICES AND INFORMATION - -%% minimalistic-assert 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz) -========================================= -Copyright 2015 Calvin Metcalf - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -========================================= -END OF minimalistic-assert NOTICES AND INFORMATION - -%% minimatch 3.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF minimatch NOTICES AND INFORMATION - -%% minimist 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF minimist NOTICES AND INFORMATION - -%% mkdirp 0.5.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz) -========================================= -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF mkdirp NOTICES AND INFORMATION - -%% moment 2.24.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/moment/-/moment-2.24.0.tgz) -========================================= -Copyright (c) JS Foundation and other contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF moment NOTICES AND INFORMATION - -%% monaco-editor 0.18.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.18.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 - present Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF monaco-editor NOTICES AND INFORMATION - -%% monaco-editor-textmate 2.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/monaco-editor-textmate/-/monaco-editor-textmate-2.2.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2018 Neek Sandhu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF monaco-editor-textmate NOTICES AND INFORMATION - -%% monaco-textmate 3.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/monaco-textmate/-/monaco-textmate-3.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF monaco-textmate NOTICES AND INFORMATION - -%% ms 2.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ms/-/ms-2.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF ms NOTICES AND INFORMATION - -%% named-js-regexp 1.3.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz) -========================================= -The MIT License - -Copyright (c) 2015, @edvinv - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF named-js-regexp NOTICES AND INFORMATION - -%% negotiator 0.6.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012-2014 Federico Romero -Copyright (c) 2012-2014 Isaac Z. Schlueter -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF negotiator NOTICES AND INFORMATION - -%% node-fetch 1.7.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 David Frank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF node-fetch NOTICES AND INFORMATION - -%% node-libs-browser 2.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012 Tobias Koppers - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF node-libs-browser NOTICES AND INFORMATION - -%% node-stream-zip 1.8.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz) -========================================= -Copyright (c) 2015 Antelle https://github.com/antelle - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -== dependency license: adm-zip == - -Copyright (c) 2012 Another-D-Mention Software and other contributors, -http://www.another-d-mention.ro/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF node-stream-zip NOTICES AND INFORMATION - -%% numeral 2.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz) -========================================= -Copyright (c) 2016 Adam Draper - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF numeral NOTICES AND INFORMATION - -%% oauth-sign 0.9.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF oauth-sign NOTICES AND INFORMATION - -%% object-assign 4.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF object-assign NOTICES AND INFORMATION - -%% object-inspect 1.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF object-inspect NOTICES AND INFORMATION - -%% object-is 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF object-is NOTICES AND INFORMATION - -%% object-keys 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (C) 2013 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF object-keys NOTICES AND INFORMATION - -%% on-finished 2.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2013 Jonathan Ong -Copyright (c) 2014 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF on-finished NOTICES AND INFORMATION - -%% once 1.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/once/-/once-1.4.0.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF once NOTICES AND INFORMATION - -%% one-time 0.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF one-time NOTICES AND INFORMATION - -%% onigasm 2.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/onigasm/-/onigasm-2.2.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2018 Neek Sandhu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF onigasm NOTICES AND INFORMATION - -%% only 0.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/only/-/only-0.0.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF only NOTICES AND INFORMATION - -%% optionator 0.8.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz) -========================================= -Copyright (c) George Zahariev - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF optionator NOTICES AND INFORMATION - -%% os-tmpdir 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF os-tmpdir NOTICES AND INFORMATION - -%% pako 0.2.9 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/pako/-/pako-0.2.9.tgz) -========================================= -(The MIT License) - -Copyright (C) 2014-2016 by Vitaly Puzrin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF pako NOTICES AND INFORMATION - -%% parse-entities 1.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF parse-entities NOTICES AND INFORMATION - -%% parseurl 1.3.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz) -========================================= - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF parseurl NOTICES AND INFORMATION - -%% parso 0.5.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/davidhalter/parso/tree/v0.5.0) -========================================= -All contributions towards parso are MIT licensed. - -Some Python files have been taken from the standard library and are therefore -PSF licensed. Modifications on these files are dual licensed (both MIT and -PSF). These files are: - -- parso/pgen2/* -- parso/tokenize.py -- parso/token.py -- test/test_pgen2.py - -Also some test files under test/normalizer_issue_files have been copied from -https://github.com/PyCQA/pycodestyle (Expat License == MIT License). - -------------------------------------------------------------------------------- -The MIT License (MIT) - -Copyright (c) <2013-2017> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -------------------------------------------------------------------------------- - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - -========================================= -END OF parso NOTICES AND INFORMATION - -%% passthrough-counter 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) {{year}} Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF passthrough-counter NOTICES AND INFORMATION - -%% path-browserify 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF path-browserify NOTICES AND INFORMATION - -%% path-is-absolute 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF path-is-absolute NOTICES AND INFORMATION - -%% path-parse 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Javier Blanco - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF path-parse NOTICES AND INFORMATION - -%% path-posix 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz) -========================================= -Node's license follows: - -==== - -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -==== - -========================================= -END OF path-posix NOTICES AND INFORMATION - -%% pdfkit 0.10.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/pdfkit/-/pdfkit-0.10.0.tgz) -========================================= -MIT LICENSE -Copyright (c) 2014 Devon Govett - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF pdfkit NOTICES AND INFORMATION - -%% performance-now 2.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz) -========================================= -Copyright (c) 2013 Braveg1rl - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF performance-now NOTICES AND INFORMATION - -%% pidusage 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 soyuka - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -========================================= -END OF pidusage NOTICES AND INFORMATION - -%% plotly.js-dist 1.51.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-1.51.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2019 Plotly, Inc - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF plotly.js-dist NOTICES AND INFORMATION - -%% png-js 0.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz) -========================================= -MIT License - -Copyright (c) 2017 Devon Govett - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF png-js NOTICES AND INFORMATION - -%% polygon-offset 0.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/polygon-offset/-/polygon-offset-0.3.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Alexander Milevski - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF polygon-offset NOTICES AND INFORMATION - -%% popper.js 1.16.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz) -========================================= -The MIT License (MIT) - -Copyright © 2016 Federico Zivolo and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF popper.js NOTICES AND INFORMATION - -%% portfinder 1.0.25 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz) -========================================= -node-portfinder - -Copyright (c) 2012 Charlie Robbins - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF portfinder NOTICES AND INFORMATION - -%% prelude-ls 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz) -========================================= -Copyright (c) George Zahariev - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF prelude-ls NOTICES AND INFORMATION - -%% process 0.11.10 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/process/-/process-0.11.10.tgz) -========================================= -(The MIT License) - -Copyright (c) 2013 Roman Shtylman - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF process NOTICES AND INFORMATION - -%% process-nextick-args 1.0.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz) -========================================= -# Copyright (c) 2015 Calvin Metcalf - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.** - -========================================= -END OF process-nextick-args NOTICES AND INFORMATION - -%% prop-types 15.7.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz) -========================================= -MIT License - -Copyright (c) 2013-present, Facebook, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF prop-types NOTICES AND INFORMATION - -%% pseudomap 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF pseudomap NOTICES AND INFORMATION - -%% psl 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/psl/-/psl-1.2.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2017 Lupo Montero lupomontero@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF psl NOTICES AND INFORMATION - -%% ptvsd 4.3.2 NOTICES AND INFORMATION BEGIN HERE (https://github.com/Microsoft/ptvsd/tree/v4.3.2) -========================================= -Copyright (c) Microsoft Corporation -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF ptvsd NOTICES AND INFORMATION - -%% punycode 2.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz) -========================================= -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF punycode NOTICES AND INFORMATION - -%% pure-color 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Nick Williams -Copyright (c) 2011 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -========================================= -END OF pure-color NOTICES AND INFORMATION - -%% py2app (for PyDev.Debugger) NOTICES AND INFORMATION BEGIN HERE (https://bitbucket.org/ronaldoussoren/py2app) -========================================= -This is the MIT license. This software may also be distributed under the same terms as Python (the PSF license). - -Copyright (c) 2004 Bob Ippolito. - -Some parts copyright (c) 2010-2014 Ronald Oussoren - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF py2app NOTICES AND INFORMATION - -%% PyDev.Debugger (for ptvsd 4) NOTICES AND INFORMATION BEGIN HERE (https://pypi.org/project/pydevd/) -========================================= -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' - from a Contributor if it was added to the Program by such Contributor - itself or anyone acting on such Contributor's behalf. Contributions do not - include additions to the Program which: (i) are separate modules of - software distributed in conjunction with the Program under their own - license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly - perform, distribute and sublicense the Contribution of such Contributor, - if any, and such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of - the Contribution and the Program if, at the time the Contribution is - added by the Contributor, such addition of the Contribution causes such - combination to be covered by the Licensed Patents. The patent license - shall not apply to any other combinations which include the Contribution. - No hardware per se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses - to its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other - entity based on infringement of intellectual property rights or - otherwise. As a condition to exercising the rights and licenses granted - hereunder, each Recipient hereby assumes sole responsibility to secure - any other intellectual property rights needed, if any. For example, if a - third party patent license is required to allow Recipient to distribute - the Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained - within the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, -if a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits and -other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such Commercial -Contributor in connection with its distribution of the Program in a commercial -product offering. The obligations in this section do not apply to any claims -or Losses relating to any actual or alleged intellectual property -infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor to control, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim at -its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each -Recipient is solely responsible for determining the appropriateness of using -and distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to the -risks and costs of program errors, compliance with applicable laws, damage to -or loss of data, programs or equipment, and unavailability or interruption of -operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue -and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of the -Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this Agreement, -whether expressly, by implication, estoppel or otherwise. All rights in the -Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - -========================================= -END OF PyDev.Debugger NOTICES AND INFORMATION - -%% pyparsing 2.4.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/pyparsing/pyparsing/tree/pyparsing_2.4.0) -========================================= -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF pyparsing NOTICES AND INFORMATION - -%% python-jsonrpc-server 0.2.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/palantir/python-jsonrpc-server/releases/tag/0.2.0) -========================================= -The MIT License (MIT) - -Copyright 2017 Palantir Technologies, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF python-jsonrpc-server NOTICES AND INFORMATION - -%% qs 6.5.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/qs/-/qs-6.5.2.tgz) -========================================= -Copyright (c) 2014 Nathan LaFreniere and other contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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. - * The names of any contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND 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. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors - -========================================= -END OF qs NOTICES AND INFORMATION - -%% querystringify 2.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF querystringify NOTICES AND INFORMATION - -%% quote-stream 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF quote-stream NOTICES AND INFORMATION - -%% react 16.8.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react/-/react-16.8.6.tgz) -========================================= -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react NOTICES AND INFORMATION - -%% react-annotation 2.1.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-annotation/-/react-annotation-2.1.6.tgz) -========================================= - - 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 (c) 2017, Susie Lu - - 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 OF react-annotation NOTICES AND INFORMATION - -%% react-base16-styling 0.5.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Alexander Kuznetsov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-base16-styling NOTICES AND INFORMATION - -%% react-color 2.17.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Case Sandberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-color NOTICES AND INFORMATION - -%% react-data-grid 6.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-data-grid/-/react-data-grid-6.1.0.tgz) -========================================= -The MIT License (MIT) - -Original work Copyright (c) 2014 Prometheus Research -Modified work Copyright 2015 Adazzle - -For the original source code please see https://github.com/prometheusresearch/react-grid - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF react-data-grid NOTICES AND INFORMATION - -%% react-dom 16.8.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz) -========================================= -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-dom NOTICES AND INFORMATION - -%% react-hot-loader 4.12.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.6.tgz) -========================================= -MIT License - -Copyright (c) 2016 Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-hot-loader NOTICES AND INFORMATION - -%% react-is 16.8.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz) -========================================= -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-is NOTICES AND INFORMATION - -%% react-json-tree 0.11.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Shusaku Uesugi, (c) 2016-present Alexander Kuznetsov - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-json-tree NOTICES AND INFORMATION - -%% react-lifecycles-compat 3.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz) -========================================= -MIT License - -Copyright (c) 2013-present, Facebook, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -========================================= -END OF react-lifecycles-compat NOTICES AND INFORMATION - -%% react-markdown 4.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-markdown/-/react-markdown-4.1.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Espen Hovlandsdal - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-markdown NOTICES AND INFORMATION - -%% react-popper 1.3.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2018 React Popper authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-popper NOTICES AND INFORMATION - -%% react-redux 7.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-redux/-/react-redux-7.1.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015-present Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-redux NOTICES AND INFORMATION - -%% react-svg-pan-zoom 3.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz) -========================================= -MIT License - -Copyright (c) 2016 https://github.com/chrvadala - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-svg-pan-zoom NOTICES AND INFORMATION - -%% react-svgmt 1.1.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-svgmt/-/react-svgmt-1.1.8.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2017 Hugo Zapata - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF react-svgmt NOTICES AND INFORMATION - -%% react-table 6.10.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-table/-/react-table-6.10.0.tgz) -========================================= -MIT License - -Copyright (c) 2016 Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-table NOTICES AND INFORMATION - -%% react-table-hoc-fixed-columns 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-table-hoc-fixed-columns/-/react-table-hoc-fixed-columns-1.0.2.tgz) -========================================= -MIT License - -Copyright (c) 2018 Guillaume Jasmin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF react-table-hoc-fixed-columns NOTICES AND INFORMATION - -%% react-transition-group 2.9.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz) -========================================= -BSD 3-Clause License - -Copyright (c) 2018, React Community -Forked from React (https://github.com/facebook/react) Copyright 2013-present, Facebook, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF react-transition-group NOTICES AND INFORMATION - -%% react-virtualized 9.21.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Brian Vaughn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF react-virtualized NOTICES AND INFORMATION - -%% reactcss 1.2.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Case Sandberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF reactcss NOTICES AND INFORMATION - -%% readable-stream 3.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz) -========================================= -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -========================================= -END OF readable-stream NOTICES AND INFORMATION - -%% redux 4.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/redux/-/redux-4.0.4.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015-present Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF redux NOTICES AND INFORMATION - -%% redux-logger 3.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz) -========================================= -Copyright (c) 2016 Eugene Rodionov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF redux-logger NOTICES AND INFORMATION - -%% reflect-metadata 0.1.13 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF reflect-metadata NOTICES AND INFORMATION - -%% regenerator-runtime 0.13.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz) -========================================= -MIT License - -Copyright (c) 2014-present, Facebook, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF regenerator-runtime NOTICES AND INFORMATION - -%% regexp.prototype.flags 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (C) 2014 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF regexp.prototype.flags NOTICES AND INFORMATION - -%% regression 2.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/regression/-/regression-2.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Tom Alexander - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF regression NOTICES AND INFORMATION - -%% remark-parse 5.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014-2016 Titus Wormer -Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -========================================= -END OF remark-parse NOTICES AND INFORMATION - -%% repeat-string 1.6.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014-2016, Jon Schlinkert. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF repeat-string NOTICES AND INFORMATION - -%% replace-ext 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 Blaine Bublitz , Eric Schoffstall and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF replace-ext NOTICES AND INFORMATION - -%% request 2.88.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/request/-/request-2.88.0.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF request NOTICES AND INFORMATION - -%% request-progress 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz) -========================================= -Copyright (c) 2012 IndigoUnited - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF request-progress NOTICES AND INFORMATION - -%% requires-port 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF requires-port NOTICES AND INFORMATION - -%% resize-observer-polyfill 1.5.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 Denis Rul - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF resize-observer-polyfill NOTICES AND INFORMATION - -%% resolve 1.11.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF resolve NOTICES AND INFORMATION - -%% restructure 0.5.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz) -========================================= -Copyright 2019 restructure developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF restructure NOTICES AND INFORMATION - -%% roughjs-es5 0.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/roughjs-es5/-/roughjs-es5-0.1.0.tgz) -========================================= -MIT License - -Copyright (c) 2018 Preet Shihn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF roughjs-es5 NOTICES AND INFORMATION - -%% rxjs 5.5.12 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz) -========================================= - 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 (c) 2015-2017 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors - - 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 OF rxjs NOTICES AND INFORMATION - -%% safe-buffer 5.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF safe-buffer NOTICES AND INFORMATION - -%% safer-buffer 2.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz) -========================================= -MIT License - -Copyright (c) 2018 Nikita Skovoroda - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF safer-buffer NOTICES AND INFORMATION - -%% sax 0.5.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/sax/-/sax-0.5.8.tgz) -========================================= -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -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 AUTHOR 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 AUTHOR 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. - - -The file "examples/strict.dtd" is licensed by the W3C and used according -to the terms of the W3C SOFTWARE NOTICE AND LICENSE. See LICENSE-W3C.html -for details. - -========================================= -END OF sax NOTICES AND INFORMATION - -%% scheduler 0.13.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz) -========================================= -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF scheduler NOTICES AND INFORMATION - -%% semiotic 1.19.11 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/semiotic/-/semiotic-1.19.11.tgz) -========================================= -Copyright 2017 Elijah Meeks - -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 OF semiotic NOTICES AND INFORMATION - -%% semiotic-mark 0.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/semiotic-mark/-/semiotic-mark-0.3.1.tgz) -========================================= -Copyright 2017 Elijah Meeks - -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 OF semiotic-mark NOTICES AND INFORMATION - -%% semver 5.7.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/semver/-/semver-5.7.0.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF semver NOTICES AND INFORMATION - -%% setImmediate (for RxJS 5.5) NOTICES AND INFORMATION BEGIN HERE (https://github.com/YuzuJS/setImmediate) -========================================= -Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF setImmediate NOTICES AND INFORMATION - -%% setimmediate 1.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz) -========================================= -Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF setimmediate NOTICES AND INFORMATION - -%% setprototypeof 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz) -========================================= -Copyright (c) 2015, Wes Todd - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF setprototypeof NOTICES AND INFORMATION - -%% shallow-copy 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF shallow-copy NOTICES AND INFORMATION - -%% simple-swizzle 0.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Josh Junon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF simple-swizzle NOTICES AND INFORMATION - -%% sizzle (for lodash 4.17) NOTICES AND INFORMATION BEGIN HERE (https://sizzlejs.com/) -========================================= -Copyright (c) 2009 John Resig - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF sizzle NOTICES AND INFORMATION - -%% slickgrid 2.4.17 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/slickgrid/-/slickgrid-2.4.17.tgz) -========================================= -Copyright (c) 2009-2019 Michael Leibman and Ben McIntyre, http://github.com/6pac/slickgrid - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF slickgrid NOTICES AND INFORMATION - -%% source-map 0.6.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz) -========================================= - -Copyright (c) 2009-2011, Mozilla Foundation and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the names of the Mozilla Foundation nor the names of project - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF source-map NOTICES AND INFORMATION - -%% sshpk 1.16.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz) -========================================= -Copyright Joyent, Inc. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF sshpk NOTICES AND INFORMATION - -%% stack-trace 0.0.10 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz) -========================================= -Copyright (c) 2011 Felix Geisendörfer (felix@debuggable.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -========================================= -END OF stack-trace NOTICES AND INFORMATION - -%% state-toggle 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF state-toggle NOTICES AND INFORMATION - -%% static-eval 2.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF static-eval NOTICES AND INFORMATION - -%% static-module 2.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF static-module NOTICES AND INFORMATION - -%% statuses 1.5.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz) -========================================= - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF statuses NOTICES AND INFORMATION - -%% string-hash 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz) -========================================= -To the extend possible by law, The Dark Sky Company, LLC has [waived all -copyright and related or neighboring rights][cc0] to this library. - -[cc0]: http://creativecommons.org/publicdomain/zero/1.0/ - -========================================= -END OF string-hash NOTICES AND INFORMATION - -%% string_decoder 1.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz) -========================================= -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - - -========================================= -END OF string_decoder NOTICES AND INFORMATION - -%% strip-ansi 5.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF strip-ansi NOTICES AND INFORMATION - -%% style-loader 0.23.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz) -========================================= -Copyright JS Foundation and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF style-loader NOTICES AND INFORMATION - -%% styled-jsx 3.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.2.1.tgz) -========================================= -MIT License - -Copyright (c) 2016-present Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF styled-jsx NOTICES AND INFORMATION - -%% stylis-rule-sheet 0.0.10 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz) -========================================= -MIT License - -Copyright (c) 2016 Sultan Tarimo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF stylis-rule-sheet NOTICES AND INFORMATION - -%% sudo-prompt 8.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Joran Dirk Greef - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF sudo-prompt NOTICES AND INFORMATION - -%% supports-color 5.5.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz) -========================================= -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF supports-color NOTICES AND INFORMATION - -%% svg-inline-react 3.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz) -========================================= -Copyright 2015-2017 Jaeho Lee - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF svg-inline-react NOTICES AND INFORMATION - -%% svg-path-bounding-box 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/svg-path-bounding-box/-/svg-path-bounding-box-1.0.4.tgz) -========================================= -MIT License - -Copyright (c) 2016 Sultan Tarimo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF svg-path-bounding-box NOTICES AND INFORMATION - -%% svg-to-pdfkit 0.1.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.7.tgz) -========================================= -Copyright 2019 svg-to-pdfkit developers - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF svg-to-pdfkit NOTICES AND INFORMATION - -%% svgpath 2.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/svgpath/-/svgpath-2.2.2.tgz) -========================================= -(The MIT License) - -Copyright (C) 2013-2015 by Vitaly Puzrin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -========================================= -END OF svgpath NOTICES AND INFORMATION - -%% symbol-observable 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) -Copyright (c) Ben Lesh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF symbol-observable NOTICES AND INFORMATION - -%% text-hex 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014-2015 Arnout Kazemier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF text-hex NOTICES AND INFORMATION - -%% throttleit 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/component/throttle/tree/1.0.0) -========================================= -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF throttleit NOTICES AND INFORMATION - -%% through 2.3.8 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/through/-/through-2.3.8.tgz) -========================================= -The MIT License - -Copyright (c) 2011 Dominic Tarr - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF through NOTICES AND INFORMATION - -%% through2 2.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/through2/-/through2-2.0.5.tgz) -========================================= -# The MIT License (MIT) - -**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF through2 NOTICES AND INFORMATION - -%% timers-browserify 2.0.10 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz) -========================================= -# timers-browserify - -This project uses the [MIT](http://jryans.mit-license.org/) license: - - Copyright © 2012 J. Ryan Stinnett - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the “Software”), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -# lib/node - -The `lib/node` directory borrows files from joyent/node which uses the following license: - - Copyright Joyent, Inc. and other Node contributors. All rights reserved. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - -========================================= -END OF timers-browserify NOTICES AND INFORMATION - -%% tiny-inflate 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz) -========================================= -Copyright 2018 - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF tiny-inflate NOTICES AND INFORMATION - -%% tinycolor2 1.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz) -========================================= -Copyright (c), Brian Grinstead, http://briangrinstead.com - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -========================================= -END OF tinycolor2 NOTICES AND INFORMATION - -%% tinyqueue 1.2.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz) -========================================= -ISC License - -Copyright (c) 2017, Vladimir Agafonkin - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -========================================= -END OF tinyqueue NOTICES AND INFORMATION - -%% tmp 0.0.29 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2014 KARASZI István - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF tmp NOTICES AND INFORMATION - -%% toidentifier 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz) -========================================= -MIT License - -Copyright (c) 2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF toidentifier NOTICES AND INFORMATION - -%% topojson-client 3.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz) -========================================= -Copyright 2012-2019 Michael Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -========================================= -END OF topojson-client NOTICES AND INFORMATION - -%% tough-cookie 2.4.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz) -========================================= -Copyright (c) 2015, Salesforce.com, Inc. -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. - -3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF tough-cookie NOTICES AND INFORMATION - -%% transformation-matrix 2.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz) -========================================= -MIT License - -Copyright (c) 2017 https://github.com/chrvadala - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF transformation-matrix NOTICES AND INFORMATION - -%% tree-kill 1.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz) -========================================= -MIT License - -Copyright (c) 2018 Peter Krumins - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF tree-kill NOTICES AND INFORMATION - -%% trim 0.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/trim/-/trim-0.0.1.tgz) -========================================= -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.XXX - -========================================= -END OF trim NOTICES AND INFORMATION - -%% trim-trailing-lines 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF trim-trailing-lines NOTICES AND INFORMATION - -%% triple-beam 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz) -========================================= -MIT License - -Copyright (c) 2017 winstonjs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF triple-beam NOTICES AND INFORMATION - -%% trough 1.0.4 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/trough/-/trough-1.0.4.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF trough NOTICES AND INFORMATION - -%% tslib 1.10.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 - -========================================= -END OF tslib NOTICES AND INFORMATION - -%% tsscmp 1.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2016 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF tsscmp NOTICES AND INFORMATION - -%% tunnel-agent 0.6.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz) -========================================= -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: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -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 - -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 -========================================= -END OF tunnel-agent NOTICES AND INFORMATION - -%% tweetnacl 0.14.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz) -========================================= -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - -========================================= -END OF tweetnacl NOTICES AND INFORMATION - -%% type-check 0.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz) -========================================= -Copyright (c) George Zahariev - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF type-check NOTICES AND INFORMATION - -%% type-is 1.6.18 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF type-is NOTICES AND INFORMATION - -%% typedarray 0.0.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz) -========================================= -/* - Copyright (c) 2010, Linden Research, Inc. - Copyright (c) 2012, Joshua Bell - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - $/LicenseInfo$ - */ - -// Original can be found at: -// https://bitbucket.org/lindenlab/llsd -// Modifications by Joshua Bell inexorabletash@gmail.com -// https://github.com/inexorabletash/polyfill - -// ES3/ES5 implementation of the Krhonos Typed Array Specification -// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ -// Date: 2011-02-01 -// -// Variations: -// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) - -========================================= -END OF typedarray NOTICES AND INFORMATION - -%% typescript-char 0.0.0 NOTICES AND INFORMATION BEGIN HERE (https://github.com/mason-lang/typescript-char) -========================================= -http://unlicense.org/UNLICENSE -========================================= -END OF typescript-char NOTICES AND INFORMATION - -%% uint64be 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF uint64be NOTICES AND INFORMATION - -%% underscore 1.8.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz) -========================================= -Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative -Reporters & Editors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF underscore NOTICES AND INFORMATION - -%% unherit 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF unherit NOTICES AND INFORMATION - -%% unicode 10.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unicode/-/unicode-10.0.0.tgz) -========================================= -Copyright (c) 2014 ▟ ▖▟ ▖(dodo) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unicode NOTICES AND INFORMATION - -%% unicode-trie 0.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz) -========================================= -Copyright 2018 - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unicode-trie NOTICES AND INFORMATION - -%% unified 6.2.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unified/-/unified-6.2.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF unified NOTICES AND INFORMATION - -%% uniqid 5.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/uniqid/-/uniqid-5.0.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Halász Ádám - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF uniqid NOTICES AND INFORMATION - -%% unist-util-is 3.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz) -========================================= -(The MIT license) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unist-util-is NOTICES AND INFORMATION - -%% unist-util-remove-position 1.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unist-util-remove-position NOTICES AND INFORMATION - -%% unist-util-stringify-position 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unist-util-stringify-position NOTICES AND INFORMATION - -%% unist-util-visit 1.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unist-util-visit NOTICES AND INFORMATION - -%% unist-util-visit-parents 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF unist-util-visit-parents NOTICES AND INFORMATION - -%% universalify 0.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2017, Ryan Zimmerman - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the 'Software'), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF universalify NOTICES AND INFORMATION - -%% untildify 3.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF untildify NOTICES AND INFORMATION - -%% uri-js 4.2.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz) -========================================= -Copyright 2011 Gary Court. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 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 GARY COURT "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 GARY COURT 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. - -The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. - -========================================= -END OF uri-js NOTICES AND INFORMATION - -%% url-parse 1.4.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF url-parse NOTICES AND INFORMATION - -%% util 0.11.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/util/-/util-0.11.1.tgz) -========================================= -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF util NOTICES AND INFORMATION - -%% util-deprecate 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014 Nathan Rajlich - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF util-deprecate NOTICES AND INFORMATION - -%% uuid 3.3.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2010-2016 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF uuid NOTICES AND INFORMATION - -%% validator 9.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/validator/-/validator-9.4.1.tgz) -========================================= -Copyright (c) 2016 Chris O'Hara - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF validator NOTICES AND INFORMATION - -%% vary 1.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vary/-/vary-1.1.2.tgz) -========================================= -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vary NOTICES AND INFORMATION - -%% vega 5.7.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega/-/vega-5.7.3.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega NOTICES AND INFORMATION - -%% vega-canvas 1.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-canvas NOTICES AND INFORMATION - -%% vega-crossfilter 4.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-crossfilter NOTICES AND INFORMATION - -%% vega-dataflow 5.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.4.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-dataflow NOTICES AND INFORMATION - -%% vega-embed 4.2.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-embed/-/vega-embed-4.2.5.tgz) -========================================= -Copyright (c) 2015, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-embed NOTICES AND INFORMATION - -%% vega-encode 4.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-encode/-/vega-encode-4.4.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-encode NOTICES AND INFORMATION - -%% vega-event-selector 2.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-event-selector NOTICES AND INFORMATION - -%% vega-expression 2.6.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.2.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-expression NOTICES AND INFORMATION - -%% vega-force 4.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-force/-/vega-force-4.0.3.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-force NOTICES AND INFORMATION - -%% vega-functions 5.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-functions/-/vega-functions-5.4.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-functions NOTICES AND INFORMATION - -%% vega-geo 4.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-geo/-/vega-geo-4.1.0.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-geo NOTICES AND INFORMATION - -%% vega-hierarchy 4.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-hierarchy NOTICES AND INFORMATION - -%% vega-lite 3.4.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-lite/-/vega-lite-3.4.0.tgz) -========================================= -Copyright (c) 2015, University of Washington Interactive Data Lab. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the University of Washington Interactive Data Lab - nor the names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-lite NOTICES AND INFORMATION - -%% vega-loader 4.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-loader/-/vega-loader-4.1.2.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-loader NOTICES AND INFORMATION - -%% vega-parser 5.10.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-parser/-/vega-parser-5.10.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-parser NOTICES AND INFORMATION - -%% vega-projection 1.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-projection/-/vega-projection-1.3.0.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-projection NOTICES AND INFORMATION - -%% vega-regression 1.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-regression/-/vega-regression-1.0.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-regression NOTICES AND INFORMATION - -%% vega-runtime 5.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-runtime/-/vega-runtime-5.0.2.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-runtime NOTICES AND INFORMATION - -%% vega-scale 4.1.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-scale/-/vega-scale-4.1.3.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-scale NOTICES AND INFORMATION - -%% vega-scenegraph 4.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.3.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-scenegraph NOTICES AND INFORMATION - -%% vega-schema-url-parser 1.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz) -========================================= -BSD 3-Clause License - -Copyright (c) 2017, Vega -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF vega-schema-url-parser NOTICES AND INFORMATION - -%% vega-selections 5.0.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-selections/-/vega-selections-5.0.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-selections NOTICES AND INFORMATION - -%% vega-statistics 1.6.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.6.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-statistics NOTICES AND INFORMATION - -%% vega-themes 2.5.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-themes/-/vega-themes-2.5.0.tgz) -========================================= -Copyright (c) 2016, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-themes NOTICES AND INFORMATION - -%% vega-tooltip 0.18.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.18.1.tgz) -========================================= -Copyright 2016 Interactive Data Lab and contributors - -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. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. - -========================================= -END OF vega-tooltip NOTICES AND INFORMATION - -%% vega-transforms 4.4.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.4.3.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-transforms NOTICES AND INFORMATION - -%% vega-util 1.12.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-util/-/vega-util-1.12.0.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-util NOTICES AND INFORMATION - -%% vega-view 5.3.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-view/-/vega-view-5.3.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-view NOTICES AND INFORMATION - -%% vega-view-transforms 4.4.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.4.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-view-transforms NOTICES AND INFORMATION - -%% vega-voronoi 4.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.1.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-voronoi NOTICES AND INFORMATION - -%% vega-wordcloud 4.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.0.2.tgz) -========================================= -Copyright (c) 2015-2018, University of Washington Interactive Data Lab -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. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -========================================= -END OF vega-wordcloud NOTICES AND INFORMATION - -%% verror 1.10.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/verror/-/verror-1.10.0.tgz) -========================================= -Copyright (c) 2016, Joyent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE - -========================================= -END OF verror NOTICES AND INFORMATION - -%% vfile 2.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz) -========================================= -(The MIT License) - -Copyright (c) 2015 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF vfile NOTICES AND INFORMATION - -%% vfile-location 2.0.5 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz) -========================================= -(The MIT License) - -Copyright (c) 2016 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vfile-location NOTICES AND INFORMATION - -%% vfile-message 1.1.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz) -========================================= -(The MIT License) - -Copyright (c) 2017 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vfile-message NOTICES AND INFORMATION - -%% viz-annotation 0.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/viz-annotation/-/viz-annotation-0.0.3.tgz) -========================================= -Copyright 2018 Susie Lu - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF viz-annotation NOTICES AND INFORMATION - -%% vlq 0.2.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz) -========================================= -Copyright (c) 2017 [these people](https://github.com/Rich-Harris/vlq/graphs/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vlq NOTICES AND INFORMATION - -%% vscode-debugadapter 1.35.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.35.0.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-debugadapter NOTICES AND INFORMATION - -%% vscode-debugprotocol 1.35.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.35.0.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-debugprotocol NOTICES AND INFORMATION - -%% vscode-extension-telemetry 0.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.0.tgz) -========================================= -vscode-extension-telemetry - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -========================================= -END OF vscode-extension-telemetry NOTICES AND INFORMATION - -%% vscode-jsonrpc 4.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-jsonrpc NOTICES AND INFORMATION - -%% vscode-languageclient 5.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-languageclient NOTICES AND INFORMATION - -%% vscode-languageserver 5.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-languageserver NOTICES AND INFORMATION - -%% vscode-languageserver-protocol 3.14.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-languageserver-protocol NOTICES AND INFORMATION - -%% vscode-languageserver-types 3.14.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz) -========================================= -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF vscode-languageserver-types NOTICES AND INFORMATION - -%% vsls 0.3.1291 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/vsls/-/vsls-0.3.1291.tgz) -========================================= -MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS - -MICROSOFT VISUAL STUDIO LIVE SHARE SOFTWARE - -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. They apply to the pre-release software named above. The terms also apply to any Microsoft services or updates for the software, except to the extent those have additional terms. - -IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. - -1. INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to evaluate it as you develop and test your software applications. You may use the software only with Microsoft Visual Studio or Visual Studio Code. The software works in tandem with an associated preview release service, as described below. - -2. PRE-RELEASE SOFTWARE. The software is a pre-release version. It may not work the way a final version of the software will. Microsoft may change it for the final, commercial version. We also may not release a commercial version. Microsoft is not obligated to provide maintenance, technical support or updates to you for the software. - -3. ASSOCIATED ONLINE SERVICES. - - a. Microsoft Azure Services. Some features of the software provide access to, or rely on, Azure online services, including an associated Azure online service to the software, Visual Studio Live Share (the “corresponding service”). The use of those services (but not the software) is governed by the separate terms and privacy policies in the agreement under which you obtained the Azure services at https://go.microsoft.com/fwLink/p/?LinkID=233178 (and, with respect to the corresponding service, the additional terms below). Please read them. The services may not be available in all regions. - - b. Limited Availability. The corresponding service is currently in “Preview,” and therefore, we may change or discontinue the corresponding service at any time without notice. Any changes or updates to the corresponding service may cause the software to stop working and may result in the deletion of any data stored on the corresponding service. You may not receive notice prior to these updates. - -4. Licenses for other components. The software may include third party components with separate legal notices or governed by other agreements, as described in the ThirdPartyNotices file accompanying the software. Even if such components are governed by other agreements, the disclaimers and the limitations on and exclusions of damages below also apply. - -5. DATA. - - a. Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt out of many of these scenarios, but not all, as described in the product documentation. In using the software, you must comply with applicable law. You can learn more about data collection and use in the help documentation and the privacy statement at http://go.microsoft.com/fwlink/?LinkId=398505. Your use of the software operates as your consent to these practices. - - b. Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at http://go.microsoft.com/?linkid=9840733. - -6. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because we include your feedback in them. These rights survive this agreement. - -7. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. For example, if Microsoft technically limits or disables extensibility for the software, you may not extend the software by, among other things, loading or injecting into the software any non-Microsoft add-ins, macros, or packages; modifying the software registry settings; or adding features or functionality equivalent to that found in other Visual Studio products. You may not: - - * work around any technical limitations in the software; - - * reverse engineer, decompile or disassemble the software, or attempt to do so, except and only to the extent required by third party licensing terms governing use of certain open source components that may be included with the software; - - * remove, minimize, block or modify any notices of Microsoft or its suppliers in the software; - - * use the software in any way that is against the law; or - - * share, publish, rent or lease the software, or provide the software as a stand-alone offering for others to use. - -8. UPDATES. The software may periodically check for updates and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. - -9. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users and end use. For further information on export restrictions, visit (aka.ms/exporting). - -10. SUPPORT SERVICES. Because the software is “as is,” we may not provide support services for it. - -11. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. - -12. APPLICABLE LAW. If you acquired the software in the United States, Washington State law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. - -13. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: - - a. Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. - - b. Canada. If you acquired the software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. - - c. Germany and Austria. - - (i) Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. - - (ii) Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. - - Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. - -14. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. - -15. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -16. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. - - This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. - - It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. - -Please note: As the software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. - -Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. - -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. - -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. - -Cette limitation concerne : - -* tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et - -* les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. - -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. - -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. - -========================================= -END OF vsls NOTICES AND INFORMATION - -%% warning 4.0.3 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/warning/-/warning-4.0.3.tgz) -========================================= -MIT License - -Copyright (c) 2013-present, Facebook, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF warning NOTICES AND INFORMATION - -%% webpack (for lodash 4) NOTICES AND INFORMATION BEGIN HERE (https://webpack.js.org/) -========================================= -Copyright (c) JS Foundation and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF webpack NOTICES AND INFORMATION - -%% winreg 1.2.4 NOTICES AND INFORMATION BEGIN HERE (https://github.com/fresc81/node-winreg/tree/v1.2.4) -========================================= -This project is released under [BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause). - -Copyright (c) 2016, Paul Bottin All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * 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. - -========================================= -END OF winreg NOTICES AND INFORMATION - -%% winston 3.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/winston/-/winston-3.2.1.tgz) -========================================= -Copyright (c) 2010 Charlie Robbins - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -========================================= -END OF winston NOTICES AND INFORMATION - -%% winston-transport 4.3.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2015 Charlie Robbins & the contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -========================================= -END OF winston-transport NOTICES AND INFORMATION - -%% wordwrap 1.0.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz) -========================================= -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF wordwrap NOTICES AND INFORMATION - -%% wrappy 1.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF wrappy NOTICES AND INFORMATION - -%% ws 6.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ws/-/ws-6.2.1.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2011 Einar Otto Stangvik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -========================================= -END OF ws NOTICES AND INFORMATION - -%% x-is-string 0.1.0 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz) -========================================= -Copyright (c) 2014 Matt-Esch. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF x-is-string NOTICES AND INFORMATION - -%% xml2js 0.4.19 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz) -========================================= -Copyright 2010, 2011, 2012, 2013. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - -========================================= -END OF xml2js NOTICES AND INFORMATION - -%% xmlbuilder 9.0.7 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz) -========================================= -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF xmlbuilder NOTICES AND INFORMATION - -%% xtend 4.0.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz) -========================================= -The MIT License (MIT) -Copyright (c) 2012-2014 Raynos. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF xtend NOTICES AND INFORMATION - -%% yallist 2.1.2 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz) -========================================= -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -========================================= -END OF yallist NOTICES AND INFORMATION - -%% ylru 1.2.1 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz) -========================================= -Copyright (c) 2016 node-modules -Copyright (c) 2016 'Dominic Tarr' - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -========================================= -END OF ylru NOTICES AND INFORMATION - -%% zone.js 0.7.6 NOTICES AND INFORMATION BEGIN HERE (https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz) -========================================= -The MIT License - -Copyright (c) 2016 Google, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -========================================= -END OF zone.js NOTICES AND INFORMATION diff --git a/ThirdPartyNotices-Repository.txt b/ThirdPartyNotices-Repository.txt index 21582af67bdf..9e7e822af1bb 100644 --- a/ThirdPartyNotices-Repository.txt +++ b/ThirdPartyNotices-Repository.txt @@ -6,18 +6,17 @@ Microsoft Python extension for Visual Studio Code incorporates third party mater 1. Go for Visual Studio Code (https://github.com/Microsoft/vscode-go) 2. Files from the Python Project (https://www.python.org/) -3. Google Diff Match and Patch (https://github.com/GerHobbelt/google-diff-match-patch) -6. omnisharp-vscode (https://github.com/OmniSharp/omnisharp-vscode) -8. PTVS (https://github.com/Microsoft/PTVS) -9. Python documentation (https://docs.python.org/) -10. python-functools32 (https://github.com/MiCHiLU/python-functools32/blob/master/functools32/functools32.py) -11. pythonVSCode (https://github.com/DonJayamanne/pythonVSCode) -12. Sphinx (http://sphinx-doc.org/) -13. nteract (https://github.com/nteract/nteract) -14. less-plugin-inline-urls (https://github.com/less/less-plugin-inline-urls/) -15. jupyter-notebook (https://github.com/jupyter/notebook) -16. ipywidgets (https://github.com/jupyter-widgets) -17. vscode-cpptools (https://github.com/microsoft/vscode-cpptools) +3. omnisharp-vscode (https://github.com/OmniSharp/omnisharp-vscode) +4. PTVS (https://github.com/Microsoft/PTVS) +5. Python documentation (https://docs.python.org/) +6. python-functools32 (https://github.com/MiCHiLU/python-functools32/blob/master/functools32/functools32.py) +7. pythonVSCode (https://github.com/DonJayamanne/pythonVSCode) +8. Sphinx (http://sphinx-doc.org/) +9. nteract (https://github.com/nteract/nteract) +10. less-plugin-inline-urls (https://github.com/less/less-plugin-inline-urls/) +11. vscode-cpptools (https://github.com/microsoft/vscode-cpptools) +12. mocha (https://github.com/mochajs/mocha) +13. get-pip (https://github.com/pypa/get-pip) %% Go for Visual Studio Code NOTICES, INFORMATION, AND LICENSE BEGIN HERE @@ -244,25 +243,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ========================================= END OF Files from the Python Project NOTICES, INFORMATION, AND LICENSE -%% Google Diff Match and Patch NOTICES, INFORMATION, AND LICENSE BEGIN HERE -========================================= - * Copyright 2006 Google Inc. - * http://code.google.com/p/google-diff-match-patch/ - * - * 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 OF Google Diff Match and Patch NOTICES, INFORMATION, AND LICENSE - %% omnisharp-vscode NOTICES, INFORMATION, AND LICENSE BEGIN HERE ========================================= Copyright (c) Microsoft Corporation @@ -964,132 +944,91 @@ Apache License ========================================= END OF less-plugin-inline-urls NOTICES, INFORMATION, AND LICENSE -%% jupyter notebook NOTICES, INFORMATION, AND LICENSE BEGIN HERE +%% vscode-cpptools NOTICES, INFORMATION, AND LICENSE BEGIN HERE ========================================= -# Licensing terms +vscode-cpptools -This project is licensed under the terms of the Modified BSD License -(also known as New or Revised or 3-Clause BSD), as follows: - -- Copyright (c) 2001-2015, IPython Development Team -- Copyright (c) 2015-, Jupyter Development Team +Copyright (c) Microsoft Corporation All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -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. - -Neither the name of the Jupyter Development Team nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## About the Jupyter Development Team - -The Jupyter Development Team is the set of all contributors to the Jupyter project. -This includes all of the Jupyter subprojects. - -The core team that coordinates development on GitHub can be found here: -https://github.com/jupyter/. +MIT License -## Our Copyright Policy +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in the +Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -Jupyter uses a shared copyright model. Each contributor maintains copyright -over their contributions to Jupyter. But, it is important to note that these -contributions are typically only changes to the repositories. Thus, the Jupyter -source code, in its entirety is not the copyright of any single person or -institution. Instead, it is the collective copyright of the entire Jupyter -Development Team. If individual contributors want to maintain a record of what -changes/contributions they have specific copyright on, they should indicate -their copyright in the commit message of the change, when they commit the -change to one of the Jupyter repositories. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -With this in mind, the following banner should be used in any source code file -to indicate the copyright and license terms: +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT - # Copyright (c) Jupyter Development Team. - # Distributed under the terms of the Modified BSD License. +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= -END OF jupyter notebook NOTICES, INFORMATION, AND LICENSE +END OF vscode-cpptools NOTICES, INFORMATION, AND LICENSE -%% ipywidgets NOTICES, INFORMATION, AND LICENSE BEGIN HERE +%% mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE ========================================= -Copyright (c) 2015 Project Jupyter Contributors -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +(The MIT License) -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Copyright (c) 2011-2020 OpenJS Foundation and contributors, https://openjsf.org -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. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -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. -========================================= -END OF ipywidgets NOTICES, INFORMATION, AND LICENSE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -%% vscode-cpptools NOTICES, INFORMATION, AND LICENSE BEGIN HERE ========================================= -vscode-cpptools - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the Software), to deal in the -Software without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +END OF mocha NOTICES, INFORMATION, AND LICENSE -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT +%% get-pip NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +Copyright (c) 2008-2019 The pip developers + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= -END OF vscode-cpptools NOTICES, INFORMATION, AND LICENSE +END OF get-pip NOTICES, INFORMATION, AND LICENSE diff --git a/build/.mocha-multi-reporters.config b/build/.mocha-multi-reporters.config index 539aa1c15b60..abe46f117f5b 100644 --- a/build/.mocha-multi-reporters.config +++ b/build/.mocha-multi-reporters.config @@ -1,3 +1,3 @@ { - "reporterEnabled": "spec,mocha-junit-reporter" + "reporterEnabled": "./build/ci/scripts/spec_with_pid,mocha-junit-reporter" } diff --git a/build/.mocha.functional.json b/build/.mocha.functional.json new file mode 100644 index 000000000000..71998902e984 --- /dev/null +++ b/build/.mocha.functional.json @@ -0,0 +1,14 @@ +{ + "spec": "./out/test/**/*.functional.test.js", + "require": [ + "out/test/unittests.js" + ], + "exclude": "out/**/*.jsx", + "reporter": "mocha-multi-reporters", + "reporter-option": "configFile=./build/.mocha-multi-reporters.config", + "ui": "tdd", + "recursive": true, + "colors": true, + "exit": true, + "timeout": 180000 +} diff --git a/build/.mocha.functional.opts b/build/.mocha.functional.opts deleted file mode 100644 index 47ae4d6eeb25..000000000000 --- a/build/.mocha.functional.opts +++ /dev/null @@ -1,10 +0,0 @@ -./out/test/**/*.functional.test.js ---require=out/test/unittests.js ---exclude=out/**/*.jsx ---ui=tdd ---recursive ---colors ---exit ---timeout=180000 ---reporter mocha-multi-reporters ---reporter-options configFile=build/.mocha-multi-reporters.config diff --git a/build/.mocha.functional.perf.json b/build/.mocha.functional.perf.json new file mode 100644 index 000000000000..d67cbb73e8f7 --- /dev/null +++ b/build/.mocha.functional.perf.json @@ -0,0 +1,11 @@ +{ + "spec": "./out/test/**/*.functional.test.js", + "exclude-out": "out/**/*.jsx", + "require": ["out/test/unittests.js"], + "reporter": "spec", + "ui": "tdd", + "recursive": true, + "colors": true, + "exit": true, + "timeout": 180000 +} diff --git a/build/.mocha.perf.config b/build/.mocha.perf.config new file mode 100644 index 000000000000..50ae73444d09 --- /dev/null +++ b/build/.mocha.perf.config @@ -0,0 +1,6 @@ +{ + "reporterEnabled": "spec,xunit", + "xunitReporterOptions": { + "output": "xunit-test-results.xml" + } +} diff --git a/build/.mocha.performance.json b/build/.mocha.performance.json new file mode 100644 index 000000000000..84dc3952cc85 --- /dev/null +++ b/build/.mocha.performance.json @@ -0,0 +1,11 @@ +{ + "spec": "./out/test/**/*.functional.test.js", + "require": ["out/test/unittests.js"], + "reporter": "mocha-multi-reporters", + "reporter-option": "configFile=build/.mocha.perf.config", + "ui": "tdd", + "recursive": true, + "colors": true, + "exit": true, + "timeout": 30000 +} diff --git a/build/.mocha.performance.opts b/build/.mocha.performance.opts deleted file mode 100644 index 98d40abcc82c..000000000000 --- a/build/.mocha.performance.opts +++ /dev/null @@ -1,10 +0,0 @@ -./out/test/**/*.functional.test.js ---require=out/test/unittests.js ---ui=tdd ---recursive ---colors ---exit ---timeout=180000 ---reporter mocha-multi-reporters ---reporter-options configFile=build/.mocha-multi-reporters.config ---grep DataScience diff --git a/build/.mocha.unittests.js.json b/build/.mocha.unittests.js.json new file mode 100644 index 000000000000..a0bc134c7dc8 --- /dev/null +++ b/build/.mocha.unittests.js.json @@ -0,0 +1,9 @@ +{ + "spec": "./out/test/**/*.unit.test.js", + "require": ["source-map-support/register", "out/test/unittests.js"], + "reporter": "mocha-multi-reporters", + "reporter-option": "configFile=build/.mocha-multi-reporters.config", + "ui": "tdd", + "recursive": true, + "colors": true +} diff --git a/build/.mocha.unittests.js.opts b/build/.mocha.unittests.js.opts deleted file mode 100644 index 314f85a1d3a9..000000000000 --- a/build/.mocha.unittests.js.opts +++ /dev/null @@ -1,8 +0,0 @@ ---require source-map-support/register ---require out/test/unittests.js ---reporter mocha-multi-reporters ---reporter-options configFile=build/.mocha-multi-reporters.config ---ui tdd ---recursive ---colors -./out/test/**/*.unit.test.js \ No newline at end of file diff --git a/build/.mocha.unittests.json b/build/.mocha.unittests.json new file mode 100644 index 000000000000..cb6bff959497 --- /dev/null +++ b/build/.mocha.unittests.json @@ -0,0 +1,13 @@ +{ + "spec": "./out/test/**/*.unit.test.js", + "require": [ + "out/test/unittests.js" + ], + "exclude": "out/**/*.jsx", + "reporter": "mocha-multi-reporters", + "reporter-option": "configFile=./build/.mocha-multi-reporters.config", + "ui": "tdd", + "recursive": true, + "colors": true, + "timeout": 180000 +} diff --git a/build/.mocha.unittests.opts b/build/.mocha.unittests.opts deleted file mode 100644 index 1583fcaaa727..000000000000 --- a/build/.mocha.unittests.opts +++ /dev/null @@ -1,7 +0,0 @@ -./out/test/**/*.unit.test.js ---require out/test/unittests.js ---reporter mocha-multi-reporters ---reporter-options configFile=build/.mocha-multi-reporters.config ---ui tdd ---recursive ---colors diff --git a/build/.mocha.unittests.ts.json b/build/.mocha.unittests.ts.json new file mode 100644 index 000000000000..b20e02bfa96f --- /dev/null +++ b/build/.mocha.unittests.ts.json @@ -0,0 +1,9 @@ +{ + "spec": "./src/test/**/*.unit.test.ts", + "require": ["ts-node/register", "out/test/unittests.js"], + "reporter": "mocha-multi-reporters", + "reporter-option": "configFile=build/.mocha-multi-reporters.config", + "ui": "tdd", + "recursive": true, + "colors": true +} diff --git a/build/.mocha.unittests.ts.opts b/build/.mocha.unittests.ts.opts deleted file mode 100644 index 9d97e8ef972a..000000000000 --- a/build/.mocha.unittests.ts.opts +++ /dev/null @@ -1,8 +0,0 @@ ---require ts-node/register ---require src/test/unittests.ts ---reporter mocha-multi-reporters ---reporter-options configFile=build/.mocha-multi-reporters.config ---ui tdd ---recursive ---colors -./src/test/**/*.unit.test.ts diff --git a/build/.nycrc b/build/.nycrc index e9540ef130f2..b92a4f36785d 100644 --- a/build/.nycrc +++ b/build/.nycrc @@ -2,8 +2,8 @@ "extends": "@istanbuljs/nyc-config-typescript", "all": true, "include": [ - "src/client/**/*.ts", "src/test/**/*.js", - "src/datascience-ui/**/*.ts", "src/datascience-ui/**/*.js" + "src/client/**/*.ts", "out/client/**/*.js" ], - "exclude": ["src/test/**/*.ts", "src/test/**/*.js"] -} \ No newline at end of file + "exclude": ["src/test/**/*.ts", "out/test/**/*.js"], + "exclude-node-modules": true +} diff --git a/build/azure-pipeline.pre-release.yml b/build/azure-pipeline.pre-release.yml new file mode 100644 index 000000000000..e7159618d3ae --- /dev/null +++ b/build/azure-pipeline.pre-release.yml @@ -0,0 +1,158 @@ +# Run on a schedule +trigger: none +pr: none + +schedules: + - cron: '0 10 * * 1-5' # 10AM UTC (2AM PDT) MON-FRI (VS Code Pre-release builds at 9PM PDT) + displayName: Nightly Pre-Release Schedule + always: false # only run if there are source code changes + branches: + include: + - main + +resources: + repositories: + - repository: templates + type: github + name: microsoft/vscode-engineering + ref: main + endpoint: Monaco + +parameters: + - name: publishExtension + displayName: 🚀 Publish Extension + type: boolean + default: false + +extends: + template: azure-pipelines/extension/pre-release.yml@templates + parameters: + publishExtension: ${{ parameters.publishExtension }} + ghCreateTag: false + standardizedVersioning: true + l10nSourcePaths: ./src/client + + buildPlatforms: + - name: Linux + vsceTarget: 'web' + - name: Linux + packageArch: arm64 + vsceTarget: linux-arm64 + - name: Linux + packageArch: arm + vsceTarget: linux-armhf + - name: Linux + packageArch: x64 + vsceTarget: linux-x64 + - name: Linux + packageArch: arm64 + vsceTarget: alpine-arm64 + - name: Linux + packageArch: x64 + vsceTarget: alpine-x64 + - name: MacOS + packageArch: arm64 + vsceTarget: darwin-arm64 + - name: MacOS + packageArch: x64 + vsceTarget: darwin-x64 + - name: Windows + packageArch: arm + vsceTarget: win32-arm64 + - name: Windows + packageArch: x64 + vsceTarget: win32-x64 + + buildSteps: + - task: NodeTool@0 + inputs: + versionSpec: '22.17.0' + displayName: Select Node version + + - task: UsePythonVersion@0 + inputs: + versionSpec: '3.9' + addToPath: true + architecture: 'x64' + displayName: Select Python version + + - script: python -m pip install -U pip + displayName: Upgrade pip + + - script: python -m pip install wheel nox + displayName: Install wheel and nox + + - script: npm ci + displayName: Install NPM dependencies + + - script: nox --session install_python_libs + displayName: Install Jedi, get-pip, etc + + - script: python ./build/update_package_file.py + displayName: Update telemetry in package.json + + - script: npm run addExtensionPackDependencies + displayName: Update optional extension dependencies + + - script: npx gulp prePublishBundle + displayName: Build + + - bash: | + mkdir -p $(Build.SourcesDirectory)/python-env-tools/bin + chmod +x $(Build.SourcesDirectory)/python-env-tools/bin + displayName: Make Directory for python-env-tool binary + + - bash: | + if [ "$(vsceTarget)" == "win32-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-pc-windows-msvc" + elif [ "$(vsceTarget)" == "win32-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-pc-windows-msvc" + elif [ "$(vsceTarget)" == "linux-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + elif [ "$(vsceTarget)" == "linux-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-unknown-linux-gnu" + elif [ "$(vsceTarget)" == "linux-armhf" ]; then + echo "##vso[task.setvariable variable=buildTarget]armv7-unknown-linux-gnueabihf" + elif [ "$(vsceTarget)" == "darwin-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-apple-darwin" + elif [ "$(vsceTarget)" == "darwin-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-apple-darwin" + elif [ "$(vsceTarget)" == "alpine-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + elif [ "$(vsceTarget)" == "alpine-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-unknown-linux-gnu" + elif [ "$(vsceTarget)" == "web" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + else + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + fi + displayName: Set buildTarget variable + + - task: DownloadPipelineArtifact@2 + inputs: + buildType: 'specific' + project: 'Monaco' + definition: 591 + buildVersionToDownload: 'latest' + branchName: 'refs/heads/main' + targetPath: '$(Build.SourcesDirectory)/python-env-tools/bin' + artifactName: 'bin-$(buildTarget)' + itemPattern: | + pet.exe + pet + ThirdPartyNotices.txt + + - bash: | + ls -lf ./python-env-tools/bin + chmod +x ./python-env-tools/bin/pet* + ls -lf ./python-env-tools/bin + displayName: Set chmod for pet binary + + - script: python -c "import shutil; shutil.rmtree('.nox', ignore_errors=True)" + displayName: Clean up Nox + + tsa: + config: + areaPath: 'Visual Studio Code Python Extensions' + serviceTreeID: '6e6194bc-7baa-4486-86d0-9f5419626d46' + enabled: true diff --git a/build/azure-pipeline.stable.yml b/build/azure-pipeline.stable.yml new file mode 100644 index 000000000000..cd66613eec8d --- /dev/null +++ b/build/azure-pipeline.stable.yml @@ -0,0 +1,153 @@ +trigger: none +# branches: +# include: +# - release* +# tags: +# include: ['*'] +pr: none + +resources: + repositories: + - repository: templates + type: github + name: microsoft/vscode-engineering + ref: main + endpoint: Monaco + +parameters: + - name: publishExtension + displayName: 🚀 Publish Extension + type: boolean + default: false + +extends: + template: azure-pipelines/extension/stable.yml@templates + parameters: + publishExtension: ${{ parameters.publishExtension }} + l10nSourcePaths: ./src/client + + buildPlatforms: + - name: Linux + vsceTarget: 'web' + - name: Linux + packageArch: arm64 + vsceTarget: linux-arm64 + - name: Linux + packageArch: arm + vsceTarget: linux-armhf + - name: Linux + packageArch: x64 + vsceTarget: linux-x64 + - name: Linux + packageArch: arm64 + vsceTarget: alpine-arm64 + - name: Linux + packageArch: x64 + vsceTarget: alpine-x64 + - name: MacOS + packageArch: arm64 + vsceTarget: darwin-arm64 + - name: MacOS + packageArch: x64 + vsceTarget: darwin-x64 + - name: Windows + packageArch: arm + vsceTarget: win32-arm64 + - name: Windows + packageArch: x64 + vsceTarget: win32-x64 + + buildSteps: + - task: NodeTool@0 + inputs: + versionSpec: '22.17.0' + displayName: Select Node version + + - task: UsePythonVersion@0 + inputs: + versionSpec: '3.9' + addToPath: true + architecture: 'x64' + displayName: Select Python version + + - script: python -m pip install -U pip + displayName: Upgrade pip + + - script: python -m pip install wheel nox + displayName: Install wheel and nox + + - script: npm ci + displayName: Install NPM dependencies + + - script: nox --session install_python_libs + displayName: Install Jedi, get-pip, etc + + - script: python ./build/update_package_file.py + displayName: Update telemetry in package.json + + - script: npm run addExtensionPackDependencies + displayName: Update optional extension dependencies + + - script: npx gulp prePublishBundle + displayName: Build + + - bash: | + mkdir -p $(Build.SourcesDirectory)/python-env-tools/bin + chmod +x $(Build.SourcesDirectory)/python-env-tools/bin + displayName: Make Directory for python-env-tool binary + + - bash: | + if [ "$(vsceTarget)" == "win32-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-pc-windows-msvc" + elif [ "$(vsceTarget)" == "win32-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-pc-windows-msvc" + elif [ "$(vsceTarget)" == "linux-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + elif [ "$(vsceTarget)" == "linux-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-unknown-linux-gnu" + elif [ "$(vsceTarget)" == "linux-armhf" ]; then + echo "##vso[task.setvariable variable=buildTarget]armv7-unknown-linux-gnueabihf" + elif [ "$(vsceTarget)" == "darwin-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-apple-darwin" + elif [ "$(vsceTarget)" == "darwin-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-apple-darwin" + elif [ "$(vsceTarget)" == "alpine-x64" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + elif [ "$(vsceTarget)" == "alpine-arm64" ]; then + echo "##vso[task.setvariable variable=buildTarget]aarch64-unknown-linux-gnu" + elif [ "$(vsceTarget)" == "web" ]; then + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + else + echo "##vso[task.setvariable variable=buildTarget]x86_64-unknown-linux-musl" + fi + displayName: Set buildTarget variable + + - task: DownloadPipelineArtifact@2 + inputs: + buildType: 'specific' + project: 'Monaco' + definition: 593 + buildVersionToDownload: 'latestFromBranch' + branchName: 'refs/heads/release/2026.4' + targetPath: '$(Build.SourcesDirectory)/python-env-tools/bin' + artifactName: 'bin-$(buildTarget)' + itemPattern: | + pet.exe + pet + ThirdPartyNotices.txt + + - bash: | + ls -lf ./python-env-tools/bin + chmod +x ./python-env-tools/bin/pet* + ls -lf ./python-env-tools/bin + displayName: Set chmod for pet binary + + - script: python -c "import shutil; shutil.rmtree('.nox', ignore_errors=True)" + displayName: Clean up Nox + tsa: + config: + areaPath: 'Visual Studio Code Python Extensions' + serviceTreeID: '6e6194bc-7baa-4486-86d0-9f5419626d46' + enabled: true + apiScanDependentPipelineId: '593' # python-environment-tools + apiScanSoftwareVersion: '2024' diff --git a/build/azure-pipelines/pipeline.yml b/build/azure-pipelines/pipeline.yml new file mode 100644 index 000000000000..0796e38ca598 --- /dev/null +++ b/build/azure-pipelines/pipeline.yml @@ -0,0 +1,58 @@ +############################################################################################### +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +############################################################################################### +name: $(Date:yyyyMMdd)$(Rev:.r) + +trigger: none + +pr: none + +resources: + repositories: + - repository: templates + type: github + name: microsoft/vscode-engineering + ref: main + endpoint: Monaco + +parameters: + - name: quality + displayName: Quality + type: string + default: latest + values: + - latest + - next + - name: publishPythonApi + displayName: 🚀 Publish pythonExtensionApi + type: boolean + default: false + +extends: + template: azure-pipelines/npm-package/pipeline.yml@templates + parameters: + npmPackages: + - name: pythonExtensionApi + testPlatforms: + - name: Linux + nodeVersions: + - 22.21.1 + - name: MacOS + nodeVersions: + - 22.21.1 + - name: Windows + nodeVersions: + - 22.21.1 + testSteps: + - template: /build/azure-pipelines/templates/test-steps.yml@self + parameters: + package: pythonExtensionApi + buildSteps: + - template: /build/azure-pipelines/templates/pack-steps.yml@self + parameters: + package: pythonExtensionApi + ghTagPrefix: release/pythonExtensionApi/ + tag: ${{ parameters.quality }} + publishPackage: ${{ parameters.publishPythonApi }} + workingDirectory: $(Build.SourcesDirectory)/pythonExtensionApi diff --git a/build/azure-pipelines/templates/pack-steps.yml b/build/azure-pipelines/templates/pack-steps.yml new file mode 100644 index 000000000000..97037efb59ba --- /dev/null +++ b/build/azure-pipelines/templates/pack-steps.yml @@ -0,0 +1,14 @@ +############################################################################################### +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +############################################################################################### +parameters: +- name: package + +steps: + - script: npm install --root-only + workingDirectory: $(Build.SourcesDirectory) + displayName: Install root dependencies + - script: npm install + workingDirectory: $(Build.SourcesDirectory)/${{ parameters.package }} + displayName: Install package dependencies diff --git a/build/azure-pipelines/templates/test-steps.yml b/build/azure-pipelines/templates/test-steps.yml new file mode 100644 index 000000000000..15eb3db6384d --- /dev/null +++ b/build/azure-pipelines/templates/test-steps.yml @@ -0,0 +1,23 @@ +############################################################################################### +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +############################################################################################### +parameters: +- name: package + type: string +- name: script + type: string + default: 'all:publish' + +steps: + - script: npm install --root-only + workingDirectory: $(Build.SourcesDirectory) + displayName: Install root dependencies + - bash: | + /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + echo ">>> Started xvfb" + displayName: Start xvfb + condition: eq(variables['Agent.OS'], 'Linux') + - script: npm run ${{ parameters.script }} + workingDirectory: $(Build.SourcesDirectory)/${{ parameters.package }} + displayName: Verify package diff --git a/build/build-install-requirements.txt b/build/build-install-requirements.txt new file mode 100644 index 000000000000..8baaa59ded67 --- /dev/null +++ b/build/build-install-requirements.txt @@ -0,0 +1,2 @@ +# Requirements needed to run install_debugpy.py and download_get_pip.py +packaging diff --git a/build/ci/addEnvPath.py b/build/ci/addEnvPath.py index abad9ec3b5c9..66eff2a7b25d 100644 --- a/build/ci/addEnvPath.py +++ b/build/ci/addEnvPath.py @@ -3,7 +3,8 @@ #Adds the virtual environment's executable path to json file -import json,sys +import json +import sys import os.path jsonPath = sys.argv[1] key = sys.argv[2] diff --git a/build/ci/codecov.yml b/build/ci/codecov.yml deleted file mode 100644 index 817313b270d3..000000000000 --- a/build/ci/codecov.yml +++ /dev/null @@ -1,27 +0,0 @@ -codecov: - notify: - require_ci_to_pass: yes - -coverage: - precision: 0 - round: down - range: "70...100" - - status: - project: yes - patch: yes - changes: no - -parsers: - gcov: - branch_detection: - conditional: yes - loop: yes - method: no - macro: no - -comment: - branch: !release* - layout: "header, diff, files" - behavior: default - require_changes: no diff --git a/build/ci/conda_base.yml b/build/ci/conda_base.yml new file mode 100644 index 000000000000..a1b589e38a32 --- /dev/null +++ b/build/ci/conda_base.yml @@ -0,0 +1 @@ +pip diff --git a/build/ci/conda_env_1.yml b/build/ci/conda_env_1.yml new file mode 100644 index 000000000000..4f9ceefd27fb --- /dev/null +++ b/build/ci/conda_env_1.yml @@ -0,0 +1,4 @@ +name: conda_env_1 +dependencies: + - python=3.9 + - pip diff --git a/build/ci/conda_env_2.yml b/build/ci/conda_env_2.yml new file mode 100644 index 000000000000..af9d7a46ba3e --- /dev/null +++ b/build/ci/conda_env_2.yml @@ -0,0 +1,4 @@ +name: conda_env_2 +dependencies: + - python=3.9 + - pip diff --git a/build/ci/performance/checkPerformanceResults.js b/build/ci/performance/checkPerformanceResults.js deleted file mode 100644 index fc2f05bf0cb1..000000000000 --- a/build/ci/performance/checkPerformanceResults.js +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; -const fastXmlParser = require('fast-xml-parser'); -const fs = require('fs'); -const path = require('path'); -const constants = require('../../constants'); - -const xmlFile = path.join(constants.ExtensionRootDir, 'test-results.xml'); -const performanceResultsFile = path.join( - constants.ExtensionRootDir, - 'build', - 'ci', - 'performance', - 'performance-results.json' -); -const errorMargin = 0.01; -let failedTests = ''; - -fs.readFile(xmlFile, 'utf8', (xmlFileError, xmlData) => { - if (xmlFileError) { - throw xmlFileError; - } - - if (fastXmlParser.validate(xmlData)) { - const defaultOptions = { - attributeNamePrefix: '', - ignoreAttributes: false - }; - - fs.readFile(performanceResultsFile, 'utf8', (performanceResultsFileError, performanceData) => { - if (performanceResultsFileError) { - throw performanceResultsFileError; - } - - const resultsJson = fastXmlParser.parse(xmlData, defaultOptions); - const performanceJson = JSON.parse(performanceData); - - performanceJson.forEach(result => { - const avg = result.times.reduce((a, b) => parseFloat(a) + parseFloat(b)) / result.times.length; - - resultsJson.testsuites.testsuite.forEach(suite => { - if (parseInt(suite.tests, 10) > 0) { - if (Array.isArray(suite.testcase)) { - const testcase = suite.testcase.find(x => x.name === result.name); - - // compare the average result to the base JSON - if (testcase && avg > parseFloat(testcase.time) + errorMargin) { - failedTests += - 'Performance is slow in: ' + - testcase.name + - ', Benchmark time: ' + - testcase.time + - ', Average test time: ' + - avg + - '\n'; - } - } else { - // compare the average result to the base JSON - if ( - suite.testcase.name === result.name && - avg > parseFloat(suite.testcase.time) + errorMargin - ) { - failedTests += - 'Performance is slow in: ' + - testcase.name + - ', Benchmark time: ' + - testcase.time + - ', Average test time: ' + - avg + - '\n'; - } - } - } - }); - }); - - if (failedTests.length > 0) { - throw new Error(failedTests); - } - - // Delete performance-results.json - fs.unlink(performanceResultsFile, deleteError => { - if (deleteError) { - throw deleteError; - } - }); - }); - } -}); diff --git a/build/ci/performance/savePerformanceResults.js b/build/ci/performance/savePerformanceResults.js deleted file mode 100644 index 0726b9235d87..000000000000 --- a/build/ci/performance/savePerformanceResults.js +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; -const fastXmlParser = require('fast-xml-parser'); -const fs = require('fs'); -const path = require('path'); -const constants = require('../../constants'); - -const xmlFile = path.join(constants.ExtensionRootDir, 'test-results.xml'); -const jsonFile = path.join(constants.ExtensionRootDir, 'build', 'ci', 'performance', 'performance-results.json'); -let performanceData = []; - -fs.readFile(xmlFile, 'utf8', (xmlReadError, xmlData) => { - if (xmlReadError) { - throw xmlReadError; - } - - if (fastXmlParser.validate(xmlData)) { - const defaultOptions = { - attributeNamePrefix: '', - ignoreAttributes: false - }; - const jsonObj = fastXmlParser.parse(xmlData, defaultOptions); - - fs.readFile(jsonFile, 'utf8', (jsonReadError, data) => { - if (jsonReadError) { - // File doesn't exist, so we create it - jsonObj.testsuites.testsuite.forEach(suite => { - if (parseInt(suite.tests, 10) > 0) { - if (Array.isArray(suite.testcase)) { - suite.testcase.forEach(testcase => { - const test = { - name: testcase.name, - times: [parseFloat(testcase.time)] - }; - performanceData.push(test); - }); - } else { - const test = { - name: suite.testcase.name, - times: [parseFloat(suite.testcase.time)] - }; - performanceData.push(test); - } - } - }); - } else { - performanceData = JSON.parse(data); - - jsonObj.testsuites.testsuite.forEach(suite => { - if (parseInt(suite.tests, 10) > 0) { - if (Array.isArray(suite.testcase)) { - suite.testcase.forEach(testcase => { - let test = performanceData.find(x => x.name === testcase.name); - if (test) { - // if the test name is already there, we add the new time - test.times.push(parseFloat(testcase.time)); - } else { - // if its not there, we add the whole thing - const test = { - name: testcase.name, - times: [parseFloat(testcase.time)] - }; - - performanceData.push(test); - } - }); - } else { - let test = performanceData.find(x => x.name === suite.testcase.name); - if (test) { - // if the test name is already there, we add the new time - test.times.push(parseFloat(suite.testcase.time)); - } else { - // if its not there, we add the whole thing - test = { - name: suite.testcase.name, - times: [parseFloat(suite.testcase.time)] - }; - - performanceData.push(test); - } - } - } - }); - } - - fs.writeFile( - path.join(constants.ExtensionRootDir, 'build', 'ci', 'performance', 'performance-results.json'), - JSON.stringify(performanceData, null, 2), - writeResultsError => { - if (writeResultsError) { - throw writeResultsError; - } - // tslint:disable-next-line: no-console - console.log('performance-results.json was saved!'); - } - ); - }); - } -}); diff --git a/build/ci/performance/strategy.yaml b/build/ci/performance/strategy.yaml deleted file mode 100644 index d147ad77026a..000000000000 --- a/build/ci/performance/strategy.yaml +++ /dev/null @@ -1,47 +0,0 @@ -parameters: - jobs: [] - pythonVersions: [ - # All scenarios tagged with `@noNeedToTestInAllPython`, will run in the latest version of Python. - # When using other versions of Python, ignore `@noNeedToTestInAllPython`. - { - "version": "3.7", - "displayName": "37", - "excludeTags": "not @python3.6 and not @python3.5 and not @python2" - }, - { - "version": "3.6", - "displayName": "36", - "excludeTags": "not @python3.7 and not @python3.5 and not @python2 and not @noNeedToTestInAllPython" - }, - { - "version": "3.5", - "displayName": "35", - "excludeTags": "not @python3.7 and not @python3.6 and not @python2 and not @noNeedToTestInAllPython" - }, - { - "version": "2.7", - "displayName": "27", - "excludeTags": "not @python3.7 and not @python3.6 and not @python3.5 and not @python3 and not @noNeedToTestInAllPython" - } - ] - -matrix: - ${{ each job in parameters.jobs }}: - ${{ each py in parameters.pythonVersions }}: - ${{ if not(contains('mac')) }}: - ${{ format('Mac{2}{0}{1}', py.displayName, job.test) }}: - PythonVersion: ${{ py.version }} - VSCodeChannel: "stable" - VMImageName: "macos-latest" - - ${{ if not(contains('win')) }}: - ${{ format('Win{2}{0}{1}', py.displayName, job.test) }}: - PythonVersion: ${{ py.version }} - VSCodeChannel: "stable" - VMImageName: "vs2017-win2016" - - ${{ if not(contains('linux')) }}: - ${{ format('Linux{2}{0}{1}', py.displayName, job.test) }}: - PythonVersion: ${{ py.version }} - VSCodeChannel: "stable" - VMImageName: "ubuntu-latest" diff --git a/build/ci/performance/vscode-python-performance.yaml b/build/ci/performance/vscode-python-performance.yaml deleted file mode 100644 index f1890d273cff..000000000000 --- a/build/ci/performance/vscode-python-performance.yaml +++ /dev/null @@ -1,74 +0,0 @@ -name: '$(Year:yyyy).$(Month).0.$(BuildID)-weekly-performance-test' - -trigger: none -pr: none -schedules: -- cron: "0 0 * * sat" - displayName: Weekly Performance Test - branches: - include: - - master - -- stage: Test performance - jobs: - - job: Testing Round 1 - timeoutInMinutes: 120 - strategy: - - template: strategy.yaml - steps: - - bash: | - mocha --require source-map-support/register --opts ./build/.mocha.performance.opts - node .\savePerformanceResults.js - - - job: Testing Round 2 - dependsOn: - - Testing Round 1 - timeoutInMinutes: 120 - strategy: - - template: strategy.yaml - steps: - - bash: | - mocha --require source-map-support/register --opts ./build/.mocha.performance.opts - node .\savePerformanceResults.js - - - job: Testing Round 3 - dependsOn: - - Testing Round 2 - timeoutInMinutes: 120 - strategy: - - template: strategy.yaml - steps: - - bash: | - mocha --require source-map-support/register --opts ./build/.mocha.performance.opts - node .\savePerformanceResults.js - - - job: Testing Round 4 - dependsOn: - - Testing Round 3 - timeoutInMinutes: 120 - strategy: - - template: strategy.yaml - steps: - - bash: | - mocha --require source-map-support/register --opts ./build/.mocha.performance.opts - node .\savePerformanceResults.js - - - job: Testing Round 5 - dependsOn: - - Testing Round 4 - timeoutInMinutes: 120 - strategy: - - template: strategy.yaml - steps: - - bash: | - mocha --require source-map-support/register --opts ./build/.mocha.performance.opts - node .\savePerformanceResults.js - -- stage: Results - dependsOn: - - Test performance - jobs: - - job: CheckResults - timeoutInMinutes: 5 - steps: - - bash: node .\checkPerformanceResults.js diff --git a/build/ci/postInstall.js b/build/ci/postInstall.js deleted file mode 100644 index 6d02c8f1611e..000000000000 --- a/build/ci/postInstall.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -var colors = require('colors/safe'); -var fs = require('fs'); -var path = require('path'); -var constants_1 = require('../constants'); -/** - * In order to compile the extension in strict mode, one of the dependencies (@jupyterlab) has some files that - * just won't compile in strict mode. - * Unfortunately we cannot fix it by overriding their type definitions - * Note: that has been done for a few of the JupyterLabl files (see typings/index.d.ts). - * The solution is to modify the type definition file after `npm install`. - */ -function fixJupyterLabDTSFiles() { - var relativePath = path.join( - 'node_modules', - '@jupyterlab', - 'services', - 'node_modules', - '@jupyterlab', - 'coreutils', - 'lib', - 'settingregistry.d.ts' - ); - var filePath = path.join(constants_1.ExtensionRootDir, relativePath); - if (!fs.existsSync(filePath)) { - throw new Error("Type Definition file from JupyterLab not found '" + filePath + "' (pvsc post install script)"); - } - var fileContents = fs.readFileSync(filePath, { encoding: 'utf8' }); - if (fileContents.indexOf('[key: string]: ISchema | undefined;') > 0) { - // tslint:disable-next-line:no-console - console.log(colors.blue(relativePath + ' file already updated (by Python VSC)')); - return; - } - if (fileContents.indexOf('[key: string]: ISchema;') > 0) { - var replacedText = fileContents.replace('[key: string]: ISchema;', '[key: string]: ISchema | undefined;'); - if (fileContents === replacedText) { - throw new Error("Fix for JupyterLabl file 'settingregistry.d.ts' failed (pvsc post install script)"); - } - fs.writeFileSync(filePath, replacedText); - // tslint:disable-next-line:no-console - console.log(colors.green(relativePath + ' file updated (by Python VSC)')); - } else { - // tslint:disable-next-line:no-console - console.log(colors.red(relativePath + ' file does not need updating.')); - } -} -fixJupyterLabDTSFiles(); diff --git a/build/ci/pyproject.toml b/build/ci/pyproject.toml new file mode 100644 index 000000000000..6335f021a637 --- /dev/null +++ b/build/ci/pyproject.toml @@ -0,0 +1,8 @@ +[tool.poetry] +name = "poetry-tutorial-project" +version = "0.1.0" +description = "" +authors = [""] + +[tool.poetry.dependencies] +python = "*" diff --git a/build/ci/scripts/spec_with_pid.js b/build/ci/scripts/spec_with_pid.js new file mode 100644 index 000000000000..a8453353aa79 --- /dev/null +++ b/build/ci/scripts/spec_with_pid.js @@ -0,0 +1,103 @@ +'use strict'; + +/** + * @module Spec + */ +/** + * Module dependencies. + */ + +const Base = require('mocha/lib/reporters/base'); +const { constants } = require('mocha/lib/runner'); + +const { EVENT_RUN_BEGIN } = constants; +const { EVENT_RUN_END } = constants; +const { EVENT_SUITE_BEGIN } = constants; +const { EVENT_SUITE_END } = constants; +const { EVENT_TEST_FAIL } = constants; +const { EVENT_TEST_PASS } = constants; +const { EVENT_TEST_PENDING } = constants; +const { inherits } = require('mocha/lib/utils'); + +const { color } = Base; + +const prefix = process.env.VSC_PYTHON_CI_TEST_PARALLEL ? `${process.pid} ` : ''; + +/** + * Constructs a new `Spec` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ +function Spec(runner, options) { + Base.call(this, runner, options); + + let indents = 0; + let n = 0; + + function indent() { + return Array(indents).join(' '); + } + + runner.on(EVENT_RUN_BEGIN, () => { + Base.consoleLog(); + }); + + runner.on(EVENT_SUITE_BEGIN, (suite) => { + indents += 1; + Base.consoleLog(color('suite', `${prefix}%s%s`), indent(), suite.title); + }); + + runner.on(EVENT_SUITE_END, () => { + indents -= 1; + if (indents === 1) { + Base.consoleLog(); + } + }); + + runner.on(EVENT_TEST_PENDING, (test) => { + const fmt = indent() + color('pending', `${prefix} %s`); + Base.consoleLog(fmt, test.title); + }); + + runner.on(EVENT_TEST_PASS, (test) => { + let fmt; + if (test.speed === 'fast') { + fmt = indent() + color('checkmark', prefix + Base.symbols.ok) + color('pass', ' %s'); + Base.consoleLog(fmt, test.title); + } else { + fmt = + indent() + + color('checkmark', prefix + Base.symbols.ok) + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); + Base.consoleLog(fmt, test.title, test.duration); + } + }); + + runner.on(EVENT_TEST_FAIL, (test) => { + n += 1; + Base.consoleLog(indent() + color('fail', `${prefix}%d) %s`), n, test.title); + }); + + runner.once(EVENT_RUN_END, this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ +inherits(Spec, Base); + +Spec.description = 'hierarchical & verbose [default]'; + +/** + * Expose `Spec`. + */ + +// eslint-disable-next-line no-global-assign +exports = Spec; +module.exports = exports; diff --git a/build/ci/static_analysis/policheck/exceptions.mdb b/build/ci/static_analysis/policheck/exceptions.mdb new file mode 100644 index 000000000000..d4a413f897e1 Binary files /dev/null and b/build/ci/static_analysis/policheck/exceptions.mdb differ diff --git a/build/ci/templates/globals.yml b/build/ci/templates/globals.yml deleted file mode 100644 index 1303ba0bc8e6..000000000000 --- a/build/ci/templates/globals.yml +++ /dev/null @@ -1,11 +0,0 @@ -variables: - PythonVersion: '3.7' # Always use latest version. - NodeVersion: '12.4.0' # Check version of node used in VS Code. - NpmVersion: '6.13.4' - MOCHA_FILE: '$(Build.ArtifactStagingDirectory)/test-junit.xml' # All test files will write their JUnit xml output to this file, clobbering the last time it was written. - MOCHA_REPORTER_JUNIT: true # Use the mocha-multi-reporters and send output to both console (spec) and JUnit (mocha-junit-reporter). - VSC_PYTHON_FORCE_LOGGING: true # Enable this to turn on console output for the logger - VSC_PYTHON_LOG_FILE: '$(Build.ArtifactStagingDirectory)/pvsc.log' - CI_BRANCH_NAME: ${Build.SourceBranchName} - npm_config_cache: $(Pipeline.Workspace)/.npm - diff --git a/build/ci/templates/jobs/build_compile.yml b/build/ci/templates/jobs/build_compile.yml deleted file mode 100644 index 3fb399879b80..000000000000 --- a/build/ci/templates/jobs/build_compile.yml +++ /dev/null @@ -1,50 +0,0 @@ -# Overview: -# Generic jobs template to compile and build extension - -jobs: -- job: Compile - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/compile.yml - -- job: Build - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/build.yml - -- job: Dependencies - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/dependencies.yml - -- job: Hygiene - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - installVSCEorNPX: 'false' - - - bash: npx tslint --project tsconfig.json - displayName: "Lint" - workingDirectory: $(Build.SourcesDirectory) - - - bash: npx prettier "src/**/*.ts*" --check - displayName: "Code Format (TypeScript)" - workingDirectory: $(Build.SourcesDirectory) - - - bash: npx prettier "build/**/*.js" --check - displayName: "Code Format (JavaScript)" - workingDirectory: $(Build.SourcesDirectory) - - - bash: | - python -m pip install -U black - python -m black . --check - displayName: "Code Format (Python)" - workingDirectory: $(Build.SourcesDirectory)/pythonFiles diff --git a/build/ci/templates/jobs/build_uitests.yml b/build/ci/templates/jobs/build_uitests.yml deleted file mode 100644 index 00db1ef863a8..000000000000 --- a/build/ci/templates/jobs/build_uitests.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Compile and build uitests - -jobs: -- job: Compile - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/initialization.yml - parameters: - workingDirectory: $(Build.SourcesDirectory)/uitests - compile: 'true' - installVSCEorNPX: 'false' - - -- job: Hygiene - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/initialization.yml - parameters: - workingDirectory: $(Build.SourcesDirectory)/uitests - compile: 'false' - installVSCEorNPX: 'false' - - - bash: npx tslint --project tsconfig.json - displayName: "Lint" - workingDirectory: $(Build.SourcesDirectory)/uitests - - - bash: npx prettier --check 'src/**/*.ts' - displayName: "Format" - workingDirectory: $(Build.SourcesDirectory)/uitests diff --git a/build/ci/templates/jobs/coverage.yml b/build/ci/templates/jobs/coverage.yml deleted file mode 100644 index 94e82dc6ea25..000000000000 --- a/build/ci/templates/jobs/coverage.yml +++ /dev/null @@ -1,8 +0,0 @@ -jobs: -- job: Coverage - pool: - vmImage: "ubuntu-16.04" - variables: - TestsToRun: 'testUnitTests' - steps: - - template: ../steps/merge_upload_coverage.yml diff --git a/build/ci/templates/jobs/merge_upload_uitest_report.yml b/build/ci/templates/jobs/merge_upload_uitest_report.yml deleted file mode 100644 index ced3f586a854..000000000000 --- a/build/ci/templates/jobs/merge_upload_uitest_report.yml +++ /dev/null @@ -1,47 +0,0 @@ -# Overview: -# Generic jobs template to compile and build extension - -jobs: -- job: UI_Test_Report - timeoutInMinutes: 120 - pool: - vmImage: "ubuntu-16.04" - steps: - - template: ../steps/initialization.yml - parameters: - workingDirectory: $(Build.SourcesDirectory)/uitests - compile: 'true' - - - bash: mkdir -p reports - workingDirectory: $(Build.SourcesDirectory)/uitests - displayName: "Create Reports Directory" - - - task: DownloadBuildArtifacts@0 - inputs: - buildType: "current" - allowPartiallySucceededBuilds: true - downloadType: "Specific" - itemPattern: "**/.vscode test/reports/cucumber_report_*.json" - downloadPath: "$(Build.SourcesDirectory)/uitests/reports" - displayName: "Restore Cucumber Reports" - condition: always() - - - bash: node ./out/index.js report --jsonDir=./reports --htmlOutput=./reports - workingDirectory: $(Build.SourcesDirectory)/uitests - displayName: "Merge and generate report" - condition: always() - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/uitests/reports - contents: "**" - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: "Copy Report" - condition: always() - - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory) - artifactName: UIReport - displayName: "Publish Report" - condition: always() diff --git a/build/ci/templates/jobs/smoke.yml b/build/ci/templates/jobs/smoke.yml deleted file mode 100644 index 70ab40523489..000000000000 --- a/build/ci/templates/jobs/smoke.yml +++ /dev/null @@ -1,11 +0,0 @@ -jobs: -- template: uitest.yml - parameters: - # In PRs, test only against stable version of VSC. - vscodeChannels: ['stable'] - # In PRs, run smoke tests against 3.7 (excluding others). - # Azure seems to hang very often when running tests against 2.7 - jobs: - - test: "Smoke" - tags: "@smoke" - ignorePythonVersions: "2.7,3.6,3.5" diff --git a/build/ci/templates/jobs/uitest.yml b/build/ci/templates/jobs/uitest.yml deleted file mode 100644 index 4a4fa9aa7a20..000000000000 --- a/build/ci/templates/jobs/uitest.yml +++ /dev/null @@ -1,156 +0,0 @@ -# ----------------------------------------------------------------------------------------------------------------------------- -# Overview: -# ----------------------------------------------------------------------------------------------------------------------------- -# This template builds a dynamic list of Jobs for UI Tests. -# Basically, given a set of environments (OS, Python Version, VSC Version), we generate a -# list of jobs for each permutation. -# I.e. we generate permutations of Jobs for each of the following: -# - OS: Windows, Linux, Mac -# - Python Version: 2.7, 3.5, 3.6, 3.7 -# - VSC Version: Stable, Insiders -# Using this approach, we can add tests for PipEnv, PyEnv, Conda, etc and ensure we test in all possible combinations. -# When using this template we can also, ignore testing against specific permutations by -# excluding OS, Python Version or VSC Version using the parameters ignorePythonVersions, ignoreOperatingSystems & vscodeChannels -# -# ----------------------------------------------------------------------------------------------------------------------------- -# Parameters -# ----------------------------------------------------------------------------------------------------------------------------- -# 1. jobs -# Mandatory. -# Contains a list of all tests that needs to be run. -# -# Sample: -# ``` -# - template: templates/uitest_jobs.yml -# parameters: -# jobs: -# - test: "Smoke" -# tags: "@smoke" -# - test: "Test" -# tags: "@test" -# - test: "Terminal" -# tags: "@terminal" -# ``` -# Based on this sample, we're running 3 tests with the names `Smoke`, `Test`, and `Terminal`. -# The tags inside each test contains the arguments that needs to be passd into behave. -# I.e. we're only testing BDD tests that contain the tag `@smoke`, `@test` & `@terminal` (as separate jobs). -# Please pass in just the `tags` arguments. -# Multiple tag values can be passed in as follows: -# tags: "@debug and @remote" -# More information on --tags argument for behave can be found here: -# * https://behave.readthedocs.io/en/latest/tutorial.html#controlling-things-with-tags -# * https://behave.readthedocs.io/en/latest/tag_expressions.html -# 2. ignorePythonVersions -# Comma delimited list of Python versions not to be tested against. -# E.g. = 3.7,3.6 -# Possible values 3.7, 3.6, 3.5, 2.7 -# Any OS provided in this string will not be tested against. -# -# Sample: -# ``` -# parameters: -# vscodeChannels: ['stable'] -# jobs: -# - test: "Smoke" -# tags: "@smoke" -# ignorePythonVersions: "3.6,3.5" -# ``` -# Based on this sample, we're running 1 test with the name `Smoke`. -# We're only test BDD tests that contain the tag `@smoke`. -# And we're ignoring Python Versions 3.6 and 3.5. -# 3. ignoreOperatingSystems -# Comma delimited list of OS not to be tested against. -# E.g. = win, linux -# Possible values = mac, win, linux -# 4. vscodeChannels -# Comma delimited list of VSC Versions. -# Defaults include = `stable`,`insider` -# If changed to `stable`, then only `stable` is tested. -# -# Sample: -# ``` -# parameters: -# vscodeChannels: ['stable'] -# jobs: -# - test: "Smoke" -# tags: "@smoke" -# ignorePythonVersions: "3.6,3.5" -# ``` -# Based on this sample, we're running 1 test with the name `Smoke`. -# We're only testing against the `stable` version of VSC. -# 5. pythonVersions -# Do not pass (these are internal variables). -# Defines the versions of Pythons versions we run tests against. -# We use this to build a list of python versions as a list instead of having to hardcode them. -# This way we just use a simple for loop and run jobs for each OS and each Python version. -# Note: The display name MUST not contain spaces, hyphens and periods or other similar funky characters. -# Use [A-Za-z_], else Azure starts playing up (recommended by Azure Devops via support). - -parameters: - jobs: [] - ignorePythonVersions: "" - ignoreOperatingSystems: "" - vscodeChannels: ['stable', 'insider'] - pythonVersions: [ - # All scenarios tagged with `@noNeedToTestInAllPython`, will run in the latest version of Python. - # When using other versions of Python, ignore `@noNeedToTestInAllPython`. - { - "version": "3.7", - "displayName": "37", - "excludeTags": "not @python3.6 and not @python3.5 and not @python2" - }, - { - "version": "3.6", - "displayName": "36", - "excludeTags": "not @python3.7 and not @python3.5 and not @python2 and not @noNeedToTestInAllPython" - }, - { - "version": "3.5", - "displayName": "35", - "excludeTags": "not @python3.7 and not @python3.6 and not @python2 and not @noNeedToTestInAllPython" - }, - { - "version": "2.7", - "displayName": "27", - "excludeTags": "not @python3.7 and not @python3.6 and not @python3.5 and not @python3 and not @noNeedToTestInAllPython" - } - ] - - -jobs: -- job: UITest - # Remember, some tests can take easily an hour (the `tests` features take just around 1 hour). - timeoutInMinutes: 120 - # Build our matrix (permutations of VS Code + Tests + Pyhton + OS). - strategy: - matrix: - ${{ each channel in parameters.vscodeChannels }}: - ${{ each job in parameters.jobs }}: - ${{ each py in parameters.pythonVersions }}: - ${{ if not(contains(coalesce(job.ignorePythonVersions, ''), py.version)) }}: - ${{ if not(contains(coalesce(job.ignoreOperatingSystems, ''), 'mac')) }}: - ${{ format('Mac{2}{0}{1}', py.displayName, job.test, channel) }}: - PythonVersion: ${{ py.version }} - VMImageName: "macos-latest" - VSCodeChannel: ${{ channel }} - Tags: ${{ format('{0} and {1} and not @win and not @linux', job.tags, py.excludeTags) }} - - ${{ if not(contains(coalesce(job.ignoreOperatingSystems, ''), 'win')) }}: - ${{ format('Win{2}{0}{1}', py.displayName, job.test, channel) }}: - PythonVersion: ${{ py.version }} - VSCodeChannel: ${{ channel }} - VMImageName: "vs2017-win2016" - Tags: ${{ format('{0} and {1} and not @mac and not @linux', job.tags, py.excludeTags) }} - - ${{ if not(contains(coalesce(job.ignoreOperatingSystems, ''), 'linux')) }}: - ${{ format('Linux{2}{0}{1}', py.displayName, job.test, channel) }}: - PythonVersion: ${{ py.version }} - VSCodeChannel: ${{ channel }} - VMImageName: "ubuntu-latest" - Tags: ${{ format('{0} and {1} and not @mac and not @win', job.tags, py.excludeTags) }} - - pool: - vmImage: $(VMImageName) - - steps: - - template: ../steps/uitest.yml diff --git a/build/ci/templates/steps/build.yml b/build/ci/templates/steps/build.yml deleted file mode 100644 index 167d87350b0f..000000000000 --- a/build/ci/templates/steps/build.yml +++ /dev/null @@ -1,61 +0,0 @@ -# ----------------------------------------------------------------------------------------------------------------------------- -# Overview: -# ----------------------------------------------------------------------------------------------------------------------------- -# Set of steps used to compile and build the extension -# -# ----------------------------------------------------------------------------------------------------------------------------- -# Variables -# ----------------------------------------------------------------------------------------------------------------------------- -# 1. build -# Mandatory -# Possible values, `true` or `false`. -# If `true`, means we need to build the VSIX, else just compile. - -steps: - - template: initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - - - bash: | - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/old_ptvsd --no-cache-dir --implementation py --no-deps --upgrade 'ptvsd==4.3.2' - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/new_ptvsd/no_wheels --no-cache-dir --implementation py --no-deps --upgrade --pre ptvsd - failOnStderr: true - displayName: 'pip install requirements' - - - bash: | - python -m pip --disable-pip-version-check install -r build/debugger-install-requirements.txt - python ./pythonFiles/install_ptvsd.py - failOnStderr: true - displayName: 'Install PTVSD wheels' - - - bash: npm run clean - displayName: 'Clean' - - - bash: | - npm run updateBuildNumber -- --buildNumber $BUILD_BUILDID - displayName: 'Update dev Version of Extension' - condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) - - - bash: | - npm run updateBuildNumber -- --buildNumber $BUILD_BUILDID --updateChangelog - displayName: 'Update release Version of Extension' - condition: and(succeeded(), startsWith(variables['Build.SourceBranchName'], 'release')) - - - bash: | - npm run package - displayName: 'Build VSIX' - - - task: CopyFiles@2 - inputs: - contents: '*.vsix' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy VSIX' - - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory) - artifactName: VSIX - displayName: 'Publish VSIX to Artifacts' diff --git a/build/ci/templates/steps/compile.yml b/build/ci/templates/steps/compile.yml deleted file mode 100644 index 86760f160c55..000000000000 --- a/build/ci/templates/steps/compile.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Compiles the source - -steps: - - template: initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - installVSCEorNPX: 'false' - - - task: Gulp@0 - displayName: "Compile and check for errors" - inputs: - targets: "prePublishNonBundle" diff --git a/build/ci/templates/steps/dependencies.yml b/build/ci/templates/steps/dependencies.yml deleted file mode 100644 index d950f7e866f2..000000000000 --- a/build/ci/templates/steps/dependencies.yml +++ /dev/null @@ -1,21 +0,0 @@ -# ----------------------------------------------------------------------------------------------------------------------------- -# Overview: -# ----------------------------------------------------------------------------------------------------------------------------- -# Set of steps used to validate dependencies for the extension. In a separate pipeline because this -# can take a long time. -# - -steps: - - template: initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - - - bash: npm run clean - displayName: "Clean" - - # This is a slow process, hence do this as a separate step - - bash: npm run checkDependencies - displayName: "Check Dependencies" - diff --git a/build/ci/templates/steps/generate_upload_coverage.yml b/build/ci/templates/steps/generate_upload_coverage.yml deleted file mode 100644 index 27cecac25f30..000000000000 --- a/build/ci/templates/steps/generate_upload_coverage.yml +++ /dev/null @@ -1,24 +0,0 @@ -steps: - # Generate the coverage reports. - - bash: npm run test:cover:report - displayName: 'run test:cover:report' - condition: contains(variables['TestsToRun'], 'testUnitTests') - failOnStderr: false - - - # Publish Code Coverage Results - - task: PublishCodeCoverageResults@1 - displayName: 'Publish test:unittests coverage results' - condition: contains(variables['TestsToRun'], 'testUnitTests') - inputs: - codeCoverageTool: 'cobertura' - summaryFileLocation: "$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml" - reportDirectory: "$(System.DefaultWorkingDirectory)/coverage" - - - bash: cat ./coverage/cobertura-coverage.xml | ./node_modules/.bin/codecov --pipe - displayName: 'Upload coverage to codecov' - continueOnError: true - condition: contains(variables['TestsToRun'], 'testUnitTests') - failOnStderr: false - env: - CODECOV_TOKEN: $(CODECOV_TOKEN) diff --git a/build/ci/templates/steps/initialization.yml b/build/ci/templates/steps/initialization.yml deleted file mode 100644 index d262eada79ed..000000000000 --- a/build/ci/templates/steps/initialization.yml +++ /dev/null @@ -1,136 +0,0 @@ -# ----------------------------------------------------------------------------------------------------------------------------- -# Overview: -# ----------------------------------------------------------------------------------------------------------------------------- -# Set of common steps required when initializing a job. -# -# ----------------------------------------------------------------------------------------------------------------------------- -# Variables -# ----------------------------------------------------------------------------------------------------------------------------- -# 1. workingDirectory -# Mandatory -# Working directory. -# 2. PythonVersion -# Python version to be used. -# If not provided, python will not be setup on CI. -parameters: - workingDirectory: '' - PythonVersion: '' - compile: 'true' - sqlite: 'false' - installVSCEorNPX: 'true' - -steps: - - bash: | - printenv - displayName: "Show all env vars" - condition: eq(variables['system.debug'], 'true') - - - task: NodeTool@0 - displayName: "Use Node $(NodeVersion)" - inputs: - versionSpec: $(NodeVersion) - - - task: UsePythonVersion@0 - displayName: "Use Python ${{ parameters.PythonVersion }}" - condition: and(succeeded(), not(eq('${{ parameters.PythonVersion }}', ''))) - inputs: - versionSpec: ${{ parameters.PythonVersion }} - - # Install the a version of python that works with sqlite3 until this bug is addressed - # https://mseng.visualstudio.com/AzureDevOps/_workitems/edit/1535830 - # - # This task will only run if variable `NeedsPythonFunctionalReqs` is true. - - bash: | - sudo apt-get update - sudo apt-get install libsqlite3-dev - version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)') - wget https://www.python.org/ftp/python/$version/Python-$version.tar.xz - tar xvf Python-$version.tar.xz - cd Python-$version - ./configure --enable-loadable-sqlite-extensions --with-ensurepip=install --prefix=$HOME/py-$version - make - sudo make install - sudo chmod -R 777 $HOME/py-$version - export PATH=$HOME/py-$version/bin:$PATH - sudo ln -s $HOME/py-$version/bin/python3 $HOME/py-$version/bin/python - echo '##vso[task.prependpath]'$HOME/py-$version/bin - displayName: 'Setup python to run with sqlite on 3.*' - condition: and(succeeded(), eq('${{ parameters.sqlite }}', 'true'), not(eq('${{ parameters.PythonVersion }}', '')), not(eq('${{ parameters.PythonVersion }}', '2.7')), eq(variables['Agent.Os'], 'Linux')) - - - task: Npm@1 - displayName: "Use NPM $(NpmVersion)" - inputs: - command: custom - verbose: true - customCommand: "install -g npm@$(NpmVersion)" - - # In the past installs of npm, node-pre-gyp 0.12.0 was installed. - # However in the latest versions, 0.11.0 is getting isntalled. - # - bash: | - # npm uninstall canvas - # npm i -g node-pre-gyp@0.12.0 - # npm i -D node-pre-gyp@0.12.0 - # npm install -D canvas --build-from-source - # displayName: 'Uninstall canvas and install build from source (only for Linux)' - # condition: and(succeeded(), eq(variables['Agent.Os'], 'Linux')) - - # See the help here on how to cache npm - # https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/?view=azure-devops#nodejsnpm - - task: CacheBeta@0 - inputs: - key: npm | $(Agent.OS) | package-lock.json - path: $(npm_config_cache) - restoreKeys: | - npm | $(Agent.OS) - displayName: Cache npm - - - task: Npm@1 - displayName: "npm ci" - inputs: - workingDir: ${{ parameters.workingDirectory }} - command: custom - verbose: true - customCommand: ci - - # On Mac, the command `node` doesn't always point to the current node version. - # Debugger tests use the variable process.env.NODE_PATH - - script: | - export NODE_PATH=`which node` - echo $NODE_PATH - echo '##vso[task.setvariable variable=NODE_PATH]'$NODE_PATH - displayName: "Setup NODE_PATH for extension (Debugger Tests)" - condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) - - # Install vsce - - bash: | - npm install -g vsce - displayName: "Install vsce" - condition: and(succeeded(), eq('${{ parameters.installVSCEorNPX }}', 'true')) - - - bash: npx tsc -p ./ - displayName: "compile (npx tsc -p ./)" - workingDirectory: ${{ parameters.workingDirectory }} - condition: and(succeeded(), eq('${{ parameters.compile }}', 'true')) - - # https://code.visualstudio.com/api/working-with-extensions/continuous-integration#azure-pipelines - - bash: | - set -e - /usr/bin/Xvfb :10 -ac >> /tmp/Xvfb.out 2>&1 & - disown -ar - displayName: 'Start Display Server (xvfb) to launch VS Code)' - condition: and(succeeded(), eq(variables['Agent.Os'], 'Linux')) - - - bash: python -m pip install -U pip - displayName: 'Install pip' - - # # Show all versions installed/available on PATH if in verbose mode. - # # Example command line (windows pwsh): - # # > Write-Host Node ver: $(& node -v) NPM Ver: $(& npm -v) Python ver: $(& python --version)" - # - bash: | - # echo AVAILABLE DEPENDENCY VERSIONS - # echo Node Version = `node -v` - # echo NPM Version = `npm -v` - # echo Python Version = `python --version` - # echo Gulp Version = `gulp --version` - # condition: and(succeeded(), eq(variables['system.debug'], 'true')) - # displayName: Show Dependency Versions diff --git a/build/ci/templates/steps/merge_upload_coverage.yml b/build/ci/templates/steps/merge_upload_coverage.yml deleted file mode 100644 index 82aced006580..000000000000 --- a/build/ci/templates/steps/merge_upload_coverage.yml +++ /dev/null @@ -1,29 +0,0 @@ -steps: - - template: initialization.yml - parameters: - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - - # Download previously generated coverage artifacts - - task: DownloadPipelineArtifact@2 - inputs: - patterns: '**/.nyc_output/**' - displayName: "Download .nyc_output coverage artifacts" - condition: always() - - # Now that we have downloaded artifacts from `coverage-output-`, copy them - # into the root directory (they'll go under `.nyc_output/...`) - # These are the coverage output files that can be merged and then we can generate a report from them. - # This step results in downloading all individual `./nyc_output` results in coverage - # from all different test outputs. - # Running the process of generating reports, will result in generation of - # reports from all coverage data, i.e. we're basically combining all to generate a single merged report. - - bash: | - cp -r $(Pipeline.Workspace)/coverage-output-*/.nyc_output/ ./ - cd .nyc_output/ - ls -dlU .*/ */ - ls - displayName: "Copy ./.nyc_output" - condition: always() - - - template: generate_upload_coverage.yml diff --git a/build/ci/templates/steps/uitest.yml b/build/ci/templates/steps/uitest.yml deleted file mode 100644 index 3b09fe2c8088..000000000000 --- a/build/ci/templates/steps/uitest.yml +++ /dev/null @@ -1,201 +0,0 @@ -# ----------------------------------------------------------------------------------------------------------------------------- -# Overview: -# ----------------------------------------------------------------------------------------------------------------------------- -# Steps to be executed as part of the UI tests. -# 1. Show all env vars - Logging (display environment variables). -# 2. Use Node - Specify and use node version. -# 3. Setup Python ? for extension - Version of Python to be used for testing in Extension. -# 4. Setup CI_PYTHON_PATH for extension - Export Env variable that'll be used by a seprate step. -# Note: This env variable is NOT used by any Code (used purely in the Azdo step further below). -# 5. Use Python 2.7 - Ensure minimum version of Python (2.7) is available on CI for Python Extension. -# 6. Use Python 3.7 - Ensure latest version of Python (3.7) is available on CI for Python Extension. -# 7. npm ci - Install npm packages for some JS scripts used in testing (NOT for extension). -# 8. Show Dependency Versions - Logging. -# 9. Start xvfb - Start in-memory display server (for launching VSC). -# 10. Restore VSIX - VSIX has been built in another Job, download that from artifacts. -# 11. Copy VSIX - Copy the VSIX into root directory (test suite expects it to be in root - default setup). -# 12. Compile - Npm compile -# 13. Run Tests - Launch the UI tests in Nodejs -# 14. Copy Reports -# 15. Copy Screenshots -# 16. Copy Extension Logs -# 17. Copy VSC Logs -# 18. Upload Reports - Upload as artifacts to Azure Devops -# 19. Test Results - Upload test results to Azure Devops -# ----------------------------------------------------------------------------------------------------------------------------- -# Variables: -# ----------------------------------------------------------------------------------------------------------------------------- -# 1. VSCodeChannel -# Mandatory. -# VS Code channel to be tested against. `stable` or `insider`. -# 2. Tags -# Mandatory. -# Contain the `--tags=....` arguments to be passed into behave to exclude certain tags. -# Multiple tags can be passed as `@smoke and not @ignore1 and @another and not @andMore` -# More information on --tags argument for behave can be found here: -# * https://behave.readthedocs.io/en/latest/tutorial.html#controlling-things-with-tags -# * https://behave.readthedocs.io/en/latest/tag_expressions.html -# 3. PythonVersion -# Python version to be used. -# 4. VMImageName -# VM Image to be used (standard Azure Devops variable). - -steps: - # Some tests need to have both 2.7 & 3.7 available. - - task: UsePythonVersion@0 - displayName: 'Use Python 2.7' - inputs: - versionSpec: 2.7 - - - task: UsePythonVersion@0 - displayName: 'Use Python 3.7' - inputs: - versionSpec: 3.7 - - # Setup python environment in current path for extension to use. - - template: initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory)/uitests - compile: 'true' - - - task: DownloadBuildArtifacts@0 - inputs: - buildType: "current" - artifactName: "VSIX" - downloadPath: "$(Build.SourcesDirectory)" - displayName: "Restore VSIX" - condition: succeeded() - - - task: CopyFiles@2 - inputs: - sourceFolder: "$(Build.SourcesDirectory)/VSIX" - targetFolder: $(Build.SourcesDirectory)/uitests - displayName: "Copy VSIX" - condition: succeeded() - - - bash: | - cd ./bootstrap/extension - npm run build - workingDirectory: $(Build.SourcesDirectory)/uitests - displayName: "Build Bootstrap Extension" - condition: succeeded() - - - bash: node ./out/index.js download --channel=$(VSCodeChannel) - workingDirectory: $(Build.SourcesDirectory)/uitests - env: - VSCODE_CHANNEL: $(VSCodeChannel) - displayName: 'Download VS Code $(VSCodeChannel)' - condition: succeeded() - - - bash: node ./out/index.js install --channel=$(VSCodeChannel) - workingDirectory: $(Build.SourcesDirectory)/uitests - env: - VSCODE_CHANNEL: $(VSCodeChannel) - displayName: 'Install Extension(s)' - condition: succeeded() - - # Setup python environment in current path for extension. - - task: UsePythonVersion@0 - displayName: 'Setup Python $(PythonVersion) for extension' - inputs: - versionSpec: $(PythonVersion) - - # On Hosted macOS, the agent user doesn't have ownership of Miniconda's installation directory/ - # We need to take ownership if we want to update conda or install packages globally - - bash: sudo chown -R $USER $CONDA - displayName: Take ownership of conda installation - condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) - - - script: | - export CI_PYTHON_PATH=`which python` - echo '##vso[task.setvariable variable=CI_PYTHON_PATH]'$CI_PYTHON_PATH - displayName: 'Setup CI_PYTHON_PATH for extension' - condition: and(succeeded(), not(eq(variables['agent.os'], 'Windows_NT'))) - - - powershell: | - $CI_PYTHON_PATH = (get-command python).path - Write-Host "##vso[task.setvariable variable=CI_PYTHON_PATH]$CI_PYTHON_PATH" - Write-Host $CI_PYTHON_PATH - displayName: 'Setup CI_PYTHON_PATH for extension' - condition: and(succeeded(), eq(variables['agent.os'], 'Windows_NT')) - - # Conda - - bash: echo "##vso[task.prependpath]$CONDA/bin" - displayName: Add conda to PATH - condition: and(succeeded(), not(eq(variables['agent.os'], 'Windows_NT'))) - - - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" - displayName: Add conda to PATH - condition: and(succeeded(), eq(variables['agent.os'], 'Windows_NT')) - - # Ensure reports folder exists. - - bash: mkdir -p './.vscode test/reports' - workingDirectory: $(Build.SourcesDirectory)/uitests - displayName: 'Create Reports folder' - condition: succeeded() - - # Skip @skip tagged tests - # Always dump to a text file (easier than scrolling and downloading the logs seprately). - # This way all logs are part of the artificat for each test. - # Passing CI_PYTHON_PATH on windows sucks, as `\` needs to be escaped. Just use env variable. - # node ./out/index.js test --verbose=true --channel=$(VSCodeChannel) --pythonPath=$(CI_PYTHON_PATH) -- --tags='$(Tags) and not @skip' --exit | tee './.vscode test/reports/log.log' - # Don't use `npm run test` (we need the exit code to propagage all the way up). - - bash: node ./out/index.js test --verbose=$(VERBOSE) --channel=$(VSCodeChannel) -- --tags='$(Tags) and not @skip' - workingDirectory: $(Build.SourcesDirectory)/uitests - env: - DISPLAY: :10 - AgentJobName: $(Agent.JobName) - VSCODE_CHANNEL: $(VSCodeChannel) - CI_PYTHON_PATH: $(CI_PYTHON_PATH) - PYTHON_VERSION: $(PythonVersion) - VERBOSE: $(system.debug) - displayName: 'Run Tests' - condition: succeeded() - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/uitests - contents: '.vscode test/reports/**' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy Reports' - condition: always() - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/uitests - contents: '.vscode test/screenshots/**' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy Screenshots' - condition: always() - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/uitests - contents: '.vscode test/logs/**' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy Extension Logs' - condition: always() - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory)/uitests - contents: '.vscode test/user/logs/**' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy VSC Logs' - condition: always() - - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory) - artifactName: $(Agent.JobName) - displayName: 'Upload Reports' - condition: always() - - - task: PublishTestResults@2 - displayName: 'TestResults' - inputs: - testRunTitle: $(Agent.JobName) - testRunner: JUnit - testResultsFiles: '$(Build.SourcesDirectory)/uitests/.vscode test/reports/*.xml' - condition: always() diff --git a/build/ci/templates/test_phases.yml b/build/ci/templates/test_phases.yml deleted file mode 100644 index 6e9a0d6e4ca2..000000000000 --- a/build/ci/templates/test_phases.yml +++ /dev/null @@ -1,498 +0,0 @@ -# To use this step template from a job, use the following code: -# ```yaml -# steps: -# template: path/to/this/dir/test_phases.yml -# ``` -# -# Your job using this template *must* supply these values: -# - VMImageName: '[name]' - the VM image to run the tests on. -# - TestsToRun: 'testA, testB, ..., testN' - the list of tests to execute, see the list above. -# -# Your job using this template *may* supply these values: -# - NeedsPythonTestReqs: [true|false] - install the test-requirements prior to running tests. False if not set. -# - NeedsPythonFunctionalReqs: [true|false] - install the functional-requirements prior to running tests. False if not set. -# - PythonVersion: 'M.m' - the Python version to run. DefaultPythonVersion if not set. -# - NodeVersion: 'x.y.z' - Node version to use. DefaultNodeVersion if not set. -# - SkipXvfb: [true|false] - skip initialization of xvfb prior to running system tests on Linux. False if not set -# - UploadBinary: [true|false] - upload test binaries to Azure if true. False if not set. - -## Supported `TestsToRun` values, multiples are allowed separated by commas or spaces: -# -# 'testUnitTests' -# 'pythonUnitTests' -# 'pythonInternalTools' -# 'testSingleWorkspace' -# 'testMultiWorkspace' -# 'testDebugger' -# 'testFunctional' -# 'testPerformance' -# 'venvTests' - -steps: - - template: steps/initialization.yml - parameters: - PythonVersion: $(PythonVersion) - workingDirectory: $(Build.SourcesDirectory) - compile: 'false' - sqlite: 'true' - - # Run the `prePublishNonBundle` gulp task to build the binaries we will be testing. - # This produces the .js files required into the out/ folder. - # Example command line (windows pwsh): - # > gulp prePublishNonBundle - - task: Gulp@0 - displayName: 'gulp prePublishNonBundle' - inputs: - targets: 'prePublishNonBundle' - condition: and(succeeded(), not(contains(variables['TestsToRun'], 'testSmoke'))) - - # Run the typescript unit tests. - # - # This will only run if the string 'testUnitTests' exists in variable `TestsToRun` - # - # Example command line (windows pwsh): - # > npm run test:unittests:cover - - bash: | - npm run test:unittests:cover - displayName: 'run test:unittests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testUnitTests')) - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish test:unittests results' - condition: contains(variables['TestsToRun'], 'testUnitTests') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'unittests-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'UnitTests' - - - task: CopyFiles@2 - inputs: - sourceFolder: '$(Build.SourcesDirectory)/.nyc_output' - targetFolder: '$(Build.ArtifactStagingDirectory)/nyc/.nyc_output' - displayName: 'Copy nyc_output to publish as artificat' - condition: contains(variables['TestsToRun'], 'testUnitTests') - - # Upload Code Coverage Results (to be merged later). - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: '$(Build.ArtifactStagingDirectory)/nyc' - artifactName: 'coverage-output-$(Agent.Os)' - condition: contains(variables['TestsToRun'], 'testUnitTests') - - - template: steps/generate_upload_coverage.yml - - # Install the requirements for the Python or the system tests. This includes the supporting libs that - # we ship in our extension such as PTVSD and Jedi. - # - # This task will only run if variable `NeedsPythonTestReqs` is true. - # - # Example command line (windows pwsh): - # > python -m pip install -m -U pip - # > python -m pip install --upgrade -r build/test-requirements.txt - # > python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - - bash: | - python -m pip install --upgrade -r build/test-requirements.txt - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/old_ptvsd --no-cache-dir --implementation py --no-deps --upgrade 'ptvsd==4.3.2' - python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python/new_ptvsd/no_wheels --no-cache-dir --implementation py --no-deps --upgrade --pre ptvsd - displayName: 'pip install system test requirements' - condition: and(succeeded(), eq(variables['NeedsPythonTestReqs'], 'true')) - - # Install the additional sqlite requirements - # - # This task will only run if variable `NeedsPythonFunctionalReqs` is true. - - bash: | - sudo apt-get install libsqlite3-dev - python -m pip install pysqlite - displayName: 'Setup python to run with sqlite on 2.7' - condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true'), eq(variables['Agent.Os'], 'Linux'), eq(variables['PythonVersion'], '2.7')) - - # Install the requirements for functional tests. - # - # This task will only run if variable `NeedsPythonFunctionalReqs` is true. - # - # Example command line (windows pwsh): - # > python -m pip install numpy - # > python -m pip install --upgrade -r build/functional-test-requirements.txt - # > python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - - bash: | - python -m pip install numpy - python -m pip install --upgrade -r ./build/functional-test-requirements.txt - displayName: 'pip install functional requirements' - condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true')) - - # Downgrade pywin32 on Windows due to bug https://github.com/jupyter/notebook/issues/4909 - # - # This task will only run if variable `NeedsPythonFunctionalReqs` is true. - - bash: | - python -m pip install --upgrade pywin32==224 - displayName: 'Downgrade pywin32 on Windows / Python 3.6' - condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true'), eq(variables['Agent.Os'], 'Windows_NT'), eq(variables['PythonVersion'], '3.6')) - - # Install the requirements for ipython tests. - # - # This task will only run if variable `NeedsIPythonReqs` is true. - # - # Example command line (windows pwsh): - # > python -m pip install numpy - # > python -m pip install --upgrade -r build/ipython-test-requirements.txt - # > python -m pip --disable-pip-version-check install -t ./pythonFiles/lib/python --no-cache-dir --implementation py --no-deps --upgrade -r requirements.txt - - bash: | - python -m pip install numpy - python -m pip install --upgrade -r ./build/ipython-test-requirements.txt - displayName: 'pip install ipython requirements' - condition: and(succeeded(), eq(variables['NeedsIPythonReqs'], 'true')) - - # Install jupyter for smoke tests. - - bash: | - python -m pip install --upgrade jupyter - displayName: 'pip install jupyter' - condition: and(succeeded(), eq(variables['NeedsIPythonReqs'], 'true'), contains(variables['TestsToRun'], 'testSmoke')) - - - task: PythonScript@0 - displayName: 'Install PTVSD wheels' - inputs: - scriptSource: 'filePath' - scriptPath: './pythonFiles/install_ptvsd.py' - failOnStderr: true - condition: and(eq(variables['NeedsPythonTestReqs'], 'true'), eq(variables['PythonVersion'], '3.7')) - - # Run the Python unit tests in our codebase. Produces a JUnit-style log file that - # will be uploaded after all tests are complete. - # - # This task only runs if the string 'pythonUnitTests' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > python -m pip install -m -U pip - # > python -m pip install -U -r build/test-requirements.txt - # > python pythonFiles/tests/run_all.py --color=yes --junit-xml=python-tests-junit.xml - - bash: | - python pythonFiles/tests/run_all.py --color=no --junit-xml=$COMMON_TESTRESULTSDIRECTORY/python-tests-junit.xml - displayName: 'Python unittests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'pythonUnitTests')) - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish Python unittests results' - condition: contains(variables['TestsToRun'], 'pythonUnitTests') - inputs: - testResultsFiles: 'python-tests-junit.xml' - searchFolder: '$(Common.TestResultsDirectory)' - testRunTitle: 'pythonUnitTests-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'UnitTests' - - # Run the Python IPython tests in our codebase. Produces a JUnit-style log file that - # will be uploaded after all tests are complete. - # - # This task only runs if the string 'pythonIPythonTests' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > python -m pip install -m -U pip - # > python -m pip install -U -r build/test-requirements.txt - # > python pythonFiles/tests/run_all.py --color=yes --junit-xml=python-tests-junit.xml - - bash: | - python -m IPython pythonFiles/tests/run_all.py -- --color=no --junit-xml=$COMMON_TESTRESULTSDIRECTORY/ipython-tests-junit.xml - displayName: 'Python ipython tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'pythonIPythonTests')) - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish IPython test results' - condition: contains(variables['TestsToRun'], 'pythonIPythonTests') - inputs: - testResultsFiles: 'ipython-tests-junit.xml' - searchFolder: '$(Common.TestResultsDirectory)' - testRunTitle: 'pythonIPythonTests-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'UnitTests' - - # Run the News tool tests. - # - # This task only runs if the string 'pythonInternalTools' exists in variable `TestsToRun` - # - # Example command line (windows pwsh): - # > python -m pip install -U -r news/requirements.txt - # > python -m pytest tpn --color=yes --junit-xml=python-news-junit.xml - - script: | - python -m pip install --upgrade -r news/requirements.txt - python -m pytest news --color=yes --junit-xml=$COMMON_TESTRESULTSDIRECTORY/python-news-junit.xml - displayName: 'Run Python tests for news' - condition: and(succeeded(), contains(variables['TestsToRun'], 'pythonInternalTools')) - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish Python tests for news results' - condition: contains(variables['TestsToRun'], 'pythonInternalTools') - inputs: - testResultsFiles: 'python-news-junit.xml' - searchFolder: '$(Common.TestResultsDirectory)' - testRunTitle: 'news-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'UnitTests' - - # Run the TPN tool tests. - # - # This task only runs if the string 'pythonUnitTests' exists in variable `TestsToRun` - # - # Example command line (windows pwsh): - # > python -m pip install -U -r tpn/requirements.txt - # > python -m pytest tpn --color=yes --junit-xml=python-tpn-junit.xml - - script: | - python -m pip install --upgrade -r tpn/requirements.txt - python -m pytest tpn --color=yes --junit-xml=$COMMON_TESTRESULTSDIRECTORY/python-tpn-junit.xml - displayName: 'Run Python tests for TPN tool' - condition: and(succeeded(), contains(variables['TestsToRun'], 'pythonInternalTools')) - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish Python tests for TPN tool results' - condition: contains(variables['TestsToRun'], 'pythonInternalTools') - inputs: - testResultsFiles: 'python-tpn-junit.xml' - searchFolder: '$(Common.TestResultsDirectory)' - testRunTitle: 'tpn-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'UnitTests' - - # Venv tests: Prepare the various virtual environments and record their details into the - # JSON file that venvTests require to run. - # - # This task only runs if the string 'venvTests' exists in variable 'TestsToRun' - # - # This task has a bunch of steps, all of which are to fill the `EnvPath` struct found in - # the file: - # `src/test/common/terminals/environmentActionProviders/terminalActivation.testvirtualenvs.ts` - # - # Example command line (windows pwsh): - # // This is done in powershell. Copy/paste the code below. - - pwsh: | - # venv/bin or venv\\Scripts (windows)? - $environmentExecutableFolder = 'bin' - if ($Env:AGENT_OS -match '.*Windows.*') { - $environmentExecutableFolder = 'Scripts' - } - - # pipenv - python -m pip install pipenv - python -m pipenv run python build/ci/addEnvPath.py $(PYTHON_VIRTUAL_ENVS_LOCATION) pipenvPath - - # venv - # what happens when running under Python 2.7? - python -m venv .venv - & ".venv/$environmentExecutableFolder/python" ./build/ci/addEnvPath.py $(PYTHON_VIRTUAL_ENVS_LOCATION) venvPath - - # virtualenv - python -m pip install virtualenv - python -m virtualenv .virtualenv - & ".virtualenv/$environmentExecutableFolder/python" ./build/ci/addEnvPath.py $(PYTHON_VIRTUAL_ENVS_LOCATION) virtualEnvPath - - # conda - - # 1. For `terminalActivation.testvirtualenvs.test.ts` - - $condaExecPath = Join-Path -Path $Env:CONDA -ChildPath $environmentExecutableFolder | Join-Path -ChildPath conda - if( '$(Agent.Os)' -match '.*Windows.*' ){ - $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python - } else{ - $condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath $environmentExecutableFolder | Join-Path -ChildPath python - & $condaPythonPath ./build/ci/addEnvPath.py $(PYTHON_VIRTUAL_ENVS_LOCATION) condaExecPath $condaExecPath - } - & $condaPythonPath ./build/ci/addEnvPath.py $(PYTHON_VIRTUAL_ENVS_LOCATION) condaPath - - # 2. For `interpreterLocatorService.testvirtualenvs.ts` - - & $condaExecPath create -n "test_env1" -y python - & $condaExecPath create -p "./test_env2" -y python - & $condaExecPath create -p "$Env:HOME/test_env3" -y python - - # Set the TEST_FILES_SUFFIX - Write-Host '##vso[task.setvariable variable=TEST_FILES_SUFFIX;]testvirtualenvs' - - displayName: 'Prepare Venv-Test Environment' - condition: and(succeeded(), contains(variables['TestsToRun'], 'venvTests')) - - # Run the virtual environment based tests. - # This set of tests is simply using the `testSingleWorkspace` set of tests, but - # with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`, which - # got set in the Prepare Venv-Test Environment task above. - # **Note**: Azure DevOps tasks set environment variables via a specially formatted - # string sent to stdout. - # - # This task only runs if the string 'venvTests' exists in variable 'TestsToRun' - # - # Example command line (windows pwsh): - # > $Env:TEST_FILES_SUFFIX=testvirtualenvs - # > npm run testSingleWorkspace - - script: | - cat $PYTHON_VIRTUAL_ENVS_LOCATION - - npm run testSingleWorkspace - - displayName: 'Run Venv-Tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'venvTests')) - env: - DISPLAY: :10 - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish Venv-Tests results' - condition: contains(variables['TestsToRun'], 'venvTests') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'venvTest-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'SystemTests' - - # Set the CI_PYTHON_PATH variable that forces VS Code system tests to use - # the specified Python interpreter. - # - # This is how to set an environment variable in the Azure DevOps pipeline, write - # a specially formatted string to stdout. For details, please see - # https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-in-script - # - # Example command line (windows pwsd): - # > $Env:CI_PYTHON_PATH=(& python -c 'import sys;print(sys.executable)') - - script: | - python -c "from __future__ import print_function;import sys;print('##vso[task.setvariable variable=CI_PYTHON_PATH;]{}'.format(sys.executable))" - displayName: 'Set CI_PYTHON_PATH' - - # Run the functional tests. - # - # This task only runs if the string 'testFunctional' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run test:functional - - script: | - npm run test:functional - displayName: 'Run functional tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testFunctional')) - env: - DISPLAY: :10 - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish functional tests results' - condition: contains(variables['TestsToRun'], 'testFunctional') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'functional-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'FunctionalTests' - - # Run the single workspace tests. - # - # This task only runs if the string 'testSingleWorkspace' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run testSingleWorkspace - - script: | - npm run testSingleWorkspace - displayName: 'Run single workspace tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testSingleWorkspace')) - env: - DISPLAY: :10 - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish single workspace tests results' - condition: contains(variables['TestsToRun'], 'testSingleWorkspace') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'singleWorkspace-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'SystemTests' - - # Run the multi-workspace tests. - # - # This task only runs if the string 'testMultiWorkspace' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run testMultiWorkspace - - script: | - npm run testMultiWorkspace - displayName: 'Run multi-workspace tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testMultiWorkspace')) - env: - DISPLAY: :10 - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish multi-workspace tests results' - condition: contains(variables['TestsToRun'], 'testMultiWorkspace') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'multiWorkspace-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'SystemTests' - - # Run the debugger integration tests. - # - # This task only runs if the string 'testDebugger' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run testDebugger - - script: | - npm run testDebugger - displayName: 'Run debugger tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testDebugger')) - env: - DISPLAY: :10 - - # Upload the test results to Azure DevOps to facilitate test reporting in their UX. - - task: PublishTestResults@2 - displayName: 'Publish debugger tests results' - condition: contains(variables['TestsToRun'], 'testDebugger') - inputs: - testResultsFiles: '$(MOCHA_FILE)' - testRunTitle: 'debugger-$(Agent.Os)-Py$(pythonVersion)' - buildPlatform: '$(Agent.Os)-Py$(pythonVersion)' - buildConfiguration: 'SystemTests' - - # Run the performance tests. - # - # This task only runs if the string 'testPerformance' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run testPerformance - - script: | - npm run testPerformance - displayName: 'Run Performance Tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testPerformance')) - env: - DISPLAY: :10 - - # Run the smoke tests. - # - # This task only runs if the string 'testSmoke' exists in variable `TestsToRun`. - # - # Example command line (windows pwsh): - # > npm run clean - # > npm run updateBuildNumber -- --buildNumber 0.0.0-local - # > npm run package - # > npx gulp clean:cleanExceptTests - # > npm run testSmoke - - bash: | - npm install -g vsce - npm run clean - npx tsc -p ./ - npx gulp clean:cleanExceptTests - mkdir -p ./tmp - cp -r ./out/test ./tmp/test - npm run updateBuildNumber -- --buildNumber $BUILD_BUILDID - npm run package - npx gulp clean:cleanExceptTests - cp -r ./tmp/test ./out/test - node ./out/test/smokeTest.js - displayName: 'Run Smoke Tests' - condition: and(succeeded(), contains(variables['TestsToRun'], 'testSmoke')) - env: - DISPLAY: :10 - - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory) - artifactName: $(Agent.JobName) - condition: always() diff --git a/build/ci/vscode-python-ci.yaml b/build/ci/vscode-python-ci.yaml deleted file mode 100644 index be5356cee725..000000000000 --- a/build/ci/vscode-python-ci.yaml +++ /dev/null @@ -1,305 +0,0 @@ -name: '$(Year:yyyy).$(Month).0.$(BuildID)-ci' -# CI build. -# Notes: Only trigger a commit for master and release, and skip build/rebuild -# on changes in the news and .vscode folders. -trigger: - branches: - include: ["master", "release*"] - paths: - exclude: ["/news/1 Enhancements", "/news/2 Fixes", "/news/3 Code Health", "/.vscode"] - -# Not the PR build for merges to master and release. -pr: none - -# Variables that are available for the entire pipeline. -variables: -- template: templates/globals.yml - -stages: -- stage: Build - jobs: - - template: templates/jobs/build_compile.yml - -- stage: Tests - dependsOn: [] - jobs: - - job: 'Test' - dependsOn: [] - timeoutInMinutes: 120 - strategy: - matrix: - # Each member of this list must contain these values: - # VMImageName: '[name]' - the VM image to run the tests on. - # TestsToRun: 'testA, testB, ..., testN' - the list of tests to execute, see the list above. - # Each member of this list may contain these values: - # NeedsPythonTestReqs: [true|false] - install the test-requirements prior to running tests. False if not set. - # NeedsPythonFunctionalReqs: [true|false] - install the functional-requirements prior to running tests. False if not set. - # NeedsIPythonReqs: [true|false] - install the ipython-test-requirements prior to running tests. False if not set. - # PythonVersion: 'M.m' - the Python version to run. DefaultPythonVersion if not set. - # NodeVersion: 'x.y.z' - Node version to use. DefaultNodeVersion if not set. - # SkipXvfb: [true|false] - skip initialization of xvfb prior to running system tests on Linux. False if not set - # UploadBinary: [true|false] - upload test binaries to Azure if true. False if not set. - - ## Virtual Environment Tests: - - 'Win-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Linux-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Mac-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Win-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Linux-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Mac-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - - 'Win-Py3.7 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.7' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - # This is for the venvTests to use, not needed if you don't run venv tests... - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.7 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.7' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.7 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.7' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Win-Py3.6 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.6' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.6 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.6' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.6 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.6' - TestsToRun: 'venvTests, pythonIPythonTests' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - - # SingleWorkspace Tests - 'Win-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - - # MultiWorkspace Tests - 'Win-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - - # Debugger integration Tests - 'Win-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - - # Functional tests (not mocked Jupyter) - 'Windows-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Windows-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - - -- stage: Smoke - dependsOn: [] - jobs: - - job: 'Smoke' - dependsOn: [] - strategy: - matrix: - 'Mac-Py3.7': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Linux-Py3.7': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Win-Py3.7': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - -- stage: Reports - dependsOn: - - Smoke - - Tests - condition: always() - jobs: - - template: templates/jobs/coverage.yml diff --git a/build/ci/vscode-python-nightly-ci.yaml b/build/ci/vscode-python-nightly-ci.yaml deleted file mode 100644 index 17980d1262bf..000000000000 --- a/build/ci/vscode-python-nightly-ci.yaml +++ /dev/null @@ -1,476 +0,0 @@ -# Nightly build - -name: '$(Year:yyyy).$(Month).0.$(BuildID)-nightly' - -# Not the CI build, see `vscode-python-ci.yaml`. -trigger: none - -# Not the PR build for merges to master and release. -pr: none - -schedules: -- cron: "0 8 * * 1-5" - # Daily midnight PST build, runs Monday - Friday always - displayName: Nightly build - branches: - include: - - master - - release* - always: true - -# Variables that are available for the entire pipeline. -variables: -- template: templates/globals.yml - -stages: -- stage: Build - jobs: - - template: templates/jobs/build_compile.yml - -- stage: Tests - dependsOn: - - Build - jobs: - - job: 'Tests' - dependsOn: [] - timeoutInMinutes: 120 - strategy: - matrix: - # Each member of this list must contain these values: - # VMImageName: '[name]' - the VM image to run the tests on. - # TestsToRun: 'testA, testB, ..., testN' - the list of tests to execute, see the list above. - # Each member of this list may contain these values: - # NeedsPythonTestReqs: [true|false] - install the test-requirements prior to running tests. False if not set. - # NeedsPythonFunctionalReqs: [true|false] - install the functional-requirements prior to running tests. False if not set. - # PythonVersion: 'M.m' - the Python version to run. DefaultPythonVersion if not set. - # NodeVersion: 'x.y.z' - Node version to use. DefaultNodeVersion if not set. - # SkipXvfb: [true|false] - skip initialization of xvfb prior to running system tests on Linux. False if not set - # UploadBinary: [true|false] - upload test binaries to Azure if true. False if not set. - - ## Virtual Environment Tests: - - 'Win-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - - 'Win-Py3.7 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - # This is for the venvTests to use, not needed if you don't run venv tests... - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.7 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.7 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Win-Py3.6 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.6 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.6 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Win-Py3.5 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.5 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.5 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # Note: Virtual env tests use `venv` and won't currently work with Python 2.7 - - # SingleWorkspace Tests - 'Win-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - - # MultiWorkspace Tests - 'Win-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - - # Debugger integration Tests - 'Win-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - - # Functional tests (mocked Jupyter) - 'Windows-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Windows-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Windows-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Windows-Py2.7 Functional': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Linux-Py2.7 Functional': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - 'Mac-Py2.7 Functional': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - - -- stage: Smoke - dependsOn: - - Build - jobs: - - job: 'Smoke' - dependsOn: [] - strategy: - matrix: - 'Mac-Py3.7': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Linux-Py3.7': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Win-Py3.7': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - -- stage: Reports - dependsOn: - - Smoke - - Tests - condition: always() - jobs: - - template: templates/jobs/coverage.yml diff --git a/build/ci/vscode-python-nightly-flake-ci.yaml b/build/ci/vscode-python-nightly-flake-ci.yaml deleted file mode 100644 index 4ab0a9519179..000000000000 --- a/build/ci/vscode-python-nightly-flake-ci.yaml +++ /dev/null @@ -1,136 +0,0 @@ -# Nightly flake build -# Notes: Scheduled builds don't have a trigger in YAML (as of this writing). -# Trigger is set through the Azure DevOps UI `Nightly Build->Edit->...->Triggers`. - -name: '$(Year:yyyy).$(Month).0.$(BuildID)-nightly-flake' - -# Not the CI build, see `vscode-python-ci.yaml`. -trigger: none - -# Not the PR build for merges to master and release. -pr: none - -schedules: -- cron: "0 8 * * 1-5" - # Daily midnight PST build, runs Monday - Friday always - displayName: Nightly flake build - branches: - include: - - master - - release* - # False here so we don't run these long tests over and over on release branch if the source isn't changing - always: false - -# Variables that are available for the entire pipeline. -variables: -- template: templates/globals.yml - -stages: -- stage: Build - jobs: - - template: templates/jobs/build_compile.yml - -# - template: templates/jobs/smoke.yml - -- stage: Tests - dependsOn: - - Build - jobs: - - job: 'Test' - dependsOn: [] - timeoutInMinutes: 240 - strategy: - matrix: - # Each member of this list must contain these values: - # VMImageName: '[name]' - the VM image to run the tests on. - # TestsToRun: 'testA, testB, ..., testN' - the list of tests to execute, see the list above. - # Each member of this list may contain these values: - # NeedsPythonTestReqs: [true|false] - install the test-requirements prior to running tests. False if not set. - # NeedsPythonFunctionalReqs: [true|false] - install the functional-requirements prior to running tests. False if not set. - # PythonVersion: 'M.m' - the Python version to run. DefaultPythonVersion if not set. - # NodeVersion: 'x.y.z' - Node version to use. DefaultNodeVersion if not set. - # SkipXvfb: [true|false] - skip initialization of xvfb prior to running system tests on Linux. False if not set - # UploadBinary: [true|false] - upload test binaries to Azure if true. False if not set. - - ## Virtual Environment Tests: - - # Functional tests (not mocked Jupyter) - 'Windows-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - # This tells the functional tests to not mock out Jupyter... - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Linux-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Mac-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Windows-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Linux-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Mac-Py3.6 Functional': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Windows-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Linux-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - 'Mac-Py3.5 Functional': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - VSCODE_PYTHON_ROLLING: true - VSC_PYTHON_LOG_TELEMETRY: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml diff --git a/build/ci/vscode-python-nightly-uitest.yaml b/build/ci/vscode-python-nightly-uitest.yaml deleted file mode 100644 index 0147e60762bd..000000000000 --- a/build/ci/vscode-python-nightly-uitest.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: '$(Year:yyyy).$(Month).0.$(BuildID)-nightly-uitest' - -trigger: none -pr: none -schedules: -- cron: "0 8 * * *" - # Daily midnight PST build, runs at midnight every day, but only if the code has changed since the last run, for master and all releases/* - displayName: Daily midnight build - branches: - include: - - master - - releases* - -# Variables that are available for the entire pipeline. -variables: -- template: templates/globals.yml - -stages: -- stage: Build - jobs: - - template: templates/jobs/build_compile.yml - -- stage: Build_UITests - dependsOn: [] - jobs: - - template: templates/jobs/build_uitests.yml - -- stage: UITests - dependsOn: - - Build - - Build_UITests - jobs: - - template: templates/jobs/uitest.yml - parameters: - jobs: - - test: "Smoke" - tags: "@smoke" - # Smoke tests are cheap, so run them against all Python Versions. - - test: "Test" - tags: "@testing" - # We have python code that is involved in running/discovering tests. - # Hence test against all versions, until we have CI running for the Python code. - # I.e. when all test discovery/running is done purely in Python. - # However we will not run against Python 2.7 as Pytest is not supported against 2.7. - # Yes unitest and nose are, but its messy to write the BDD tests to re-use same tests - # but exclude for pytest and python 2.7 in a generic & simple way. - ignorePythonVersions: "2.7" - - test: "Terminal" - tags: "@terminal and not @terminal.pipenv" - # No need to run tests against all versions. - # This is faster/cheaper, besides activation of terminals is generic enough - # not to warrant testing against all versions. - ignorePythonVersions: "3.6,3.5" - - test: "Debugging" - tags: "@debugging" - # No need to run tests against all versions. - # This is faster/cheaper, and these are external packages. - # We expect them to work (or 3rd party packages to test against all PY versions). - ignorePythonVersions: "3.6,3.5" - - test: "Jedi_Language_Server" - tags: "@ls" - # No need to run tests against all versions. - # This is faster/cheaper, and these are external packages. - # We expect them to work (or 3rd party packages to test against all PY versions). - ignorePythonVersions: "3.6,3.5" - -- stage: Reports - dependsOn: - - UITests - condition: always() - jobs: - - template: templates/jobs/merge_upload_uitest_report.yml diff --git a/build/ci/vscode-python-pr-validation.yaml b/build/ci/vscode-python-pr-validation.yaml deleted file mode 100644 index 0c24a440df33..000000000000 --- a/build/ci/vscode-python-pr-validation.yaml +++ /dev/null @@ -1,133 +0,0 @@ -name: '$(Year:yyyy).$(Month).0.$(BuildID)-pr' - -# PR Validation build. -# Notes: Only trigger a PR build for master and release, and skip build/rebuild -# on changes in the news and .vscode folders. -pr: - autoCancel: true - branches: - include: ["master", "release*", "ds*"] - paths: - exclude: ["/news/1 Enhancements", "/news/2 Fixes", "/news/3 Code Health", "/.vscode"] - -# Not the CI build for merges to master and release. -trigger: none - -# Variables that are available for the entire pipeline. -variables: -- template: templates/globals.yml - -stages: -- stage: Build - jobs: - - template: templates/jobs/build_compile.yml - -- stage: Tests - dependsOn: [] - jobs: - - job: 'Test' - dependsOn: [] - strategy: - matrix: - # Each member of this list must contain these values: - # VMImageName: '[name]' - the VM image to run the tests on. - # TestsToRun: 'testA, testB, ..., testN' - the list of tests to execute, see the list above. - # Each member of this list may contain these values: - # NeedsPythonTestReqs: [true|false] - install the test-requirements prior to running tests. False if not set. - # NeedsPythonFunctionalReqs: [true|false] - install the functional-requirements prior to running tests. False if not set. - # PythonVersion: 'M.m' - the Python version to run. DefaultPythonVersion if not set. - # NodeVersion: 'x.y.z' - Node version to use. DefaultNodeVersion if not set. - # SkipXvfb: [true|false] - skip initialization of xvfb prior to running system tests on Linux. False if not set - # UploadBinary: [true|false] - upload test binaries to Azure if true. False if not set. - 'Win-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonInternalTools' - NeedsPythonTestReqs: true - 'Win-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonInternalTools' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Single Workspace': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Unit+Single': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests, testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testUnitTests, pythonUnitTests, pythonInternalTools' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Single Workspace': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Unit+Single': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests, testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Functional': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testfunctional' - NeedsPythonTestReqs: true - NeedsPythonFunctionalReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - -- stage: Smoke - dependsOn: [] - jobs: - - job: 'Smoke' - dependsOn: [] - strategy: - matrix: - 'Mac-Py3.7': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Linux-Py3.7': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - 'Win-Py3.7': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSmoke' - NeedsPythonTestReqs: true - NeedsIPythonReqs: true - - pool: - vmImage: $(VMImageName) - - steps: - - template: templates/test_phases.yml - -- stage: Reports - dependsOn: - - Smoke - - Tests - condition: always() - jobs: - - template: templates/jobs/coverage.yml diff --git a/build/constants.js b/build/constants.js index 60109ea4ce0e..73815ebea45f 100644 --- a/build/constants.js +++ b/build/constants.js @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. + 'use strict'; const util = require('./util'); + exports.ExtensionRootDir = util.ExtensionRootDir; // This is a list of files that existed before MS got the extension. exports.existingFiles = util.getListOfFiles('existingFiles.json'); diff --git a/build/debugger-install-requirements.txt b/build/debugger-install-requirements.txt deleted file mode 100644 index fe1fb9c3319b..000000000000 --- a/build/debugger-install-requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Requirements needed to run install_ptvsd.py -packaging diff --git a/build/existingFiles.json b/build/existingFiles.json index 6a3493259618..48ab84ff565d 100644 --- a/build/existingFiles.json +++ b/build/existingFiles.json @@ -135,27 +135,6 @@ "src/client/common/variables/sysTypes.ts", "src/client/common/variables/types.ts", "src/client/debugger/constants.ts", - "src/client/debugger/debugAdapter/Common/Contracts.ts", - "src/client/debugger/debugAdapter/Common/debugStreamProvider.ts", - "src/client/debugger/debugAdapter/Common/processServiceFactory.ts", - "src/client/debugger/debugAdapter/Common/protocolLogger.ts", - "src/client/debugger/debugAdapter/Common/protocolParser.ts", - "src/client/debugger/debugAdapter/Common/protocolWriter.ts", - "src/client/debugger/debugAdapter/Common/Utils.ts", - "src/client/debugger/debugAdapter/DebugClients/DebugClient.ts", - "src/client/debugger/debugAdapter/DebugClients/DebugFactory.ts", - "src/client/debugger/debugAdapter/DebugClients/helper.ts", - "src/client/debugger/debugAdapter/DebugClients/launcherProvider.ts", - "src/client/debugger/debugAdapter/DebugClients/LocalDebugClient.ts", - "src/client/debugger/debugAdapter/DebugClients/localDebugClientV2.ts", - "src/client/debugger/debugAdapter/DebugClients/nonDebugClientV2.ts", - "src/client/debugger/debugAdapter/DebugClients/RemoteDebugClient.ts", - "src/client/debugger/debugAdapter/DebugServers/BaseDebugServer.ts", - "src/client/debugger/debugAdapter/DebugServers/LocalDebugServerV2.ts", - "src/client/debugger/debugAdapter/DebugServers/RemoteDebugServerv2.ts", - "src/client/debugger/debugAdapter/main.ts", - "src/client/debugger/debugAdapter/serviceRegistry.ts", - "src/client/debugger/debugAdapter/types.ts", "src/client/debugger/extension/banner.ts", "src/client/debugger/extension/configuration/baseProvider.ts", "src/client/debugger/extension/configuration/configurationProviderUtils.ts", @@ -191,7 +170,6 @@ "src/client/interpreter/configuration/types.ts", "src/client/interpreter/contracts.ts", "src/client/interpreter/display/index.ts", - "src/client/interpreter/display/shebangCodeLensProvider.ts", "src/client/interpreter/helpers.ts", "src/client/interpreter/interpreterService.ts", "src/client/interpreter/interpreterVersion.ts", @@ -217,7 +195,6 @@ "src/client/ioc/index.ts", "src/client/ioc/serviceManager.ts", "src/client/ioc/types.ts", - "src/client/jupyter/provider.ts", "src/client/language/braceCounter.ts", "src/client/language/characters.ts", "src/client/language/characterStream.ts", @@ -229,7 +206,6 @@ "src/client/language/types.ts", "src/client/language/unicode.ts", "src/client/languageServices/jediProxyFactory.ts", - "src/client/languageServices/languageServerSurveyBanner.ts", "src/client/languageServices/proposeLanguageServerBanner.ts", "src/client/linters/bandit.ts", "src/client/linters/baseLinter.ts", @@ -403,6 +379,7 @@ "src/test/common/socketStream.test.ts", "src/test/common/terminals/activation.bash.unit.test.ts", "src/test/common/terminals/activation.commandPrompt.unit.test.ts", + "src/test/common/terminals/activation.nushell.unit.test.ts", "src/test/common/terminals/activation.conda.unit.test.ts", "src/test/common/terminals/activation.unit.test.ts", "src/test/common/terminals/activator/base.unit.test.ts", @@ -424,7 +401,6 @@ "src/test/configuration/interpreterSelector.unit.test.ts", "src/test/constants.ts", "src/test/core.ts", - "src/test/debugger/attach.ptvsd.test.ts", "src/test/debugger/capabilities.test.ts", "src/test/debugger/common/constants.ts", "src/test/debugger/common/debugStreamProvider.test.ts", @@ -524,7 +500,7 @@ "src/test/providers/shebangCodeLenseProvider.test.ts", "src/test/providers/symbolProvider.unit.test.ts", "src/test/providers/terminal.unit.test.ts", - "src/test/pythonFiles/formatting/dummy.ts", + "src/test/python_files/formatting/dummy.ts", "src/test/refactor/extension.refactor.extract.method.test.ts", "src/test/refactor/extension.refactor.extract.var.test.ts", "src/test/refactor/rename.test.ts", diff --git a/build/fail.js b/build/fail.js new file mode 100644 index 000000000000..2adc808d8da9 --- /dev/null +++ b/build/fail.js @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +process.exitCode = 1; diff --git a/build/functional-test-requirements.txt b/build/functional-test-requirements.txt index dce60486ae64..5c3a9e3116ed 100644 --- a/build/functional-test-requirements.txt +++ b/build/functional-test-requirements.txt @@ -1,7 +1,5 @@ -# List of requirements for functional tests -versioneer -jupyter -numpy -matplotlib -pandas -livelossplot +# List of requirements for functional tests +versioneer +numpy +pytest +pytest-cov diff --git a/build/ipython-test-requirements.txt b/build/ipython-test-requirements.txt deleted file mode 100644 index 688e039a4461..000000000000 --- a/build/ipython-test-requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# List of requirements for ipython tests -numpy -pandas -ipython diff --git a/build/license-header.txt b/build/license-header.txt new file mode 100644 index 000000000000..2970b03d7a1c --- /dev/null +++ b/build/license-header.txt @@ -0,0 +1,9 @@ +PLEASE NOTE: This is the license for the Python extension for Visual Studio Code. The Python extension automatically installs other extensions as optional dependencies, which can be uninstalled at any time. These extensions have separate licenses: + + - The Python Debugger extension is released under an MIT License: + https://marketplace.visualstudio.com/items/ms-python.debugpy/license + + - The Pylance extension is only available in binary form and is released under a Microsoft proprietary license, the terms of which are available here: + https://marketplace.visualstudio.com/items/ms-python.vscode-pylance/license + +------------------------------------------------------------------------------ diff --git a/build/test-requirements.txt b/build/test-requirements.txt index ffc4cf1d3287..6d64ff72ac7f 100644 --- a/build/test-requirements.txt +++ b/build/test-requirements.txt @@ -1,18 +1,42 @@ -# Install flake8 first, as both flake8 and autopep8 require pycodestyle, -# but flake8 has a tighter pinning. +# pin setoptconf to prevent issue with 'use_2to3' +setoptconf==0.3.0 + flake8 -autopep8 bandit -black ; python_version>='3.6' -yapf pylint pycodestyle -prospector pydocstyle -nose -pytest==3.6.3 -rope +prospector +pytest flask +fastapi +uvicorn django -isort -packaging==19.2 +testresources +testscenarios + +# Integrated TensorBoard tests +tensorboard +torch-tb-profiler + +# extension build tests +freezegun + +# testing custom pytest plugin require the use of named pipes +namedpipe; platform_system == "Windows" + +# typing for Django files +django-stubs + +coverage +pytest-cov +pytest-json +pytest-timeout + + +# for pytest-describe related tests +pytest-describe + +# for pytest-ruff related tests +pytest-ruff +pytest-black diff --git a/build/test_update_ext_version.py b/build/test_update_ext_version.py new file mode 100644 index 000000000000..b94484775f59 --- /dev/null +++ b/build/test_update_ext_version.py @@ -0,0 +1,126 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import datetime +import json + +import freezegun +import pytest +import update_ext_version + + +CURRENT_YEAR = datetime.datetime.now().year +TEST_DATETIME = f"{CURRENT_YEAR}-03-14 01:23:45" + +# The build ID is calculated via: +# "1" + datetime.datetime.strptime(TEST_DATETIME,"%Y-%m-%d %H:%M:%S").strftime('%j%H%M') +EXPECTED_BUILD_ID = "10730123" + + +def create_package_json(directory, version): + """Create `package.json` in `directory` with a specified version of `version`.""" + package_json = directory / "package.json" + package_json.write_text(json.dumps({"version": version}), encoding="utf-8") + return package_json + + +def run_test(tmp_path, version, args, expected): + package_json = create_package_json(tmp_path, version) + update_ext_version.main(package_json, args) + package = json.loads(package_json.read_text(encoding="utf-8")) + assert expected == update_ext_version.parse_version(package["version"]) + + +@pytest.mark.parametrize( + "version, args", + [ + ("2000.1.0", []), # Wrong year for CalVer + (f"{CURRENT_YEAR}.0.0-rc", []), + (f"{CURRENT_YEAR}.1.0-rc", ["--release"]), + (f"{CURRENT_YEAR}.0.0-rc", ["--release", "--build-id", "-1"]), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--for-publishing", "--build-id", "-1"], + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--for-publishing", "--build-id", "999999999999"], + ), + (f"{CURRENT_YEAR}.1.0-rc", ["--build-id", "-1"]), + (f"{CURRENT_YEAR}.1.0-rc", ["--for-publishing", "--build-id", "-1"]), + (f"{CURRENT_YEAR}.1.0-rc", ["--for-publishing", "--build-id", "999999999999"]), + ], +) +def test_invalid_args(tmp_path, version, args): + with pytest.raises(ValueError): + run_test(tmp_path, version, args, None) + + +@pytest.mark.parametrize( + "version, args, expected", + [ + ( + f"{CURRENT_YEAR}.1.0-rc", + ["--build-id", "12345"], + (f"{CURRENT_YEAR}", "1", "12345", "rc"), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--build-id", "12345"], + (f"{CURRENT_YEAR}", "0", "12345", ""), + ), + ( + f"{CURRENT_YEAR}.1.0-rc", + ["--for-publishing", "--build-id", "12345"], + (f"{CURRENT_YEAR}", "1", "12345", ""), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--for-publishing", "--build-id", "12345"], + (f"{CURRENT_YEAR}", "0", "12345", ""), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--build-id", "999999999999"], + (f"{CURRENT_YEAR}", "0", "999999999999", ""), + ), + ( + f"{CURRENT_YEAR}.1.0-rc", + ["--build-id", "999999999999"], + (f"{CURRENT_YEAR}", "1", "999999999999", "rc"), + ), + ( + f"{CURRENT_YEAR}.1.0-rc", + [], + (f"{CURRENT_YEAR}", "1", EXPECTED_BUILD_ID, "rc"), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release"], + (f"{CURRENT_YEAR}", "0", "0", ""), + ), + ( + f"{CURRENT_YEAR}.1.0-rc", + ["--for-publishing"], + (f"{CURRENT_YEAR}", "1", EXPECTED_BUILD_ID, ""), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release", "--for-publishing"], + (f"{CURRENT_YEAR}", "0", "0", ""), + ), + ( + f"{CURRENT_YEAR}.0.0-rc", + ["--release"], + (f"{CURRENT_YEAR}", "0", "0", ""), + ), + ( + f"{CURRENT_YEAR}.1.0-rc", + [], + (f"{CURRENT_YEAR}", "1", EXPECTED_BUILD_ID, "rc"), + ), + ], +) +@freezegun.freeze_time(f"{CURRENT_YEAR}-03-14 01:23:45") +def test_update_ext_version(tmp_path, version, args, expected): + run_test(tmp_path, version, args, expected) diff --git a/build/tslint-rules/baseRuleWalker.js b/build/tslint-rules/baseRuleWalker.js deleted file mode 100644 index b8ce93d4179d..000000000000 --- a/build/tslint-rules/baseRuleWalker.js +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -const path = require('path'); -const Lint = require('tslint'); -const util = require('../util'); -class BaseRuleWalker extends Lint.RuleWalker { - shouldIgnoreCurrentFile(node, filesToIgnore) { - const sourceFile = node.getSourceFile(); - if (sourceFile && sourceFile.fileName) { - const filename = path.resolve(util.ExtensionRootDir, sourceFile.fileName); - if (filesToIgnore.indexOf(filename.replace(/\//g, path.sep)) >= 0) { - return true; - } - } - return false; - } -} -exports.BaseRuleWalker = BaseRuleWalker; diff --git a/build/tslint-rules/messagesMustBeLocalizedRule.js b/build/tslint-rules/messagesMustBeLocalizedRule.js deleted file mode 100644 index 76c892de9653..000000000000 --- a/build/tslint-rules/messagesMustBeLocalizedRule.js +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -const path = require('path'); -const Lint = require('tslint'); -const ts = require('typescript'); -const util = require('../util'); -const baseRuleWalker = require('./baseRuleWalker'); -const methodNames = [ - // From IApplicationShell (vscode.window): - 'showErrorMessage', - 'showInformationMessage', - 'showWarningMessage', - 'setStatusBarMessage', - // From IOutputChannel (vscode.OutputChannel): - 'appendLine', - 'appendLine' -]; -// tslint:ignore-next-line:no-suspicious-comments -// TODO: Ideally we would not ignore any files. -const ignoredFiles = util.getListOfFiles('unlocalizedFiles.json'); -const ignoredPrefix = path.normalize('src/test'); -const failureMessage = 'Messages must be localized in the Python Extension (use src/client/common/utils/localize.ts)'; -class NoStringLiteralsInMessages extends baseRuleWalker.BaseRuleWalker { - visitCallExpression(node) { - if (!this.shouldIgnoreNode(node)) { - node.arguments - .filter(arg => ts.isStringLiteral(arg) || ts.isTemplateLiteral(arg)) - .forEach(arg => { - this.addFailureAtNode(arg, failureMessage); - }); - } - super.visitCallExpression(node); - } - shouldIgnoreCurrentFile(node) { - //console.log(''); - //console.log(node.getSourceFile().fileName); - //console.log(ignoredFiles); - if (super.shouldIgnoreCurrentFile(node, ignoredFiles)) { - return true; - } - const sourceFile = node.getSourceFile(); - if (sourceFile && sourceFile.fileName) { - if (sourceFile.fileName.startsWith(ignoredPrefix)) { - return true; - } - } - return false; - } - shouldIgnoreNode(node) { - if (this.shouldIgnoreCurrentFile(node)) { - return true; - } - if (!ts.isPropertyAccessExpression(node.expression)) { - return true; - } - const prop = node.expression; - if (methodNames.indexOf(prop.name.text) < 0) { - return true; - } - return false; - } -} -class Rule extends Lint.Rules.AbstractRule { - apply(sourceFile) { - return this.applyWithWalker(new NoStringLiteralsInMessages(sourceFile, this.getOptions())); - } -} -Rule.FAILURE_STRING = failureMessage; -exports.Rule = Rule; diff --git a/build/unlocalizedFiles.json b/build/unlocalizedFiles.json index a30be98420fe..4da3d450af23 100644 --- a/build/unlocalizedFiles.json +++ b/build/unlocalizedFiles.json @@ -7,7 +7,6 @@ "src/client/formatters/baseFormatter.ts", "src/client/formatters/blackFormatter.ts", "src/client/interpreter/configuration/pythonPathUpdaterService.ts", - "src/client/interpreter/locators/services/pipEnvService.ts", "src/client/linters/errorHandlers/notInstalled.ts", "src/client/linters/errorHandlers/standard.ts", "src/client/linters/linterCommands.ts", @@ -15,6 +14,7 @@ "src/client/providers/importSortProvider.ts", "src/client/providers/objectDefinitionProvider.ts", "src/client/providers/simpleRefactorProvider.ts", + "src/client/pythonEnvironments/discovery/locators/services/pipEnvService.ts", "src/client/terminals/codeExecution/helper.ts", "src/client/testing/common/debugLauncher.ts", "src/client/testing/common/managers/baseTestManager.ts", diff --git a/build/update_ext_version.py b/build/update_ext_version.py new file mode 100644 index 000000000000..6d709ae05f7f --- /dev/null +++ b/build/update_ext_version.py @@ -0,0 +1,126 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import argparse +import datetime +import json +import pathlib +import sys +from typing import Sequence, Tuple, Union + +EXT_ROOT = pathlib.Path(__file__).parent.parent +PACKAGE_JSON_PATH = EXT_ROOT / "package.json" + + +def build_arg_parse() -> argparse.ArgumentParser: + """Builds the arguments parser.""" + parser = argparse.ArgumentParser( + description="This script updates the python extension micro version based on the release or pre-release channel." + ) + parser.add_argument( + "--release", + action="store_true", + help="Treats the current build as a release build.", + ) + parser.add_argument( + "--build-id", + action="store", + type=int, + default=None, + help="If present, will be used as a micro version.", + required=False, + ) + parser.add_argument( + "--for-publishing", + action="store_true", + help="Removes `-dev` or `-rc` suffix.", + ) + return parser + + +def is_even(v: Union[int, str]) -> bool: + """Returns True if `v` is even.""" + return not int(v) % 2 + + +def micro_build_number() -> str: + """Generates the micro build number. + The format is `1`. + """ + return f"1{datetime.datetime.now(tz=datetime.timezone.utc).strftime('%j%H%M')}" + + +def parse_version(version: str) -> Tuple[str, str, str, str]: + """Parse a version string into a tuple of version parts.""" + major, minor, parts = version.split(".", maxsplit=2) + try: + micro, suffix = parts.split("-", maxsplit=1) + except ValueError: + micro = parts + suffix = "" + return major, minor, micro, suffix + + +def main(package_json: pathlib.Path, argv: Sequence[str]) -> None: + parser = build_arg_parse() + args = parser.parse_args(argv) + + package = json.loads(package_json.read_text(encoding="utf-8")) + + major, minor, micro, suffix = parse_version(package["version"]) + + current_year = datetime.datetime.now().year + current_month = datetime.datetime.now().month + int_major = int(major) + valid_major = ( + int_major + == current_year # Between JAN-DEC major version should be current year + or ( + int_major == current_year - 1 and current_month == 1 + ) # After new years the check is relaxed for JAN to allow releases of previous year DEC + or ( + int_major == current_year + 1 and current_month == 12 + ) # Before new years the check is relaxed for DEC to allow pre-releases of next year JAN + ) + if not valid_major: + raise ValueError( + f"Major version [{major}] must be the current year [{current_year}].", + f"If changing major version after new year's, change to {current_year}.1.0", + "Minor version must be updated based on release or pre-release channel.", + ) + + if args.release and not is_even(minor): + raise ValueError( + f"Release version should have EVEN numbered minor version: {package['version']}" + ) + elif not args.release and is_even(minor): + raise ValueError( + f"Pre-Release version should have ODD numbered minor version: {package['version']}" + ) + + print(f"Updating build FROM: {package['version']}") + if args.build_id: + # If build id is provided it should fall within the 0-INT32 max range + # that the max allowed value for publishing to the Marketplace. + if args.build_id < 0 or (args.for_publishing and args.build_id > ((2**32) - 1)): + raise ValueError(f"Build ID must be within [0, {(2**32) - 1}]") + + package["version"] = ".".join((major, minor, str(args.build_id))) + elif args.release: + package["version"] = ".".join((major, minor, micro)) + else: + # micro version only updated for pre-release. + package["version"] = ".".join((major, minor, micro_build_number())) + + if not args.for_publishing and not args.release and len(suffix): + package["version"] += "-" + suffix + print(f"Updating build TO: {package['version']}") + + # Overwrite package.json with new data add a new-line at the end of the file. + package_json.write_text( + json.dumps(package, indent=4, ensure_ascii=False) + "\n", encoding="utf-8" + ) + + +if __name__ == "__main__": + main(PACKAGE_JSON_PATH, sys.argv[1:]) diff --git a/build/update_package_file.py b/build/update_package_file.py new file mode 100644 index 000000000000..f82587ced846 --- /dev/null +++ b/build/update_package_file.py @@ -0,0 +1,22 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import json +import pathlib + +EXT_ROOT = pathlib.Path(__file__).parent.parent +PACKAGE_JSON_PATH = EXT_ROOT / "package.json" + + +def main(package_json: pathlib.Path) -> None: + package = json.loads(package_json.read_text(encoding="utf-8")) + package["enableTelemetry"] = True + + # Overwrite package.json with new data add a new-line at the end of the file. + package_json.write_text( + json.dumps(package, indent=4, ensure_ascii=False) + "\n", encoding="utf-8" + ) + + +if __name__ == "__main__": + main(PACKAGE_JSON_PATH) diff --git a/build/util.js b/build/util.js index 8a5ce3daf7d5..c54e204ae7d7 100644 --- a/build/util.js +++ b/build/util.js @@ -1,9 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. + 'use strict'; const fs = require('fs'); const path = require('path'); + exports.ExtensionRootDir = path.dirname(__dirname); function getListOfFiles(filename) { filename = path.normalize(filename); @@ -12,8 +14,6 @@ function getListOfFiles(filename) { } const data = fs.readFileSync(filename).toString(); const files = JSON.parse(data); - return files.map(file => { - return path.join(exports.ExtensionRootDir, file.replace(/\//g, path.sep)); - }); + return files.map((file) => path.join(exports.ExtensionRootDir, file.replace(/\//g, path.sep))); } exports.getListOfFiles = getListOfFiles; diff --git a/build/webpack/common.js b/build/webpack/common.js index 02e77ae61354..c7f7460adf86 100644 --- a/build/webpack/common.js +++ b/build/webpack/common.js @@ -1,60 +1,51 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -const glob = require('glob'); -const path = require('path'); -const webpack_bundle_analyzer = require('webpack-bundle-analyzer'); -const constants = require('../constants'); -exports.nodeModulesToExternalize = [ - 'unicode/category/Lu', - 'unicode/category/Ll', - 'unicode/category/Lt', - 'unicode/category/Lo', - 'unicode/category/Lm', - 'unicode/category/Nl', - 'unicode/category/Mn', - 'unicode/category/Mc', - 'unicode/category/Nd', - 'unicode/category/Pc', - '@jupyterlab/services', - 'azure-storage', - 'request', - 'request-progress', - 'source-map-support', - 'diff-match-patch', - 'sudo-prompt', - 'node-stream-zip', - 'xml2js', - 'vsls/vscode', - 'pdfkit', - 'crypto-js', - 'fontkit', - 'linebreak', - 'png-js', - '@koa/cors', - 'koa', - 'koa-compress', - 'koa-logger' -]; -exports.nodeModulesToReplacePaths = [...exports.nodeModulesToExternalize]; -function getDefaultPlugins(name) { - const plugins = []; - plugins.push( - new webpack_bundle_analyzer.BundleAnalyzerPlugin({ - analyzerMode: 'static', - reportFilename: `${name}.analyzer.html`, - generateStatsFile: true, - statsFilename: `${name}.stats.json`, - openAnalyzer: false // Open file manually if you want to see it :) - }) - ); - return plugins; -} -exports.getDefaultPlugins = getDefaultPlugins; -function getListOfExistingModulesInOutDir() { - const outDir = path.join(constants.ExtensionRootDir, 'out', 'client'); - const files = glob.sync('**/*.js', { sync: true, cwd: outDir }); - return files.map(filePath => `./${filePath.slice(0, -3)}`); -} -exports.getListOfExistingModulesInOutDir = getListOfExistingModulesInOutDir; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +const glob = require('glob'); +const path = require('path'); +// eslint-disable-next-line camelcase +const webpack_bundle_analyzer = require('webpack-bundle-analyzer'); +const constants = require('../constants'); + +exports.nodeModulesToExternalize = [ + 'unicode/category/Lu', + 'unicode/category/Ll', + 'unicode/category/Lt', + 'unicode/category/Lo', + 'unicode/category/Lm', + 'unicode/category/Nl', + 'unicode/category/Mn', + 'unicode/category/Mc', + 'unicode/category/Nd', + 'unicode/category/Pc', + 'source-map-support', + 'sudo-prompt', + 'node-stream-zip', + 'xml2js', +]; +exports.nodeModulesToReplacePaths = [...exports.nodeModulesToExternalize]; +function getDefaultPlugins(name) { + const plugins = []; + // Only run the analyzer on a local machine or if required + if (!constants.isCI || process.env.VSC_PYTHON_FORCE_ANALYZER) { + plugins.push( + new webpack_bundle_analyzer.BundleAnalyzerPlugin({ + analyzerMode: 'static', + reportFilename: `${name}.analyzer.html`, + generateStatsFile: true, + statsFilename: `${name}.stats.json`, + openAnalyzer: false, // Open file manually if you want to see it :) + }), + ); + } + return plugins; +} +exports.getDefaultPlugins = getDefaultPlugins; +function getListOfExistingModulesInOutDir() { + const outDir = path.join(constants.ExtensionRootDir, 'out', 'client'); + const files = glob.sync('**/*.js', { sync: true, cwd: outDir }); + return files.map((filePath) => `./${filePath.slice(0, -3)}`); +} +exports.getListOfExistingModulesInOutDir = getListOfExistingModulesInOutDir; diff --git a/build/webpack/loaders/externalizeDependencies.js b/build/webpack/loaders/externalizeDependencies.js index 654da53163ea..0ada9b0424d8 100644 --- a/build/webpack/loaders/externalizeDependencies.js +++ b/build/webpack/loaders/externalizeDependencies.js @@ -1,20 +1,27 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -const common = require('../common'); -function replaceModule(contents, moduleName, quotes) { - const stringToSearch = `${quotes}${moduleName}${quotes}`; - const stringToReplaceWith = `${quotes}./node_modules/${moduleName}${quotes}`; - return contents.replace(new RegExp(stringToSearch, 'gm'), stringToReplaceWith); -} -// tslint:disable:no-default-export no-invalid-this -function default_1(source) { - common.nodeModulesToReplacePaths.forEach(moduleName => { - if (source.indexOf(moduleName) > 0) { - source = replaceModule(source, moduleName, '"'); - source = replaceModule(source, moduleName, "'"); - } - }); - return source; -} -exports.default = default_1; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +const common = require('../common'); + +function replaceModule(prefixRegex, prefix, contents, moduleName, quotes) { + const stringToSearch = `${prefixRegex}${quotes}${moduleName}${quotes}`; + const stringToReplaceWith = `${prefix}${quotes}./node_modules/${moduleName}${quotes}`; + return contents.replace(new RegExp(stringToSearch, 'gm'), stringToReplaceWith); +} + +// eslint-disable-next-line camelcase +function default_1(source) { + common.nodeModulesToReplacePaths.forEach((moduleName) => { + if (source.indexOf(moduleName) > 0) { + source = replaceModule('import\\(', 'import(', source, moduleName, '"'); + source = replaceModule('import\\(', 'import(', source, moduleName, "'"); + source = replaceModule('require\\(', 'require(', source, moduleName, '"'); + source = replaceModule('require\\(', 'require(', source, moduleName, "'"); + source = replaceModule('from ', 'from ', source, moduleName, '"'); + source = replaceModule('from ', 'from ', source, moduleName, "'"); + } + }); + return source; +} +// eslint-disable-next-line camelcase +exports.default = default_1; diff --git a/build/webpack/loaders/fixNodeFetch.js b/build/webpack/loaders/fixNodeFetch.js deleted file mode 100644 index 512fdc05db64..000000000000 --- a/build/webpack/loaders/fixNodeFetch.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -const path = require('path'); -const constants = require('../../constants'); - -const nodeFetchIndexFile = path.join( - constants.ExtensionRootDir, - 'node_modules', - '@jupyterlab', - 'services', - 'node_modules', - 'node-fetch', - 'lib', - 'index.js' -); -// On windows replace `\` with `\\`, else we get an error in webpack (Module parse failed: Octal literal in strict mode). -const nodeFetchFile = constants.isWindows ? nodeFetchIndexFile.replace(/\\/g, '\\\\') : nodeFetchIndexFile; - -/** - * Node fetch has an es6 module file. That gets bundled into @jupyterlab/services. - * However @jupyterlab/services/serverconnection.js is written such that it uses fetch from either node or browser. - * We need to force the browser version for things to work correctly. - * - * @export - * @param {string} source - * @returns - */ -exports.default = function(source) { - if (source.indexOf("require('node-fetch')") > 0) { - source = source.replace(/require\('node-fetch'\)/g, `require('${nodeFetchFile}')`); - } - return source; -}; diff --git a/build/webpack/loaders/jsonloader.js b/build/webpack/loaders/jsonloader.js index b9bbcce75400..5ec3c7038681 100644 --- a/build/webpack/loaders/jsonloader.js +++ b/build/webpack/loaders/jsonloader.js @@ -1,6 +1,6 @@ // For some reason this has to be in commonjs format -module.exports = function(source) { +module.exports = function (source) { // Just inline the source and fix up defaults so that they don't // mess up the logic in the setOptions.js file return `module.exports = ${source}\nmodule.exports.default = false`; diff --git a/build/webpack/loaders/remarkLoader.js b/build/webpack/loaders/remarkLoader.js index b9bbcce75400..5ec3c7038681 100644 --- a/build/webpack/loaders/remarkLoader.js +++ b/build/webpack/loaders/remarkLoader.js @@ -1,6 +1,6 @@ // For some reason this has to be in commonjs format -module.exports = function(source) { +module.exports = function (source) { // Just inline the source and fix up defaults so that they don't // mess up the logic in the setOptions.js file return `module.exports = ${source}\nmodule.exports.default = false`; diff --git a/build/webpack/nativeOrInteractivePicker.html b/build/webpack/nativeOrInteractivePicker.html new file mode 100644 index 000000000000..46d6f0e7eb52 --- /dev/null +++ b/build/webpack/nativeOrInteractivePicker.html @@ -0,0 +1,8 @@ + + + + + Click here to Open Native Editor
+ Click here to Open Interactive Window + + diff --git a/build/webpack/pdfkit.js b/build/webpack/pdfkit.js deleted file mode 100644 index 5c31590a3924..000000000000 --- a/build/webpack/pdfkit.js +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -/* -This file is only used when using webpack for bundling. -We have a dummy file so that webpack doesn't fall over when trying to bundle pdfkit. -Just point it to a dummy file (this file). -Once webpack is done, we override the pdfkit.js file in the externalized node modules directory -with the actual source of pdfkit that needs to be used by nodejs (our extension code). -*/ - -class PDFDocument {} -module.exports = PDFDocument; diff --git a/build/webpack/plugins/less-plugin-base64.js b/build/webpack/plugins/less-plugin-base64.js deleted file mode 100644 index 7c42013b4e55..000000000000 --- a/build/webpack/plugins/less-plugin-base64.js +++ /dev/null @@ -1,64 +0,0 @@ -// Most of this was based on https://github.com/less/less-plugin-inline-urls -// License for this was included in the ThirdPartyNotices-Repository.txt -const less = require('less'); - -class Base64MimeTypeNode { - constructor() { - this.value = 'image/svg+xml;base64'; - this.type = 'Base64MimeTypeNode'; - } - - eval(context) { - return this; - } -} - -class Base64Visitor { - constructor() { - this.visitor = new less.visitors.Visitor(this); - - // Set to a preEval visitor to make sure this runs before - // any evals - this.isPreEvalVisitor = true; - - // Make sure this is a replacing visitor so we remove the old data. - this.isReplacing = true; - } - - run(root) { - return this.visitor.visit(root); - } - - visitUrl(URLNode, visitArgs) { - // Return two new nodes in the call. One that has the mime type and other with the node. The data-uri - // evaluator will transform this into a base64 string - return new less.tree.Call( - 'data-uri', - [new Base64MimeTypeNode(), URLNode.value], - URLNode.index || 0, - URLNode.currentFileInfo - ); - } -} -/* - * This was originally used to perform less on uris and turn them into base64 encoded so they can be loaded into - * a webpack html. There's one caveat though. Less and webpack don't play well together. It runs the less at the root dir. - * This means in order to use this in a less file, you need to qualify the urls as if they come from the root dir. - * Example: - * url("./foo.svg") - * becomes - * url("./src/datascience-ui/history-react/images/foo.svg") - */ -class Base64Plugin { - constructor() {} - - install(less, pluginManager) { - pluginManager.addVisitor(new Base64Visitor()); - } - - printUsage() { - console.log('Base64 Plugin. Add to your webpack.config.js as a plugin to convert URLs to base64 inline'); - } -} - -module.exports = Base64Plugin; diff --git a/build/webpack/webpack.datascience-ui-notebooks.config.js b/build/webpack/webpack.datascience-ui-notebooks.config.js deleted file mode 100644 index e661d5ee7620..000000000000 --- a/build/webpack/webpack.datascience-ui-notebooks.config.js +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -const builder = require('./webpack.datascience-ui.config.builder'); -module.exports = [builder.notebooks]; diff --git a/build/webpack/webpack.datascience-ui-viewers.config.js b/build/webpack/webpack.datascience-ui-viewers.config.js deleted file mode 100644 index 89e3f2c56fdd..000000000000 --- a/build/webpack/webpack.datascience-ui-viewers.config.js +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -const builder = require('./webpack.datascience-ui.config.builder'); -module.exports = [builder.viewers]; diff --git a/build/webpack/webpack.datascience-ui.config.builder.js b/build/webpack/webpack.datascience-ui.config.builder.js deleted file mode 100644 index b050d403295f..000000000000 --- a/build/webpack/webpack.datascience-ui.config.builder.js +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -// Note to editors, if you change this file you have to restart compile-webviews. -// It doesn't reload the config otherwise. - -const common = require('./common'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const FixDefaultImportPlugin = require('webpack-fix-default-import-plugin'); -const path = require('path'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const constants = require('../constants'); -const configFileName = 'tsconfig.datascience-ui.json'; - -// Any build on the CI is considered production mode. -const isProdBuild = constants.isCI || process.argv.includes('--mode'); - -function getEntry(isNotebook) { - if (isNotebook) { - return { - nativeEditor: ['babel-polyfill', `./src/datascience-ui/native-editor/index.tsx`], - interactiveWindow: ['babel-polyfill', `./src/datascience-ui/history-react/index.tsx`] - }; - } - - return { - plotViewer: ['babel-polyfill', `./src/datascience-ui/plot/index.tsx`], - dataExplorer: ['babel-polyfill', `./src/datascience-ui/data-explorer/index.tsx`] - }; -} - -function getPlugins(isNotebook) { - const plugins = []; - if (isProdBuild) { - plugins.push(...common.getDefaultPlugins(isNotebook ? 'notebook' : 'viewers')); - } - - if (isNotebook) { - plugins.push( - new MonacoWebpackPlugin({ - languages: [] // force to empty so onigasm will be used - }), - new HtmlWebpackPlugin({ - template: 'src/datascience-ui/native-editor/index.html', - indexUrl: `${constants.ExtensionRootDir}/out/1`, - chunks: ['monaco', 'commons', 'nativeEditor'], - filename: 'index.nativeEditor.html' - }), - new HtmlWebpackPlugin({ - template: 'src/datascience-ui/history-react/index.html', - indexUrl: `${constants.ExtensionRootDir}/out/1`, - chunks: ['monaco', 'commons', 'interactiveWindow'], - filename: 'index.interactiveWindow.html' - }) - ); - } else { - const definePlugin = new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify('production') - } - }); - - plugins.push( - ...(isProdBuild ? [definePlugin] : []), - ...[ - new HtmlWebpackPlugin({ - template: 'src/datascience-ui/plot/index.html', - indexUrl: `${constants.ExtensionRootDir}/out/1`, - chunks: ['commons', 'plotViewer'], - filename: 'index.plotViewer.html' - }), - new HtmlWebpackPlugin({ - template: 'src/datascience-ui/data-explorer/index.html', - indexUrl: `${constants.ExtensionRootDir}/out/1`, - chunks: ['commons', 'dataExplorer'], - filename: 'index.dataExplorer.html' - }) - ] - ); - } - - return plugins; -} - -function buildConfiguration(isNotebook) { - // Folder inside `datascience-ui` that will be created and where the files will be dumped. - const bundleFolder = isNotebook ? 'notebook' : 'viewers'; - - return { - context: constants.ExtensionRootDir, - entry: getEntry(isNotebook), - output: { - path: path.join(constants.ExtensionRootDir, 'out', 'datascience-ui', bundleFolder), - filename: '[name].js', - chunkFilename: `[name].bundle.js` - }, - mode: 'development', // Leave as is, we'll need to see stack traces when there are errors. - devtool: 'source-map', - optimization: { - minimize: isProdBuild, - minimizer: isProdBuild ? [new TerserPlugin({ sourceMap: true })] : [], - moduleIds: 'hashed', // (doesn't re-generate bundles unnecessarily) https://webpack.js.org/configuration/optimization/#optimizationmoduleids. - splitChunks: { - chunks: 'all', - cacheGroups: { - // These are bundles that will be created and loaded when page first loads. - // These must be added to the page along with the main entry point. - // Smaller they are, the faster the load in SSH. - // Interactive and native editors will share common code in commons. - commons: { - name: 'commons', - chunks: 'initial', - minChunks: isNotebook ? 2 : 1, // We want at least one shared bundle (2 for notebooks, as we want monago split into another). - filename: '[name].initial.bundle.js' - }, - // Even though nteract has been split up, some of them are large as nteract alone is large. - // This will ensure nteract (just some of the nteract) goes into a separate bundle. - // Webpack will bundle others separately when loading them asynchronously using `await import(...)` - nteract: { - name: 'nteract', - chunks: 'all', - minChunks: 2, - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - const path = require('path'); - return ( - module.resource && - module.resource.includes(`${path.sep}node_modules${path.sep}@nteract`) - ); - } - }, - // Bundling `plotly` with nteract isn't the best option, as this plotly alone is 6mb. - // This will ensure it is in a seprate bundle, hence small files for SSH scenarios. - plotly: { - name: 'plotly', - chunks: 'all', - minChunks: 1, - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - const path = require('path'); - return ( - module.resource && module.resource.includes(`${path.sep}node_modules${path.sep}plotly`) - ); - } - }, - // Monaco is a monster. For SSH again, we pull this into a seprate bundle. - // This is only a solution for SSH. - // Ideal solution would be to dynamically load monaoc `await import`, that way it will benefit UX and SSH. - // This solution doesn't improve UX, as we still need to wait for monaco to load. - monaco: { - name: 'monaco', - chunks: 'all', - minChunks: 1, - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - const path = require('path'); - return ( - module.resource && module.resource.includes(`${path.sep}node_modules${path.sep}monaco`) - ); - } - } - } - }, - chunkIds: 'named' - }, - node: { - fs: 'empty' - }, - plugins: [ - new FixDefaultImportPlugin(), - new CopyWebpackPlugin( - [ - { from: './**/*.png', to: '.' }, - { from: './**/*.svg', to: '.' }, - { from: './**/*.css', to: '.' }, - { from: './**/*theme*.json', to: '.' } - ], - { context: 'src' } - ), - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 100 - }), - ...getPlugins(isNotebook) - ], - resolve: { - // Add '.ts' and '.tsx' as resolvable extensions. - extensions: ['.ts', '.tsx', '.js', '.json', '.svg'] - }, - - module: { - rules: [ - // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. - { - test: /\.tsx?$/, - use: { - loader: 'awesome-typescript-loader', - options: { - configFileName, - reportFiles: ['src/datascience-ui/**/*.{ts,tsx}'] - } - } - }, - { - test: /\.svg$/, - use: ['svg-inline-loader'] - }, - { - test: /\.css$/, - use: ['style-loader', 'css-loader'] - }, - { - test: /\.js$/, - include: /node_modules.*remark.*default.*js/, - use: [ - { - loader: path.resolve('./build/webpack/loaders/remarkLoader.js'), - options: {} - } - ] - }, - { - test: /\.json$/, - type: 'javascript/auto', - include: /node_modules.*remark.*/, - use: [ - { - loader: path.resolve('./build/webpack/loaders/jsonloader.js'), - options: {} - } - ] - }, - { test: /\.(png|woff|woff2|eot|gif|ttf)$/, loader: 'url-loader?limit=100000' }, - { - test: /\.less$/, - use: ['style-loader', 'css-loader', 'less-loader'] - } - ] - } - }; -} - -exports.notebooks = buildConfiguration(true); -exports.viewers = buildConfiguration(false); diff --git a/build/webpack/webpack.datascience-ui.config.js b/build/webpack/webpack.datascience-ui.config.js deleted file mode 100644 index 5edb7cf8166a..000000000000 --- a/build/webpack/webpack.datascience-ui.config.js +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -const builder = require('./webpack.datascience-ui.config.builder'); -module.exports = [builder.notebooks, builder.viewers]; diff --git a/build/webpack/webpack.debugadapter.config.js b/build/webpack/webpack.debugadapter.config.js deleted file mode 100644 index c26664f843dc..000000000000 --- a/build/webpack/webpack.debugadapter.config.js +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -const path = require('path'); -const tsconfig_paths_webpack_plugin = require('tsconfig-paths-webpack-plugin'); -const constants = require('../constants'); -const common = require('./common'); -// tslint:disable-next-line:no-var-requires no-require-imports -const configFileName = path.join(constants.ExtensionRootDir, 'tsconfig.extension.json'); -const config = { - mode: 'production', - target: 'node', - entry: { - 'debugger/debugAdapter/main': './src/client/debugger/debugAdapter/main.ts' - }, - devtool: 'source-map', - node: { - __dirname: false - }, - module: { - rules: [ - { - // JupyterServices imports node-fetch. - test: /@jupyterlab[\\\/]services[\\\/].*js$/, - use: [ - { - loader: path.join(__dirname, 'loaders', 'fixNodeFetch.js') - } - ] - }, - { - test: /\.ts$/, - exclude: /node_modules/, - use: [ - { - loader: 'ts-loader' - } - ] - } - ] - }, - externals: ['vscode', 'commonjs'], - plugins: [...common.getDefaultPlugins('debugger')], - resolve: { - extensions: ['.ts', '.js'], - plugins: [new tsconfig_paths_webpack_plugin.TsconfigPathsPlugin({ configFile: configFileName })] - }, - output: { - filename: '[name].js', - path: path.resolve(constants.ExtensionRootDir, 'out', 'client'), - libraryTarget: 'commonjs2', - devtoolModuleFilenameTemplate: '../../[resource-path]' - } -}; -// tslint:disable-next-line:no-default-export -exports.default = config; diff --git a/build/webpack/webpack.extension.browser.config.js b/build/webpack/webpack.extension.browser.config.js new file mode 100644 index 000000000000..909cceaf1bea --- /dev/null +++ b/build/webpack/webpack.extension.browser.config.js @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// @ts-check + +'use strict'; + +const path = require('path'); +const webpack = require('webpack'); +const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); + +const packageRoot = path.resolve(__dirname, '..', '..'); +const outDir = path.resolve(packageRoot, 'dist'); + +/** @type {(env: any, argv: { mode: 'production' | 'development' | 'none' }) => import('webpack').Configuration} */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const nodeConfig = (_, { mode }) => ({ + context: packageRoot, + entry: { + extension: './src/client/browser/extension.ts', + }, + target: 'webworker', + output: { + filename: '[name].browser.js', + path: outDir, + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]', + }, + devtool: 'source-map', + // stats: { + // all: false, + // errors: true, + // warnings: true, + // }, + resolve: { + extensions: ['.ts', '.js'], + fallback: { path: require.resolve('path-browserify') }, + }, + plugins: [ + new NodePolyfillPlugin(), + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + ], + externals: { + vscode: 'commonjs vscode', + + // These dependencies are ignored because we don't use them, and App Insights has try-catch protecting their loading if they don't exist + // See: https://github.com/microsoft/vscode-extension-telemetry/issues/41#issuecomment-598852991 + 'applicationinsights-native-metrics': 'commonjs applicationinsights-native-metrics', + '@opentelemetry/tracing': 'commonjs @opentelemetry/tracing', + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: 'ts-loader', + options: { + configFile: 'tsconfig.browser.json', + }, + }, + { + test: /\.node$/, + loader: 'node-loader', + }, + ], + }, + // optimization: { + // usedExports: true, + // splitChunks: { + // cacheGroups: { + // defaultVendors: { + // name: 'vendor', + // test: /[\\/]node_modules[\\/]/, + // chunks: 'all', + // priority: -10, + // }, + // }, + // }, + // }, +}); + +module.exports = nodeConfig; diff --git a/build/webpack/webpack.extension.config.js b/build/webpack/webpack.extension.config.js index e35dfe609e73..082ce52a4d32 100644 --- a/build/webpack/webpack.extension.config.js +++ b/build/webpack/webpack.extension.config.js @@ -1,93 +1,90 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. + 'use strict'; const path = require('path'); +// eslint-disable-next-line camelcase const tsconfig_paths_webpack_plugin = require('tsconfig-paths-webpack-plugin'); const constants = require('../constants'); const common = require('./common'); -// tslint:disable-next-line:no-var-requires no-require-imports + const configFileName = path.join(constants.ExtensionRootDir, 'tsconfig.extension.json'); -// Some modules will be pre-genearted and stored in out/.. dir and they'll be referenced via NormalModuleReplacementPlugin -// We need to ensure they do not get bundled into the output (as they are large). +// Some modules will be pre-genearted and stored in out/.. dir and they'll be referenced via +// NormalModuleReplacementPlugin. We need to ensure they do not get bundled into the output +// (as they are large). const existingModulesInOutDir = common.getListOfExistingModulesInOutDir(); -// tslint:disable-next-line:no-var-requires no-require-imports -const FileManagerPlugin = require('filemanager-webpack-plugin'); const config = { mode: 'production', target: 'node', entry: { - extension: './src/client/extension.ts' + extension: './src/client/extension.ts', + 'shellExec.worker': './src/client/common/process/worker/shellExec.worker.ts', + 'plainExec.worker': './src/client/common/process/worker/plainExec.worker.ts', + 'registryKeys.worker': 'src/client/pythonEnvironments/common/registryKeys.worker.ts', + 'registryValues.worker': 'src/client/pythonEnvironments/common/registryValues.worker.ts', }, devtool: 'source-map', node: { - __dirname: false + __dirname: false, }, module: { rules: [ { - // JupyterServices imports node-fetch. - test: /@jupyterlab[\\\/]services[\\\/].*js$/, + test: /\.ts$/, use: [ { - loader: path.join(__dirname, 'loaders', 'fixNodeFetch.js') - } - ] + loader: path.join(__dirname, 'loaders', 'externalizeDependencies.js'), + }, + ], }, { test: /\.ts$/, + exclude: /node_modules/, use: [ { - loader: path.join(__dirname, 'loaders', 'externalizeDependencies.js') - } - ] + loader: 'ts-loader', + }, + ], }, { - test: /\.ts$/, - exclude: /node_modules/, + test: /\.node$/, use: [ { - loader: 'ts-loader' - } - ] + loader: 'node-loader', + }, + ], + }, + { + test: /\.worker\.js$/, + use: { loader: 'worker-loader' }, }, - { enforce: 'post', test: /unicode-properties[\/\\]index.js$/, loader: 'transform-loader?brfs' }, - { enforce: 'post', test: /fontkit[\/\\]index.js$/, loader: 'transform-loader?brfs' }, - { enforce: 'post', test: /linebreak[\/\\]src[\/\\]linebreaker.js/, loader: 'transform-loader?brfs' } - ] + ], }, - externals: ['vscode', 'commonjs', ...existingModulesInOutDir], - plugins: [ - ...common.getDefaultPlugins('extension'), - // Copy pdfkit bits after extension builds. webpack can't handle pdfkit. - new FileManagerPlugin({ - onEnd: [ - { - copy: [ - { source: './node_modules/fontkit/*.trie', destination: './out/client/node_modules' }, - { source: './node_modules/pdfkit/js/data/*.*', destination: './out/client/node_modules/data' }, - { source: './node_modules/pdfkit/js/pdfkit.js', destination: './out/client/node_modules/' } - ] - } - ] - }) + externals: [ + 'vscode', + 'commonjs', + ...existingModulesInOutDir, + // These dependencies are ignored because we don't use them, and App Insights has try-catch protecting their loading if they don't exist + // See: https://github.com/microsoft/vscode-extension-telemetry/issues/41#issuecomment-598852991 + 'applicationinsights-native-metrics', + '@opentelemetry/tracing', + '@azure/opentelemetry-instrumentation-azure-sdk', + '@opentelemetry/instrumentation', + '@azure/functions-core', ], + plugins: [...common.getDefaultPlugins('extension')], resolve: { - alias: { - // Pointing pdfkit to a dummy js file so webpack doesn't fall over. - // Since pdfkit has been externalized (it gets updated with the valid code by copying the pdfkit files - // into the right destination). - pdfkit: path.resolve(__dirname, 'pdfkit.js') - }, extensions: ['.ts', '.js'], - plugins: [new tsconfig_paths_webpack_plugin.TsconfigPathsPlugin({ configFile: configFileName })] + plugins: [new tsconfig_paths_webpack_plugin.TsconfigPathsPlugin({ configFile: configFileName })], + conditionNames: ['import', 'require', 'node'], }, output: { filename: '[name].js', path: path.resolve(constants.ExtensionRootDir, 'out', 'client'), libraryTarget: 'commonjs2', - devtoolModuleFilenameTemplate: '../../[resource-path]' - } + devtoolModuleFilenameTemplate: '../../[resource-path]', + }, }; -// tslint:disable-next-line:no-default-export + exports.default = config; diff --git a/build/webpack/webpack.extension.dependencies.config.js b/build/webpack/webpack.extension.dependencies.config.js index 75cdf50a9c37..a90e9135a605 100644 --- a/build/webpack/webpack.extension.dependencies.config.js +++ b/build/webpack/webpack.extension.dependencies.config.js @@ -1,67 +1,44 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -// tslint:disable-next-line: no-require-imports -const copyWebpackPlugin = require('copy-webpack-plugin'); -const path = require('path'); -const constants = require('../constants'); -const common = require('./common'); -const entryItems = {}; -common.nodeModulesToExternalize.forEach(moduleName => { - entryItems[`node_modules/${moduleName}`] = `./node_modules/${moduleName}`; -}); -const config = { - mode: 'production', - target: 'node', - context: constants.ExtensionRootDir, - entry: entryItems, - devtool: 'source-map', - node: { - __dirname: false - }, - module: { - rules: [ - { - // JupyterServices imports node-fetch. - test: /@jupyterlab[\\\/]services[\\\/].*js$/, - use: [ - { - loader: path.join(__dirname, 'loaders', 'fixNodeFetch.js') - } - ] - }, - { enforce: 'post', test: /unicode-properties[\/\\]index.js$/, loader: 'transform-loader?brfs' }, - { enforce: 'post', test: /fontkit[\/\\]index.js$/, loader: 'transform-loader?brfs' }, - { enforce: 'post', test: /linebreak[\/\\]src[\/\\]linebreaker.js/, loader: 'transform-loader?brfs' } - ] - }, - externals: ['vscode', 'commonjs'], - plugins: [ - ...common.getDefaultPlugins('dependencies'), - // vsls requires our package.json to be next to node_modules. It's how they - // 'find' the calling extension. - new copyWebpackPlugin([{ from: './package.json', to: '.' }]), - // onigasm requires our onigasm.wasm to be in node_modules - new copyWebpackPlugin([ - { from: './node_modules/onigasm/lib/onigasm.wasm', to: './node_modules/onigasm/lib/onigasm.wasm' } - ]) - ], - resolve: { - alias: { - // Pointing pdfkit to a dummy js file so webpack doesn't fall over. - // Since pdfkit has been externalized (it gets updated with the valid code by copying the pdfkit files - // into the right destination). - pdfkit: path.resolve(__dirname, 'pdfkit.js') - }, - extensions: ['.js'] - }, - output: { - filename: '[name].js', - path: path.resolve(constants.ExtensionRootDir, 'out', 'client'), - libraryTarget: 'commonjs2', - devtoolModuleFilenameTemplate: '../../[resource-path]' - } -}; -// tslint:disable-next-line:no-default-export -exports.default = config; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +const copyWebpackPlugin = require('copy-webpack-plugin'); +const path = require('path'); +const constants = require('../constants'); +const common = require('./common'); + +const entryItems = {}; +common.nodeModulesToExternalize.forEach((moduleName) => { + entryItems[`node_modules/${moduleName}`] = `./node_modules/${moduleName}`; +}); +const config = { + mode: 'production', + target: 'node', + context: constants.ExtensionRootDir, + entry: entryItems, + devtool: 'source-map', + node: { + __dirname: false, + }, + module: {}, + externals: ['vscode', 'commonjs'], + plugins: [ + ...common.getDefaultPlugins('dependencies'), + // vsls requires our package.json to be next to node_modules. It's how they + // 'find' the calling extension. + // eslint-disable-next-line new-cap + new copyWebpackPlugin({ patterns: [{ from: './package.json', to: '.' }] }), + ], + resolve: { + extensions: ['.js'], + }, + output: { + filename: '[name].js', + path: path.resolve(constants.ExtensionRootDir, 'out', 'client'), + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]', + }, +}; + +exports.default = config; diff --git a/cgmanifest.json b/cgmanifest.json new file mode 100644 index 000000000000..57123f566794 --- /dev/null +++ b/cgmanifest.json @@ -0,0 +1,15 @@ +{ + "Registrations": [ + { + "Component": { + "Other": { + "Name": "get-pip", + "Version": "21.3.1", + "DownloadUrl": "https://github.com/pypa/get-pip" + }, + "Type": "other" + }, + "DevelopmentDependency": false + } + ] +} diff --git a/data/.vscode/settings.json b/data/.vscode/settings.json deleted file mode 100644 index 99acc159fcaa..000000000000 --- a/data/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.pythonPath": "/usr/bin/python3" -} diff --git a/data/get-pip.py b/data/get-pip.py deleted file mode 100644 index 90d5644ff02e..000000000000 --- a/data/get-pip.py +++ /dev/null @@ -1,21492 +0,0 @@ -#!/usr/bin/env python -# -# Hi There! -# You may be wondering what this giant blob of binary data here is, you might -# even be worried that we're up to something nefarious (good for you for being -# paranoid!). This is a base85 encoding of a zip file, this zip file contains -# an entire copy of pip (version 19.1). -# -# Pip is a thing that installs packages, pip itself is a package that someone -# might want to install, especially if they're looking to run this get-pip.py -# script. Pip has a lot of code to deal with the security of installing -# packages, various edge cases on various platforms, and other such sort of -# "tribal knowledge" that has been encoded in its code base. Because of this -# we basically include an entire copy of pip inside this blob. We do this -# because the alternatives are attempt to implement a "minipip" that probably -# doesn't do things correctly and has weird edge cases, or compress pip itself -# down into a single file. -# -# If you're wondering how this is created, it is using an invoke task located -# in tasks/generate.py called "installer". It can be invoked by using -# ``invoke generate.installer``. - -import os.path -import pkgutil -import shutil -import sys -import struct -import tempfile - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -if PY3: - iterbytes = iter -else: - def iterbytes(buf): - return (ord(byte) for byte in buf) - -try: - from base64 import b85decode -except ImportError: - _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") - - def b85decode(b): - _b85dec = [None] * 256 - for i, c in enumerate(iterbytes(_b85alphabet)): - _b85dec[c] = i - - padding = (-len(b)) % 5 - b = b + b'~' * padding - out = [] - packI = struct.Struct('!I').pack - for i in range(0, len(b), 5): - chunk = b[i:i + 5] - acc = 0 - try: - for c in iterbytes(chunk): - acc = acc * 85 + _b85dec[c] - except TypeError: - for j, c in enumerate(iterbytes(chunk)): - if _b85dec[c] is None: - raise ValueError( - 'bad base85 character at position %d' % (i + j) - ) - raise - try: - out.append(packI(acc)) - except struct.error: - raise ValueError('base85 overflow in hunk starting at byte %d' - % i) - - result = b''.join(out) - if padding: - result = result[:-padding] - return result - - -def bootstrap(tmpdir=None): - # Import pip so we can use it to install pip and maybe setuptools too - import pip._internal - from pip._internal.commands.install import InstallCommand - from pip._internal.req.constructors import install_req_from_line - - # Wrapper to provide default certificate with the lowest priority - class CertInstallCommand(InstallCommand): - def parse_args(self, args): - # If cert isn't specified in config or environment, we provide our - # own certificate through defaults. - # This allows user to specify custom cert anywhere one likes: - # config, environment variable or argv. - if not self.parser.get_default_values().cert: - self.parser.defaults["cert"] = cert_path # calculated below - return super(CertInstallCommand, self).parse_args(args) - - pip._internal.commands_dict["install"] = CertInstallCommand - - implicit_pip = True - implicit_setuptools = True - implicit_wheel = True - - # Check if the user has requested us not to install setuptools - if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): - args = [x for x in sys.argv[1:] if x != "--no-setuptools"] - implicit_setuptools = False - else: - args = sys.argv[1:] - - # Check if the user has requested us not to install wheel - if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): - args = [x for x in args if x != "--no-wheel"] - implicit_wheel = False - - # We only want to implicitly install setuptools and wheel if they don't - # already exist on the target platform. - if implicit_setuptools: - try: - import setuptools # noqa - implicit_setuptools = False - except ImportError: - pass - if implicit_wheel: - try: - import wheel # noqa - implicit_wheel = False - except ImportError: - pass - - # We want to support people passing things like 'pip<8' to get-pip.py which - # will let them install a specific version. However because of the dreaded - # DoubleRequirement error if any of the args look like they might be a - # specific for one of our packages, then we'll turn off the implicit - # install of them. - for arg in args: - try: - req = install_req_from_line(arg) - except Exception: - continue - - if implicit_pip and req.name == "pip": - implicit_pip = False - elif implicit_setuptools and req.name == "setuptools": - implicit_setuptools = False - elif implicit_wheel and req.name == "wheel": - implicit_wheel = False - - # Add any implicit installations to the end of our args - if implicit_pip: - args += ["pip"] - if implicit_setuptools: - args += ["setuptools"] - if implicit_wheel: - args += ["wheel"] - - # Add our default arguments - args = ["install", "--upgrade", "--force-reinstall"] + args - - delete_tmpdir = False - try: - # Create a temporary directory to act as a working directory if we were - # not given one. - if tmpdir is None: - tmpdir = tempfile.mkdtemp() - delete_tmpdir = True - - # We need to extract the SSL certificates from requests so that they - # can be passed to --cert - cert_path = os.path.join(tmpdir, "cacert.pem") - with open(cert_path, "wb") as cert: - cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) - - # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI - sys.exit(pip._internal.main(args)) - finally: - # Remove our temporary directory - if delete_tmpdir and tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -def main(): - tmpdir = None - try: - # Create a temporary working directory - tmpdir = tempfile.mkdtemp() - - # Unpack the zipfile into the temporary directory - pip_zip = os.path.join(tmpdir, "pip.zip") - with open(pip_zip, "wb") as fp: - fp.write(b85decode(DATA.replace(b"\n", b""))) - - # Add the zipfile to sys.path so that we can import it - sys.path.insert(0, pip_zip) - - # Run the bootstrap - bootstrap(tmpdir=tmpdir) - finally: - # Clean up our temporary working directory - if tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -DATA = b""" -P)h>@6aWAK2mmD%m`<4gN^}MtBUtcb8d5e!POD!tS%+HIDSFlx3GPKk -)RN?{vP)h>@6aWAK2mmD%m`-N@Pvb`c003_S000jF003}la4%n9ZDDC{Utcb8d0kO4Zo@DP-1Q0q8SE -6P(>Xwfj$MoHf@(`KQCU(&8g71HO0ki&o<#cYNZz>|C(zo>JZGyl;FMx!FrO6t%vRrOrPh9=?L}8oY6 -ou)77Hd@$a4r7F5rryfn~JTAHWO)@Mv!(a4fto86JiEF(QHSJ}y)-GntEpbmcJyNSL0Vx@Gi7c>xAuL -EgIxovfWq|0NvR`+SC`IVq5DSMEVyuc5y>N3AD=LF+DESFFQK3yL&bIL-tGT-b6~%(tWCE -QA8qFLP)h ->@6aWAK2mmD%m`<{zTe%hm001@%000>P003}la4%nJZggdGZeeUMUtei%X>?y-E^v93R&8(FHW2=X;*U%xw2l%3W6Py<0o>h8I>=Z-x4>3Qeu^QF|!Q -E#E$`?b;8%9;(7<*M_Y#j*ssX^r(Dmd>coV;T2Z)}Jd=35ADU(@5Q2r#EE2I)jML=NjONY)o=yYXtEu$-H-Gm-+BOZ^V00~A@_@kKt#R;YX;F~+>#O^V-@pfx`4TJ9IRvvJI8Va8$ENdb=f@y)O)kTy&U -t8+keW`k*)triwXqw@TIWQ=kz7M~CAHT>NbjTlEYY)AN#)U|Z9b9>#fqZ|RKjCp?0)`@@)+QZGV(<*pWow<6RAI8<%7GiZm__ -Ldg`4O+Qpu7fWi`gXwe$yB+-oXAT^C-o>eO(u)G`>R`0FaN!ISX|%Tmbd@B{p;!heuwGfY&xCN-zpmA-{5oleV1B&e-FWh`ubGg0izE% -KZO)wlw#YA$T!=C?FodnQsl@e#K*pC0%ZPUoT5Xu16`yZo4?Mm2gR8?r;Ukv%TPaPRYIpgHc4htJxYu -31A&PNe&h4w2e)^%_UDMfHx;k#%rzESxFX0 -R}T+&50~)Fjo=x}j=wK!TtU+k9kx$}@KO4FHcr{QMdYUqkGc4oVwSXF^3yn{;cse6L;km*aWLjY?u`B -1>(cZ-(H2Eg3N2sONIU#CQ@u5ZKCbfq;O15N=grLo&d;ADssDON)B))X1`r}2Jv~}VIMtf&o5~8eW>) -o|`KIcquJn2mN`9rQZ=1QY-O00;mj6qrs-OWq+R2><}#8~^|s0001RX>c!JX ->N37a&BR4FJg6RY-C?$Zgwtkd7T+uZ`(NX-M@mHK1jk!!gU{w^8(#8-4@qNf;PQHVHkoU(GEAVs3R#m -z9RqqW=K&YB{}V`Uu;qH#rdA`#l^*MEvrg$RUeq(^`6#>w33!&%LQSQSGi)mCS@yFy(6+@QjvSafXBt -f#l>R5_6-+`RD8F?v+j{g`%9kspNc-IqsW`ZR`5M3cvaB?$xG4!+=!A2TE1n4GBC)mRjiUJkSTb*Wjh -PIqbh4o>Vel;#qJIGJW#G4{cL^jb5Gf{qaP -bJ2{7ltA&thiTmQ^&%NG|a>t9YSx=P+iqqN2{L)Ld!LWMQ$3ys9$U-Zz4SH1a%>qWdN*nXrg=@cb4eE -)*B17tl@(8n8q9_t)F6+2#AI%YS8`zFc2_xc>b-X3H!VZ)lxKpi@%;cHhpBSuO~CG%cUwUE5SNCZM^P -d;t3SJwDzvsG+=y$wx5sfa}Y_>XJTLLbrMGnD6L2JOnAw?WiCt>whU&{G&b#v#iedV326BSQJ$*CCP3 -D-Lj|ULUStV7L3Mfrm`%QwA#i5T_rMiz|SkZ1YMF)DiM+7S8~m3+P_7V6fuB1e)%sXRc!-r-sP1X;oP -%YTW~eFXV^pFC#Y3GK)+n3cm=XrnIj6MNYHS}p0Y+?C5S!5LoVd%TX3IC8Z5O?F~CC%J15UQMzjuOAy -}hiuyO8u%@y1k>4ReX01TYqQXC~G>VZ0F5QHKZC(T0=$;s{M_5>*e;#{D6Rwp9c25m^ow8v{&K>^e1q -L1egr3PoC1>3S>rL`CnbLo{f(?9|se}KfDXwOjqRrhkNEWM?tS#3BtMZ-y8weAoG#i4P23@5fMHoa%+ -B<$qikl+6aI_rE9^6aIcxq>v6*CpBKHADdZ?lLr_YwF~0Fb}Jxf{bEPHF$a>Euk~MKj-ylTt4el(8|v -~A>_t#b)k7CAkam01~D!4ZNg|V0x;I0s4S-xgno2{7!$D#<`9Aet(pGGSsjk}mi0tgmf4mhCOyv@QPfvQt>_eA0?703f|_rP6D1N!Ocn9Kw`v-2!0BW5R)9t= -|MJlMex_Wz>O{XXrL2(aS-b`elYMQJ3GmYgjKpOBRsqLIjJnN;Ne!vxk76@28w7{%c5>WJWlH -x}Qgmfr52$^nE7|5IXR3R?St9NT0w1Z$$f5 -N*$*im8@KaxYz1&RTA8UTBP02<`s={ajqr(_UfzN$&o%Sd3yqrMe2j8Z7S>iX^$5`CqwQ_z>8FoBesb -<+sV#Ke4=kCz!qe90RD=eDP(v;?$p4YRS^-Gui1a%h8bW1bW(@|n>(JN^}VR{97X^hQ@05cBwnL=+=# -ssX0oe=a*rYJHx<8`l0lEn77Pm?-JcHO_*AlZ-SRW>i5^(g2mD8vokeQd@b_Q0tX#}OK(TP&PVog6P; -xeqb1qOSZxW2>rZL@2iU(@vyIJo$kF#9@;2v3@Vn>|OJNy?@snVAt|e!M}ZT_a4jr?bo~aH`muUUp`- -b`uySUYBf;$1bPqT5KUw*;Gu~)GTS^b|$7G*~s!U_GS -Qcl+`vR_F%qBjetusFfk=S`$Iee9qVpMg4e+;&^fBT&<^cq-!q<^@r*td88%Pm*8%57eRS{m4B8pSAm -aw8I^8Pi0Pt*)f^zoILHT;`4AS99?MKrHbF|p-ChXZwy>2=b`1tD%cY}GxG9K<AD>ZFVp6F_Tx}_y>SOQVcg1L8{1nA{@yu{@9|!|3}S5cRw*8w-`_S3dBzsLcgunx@kv&<&BR(Nw)2i!uo5_6uh8)BCFt#eS)UW6pRI@#4)htTEHT3k*4F| -FAouPcT&|vl+C_90U#K$I#uV;AAR8Sa;3mOKQ)_Cwzqz7@(jhT8i7+M+Os^5 -ZTjVUa6j@+;Z-F9N@&2ZL=O3rAo6LB3R45XM~Kt|e3(=i~4JnJ^j^$gbQ@CDB+3Ub?mB0|&% --IbhlOHq8$`FDuqEi^x=132U060enqnG11okVU%nptw#zcRuu_3HIScjn77`g0~kCb0!wb>G9^4A=ao -nJje22g7Rj4W!S6H+p%I=vF`nk6z`XRmPYW@B5qF2Bi6cF>3<$S9@-sz?r7i2b!(QhNCUQew8)3I<|G -vAuMtxDgJBmVGr#fg46O!2ri&i`#(@i0|XQR000O8B@~!Wn_6G(90>pb=p6t6761SMaA|NaUukZ1WpZ -v|Y%gPBV`ybAaCya8ZI9bF68^rwf^a^pba0ejkjn=HF3_f%Hn?Pa$fgL2#X_JZ+EyZyI#OE44f@~jnW -0`N*-p|nhx)@}MRDF|o|(~XHhU(strD-KmK(KGy1tmrW)~O5t}?b3%35u@hplwmvRHMGrP*u>z3Co}y -SP|evlCTOCF#A=xv@zlv-gs2B~4wFPPBJ3sf{i&Sr)&kRLh+TNef*ot7VzwX0J;l^Ny;L^){_d+Su~c -^_|I8>5{V0?>mZ@`2W;ZRwl{J4lKL7>O&=U-Z*8?Q`Bl#rFmgHnm2g`=i49nq^_|MP4 -5?5C?||4v{3a((^c`o~k0`>j%CNAg17!&muRI(uG}id;4q{D@GkPq18E2>h7uSo+UZT^IELbM>Jkes1he*3XQtt$}390AX&>Lr5x5YjV~@PvQj!HIL{)pdIxXCUOi;mcU -s7mtF6qC6@2fZsI0j!a^;XFl$v?#-~uOWV?{1&={2QLBkPzK{T7w9a_7k?ObhV_^wt<;=UUYGpI;?Yf -;F3!X5Ov^+#$T4L^iUy)v-2^y({XT5&c$$maODTk-x1%=K27f6)elr>{Xt61>8dHw?(#X^>HM9jcB`p -gK%5Zl(}&5N5GDL(IqQzxD-fZap_EBGld7MnB3^{(8&|XrbfBA3xfAxuGS(&;EOsNnYz3U#@ -;x(`vD2`5~`SRMz4R^hPAC*rpE~EO9E7OqS#sxJ8wY+~3;ahTU0s~U=04}E;-@%zkNxns0l)+IHPG~? -AWhM*lUx#lNqayExCbFu~Vx!q|#?Fs!$IRygx4SqVDNTM}irIsfuxA;EF}l(j+9^i?7dSQ?T(^~vA3v -dZT$ZKqE-zf@Z-^8Q;8;o<@N+6_Y*8Nw+)?K>;Ut1h?Edw1E>`d_^OuBh7QF{=Ygs~py285%{s~ie+c -*JWbe^w@6Y&!&=bp&8W31Q8DxE=y593b0hmX;x2+{*a!%c22WGs1mPx6BEy&66qI;RM6E{?# -SV+&IN7QXd9hKhj^Z;}uko@~bZBkPASLj!vamyQ#!?%RIMdv|Ocih|aj6{9?@3=uT%Yi^(d0a$bj@mX -6Z}Y6!0q|XU}&Gy-s0QEmK(GP>?P-@- -}FGCAq(8BmK)ENY%C>{@kup=535S7)WhZuWwBh=>9d(yc-jKdNiNgvm4>y+ETPyHP1B`uE!<7niVo^W -U`Ct4YeVdkf{o@?ah_7C}SWH7MC##ScJ2L7a9WpkNjV9b^Y_z^_#iqpWgiN;`Q%i(y>LOQ&~7QB>1siU)Xw)& -SA5B?S;v{Y7dN+H1qkMm=8^iV2h!C)NMx!qL0)sc2&vioyyrq9X7RUf2CRss-ic;5$@7X1`}kcK82*9 -y$d0AbKjizq^@o0a1fvp=A`_uTFOD;==3l&vb;Y%Z#JwwHujGsH@(B%aB|{o4y7L{hr2ugEg(4#n4T7G4-3+x`A?N`r4sYW6%Bb`^1;659gMKsrE8tRv)CWQ1q|14)$28C`)1kBhXH6Sca6>ujIgg=u&;l-TP1 -#QSgPwbOR~qx4Mw4b3NIaWuf%Y)y`nKIVkspc|2M`fvLF};57QC1r{D5ASFs@jYN???8fR~<^ZgwjiA -+pBnG)(9Sp4=g9wF=nsFxg6M@7p15sJCIc`fsBWag}TmkvwWaFI*RL^PAGV_;eXgBK@Qo?Ed7lRa0Oq -mz~-~^G)(ik|gvJCPG`fQuF0D#?l9lXX#lRb_m1OGLM2E*22!mpG(ZLbuLRSrzelcSF -zls^7D2!n9@9fb3P4e?(bc!=K@80lO0aY~&=+HOE(v^%|Vdc+GV;)avEO;n0ayM8fn9xseTzaKDiJhf -q!_S~>k|07&q{%;L!7+h&M4kjD#Md;FQb$aBPe%k${DqM}zsfT_(@Js)#FB-(eqnqvgbLunUF-t0#LN -{vkq8<2HKmt^y&wVP7;$!j$;(N|yhMRtY!pwZY=Bpn`n{6MdI{PxQgMYe(HX5mr^5@4CWma)E74;=RW{-kU^pzFuXY%3m -@Y%ll`DXgLKFW^hKW{I`U$!H_eZHJ2GWj6~;UQ}{i_b7fylvqE>^t?uYoBh^6P^SGQ&Ug1=|4USO_gs -M48cA>7`?T!I!Xpc`J=RZAvhk)jax -JZZM0lj_`L7FC#_9G?Z`u~WBo#Mu`aBu|F$XaYs_!mH}G(N8%Nn=NcVBzXzo34+k_80zvnYWgDLITog -qi)6&Q4O_ZW%yntxp-0&jeg5?{YPLmf1~ek_@IV>W -aCyyIdvDt~693NQke{e28$?n5 -b8h=QVP{l+0I|V7sD9St?XgNg%UgyS1o*^|dgp**(IFr^Fm9xvW@%OE0TpGYW!WG?JULsA`rK3C~3PZ -M6cD_G_U=Bb>oXSw``l$kU>Vl>8KJiaVj08KqY(d8I_Ip -lCCHW2R=t3&^ekpeE_a%INODf^nguUOEnV`Aj5&e0`cUliuq*ONZbR2bmW{=qQ8W>pfJf-=sWuC$$vs -4)1_W(p%SFixu7|}Gw7Og~mLGQviMzfD&7&UstF5kXCo3b~2emc6-%ayZIuWX -iu_JiMNUXkRD=p+ONjmwnHl{7Bi+F+$5AE9j3**IiBBf%T=^-=n3T>+&uFu}h0#I%R#LV-EeL$nSE=3}jGNEy=F5Z6s>|z#Zch+OU==PwQ4f -|21+Ip|g-=EC_bX=F({G+VuEzcJ0%+Zxc{_OJOEC5Zm({Lhr*wy(}{QT|Z%kx+9%kzsfJ3RjQ>>W)3g -eBh1aCeE12;CrRH9{#R8HnD8x3IYR72w`z01V~_a3C1(MyIYoBkiGARdEN~R*Yjz0vBI`J)tk~BmoOW -Pykw*5PtC^gNa>4>HS(NrkR65cLGcg?5U;x?CKnJ$ZJ-ETPPOT0EN*7%^?8S*&FzPcZ$|kbx{e@y$+A -PuqbPI#e$Z|Hcvt6Fo6i!aA;QxTxNL&ex%qE+>Hb0!V>`nLx|G2^i2UP;Rj0&S+h&nrO`CefxzbOfIE -q!nBZ!U($tE;r8dkE9grl^GqhRCYp(YX#E@A903{PJe~SwAf&38yf~?~hf_}D~z~~}F2|<8@NEf4L&n -}BxH~`Ri=}l1pa3ijgv*NI3klL1jGM=RY_QDe5s9DhfJw7pLNTzYKCOGJvJT*e^oM^|6vl(B7e=;{u*lnpmJ|VLppb@LF-?C1~ha&A}}_j9Cr1xas?q-#DJR=kuey|17Jm=kAp -teA}a%Lli!PkWANW$a2F-3E1uk%>#wPk7F_DHw?~s%PuYAy#$>*u*$&C5nfs;H4Q -5!R7oA+qDUrgUIq9ZQi^ZbDmMJ3+a`pMkAHWrTBz_Qj270w}fItSk*@;K -tW9ARToS#f)3y-VXKp9xpX>PA_sD_{c!986vC3{qdp)xG@RuC6e?vA6L$**mjYl3LL305(zy_P=b91 -y8n*_yL(sZoU3C#$r-fQ>C>Cu=C>S!XeK?-~t=+UP1lc*n`cH)PgVe}W8eu~=w^7F>Y)c&1SbckUr0r -M5ie(bA{S^Ep(kqP_h5|?ja@;&AC!@l%A$GquJh32cG=OSvSMV)~m@z2;FgLVIo0G$)-1S}w$f9gGq; -jyEpG1S~9am$^?;P0aDetw|52@}@C=V_RNJx@3ZVjTe6O?hUjwn=L6cfF-0}>$}4`Rz3GQCDLLy6n4V -6*^C0l(&VqRj-{jA@CnYr;xf93M0PkqbX&hU1o9{7H1SW(vJt!GJvp>I>sVM8^%AP1(N -Uvm|krEULd>@$Xs8O+nPH+VEK4)hs%`?1>W<^-C{xer|nvON%i?XI~qHoUrxfoB`PLQf%%O>Of5t2*X -jT}%3a1pYij0yUspm}L2wIQ~d)`~NfHcLE!VBwS?N$k}uh-Jwm!qKb{E*9g!v_7Z9=(KYX{GHv8QM+e -9%v0>r#n%E8s)ruHQvBLw~?#&-$%W$Bl#+sP#5gj=I*L^}m%#vs=OS-#AYfYL$cf--Db`-@oWxekaF# -}_WNT`1N6B>qXz}3R)*FL@IVIOc3Y)*+!jpGyfJ_Qp=uIr+t(2YZnk!%x!j=1n=u*AL<+Q-*H54Hxx@ -(_IS_5!xoU;E*eEk40ZC|xp0i*$FG2^`AiGMznLMC>XPT%o?H#|y^D+0Awp1wB&Eeo~R$kFHMa1%&## -^!=I}e@(VkC8$0*-GG#lVk6Z9s0JOoC5tb5-CB-hzAVDv$4cr9u3(Q96qm~ZmwUv{h#5! -#D=-RVUwneHM@7Dpo0fi9sHo)iI)cyCQ`S^FWGRs^N|9U333kC4Rku7CR`Gxds2M_!Oi%Wzl6N3YRu$ -VCD|_=}+d&$Z<-=7emjg9J-=B^I94I5Ga4S{-Amqxxo9S@d=amMsSHN1Jxf(}U|PD|oMbq^-Mhmc~+nonTd)iCI6&_pJNji&3Mb-<8T@`l&+jF^&t=*b6b$G28ro4%>AWt?O$ -~FoBV!&7M(;itmdZmS0MckW*cQ5?ubyCWcm2ZtTS>rpE$1IMpKQV2@6jis}mMBjlIWeY@^Y{Io|I-{l -p0$&FrMI=AcUMQ${1aV;2XU-fW8!+C_C0t8ZeYMSfD#VIEM -dgjSw}H`|&e@Vyqzp`Iqyv_bYezMmkPu8XWaor|2IFA5#mVNpqjzT9S51m*dl -Mza=1I9P`IAzXPoz>?p`LvE-9P^Rkn(2es?IP%0{5!OX8{5kmv~{voa=r5!jd%y0D}0ej-TD(qi-(Z? -Gb(bp@M`chb@DiLTU*NIHk}UUr(ouec86;phh?fo?0X -E6O)D6KBniOx7Hj~{nn3zj7DNI3KX{ePo7b-Cw2r$@&<=8}pl2;#eb|I2dxM8foUKHT9WL0oz77gGh$ -B9b00*q}zV2_ch9Oj`m5#o{oP;M%zXO -I@sXZb?@d=*Mr-eD>Y>^sXmj`-~jIELc*b5!}Xi9i;F3HW83IW4*@7_Yn{-;Qp;^ll-wH@gILYhw!w! -QaE_yg>T57C$0)&_!jn#QdZI529V)XAA14@VXfK+~ooUY5WUmX`pXgmH;kt0V;reO`?H2Myb6@zt$(c -*j-i^t?IKqKj#$$K2QdFmS$+2S~*eY)Wp>_?5$~d;YAkw?EK(>Z&eYbW6iX%E%rt`BK4IPafV8IuxzI -UXrP`h{GQHQ3h1bG;{(I=9**tvrasz_fhnm^!Xwx`CW%mGpN>`q_t1QYD}U;#$t!@+yDpX%-n -s={#FFJvucRY3!PmbK4af=Xpa|r -`Wy@UvY6sk*dNdKevjoVF7O>Z;`rvFM;x9B+zCUm(7ZYWsxZfX;ylq;<)ua$UhmnCnKQ**iL_6OVy~cQ2EEPSl7#CKKZ)SJf5c0g`Ac}QHi{ -MN`letwJfLCGk9&9zJl+kbzSxhU}g}fjDiLKU8hybS&OURh5P6nXm<-ntDA&9&>;Ii8JU_sJzK< -33+f-~EDBwoL{I6V}9`Qg>Ow3-B!MFQQza5L)M -Lq>0DS*a*w~LLqg_W8YWi3UskklKyHH+M!(#06~4JdZw=J|28tgC44MOkg-C9?pPeUf|N7?b>Fe|JS5_E6C$D#2023DJGL|2wvTAZ*2-Evzsun-wYLzz -A#aO_iH|Y{~IW%cAzXbw2B@JNQ);WkH;6w@kt -Qz%qcny8?hW1^8*y28fwPHB*PJV1a;1(4OO$#*M8*QH#(2meEbGv}=&+}SNo3h^Q=(ef6#rol|Z~qGN -==9`I$-DQjU!T4HetXY#ZhAe36qPAeI#Tf0JkZi*Pfwd7#up{2U1ESme0^U>ek%QLD+{?VUwrT`EZ)?ueUce5N!F~kQyQPOWS=0{F#{lw5(EP{@>hQ^vdEPA6lNfqFsWw&m1a{$*Tq#h>Pk!^w?|!#;a+aLF{_*VHo -7X>}!S&)5zJakH>cOG-G(gng!vNNBFct%CQos|^JI2IFlFv?d4yp~%joN5;Fy<$wbu{uCgHBpX6b(d0 -9Mc!V!XVHF6?XF>YD_-wvC5m#6ffK3TwOBcD{*uL{Qs7q4i7DqZJi7Opx^fC5fs?g_Zk}n)y5kbIsv- -^$ZBJ$i);q&6be@O=SD86BXD85^m^i7ryHQz3-0pp>nqz6Y!dl}a2`akK|F|mD)S-=#<~QajXsWOCw# -6&G`Y_V|vAwFGBuebiNbx<$YW2Uc+-I=qJKXj^gqPU?v~s2u?C!czw;-yb0cf7}$HB-UvMnY9en -(S#i%nl?Z4_Vty19wKiUK1vT-s&2nq;Z?cql$zKD`ReEAew)MVd06V1bW$Hn -{{g0Sm>1fB3uB1j|w1RoV#sf0&THLxOaTw5YQ#!kx8;!zoVkH~UV(EI>L<4RD;6HsHx&6@v(FLyM-~*uR9^n8MOm_s -B-2zOq_6V1QX|)c4*p?QE_LbT_%L=SZwM_hd3*TeyHYGovzQZ^GgMpc>s|HLgW!gjQUe_LGYTFJ*mNU -BjJ)f5>dC3{v4pV1dukLPFakNAp?{9-eiDR^fF~-YRXKW3 -P!M<7HhqBN1#H8pas$=zlDi;CE^;c>&Jlbh$>`9n2mD>koa7m#Q372oT>HFXAR$u0ynoQiI`Ffb}W`i -xq|f=E$*CNl3CEgp(mtRDe$o$g;B*?|B@O6Y(x;0G4-5X;QS>sm4BJ&uI(HnS|&?MuWF!Zf5-aA&;HX^+2w>{r79ekp;*6_Q!#Qk{n`AO%w=7g)y;u9Vad>+JX|3<;6NBEDEm)P< -M|B18ps!|cX1^%j1Sc$S$N6}!6a^`R_LMOIvl54q9M@U00boq%53s!X^KzBug$;j4CM*v7m6r -lcBS|0Nnd&jmjZhiB))dY~cE$a-m;iu0IEXIh?z8Twa%$ -1Mhlwu_s$6Ef~LyTg?8LpWZGsgHXeTbkje$j%5XL61qJZ92bW@!Awrqn?#c*xPd*mls-KO7(-#xRq>- -QOE2j2NkyzlCE<9vOfcx8H=Vo6^2P1y!ywu)pzfv~cvSdS;E07o0a^aC!LjO8itY17kybAC_ -VTGe9;4~noPZ-+LAR-niNDeeU>1=>OS_nuO+zr4&9(95xr~PV(86o?OIXKoqq`fq9HIZ4Sk2f@lU}GD -c3KX)8xNkTZlyKXJTYf9Toh9}$`yQ4KvC^zUhcg-t)#M;+*()cM0L#@bT-fF?1NS264u7;(a}OL>-#H -@>3ZUVABN6Mb!d@@Fu-pb(h#s(VV-AgMYkyWj>yQ&JnF~C6CdN5l`@y)?g)Sq-181Beg&cQ$g?!g|>z%&|+dHUQxf -&Sh&TD3rTC+}QCEAdn{7GHgJeVf*E6-ebj<7wRzqy$DQ(+LWV0KqZtYM>JcWm<7y*4wloVe`}4qZ*zF -B1M3vb-A7|h~DY6S*J@2%x4gMhSqemRtcUUiC-Pzz=y46(34ZuUWhYdODC6;rPM)8P!}!&0|t^pZ*F5 -?u%PVXfj~m#a}N~m)EO|hw$gap!jL0ug}l9k`|aB!;m$4dqFRIP^4r3PWDu4ElrqI(HsgHdz%jyS`QjNtkYZL`QV|94HEDG$602E-A-9gwfj=y3*-{w!+=H)kvAYLi -li)B0!NEegMJ%Bc$Od_K+{l1Qyd(}B10+ZNuo}-7$hNDl -GxBq4j4SsVPJNQ=s7G?~i4~C$L`pP7nM$XAV{zgcCVVQw!|^^2&&Jw+{#t4YqYd^~CD^zx&UKzkUQ0`+c6}<}V>Sm$kmUrqHg~;T&%S@VaW6uW`=F*0bn5%o#!n{!$(^t0hfTPbvq`sU!9ZWE9K@Cv%`hybt3ET -841O}uO|?eBpLCnG``hD%nsI%DMA`KnQ9?O5M=pOXo@1<&9=rKo9$b-xz+8kU)e;=NL3aWRn -P!+)b<~%M6n*Nj>fnS?*uQ|W28RJgUBLU3!8p!S%BVJV0_5Z -0DR$kG8lE+PM4*UMuMRzrw2VomoI{-4Q;Mq7bs=-=y^JmHt{X8pIS#u$AYroz*a>+3LDtGD^Ni*X|%4 -qkp&-QQ{ELwIoaqVF%Y0)m2LPcbLhW9>Dens)w%*f6U>Pf$0)Wi+Pw -p%O#vR54Di&NObs3RadSZS0mek*6ZH)f!@l-l;i2kAsra@2%{#+^VCxY&co!|BLT7s&uQd|X%zvRqLnfrCYUEfIlF= -I3BRY8B&#)JAPP&5G7Dwv!m`)K}e|cM&Yi5EK>iQ4X@SL!S0r2VH115xqQoVyZnfo}G>QX%b|yc+1vY -4=it?WWCBM{;3Ec&6}ensfQr3Ko6jBDab)o>#Q7$O}WPH#EuU>8Y;2>Qp}d=JRWqVR7mLXeUES25N|v -3!HysgAO6?Vr^#`)?DlbN77@O}jf~NfyY?`#=dJW352-_C%>3xqMJ>wpG9z&UOT1rJ0oS$g=?zM-BO?s(WM2?Y+ -`6kKC)2Pz)w>;!kDv}UzZkwmvoxXT98bi+msR`WWk#uXvG@FEV}wPU3B&Ti@tr)IpO!;a^3aR{(tFPO -Rp_Tw8%k^O0UEr@;>{nAG&V|J9L^;&^4!13FGLokLS?~Tg226utqOncyjvgB6%`Tz(Z-WraZwdO8@31II$_5AmKi>cSn;tw{6P^7*@jVp%XzloLr -mH6r&%GrjHqVj}1eszn0+B(lDlm;vFo>M$qXe?m~8U$O7g79VQEwU@oerT!CBY0b9UZI>e#Cx?bA2hX -aD4qSmf6M`}&kq)VN3i&mrQPS#_Jb}o>FvT)5Fh8^F6g;F)#uLSi-!y32Ezhm*6gRfcU@Tm}{(^6{ul -tj}?riF5@(F^c@;pzS##2X4}w&jNlZ_dF2r)>3lUFpIeI-0*t!T$9}g%`jKvQC#RU?2+}9#|NGiT_v@ -gxSCFja(}Np-NbVA*|QD6e;o@3cVJznisi=dkAnq*0o8M?tljjk5}o>FsbveyS<+spd<2|XWxqbJHeb -R%XRhwRDc3%14)g(->(qM)>&8w^!Yz%a9gol_I0AN^lC1X)u!+{)Z2;xkVRdmV$Q4Y+z -h;7Oku^-dt6UE^ENCRO_t7oYy3H(35CkXAgL=Sc}CLEb -~k@Q!M@BfVqk}S2*xMb7j+ht%AHsmw84s_aJiuxs{j>x(ANO8IzK`di5-l6%b*8xz$x8y?`Zr`MGw!-a$`(ioVien2MKf?*LrD#29!0OF5bw -IlNQKAImf+m4`Isx;gcug{kvD-zAF#ft;8*+D8IlI1_;!#CbeLAgKJ)2bI~GI4dSR+OGA6#2L{7=%U* -N{)@M@fCLAe15&+S_phssYKIGBX=G?lCNw6@dWC&7R5T_2>O!b1(4FFv0IAF9*Cg2*Nd0*_CMMaZU6N -6T!*f`n6s@WHxkH99AE7C8FzoRYorbWt&mf6&E_}3!er_WDp$`f`OZ6y$zgc?6>5pp$wHf(o!L&s!Yf -M>~*7CNiZ8l)xV`M0bcZSVO>kh;A&Hq&1Nia*a)g@v8rsd)Qr&vS;lW}=zo>p;g?2qyM2)8)QWd2c -=@T72H~-|urfE?wl{LZP+m-j#VRuETTvVvX=~q~ycV(i=-^)h3P5NM#>Y5O<-{a0lbxrOiKH-2oaWIO -2vB^B7ErL&CQ+=UCWGY|B1~QhF=+gwMZ7Om+mx*}|4lx66g%mrqT!*5W&Zy9OfH$$<(oqUJu%!jup{8 -|SnbIh&YA{(`1${M9d89LA)M5!&Ud5TNr;Hs1!!i-_td&V64PELw&0)9V$qMbi2~iVk{|(r?XfB_vZ+IWF17Mb1*k2aKH>8ii@K`l=_sZ$v -M9*tj!avsu~^C>nE{UW9V-(5+-pASk(!ON$=<|EbP-=)Yib^(u!XTz>_iq0UwR{KXxG=X3Z3TUzd&S$Adw7>kRYTiWa;ySS+!Op^7 -@>;FDr(vcraYBwn2T<%iQluwIaOjD$)_VI;Sh|x^rw(Wo>@2pBW{oU8vSSn%#voNde0Ojzv(~bzSrIvo=}L8PJ1d@1VT}Zay%${j5!7of -FF4x#+$mJpX9cjLdiY-v?(=_;mGBRQKf(nx;x&OA> -Y7_NIPAu=X6E4gOlLDYQyyiZnxpj#e;+I7(|ifMI|{eO!+)7tUpvBx9R{P4_wAgQO>WkE!eW>629Mi* -|zkgyNeN0Gg&jb=mQB3fh%i_foujaUy~d7BqsK -O1%f`Z|>V{`HBTUjGd+s6z!xOV&0*LY3j=_&hUN96BXji~e9Mkf3Ll_O3c$Rdb(hzMa7dE#hs<>bk<8-ca;%f=+2 -B?LARs-r!mhEYf-zH^UfJ0D#hWnhQ_5KcS!MK=sBNx9MnT_{@@}Ets8v^zV -b{m6S#-bcLg>)A@k?K5%)FA5ui$Ug!acqOqX^tc59)fR8*bm=%HG1Hjk}>1>84MmO>m-ggj<# -2@S>J7=$7yzw0SMR{u(00wg=Dj6#tCim_W%;^sz`sP4hYsr`-)+5Fgm_`_soM=8Lg -jb_Gq0=!mO{LGDQZP=}6Tw!oplvBsLpc#&?pmq7K5TwwqN83 -P@vn>!T1}^skd4cm7T>Y?GueJa%)AgHLvrQLP8f;`Y45jCRmI~jhG=asrPUkvxlYEtOI$hV=BisUj=P -%MMLyO3yL!X+9_E?JOu+tV08JYTYjJKfrX+u@MV5%%;`FssVRySpC -neniMp$a)=BR>C^$^}t>Y7IVeCe0|w&8FuU??yN*o(aD!EwWPut@KkK!@ac1C&kcjFxPlqD$rEC(z*`Iv_G&MN#W@$7bE)l{d6?Sf_{0DTgNgf` -sJX&RJTuiNyy%n}i-K9@jsa3)COK?G0~|*%#BDrwk;-yEAszdPV=O`_u-1NbS3r58ZUfUmZSdAXwXgm -NBp}JPV@F{&v^Q_?F0Fa8Db)ve=`bXJf0Uinw=*+b;2pd?R>g+1ZZ2Rr>MBx4?qqj(*b&|Fi*$H|<0N -gCOqS$4W$x)o7p(IK5j}qhOd_Nf0}LGhFW`sb0G^0Pvp9&@{>05d5LJR159$u8ovrr}s -{5P`RiZUmU}hJa;lZKEAL5Za8+YVBTA-AYI4Ht@o8?%#Z-eJw`|{vLA?3MmBD7)(2p=_97TiMOw@b|I -%_wc%itJ3e;j!k#aW4Sf&5`ktn>7iXhrSqLRI;O%5hW4=K+>c9(o#>7=Zip?Dks@-Hs#!3;VMb36dJ#eXLFPdW_GC>_d20@}7kFVWIDa&{vH- -EN1yJJOcJKF73f-WtR4T{wqg9f)5`tb*@pxdWp~3!_XbRvm-79Y>k1bVY>D2A --n$m*jt&O((YCxW{No=2i2ErucJtpww6sMuJdptAY@+?Ab~7MH`2IAFiVwYQxr3^{&>WtFft}rxCxVE -rxjQ)887^|O4Ui$+fxMymhLT+7%IW^SKfVLnl=0OPR^emt<$f=?Q#S%m1+Obc@8(BsxGE+(3ml1$ -s;nGX8cL39C52D<2ztp*_`R#$N)5*)F`8XUj~&=~CoSPjE|zUW0sB;kkv0=hi!nw@2V-qZew|pW^7vs -zOHS$8y|8z%7U6=3lrbn#q3w1jFdD`$>T>`qNSEF9+aDm>@}!wZ3Sa@-bQGOWue^gvMU^IR?8t -Fqvo2YB*}lmu&FWR+Q1rgXtT{>1R7QkR^+0?m0Bxwepd--ktnEzG1*OnHiZKa^&}#(a59;CXMoAn_Qr -{2HiY#pN-@jsSf*Kf46bguJ*magDtc!=%mu^u23=BBcp$fV)PW<4n23L5*rK#@0l6-7aTCj!*U*z>a4 -Xam|0-1aG~P(_DLL{5v@4fh08)*k%1vc=b&`T@70&uynG*sm!RjDixRc=_qE-zZ+@CXV -QI}+eBketNTBb6r%3VGMjIc|It{(6|F8=t6^kF(s$pjQy}q2m8aR!)sFaf&x1v$dt*4mgqJU_MZg81w -F#f9hV_OVhSzHMq1vx1jY@aXqpcH#i(iY)IxI^mQ#}!TQsE5{KgbuiJZq$erTT+ -SFOrwE>8OT)Ew6i6U0d1dUuSLoGc2vZ%DRt*bzkc$w2k~;cHQ(T@Po}Sz1qJ-wG}PA% -Wo*Pf%$$AtG+?+;Mzt`_<)^gCx4Seb}vaZ&KQXR&?mZUoY?TA1MnZoAAUuH6R_-dHbg@)Vmo|MLTDIq -!gA*JVHSV_*pdUX8)aC2MITv8<(Ynz04{xCPgT;nz~*Xq5Z5^(sY+QLBC`v3ao`6rJhRZmHd2o2tF7a -0s(G$EMoZUXYed%4|aw@{>|^DPYi#e6%{S+%>7~g7Q0W;cdLz4mueH?tZRML;vcnA^7EVu@@}R@N*~p -t0R&Dec}pG=CpFUTRNEj14N@n=}7-?@0aUdS7tD|D?y&n)bt0e^`{mnPJQNkB!O~?0Umjy+;;Abuy+z -*wcqyp-n4Bqt#dj!adPJISX&=&XSK88i5s#o$?I$A~lNTyidze7S64{t(juAtsRE&qnlc+bk)Uh+7uPXI`>X%qOtkav -RnN9v(QF|MwA=LKZI$qfD!y($g~D9ZHJ8PbezjeYoTk0pePxVR6*UUvG=+3d|lwkTx4zt9MrNzbk2@E -0Enx0Le4E!!BFCVTIYD@Fa=r>m-mIufFF^!Kv!CrJ6+swa$yd=%=l71Otf`1zWKH^Tl~8tVcFP6w89o -5#re0S)_OpL*S;YZvXS1Wfff9Ssy6)*eM@#%h}x4BAnLu_W4s7SZ_MBPb-e+Lc<^+)<=-3X3uYO<3Z# -$!#kO(>hyEt=s=BuPY-=}Dyc^ft8P~B!oPFgeN)1d8@}_>&(ZWsCm)#_DQ@apPCb=-!HPP#;Y!;q%Ht_o4_?|*PB;2Cn=qBKa~U=R(S_q2mm)}%V -Bj*&Y+i?-TiA1RNJ_u*2)-VP(sZM=S4H<_cG3ZJKO3-p4a-Bb0E2A57A$d(?7wc7UkAv}tiK0gY@E5y -5O-(!^=9+kiR$(|wg+eLxh%cTsQ1d+>(9>X!gASq51LIo?~X1^=gX0}UJrkk$ZQV#1JZw%!@516MOo> -(IhTG%w=ymATIbt|mt`eq>*dnKoH{p;Feu8Opt~D550)>K!oUUoR8nCG=d%n&0o&WFKNpm^Yg4X=<|h -c0`^C%_1g~efB`9s#Pj|*UdS_@JD&D^>Kt`hEGqc=$n+=xe>Lf8_oNEj)FY)3V{K?ifg~7q&}=u3R*=oF@*oXjD -?P9Q=G6>Ml@4b?7!_r|qg@7@9FtG9&V0#roLDz3(r_>01tKM0y^V66M%6zcF@Xufm%05lLxX4L_1J~3 -*KX(~b##Dubqy4NBLg2J57T+BeQt&y^>lU=wL0{}hqC_gp}+PZyq=~I1JV!!{_!vml&vGML?x`eJ7^s -78DE~ec|4@w)i&QWGY0jBHuuY1WuTAe;GH7~_i2Y+;VIsh4z{b$I>Bj5042cp*LZDw(;CqpY|)MPzdE -va2DDKzM?`iS_7_R~8yW74067A!dQ{4jbJk;+BIj-?uw60ZOy5=DXYYF9)Sx1aE11}<4U4>tSsI>Vvx -u?9;XPRaHfwOp0Ya}=(^m{g2JBc{!(`ibLn2_H>g&yeC;;wQyyOjkXM7o?tZ01%WHY}8fe2XQ(5a05o -d|8z%;+b%ZGD~Ml41ADcN&o}qSLpG-I(?LQy#riYNpiLtS8bwW=)Mq(&-g>5~ -+$(yuPCU{hk?8vR>>Y#eF&ho3$)*W;mRA<{5G{8eM*gRbFaqoT!{iM7b$!wcgmO6uFG=1-3^{{v&wV8=EBir -?)<86ic|nk`~!j4j1di4{o^r4RY?%u5_y2$-*hWyk{G+u2)TigpK2>aLB5{(aJlTo -mfGKNVQQ>+lrUUm7f$QSaY5hN+!FYTqOs*+}2)hl*p_rMU|hH_B4^D5)WRIuq$W}*)6ma(u-y>x|ZLy -LnaqC%cOZq?Sn4LN~X#@2rOA57472YOUa9kmNwZ*Gg0z* -VpmUUjcdN~W$8?-$toe^B?9hQ>?h+-vz0S^LdUh~)pz#Y*ZF^n>6VNTwO -RYZQ}fNkJ;^joq5lwY7=ZK(un+$a(xAfxxt@b8${(vJ}n-EstvzCbkO!v)m!WS1TPO9d>}s)}mqy{W~ -#9?N${iD_#nR%nV`~dqJiOkyz!-7?sBoqJUDUl2kULyQtKI=KWKDp{nOT+<0l7!GW?B`g$ -Q(L7{*%_DyuF2-XJxe&9)<9!NocK6bUs*=wjDO`m@S5P2|Om%#ZiW*iLb|zRzANCK#O9U~|)s&6k921 -V7cc^fh_y;JHa&e)(r+Amt-W}fgwCgR>($X^rtC88$yO*7=&vy8#h@0DRu<+Esip2;C~PH=N^!^ -fIf;AonYB3=8}QFo`Q;%;321Ohh)!Amy&o}%W25#%BS*H0fGsD5kaUCa9_ExUK}Z*pu!I>@GY9b=!ew -&M>|g^qYFt=Le=qwg{8oiPIZZVjVX=pQ75)X!IUjB7huh6t$BG^7^Ae)pq7C2`Dof|i2~#NSfu|qp8V -(E@gx!8`PW|`_9%wz`rgbfm2#?j!8bjZkz3xNcEZ3XTx68mJE)z4Z~=E6OGlVDSl>6D^^LFnl4Q|@1+ -isudK#Wi!U5tZYqcB -{@MB@kT%3O;47LskuvO;}WooBnjl2Nr~S}Au7HD -|Mi_E4O=#&Ny@{fhF}Ikq61ZFGeDy+>b^fWyM{jYq!I6u?44*jo*wCGW@2qi5S|5%>!N$VF17~x`p8i -ipm>60cY4X32^}VNo6~v+kar!+ey_08`;9uNli|3f5n{4%GHg_f1Dm- -*fCWLJscKfp3nVN``BSB1qbx5h|-(C&wjW5ko#V<|7esfr?N!IyRdr!CHZpv{=K8QE5EmD46bB*Dh~E -&QnmGy>RouylOuIq6aKvcFcmorxTmcpVm*SZjJdEdbq_|odH{f%T=sb6e&~(xCjC9LNf@j%X&o -2qC(XkmY{FDCFtg8xuHYrPAq1GCtT8f4d~%u(CBKLxNw}EQQt*apI9<@J|2`?AZ@%kpR4-(M+g4h|;$jMC;HP^om}1v#cx_7l|uAa4Qs-tS#L&2+mfjsE2#Uf=&oAXpdVN@h -WN`>;5`Z&cTdck67>1cinyZaDDmyQoK9A`0@Pp<$Lk!t+;*rLA*KtaB(g0PEdT}_p7_NZ}|D{^4}kC? -k?Y4-hO!B->IvcpDrU2YA0`KmD8DT((z8cpEH4Gfxy8J>I>UbgGjt3Ox$AOGdM$L)FiYe5`*MOiosx3 -6^iS>`qF9u%H%GD8dv)|oFFZW9x1YjS-YiX9l7ToFSB7N9abbdW=bT}HSn_BWE?FBWa5j=RxQ&e=Lhk -;j@cXa1wz&eLk?7P_gozz{d#4*;ZbWk6X%PljS4KuxAU%YIdK7Vyu=5q5lVggYp8O*^t;DveiwD;-9G -m~&-^rG`kA!!MQk%TO*?D4Epq?mutRRXH?8u1ID4IaDClxQeF02TthaEa)hAyfZV~VE`AOgM%X*^Q$Z -x*?0USS0)N}tl>IPuJKfn3*yYHX-=b*6Hh>q|fg{$ZOIo!UJ-`VYmHM6kAgdb>6r+wCS1@lo|eZip6O -jPV^7e_N^@eil*2C&Q_&!?VS#XJbbz9&smugkekhoopa`S{QQLg>b;q$@JlB@iJb`QCW)Yh&kc_0{oY -?0r10V~Rcp&iU*1lxNSHIN|fp=7M?B&ZeF#(4egJ7YIG#xZ~&b-bDH|K?X__Qp;e_#LJ$-tm*W4EbWi -`YvT_o4fhD+&eT@;(D4;CA6L^rM$6j~FwjHbq-SB{mU^%M73li@A=-mIVZmy*=Ihbyh^hA(ohKO>jj+j -xffh8i5Jcm+zcHD{xktP$bn+BbZonOM=@oDp*l*HQeveN$GUx=x;4n?JprMvd}toz{s6ZwfZrf9bwtO -Yn~W@4oVE=*%1VtK`k@&C6L*l* -{~6-i$`02bXoVPUiE=ZM&`W`8+Aso2qV;?4qew+cuxe-wz(>^TkzRz7}m>w^g-j%!5^RbybvC=FfGp& -fDE4x4&2R+oo!YPn)d0HV^9Dd~0@%%xO`rR{5eWs-mu&)9Ov%O;$H~k~Q*WuD|vHm}RH=r$xRA@b}HTcW+MWx~gZ%+q|uJ`u+6u6@Tl)BE+ -TZ>SNxd+j>RF>di$S&-w5Bch@O;0Q8B!twl-nRc5PnS>2YaDqGrBJU^Ykdv!`w+{~%_ECC_S+e-eRfA -F1&D*~*Kl*xmHKL16de=jI~zN+(VxqDeQZAK)xoF!iosno^A7X4mV?bp?|q^B>-kF=4?AFlI!^>wkzv -7a*r_P%Vk8vxJc*V%(42IU>Bt#|dtrXu1K_f%*I7GXRApOND+A?ge)>Wl?&;0E -z;pt8*wc1ZlsBg7EBYR5y2&^HA%erV -5;l@9I`{J9I-=EA+{`b3+*QYPPdrgFO`u@$E@7}&U`6_t&!#5`^>x0?7A-w!n%k -;g&M^}v%s2_ita_|vah)%2_)rvtg863GUI$0L)1SDk*ZJGOzWM9?#WyD}{xX02{`KpZum2qDc?-fcU6 -@LV$6rP|AMv^vLI>fm=+C@%KZny0^y2dl9DA00$LB7iGy1&T&4_-Qc1A~qp3RaMp!W;3I?Y@BL+qej= -yAg5B~4oze7kM&<=bq7(YV3X&Ea0GbpBsilj~`ZcQs7Z^mv;$8{!#xr}ZA9f5T7SWmiL8Xo${%e=GaF -CMq84)a8Y5ip?pV5v+r|oaPG>B)=tZ%^jmy?y!Tm#?%cNn<(&~ZQCYhY(`4K4_?dIt4@S7xK?^ra$oCtBTYB% -p&&V(`Ua=pWuIoe~A5jboBJ_>9g)nmn4JCaIdQ}*B>4xO><4MGRaoA*{;!rq}qvo3#Z824z=xwPv{4q -qJY~KA9}*6GJ}-3yD);uoK>3nd`iuh`DHSvty^5rKQ5YiLmX|LPlyptk91Zt#)JrHnjCx?k|sAH?etY -u-6SO5lJ8%fCIW*FSeXz}Chyf2m)X{|CwR(3lB(-E%s{cgM?&lk)Qnv%D`}aUk%kT&P2QZf?-$ -LfNHJ+lU}Xf%$o-h=JdZ5zqH$^AB(81=Nz;_hdfhg+bh0MWbea%7qsa$SBFwWhKpj6m8ap^5U$9mk_< -{EXD>Qf)#b~}NZt{6nFRqJ^dr^NuO1!~?;4&fUzz1IuO`Bca;4Ivb)>kG9vx7WUfrvDq8t{Ord1x_qk -uB%>CkX3^ul8kA&V7>;$%*0+c)pNeKk2T`kz8!e9?9n?R-9I^3~-m -fgS}#0$8$E#C%D1fj6>`MCO8wN!|q0gj60J3LTjm5%g(l2ir4@13_I+$kNUBul*oE#{_Ax71t ->dE~4h*);fPU5X8x~*YEeTXH1!oBjP?HjKS!Y*JridY@$ttU9RS+$yfy9Iyq2quG$wmidT;wD$NHbU$CH -w+P!95}_T0^#SV9?@Onmk{$TOx;DLUI8%yCPCJgw6v~NIWM687)NHWJ;1AM2Cq;q7it%O_Mtr@tXA6g -pc!Wo?Pj4bSp7hWcC%r{%z58gnMzPR?#EcC|w>K`V^WFWinmn7u&1J_|JI@%Rwmb5p??@YnsQ6pFA*p -J0Ui_%^xZfj(-Z&2PXSXJ32}{K0gbZJWPI|eXq)Ko7`q4v&@SXSsS#Iaw16ITx6_vl2MX@*>(CKHl#z -Y^1~TX&?4KyceW*gP&dg{UXo!8qR2mO;O?aLx7S(Q0npwO#U*4+!S?(2e}|GvY>KT$I-~T@<+fyBDUG -lt>bvarzs`5#kGu*RJLsN4)`RCIo3DNeJEUOLxBI#RTAf=!GtYOkR~C|Cj%6~pV?{!k4~eRaif9@OOu!)JFSf(~Ym*MLEjd}9eQvphUg2(@$10I$>yR$cPGTtRH!LijY>ysKXk0|&&N0>RX7tvtEGUS-$1Q* -E&pO^I1HbP_vfm1_!wnow^yTLGvT$}U@eB*$HZ9}!#8rgte8vJoue@x*8vM6JtJ&I$);dJZ`xEEewIn -eQ(sZxl$@fL!b^?Bx?blvQ}e$j1VY**dq4ttY@Z1wW)|DlUz)vj<(xhJFk6T*4cG0%dsSq!T|q4rGp< -0&IlsYRUV3nYW8;R#F}{NAzEEkTf?1dmG7kkTuH+`^p#)G?6Ao;;}2HGwD~{!Yga?T?fFz!$?xN(miT0#Zmg`7GJ2Ifm!E4xhdcA -aI5oeduNSCk!Pv@E_iNr6;4<0Su}R30530;H~SQx&2ui0)t2g^E=((A*d-bNPS7P~k7ZGA9Nd$H^FDj -#;0paEs7hr$s}9O~P9>z}c;uBl)E}A)CAG=$9b)ECm*v$BXIlOG}Fwfo65STxWsfY50n#@U8G0u -9kPq9&>ffPK8$Ze(VZhRj2e640R%vO${5_`SPnRO+Y3=}8Uarg<}k$Tn?ESD=ff~{J&x?&I&adN(~f| -VuPQL~;-=ym;HiU1|)${sAnRKp!h9$h%Sx!;B<6!eYuV?M(HSv4F*MdN{xCcb!nn$oc)T4ggt5b8Szo -}~(0pwWCj7MTPTm>r$7tez8(i|nj}^xKqXwXMlCH3pu)l8}JGLmNa2@PgP2B9qAK+~7s5Ljmbwlq4R} -2K*VBx-4bdxVTtf;0qiY#3;$OFG_WfThqpUI9#PJz>=#CXrihc@xJh!mc=E_mvtvZnlW`W9T4nY<=w! -&ncaa~Hbt&8nmt@ixj#$doY^W$ss`ERb`9M;--qlA+`i)(wPcDVlfWJub2aZ;GtQNTAS{D=J@HjMdk9 -n9YU8}5hDC&m-b1!i#a4-hPX&!7LgiR!X%ZR3+z?KKZmM$L$y1Ixn_+CIZt&Km*N!nyijMIQB({UjSv -)iJ^M-g2+$U-Bvh^f+0EiYgX3w&aZ3=-YlfR5%1)tu6BRsypyx2BA4O(sLf}R~rZtr_~dlQkKj=U5_p -{;5@Y|ZhdUCLi4_4xlx{jD1o -^vuCxy@P#9IN4DQdWW%RNltnj;fb--asfMq8K8P15W3L?bYs#Jr5$2QpjSrXU%zVb;bi1jW{zAeNrw(CS4e8wne7WJ^+iGwrYDNZcgC-oG -(diaPnk&&hn$Jx3GS7(C6ypF_&{+Bg^@IPqyiT5;Vu30P+KC;Dv#s#k=R5aoV^R5QrvZlTgk_h2yreX)njZV)i?W_8U ->^P>*j~QaGj;0_%wEg>3f>DE}#k@yYyMuu#bdaVr6)waU4U -Hw6b%cMtLxtYhxA!3q-#PrT!-$6^W;?sO^xvLn-OJ{}TLK*d4UF9Do$zjh56{+nv_DI93A_BU5>@~OQr7)0!#G)~EnfaBDcRM`7%w!^Y$s -(k&)NMSD!84+s&#n;9hb0~L%5pZ$~$1xPQ#M9bpqZgul*XU0juBDF!#7EO3M+Xm1L=JLNFw{4xZp)du -Oj_170$(p?5+wxkn5I2Q2rZc`4042g7IGhIwUJq`mv=0V{UZ`Ibehx8U2#qaI}qoN|Jf7dX-vpeLQpa -5NwG5{3Xq1F-^B}vr*qRbH?o%nq?=A$dC{3;E|V^|?9J5*od32dd#svOWCy#Ag~=@exs*_hZ!Z<-0LDtO -i?MDTqBLRoCrnL@KfN>uFS7tOmjrVd)bOA&y|CJ%ghob<>Ce5s;#)!GW6DQ-YbVL8Wb!(Sq)sLQDT&= -Nc>{b{-w@-CP|=WEZsg;<_wI#}waLRo#F}Oz4aOIfHhEbS!h<&@kijnggfAs_Mcx*ifAyA=mHV}o6 -T{0q-Vt$vNcegQtrVH|92QRw0DqPQP$4y=MH!zcBAeeQO#qt(52U&KVSi&sFcf5=vR#(LWuEFbrGa7eV|C7PIv7K#w@4t{-HkVWKhxPV(_x@`^`uB7jGmV8r-r96}8r)p^VPbtjgK -NW-O`rJJ3J<_l6T5%0nFQg0q~%3@pj|6t_s*#3W-MCdTJUI#$sUvTSQt(M}|XSe4p>D-v%!~XpWfmm5 -m=C|e?;_;v#YcP-ppS{663@nt*_l)Q1JD^9A5FdP|4?Nb#_W_=WlKa!BVbby>jCJw=n}8xg^29)h0LRAw*H)olAzXP%3LBZ$I&z2~r(h8<_s4@^ -8*`Y@a41yFFa({<{`tx*lk|PsLXveH@37=R%IoU(C>%|GwENNIt$z&$*BP$;&N_4KWZNHiWI7mFAk!x -dcP8M2gY{Ll=ByeUu*@Om`I_%0>yo7b$bh9bhf(nvN7Tz{I48;JoSWoSlkjRjk~Rw6QnEaQA29-c0-; -R;J(R;~g9o_zAi8w`?#LGP*UBqYi-0xcgjHm)+5@8`|0!HnRFS6DMW1(wBvF;u^ShXg2orwN#i6vfsR -UhsEC3P?i-1PPv5lJw;Uxt)8w@wS|MP7+7{cBqQ4m`Zim6~%tj=sb8=<;l6mat;{2AIa{TDuj$UP3_Z -a1#VBEzmAaMnhGV!}z=#U1;hFQK{}{N+!;L$^4&B;|q+^}AQ6NnXPCS?Znt56|De27wayB^)erbsMT> -=)ofTC~{7uAs~()>s^u-6FKS~3B!ABm78>NotZmO-w^Duw+Mse@Wtg|aOWTkmVT*=_tcc~0TwKwUCKG -)x7PTKIQgTIz_Y7ut^S?FT&pWTQaxhe)|vqk-VRSsUxn!#2w+=R%k7HOqSZ^Q*T8#VS(ix~Z`4N+J{Q -F5Z$cN3aAUA6yP*9ZACkKEmlc;wf@ltPwNNy%>$LOiH`EEmQ&P$F!Nap~pBT0getk{smAW)Qa#Ee?DE -aBe?)c_%3`^|5T#e&C%jZ5w6tGjFO3obCLo8 -BW%dX&$M*j5aI;|UofsX!E(Y7X1s&ZVfpuvkX5Vt5Qyc?wry<6j7ccs8+cLGp#r)nsL<8sNi`sx@y$9 -VN0|2`ypR1tP12~V&DxS-=@m)nhGTy<-kPk#MXUSu;mH|?zuSbpai1k(xrRP%_`Laqk)r|9f*MKzE{4KUQ1;A$>945UAuc&|!UUoBa~x4&CsS^#ze -Jrvn41ux4zH~{oAD;z&;~5YfR&@W!Cu%x66R~{VTDpwO?$_5%*Ro-8IpOBq;3G@G(IXR9+&&~$9(n@s -{=Q*7x>&){Npov0}PITdh+uaqPe&tqcC5_90WlxNo&qLW8JcJ#$x}P&wTm|V%#{w0E+f)MTfb32A$qp -EqYJqaQvtVF`}8=S_UZ-rnpCqDY?#phoD)QgFK8BLo7yU_gC{U`3`PLB*j4aWcc0v32 -5Y{f9e0gm*iMO0ap2R3YYAo9_$FjC)dKv#NQz0maxB5&G@?hdX>txiLS^$!GT5vf-2^G&w!Kk**%0}v8=D6H18kaS7hhc!rO*=iedzGo~H3W+ELCE05n -V7Rt0cai2|ojQ21uCsc%sBnQ0FC;dToJR!MHJleu$J-=xSEYAv^3XTf_-do*T+v1@K)R;VeUC&Uz9kwsJf0KnqT*`_@nh;H -C9JT>Bi$^Nz=*&SKdPy_gHUDRD9Vg&Ma8Cnh(PrY=dtKJ^Kr=0LR@`rLzmi#4fN99x@Yio`JP8RL}NCfmUX76Oenz_hVQ@2O8OA)q0JZV!LX~8m6?= -S~)WpnamAvhut6pYte($N=&by4D*)zEWVuHajY+Fv+==!F7<#HNETDtsVvpi*zfma-~Q2Jmw009kvJ! -B#}keVnF<;ZmunrUY02hJ|5n0GfczalyecR+6R9N -wfu^h#|<3r+nG2DiLpA2U2(g*_eO}+~lYz+R2?An>k_BXb03qPI9=Y>QG4P%^vOHzM3O$oAK}Cp!f(r -da~%p-f8;~p`Sf>ENAXu@>K`!t=$drFFBHT1Sto{6}Dj~fh*ceqV>F4xMfR*nw;LwHJBIHVVggv!E6+ -{@CAqyn;FN3?!Y8g95ZD>osxRO;O82jH}?S7sKuD!?Hah{zb+QndhLPHL^9^ffC*R%;YB#+b*v%MgKR -U{oemiG?sD-_+jTC4<>ePTP@SaB#a2-d<)hP^QDF-G?Q>BKl+AIc1)}fUxM*woe9p&xZXr85AZW6wLCzFg@!cPJD4WmmbV{lTP~ -}^c*FpNCB_-)zL(>^O!RL0XC3|p=rJa>37CFxp)KL%SGmjjF;#<_kcI}OYo9irlT_XP=)wx+jR3YDEx -x6_s}$DC+}md+(GVbS8EO8hjfPDKDx!PEBXg<`PfP*|fwY)&E@bg{6GA8n`jE96zwOY8mhyi}A*LoZN -T|uZV%Jf0_ohC6Wut^ub%+!V~Zu+KMo11qhNZwNe5a7Bm>FwIvlkC#6G%;7jn~el)(qr8%SrVPgV9E -f<0XtY(K*Rgf=k)Ay~*_FhBLp=fbqsyqaryM(SGj2OwF6p>>hIiobgGXUZu(Txy$kO)?(Ljnz!fYQ*S -250?v~2PLlQc9f^^UxVA7tH1yy7e4GqS#;a;#%>Qr}=}CU -(g?D)=X^8yx_V699H!B{LHXc8_yjdF3QO60_@ -or=u&d~A3lh?h-45m6i$; -OM@~HHt}@gG0MVB&2Tg7BK3eHtj2$bR1l)clOf*T&}5eLi`{VHq1brA8x<#AST?;lbRwxL=cFhWI){k -v$bS_Db-u~j9U6?LdHA@^kYs6-6@*JqzV__EQrC+sFD7*g*t4Vg|K>GD3_Gl95c8COZZQE@I-mpXmlq -N+@trO(G!hbz&rkcR4KVV5?kfwZ^%EeyV-(?16`?z2?)eFE@7N<1W!a2@4xvZ6xoSHL68O;CBMOgKc3 -L=#&69^sY{;;&uZl1%!Pbu-;Mh5%X?E48M|%>;$jg-7f0gECtuXG>v|{$y -pzb{^;!Y?o>&L}A)2Pyayg0kGVx)@)p76j6x!G?V(;=FdoE&evBk8TU|zv5J8TN~)VG;!c7_T`wUm;d -xY?R+cKKt$2-_k#QcyjQ+&i*w0w{frLv-rJ~ygHe71H|NR%zEZr&)CYvf6z#hO?e}MT~fD -_gPE_aPY~DCv&25|=mM|eLD^D7iRY_gU6dI!(&d&9nqP*^p96tvFv=WX*vUEb9i5*=Z+hP_oGoqwhvI -bRNNOl6ku%O|qI2_ly?E#mmJ+6V_gW0b>?Y3bi7XNkoVATUDf*v#C -+a8Ety-}Roi!Oo89zp0QnfiQcXWv2XFMo)V`Lc?={BDQ}&nYl?j>+`PkbH`Q6(E5_xlGw3=Y=9bEhNo -M@3+o@4BFsy*`UWbp5E>)TgWFoZ|VAN2|-c$bggy$9Vp6W$`Dc=lJS*dAP|P}480JT`cXu5LD;#e~k4 -E>icLXZ(WKMVR;f_$|YRpIY1Ill!TE$_>Ps--QG6>F-I8GO^$ELyT21t#=7c5I>e!Gk!r%pY`}Ea%VW -qNlEPV{hK%6y?uA`RrD3bcT6M7*mQ1NS7O{=tBJ05q&6?j;x0A+j&+PA!G7e<3r7N)n@WDwE6{(O{P4 -}m$t$mqb^vTGGKF%xi7dcLUEH;re(fveZ;35^{^U -3HwxQ%8#;1gEA=QYLa-Q%Od;IWeW1Nn4&mt6=PQ_Wr>MG&wL35tmR6}nV)=Y>c#F_VIA_gNE;w#7$Ra -$8p@9H>`Ie5*gffq+5PC&RlJ7+WE~$86x@B8|K%rTdbUf59@{3ujHd;3_w7mq3~jC%D{W|9TCa*pOW_ -cE2aj*tzYBb8k1MmYX8Cx-l>9;1IHz*7G&5OMLeGCr^T^93$~O-^I9obI0MjFD4zsvL5fxyr`0d%hL>_92ndclV%0*Qp!secGr6(xND<*Kl39StOSk9Qa6* -bRAd~_aq@3Ro;;axYYAhEa3dvt44iVnW3>rBHPM11I#XLF#dCyfzh_8v8(f#@%TFe~XqjUJx)Fdm|=^ -+?lwE8{d-w>sUlE`P;LJbiUULvvw6&^_dk2PdDxyTxmIBR#6ezfD -Ta-cyT=Vl(~$r=H17vdJby5hGXn@W|P@D%|$v&jnQ;SwCEdrUxzE1P$Zx!Yi3&Wl_xQ=MA16vf5{u9i -88v4)gyt(GZok}|KEqLX#ia?&*(nMKh|7zi@Ai9B%$kRhh#NUNND`Q?|sDLB5Ys`>mPs}G*0PsX-IFM -ty54yc)H^0_|md5gF -1uO2)t3~L5I;!+7p0mw7rte)fqVPl}|XX#VFTL*pe+VcKEHH8sWw17}7rZ4hURdR*F@C7n~__qg#-`{ -Zj*=H(wtS|oBlSJH=9Zr|BR1-|&$iAaGs*HBQnfD+XdqSvSX(}(w!LB*EW?3z^5~OACc5DrLSEvE_r#x3Zn`O`nPdA)mR-1O%uzx33mSs5t -O`P@{^&)1uF$HXIZdnxPZ)O0C_&h@&vnw)~*Kz%ON&&j8$?xtR5-SIB_hh#xWO$w<61krbkL$ED5Z&p -I(F{q-~7VvExDrgHhf(&J0sx9m(?yI%lIWm-Qu4JuTMAcK3P*N-TfmjBJz@*TMejsV7TABehy=r*rS9 -y!PG0qh8ps4#xYyayE0Q(gwVV~eT!yBzU2$(IJdoVcaMtJ$6A|=4{sTqJjaP4#`w2E8v+H?<$sgpxZc -?E(VOu%{BTWkv$uDxtE8$eqB{B97CgcIDg*+U&w -j93a&A&YC`J?HHyC5)9g&}i!H}yCG_zgdF`XH6AZ?sZb*gCL0l&qJfbi8u?@Yjc-3d2t?$)x9ePby)> -cKA9MW{MZe5$gsGq)~)AwYmM$~WGYpGKY#d2^UId0o5XvUx;bul+PQ&>6}c8oXR9T;cU!Di^f!tcH<^ -JbB4=*XLgQ*q{+CR}wXdM_pMNiJQ{Abpl}{AtGyHgS_vlbngoU&@QK$MO&fX~yT}`E>Nwf>wf;1Z5it -aeiTZ)`*@gCaCz#9y~a5R)qm38ZjqETli`@rha>Oe-@gZ*31<5lGj7$ChhI@isY$!udvp!l2iBoRfHl -jPNmL?TZ=1QY-O00;mj6qrsQRMS^(3IG5U8vpc!JX>N -37a&BR4FKlmPVRUJ4ZgVbhdA(R|ZyUK0{;pra${$urrB&0SS3reZ7>RQ=F0q3+K`wBO#cG$5cwQ~HB- -gSUGppsZ+YNV!xF}ioFzt);D6UjmUJlRvSALsM_xpwsyI=llcr3Ic%Va -CRkcsUaIvDB -f2lkzYVpGutlOuSZ^n~Ar;W+pBw@`tn-jYdb}q^b(#Jp_}C%$zn#+R>-W(+|n36YP|{KKme!8_Q#|A< -5EgD-*m=#;{~Og{ar3Z%;p-Chtx@{D773PA@M{zCXpfD2o0$`nXkAtW_Ze{=*$InG5#D)q$W8PQwLr( -nAWjmBQ-UWbjoSbXB`iZ)!XmU6dKkB1vg>lWth3t+Py8yRM7k(6}=;;b}oyrgMl?@Pw5d<+6|t6DD<8 -V4XPVS{S+0w?Q;1JB>%se)RtAeKNG}&Dq=2^OJXM9(0;}VRKqI&jW~u*xk7Zz~pi*_69DW_-V;5H8;S -Jc9^uYr~Vilf1Frnregj#ajr|rUnn5y|7Q}#AQ5n0r0^mG!X?mT8#+}65@;5MC$tZN8vmqK+37M9Pn$ -et5qpK@x{~Fj5jGRiKAKWwHs)2{BKoyMF#|Dq)K{hfD^r&xyf~@L9BXcsadleA@^*3`BF1N>buqB+gG -9C}#Ya;E3Lq~d_)d^Xj-lWLsp!Pc#GACRQfNSG_R30lSYIAwY*U*$XC}xrFw@AiNGc=O>MojgHkxi<9 -+L%DVnytyir*cJjdY!y@hY`4$QjRiGoO$->J6~Q0j|!Hq}0i#(5tlgbx^62fPo-^R3%DHIyt%HblrrS -9lFwyceI@{MjOjsS?G<*NLHs9kzvrhwpoSe*>KGGfG9%#wnh5Q--gRuPn#;aQ|oB#>xj@oAZ8lTffShEI8EzBU= -xHiI@gcy3LNno3kI^oi4?Vlobh~6U_EGpIfQ-Vxkr4xH?Zpf9|q(xDR#4byKMs9&4Fd;qWomRj=-YGX}N7$P`L -a?`l>p+T(A@5{Xv$Il~PCtMp|@~)Q61b?my4Au7jcZ)=h`8>YfCdJFL7GW5zbTsb`_yx1uFZ+<&RL9X4%8 -8Q00vsJ$gWG2(=&CCiV@HYiY{}=bvRT+_7tLx*&m6Yqjt`E(T#U8gY0vuh^|+Y~%O5F+1piV+u4_j+TM}nBNti5Iy>~_pTM7b7*n3S;-v$qeLHdwOOGO1$2F3;ZfIyZ^M=_pFbQ6N9SYYohuU|`2m6(B|J>SPKizI -08tO;ndAi@L3uwW2)InO8u(xnlJ!Y;r6I(EdV`?5}!f5UM@7!ddiFc1R8EOAMr@3un3x>Vv@Ct{Xn(K_$c;-TaI_jgeq#O5Qn>CJa+*Hsmv3$C -i^kzmJ#VYCNBV^AmjYY`qy@e|vUF9%ja -&O;|%5rSh2V~Nl;7{y~ZnTguX1u%IqKY%g0Z$}2si=E0*?jIe(070Fd%#;v>3+W)t26 -m7H#7b|5vxl_TolkO9)B{xcJeUin+O$R8Ln9p*LRvM$l9pC(aokO)x#R_o+3wMRW>cv2pCd1`TFaFB* -jx0fZ2epWi>@LVJi`xF)2DDWkd%H>?H*Wh(TC3&mRo%)Fg#~{roMUZ}KLnw&^4a3c9UNZtmLc<*_B_p{6ac&I^eI~{n`Cq>^q5JjQIQF!ZCpRG-de -=CV%mx%c&;$@YcV4gJwnu30L%Nahz#{x}n8D~Bdl306J%w+Sjqr{C@i%%3-<|-F0KbuRt=GT2?e&_B; -}xc$zO=V23MD!mQxc&S!{-n@N6qmOjTW|&nOZA~kCGgw1|wLbQQGRd$lF}?Lf%Sq;GXP7D}*oF=x%bN -Vi^;ucIk~|rk%-LQZ(pWavP136FM9^xgdZFCq|~R;6`o+1p11>sb8eUK0VkMq?bt7PBsqt5UIb?&Au+ -tP3}`PXHbo{Hgw&^Dsm$rMSIjo>};Ueh02uUCiGtje@YCnW6R2KG`aN(lwNpKLsc66W;q60MLnA%Is= -~&ykQB|lP)1lmk+M&hfdIBOaX*gDO>u(d3g?CSiA9UVMlXXz -^ArJTuFmK*kgFA9G&8tu&Ubj5;TUX@iYf`G|YmgXhnvm%YFQUvOHXGh84*hi{GSDw5l$|OZ*F~9o%zWMK?4Wu?4v)2 --d|>(w-E)H=;VaNP;0n^>F5r2%3{X6$pfwVejD?#!uK#o#xW7crH{5UlY9|tN5~5OOaLaQS{)`pFyU4 -9LVJ;9dW|MDgZmx+kTvFznlUfG305eP)+wcc4(_(QKimYT8m*;t&=8P8%c7g3KilP#1ce?-ls77iG%f -}z?=(n#UAFY#@t{8jlU6qt_C4N$i#$8h0rirk)i0XkQM!ZDk9xKI;vmJpLPO3TsMh&xHk1`uq -hqh8`4q}#A(?czB8=Ts){if1l4n$1+LF?T#3+hQ;a1_WWj3`s=!HH0FM`M!VCkq)ZO#xaTI7r{z|VW3 -J@6@tlxMIy{eh!}p#rC=+Wq)O5~f%dGuFOFUGx(vjzEX%Ao+1p!ysZ}!!8hc>8d=J9so0nCcW0;6QcgTQT*&xbXDboOsfZ -@QW<`Qkwrpud%-3sM_~dQ@wOgpyEW1th<$zyZKPBR{U@j!d9 -Geou14|xU23S%q%9Eki)Qo9E0_1G*;;~SmNuJOVH^DJ-F17aV47!E#y_40aSwi4wsjYt5IfYc1CLVJF -H`SQC9hJ+Sqy(p(dhzO#tt}@8XdCov)RZ@r&UA{^nE=r=THvL;3_rpk?cK|gm03?_gtk^Io37oX-OXX -cZ60>UIj?M@j(jaj|<~%8!ni`K?ZGf+YAs1j3Y{fTh)U($5Gn%1GhiRUJ5=I`Y3AEI0MCP`F5b<|ftF -M*YscKWf4%!IFI -5kKh=0pMj?@;DdsFohb$84p8~+A=*MBW2z -be`-K7=o(!ImSGZWW9|Yfh+IG+84 -B0&(a{2D+}xSyI|J!dVW65DFLP5vOC6>HSp<2NV8jm&4`x8qV6dvwhn1eeQVRKRGLwVp(etAhhsQ_Ht ->|a!-p7`tX_eQFE|v1kS%3AuO^ -!h0nwbSZSBFV8ODe}WKn_2%;DAJ5-@2tK@g_xk(;f~=P^T$(Ly4P|ET6fCSDDJ3NUhfA3V-%3kFug3z9l*V9ci>WF!w?95*SK4BSSWW#J#e3SgrhO9o^-kYYk?w}1Pp{&!4KR8)st25O>AB#}tMjdp;dim{u&*Q_4xtsoME5m>X${1JlLWrqh0?iq8-@^q2&6>~KN+9PMjN3`Y*; -vS#i42BiUw2C9@6f9&ifj}0=v@c*V$o0%3V)ay~z?2VG3eV7jEL~{XXh!5Q>feqVYK0CGz}ku@8(KRJ -LOo84#RDN|mtA6qL;QF|EOk5}wF$7g$8cA>=dzrgI#j4u+Jg34^nUI2BHwcesm4ammI7*KES5812FyZ -WL}(act2C-&(VxWV@l><2yA3kvHjn*5*|df=?ginbiH*lzLa8HXRVnDYWhURFTFYggR*NMoQ??XU4(1 -C@PDt#`M4YahsRJ*HHoG(ctb1B^2GQv9J$r@$s?ZM){AYe^La}X*=r8%Lus90nt_!8=v+;mo9PCf`|8 -E;xZKETe|0VM{ZkxyS;LqB}^uTVRRi>x;swiANoS-p76WBYpLgOC#GSgF>2oE)2oW(RsfeNF_P>2xz) -J}*cjH?L4>jET}>HA~UyV5LV?uEP+3A2eJV>DR|L1YQFbCr{ca9kUL%vvel)H!co{`7%@^LcJfEw<1<6TxSCT#sX!qg$&Zst;B)BY*UZ4MB=aI7nzA -jazD)%dw8{X`9Aox`;Qu3i5m-^7k1eN)gg|RW0YSEWEPC<6}%gVa~87}&~)G5XA^djlsR}_2ttJ7!Eo -ZY7asK%9v^|QpoCF@L93~n8!NH1W&57{vwdzGhI(NcJqL0I^F+rmLjye5aBnqdvqRZ8LZOOmc>&?B5&nDT?nP -YDT}rXviCa1Rl!s)A$}0wW^7g$K9lxDH}e1sw#K(n>CtwB{aM1TqsCd2j{`ByE*rBqO3d4WTTzu;HOc -Oxo}V1@Ja4!2>^_Q_Zlz#AX!>RNNhmqU2vdKI%9N){I{EJ#W-AiZG3e(^DgPVYyAVc=1CzSVe+hVkeQ_V-{Kpa>LBsi$b;LH}E{7hL1zO?#QfbZ --J#bTY^Qxj34>ry5fGL(;MinceFez#Yvwj#*vRBzmf?8(SkecmmZyOlz8Aj8?ao0U~;4FH@~$Z{6X+5 -W3FhH`Xx)QmsyZt%G1ZFw&X$Avv}S5&WoR?qh;WBDdXv4k)lS5I5yRqh4BlqdLXktIswiYQ@e@|A|v2 -5>q{o&4|EEk!YDc?~dbuHZ*5HKuZyT%|`W6`4=Ly-5}0&Jm`8x5QYNoNkNrQ=H -;i=Wq1^LMOHC3TkW#C4>851YUb$OFKFxW$O9Eib$>4 -AkldiEGTET%iMj`xty7BAZSN}d;)*$mdwgi!seKn<>978~7(2#uRXlCHvkAIp1uVet8izj8Gz@poD~j -v=ll>dS3KtEQL)-{zM-4cqvJ_tpqhvPt%9uUr#8E%pZk@IGfY|9~HQdYRQREr`GvD^u0Uowky!*5%tW -?n!V}eWY7^9n2CbB1>Pm==mNvMjo?d)!i;EmLpF;i=0fc7KrRKFe+A~U~~WKQYI2PY{dx}jT7jg9Q_u -`Lia1n-Juw+=$;`2^d%2~}4(A#QH|b)qVx7BuuI#8c~SHlOags%EfPQO7$j`n(#l7!IPpM@>{t3aQ675`;2lv<$LVqp#gVQ;s@clx(f|I67SeYi8 -BZ@Cl%g4iM0|(xPN7Se=gw6;L6Hc2KF|C1xE+#TuD9gV84%2{hgXh>2drefE3`Ih>cGc#tA}=%J?tlD -d)(X=-JcIWxOjuh+gh-KEJ@ByRUIkrntg*#|=QcJbwqHP54B651~ZPmt9~L(xR-Gf<5iWq6jrr+8{?B -1HX@LPSSrb=c`8pY{$nU6*~tz`c*Dj*D&6*h*|KP&{=0^O!B~5zcskdxM}IxcdIobq#B@ai&jWbQNeA)+&Ae#^6*YaK)b)#D%XK>MGMHlFdjAFj5$vL8!(*E -xOnLffqF{|0l!K}xX;a{WODZ;6Oqi##X=kpdCpTR`qJ8j4T$(W}mh7e(JM<5_24dm;%{iRnx#{7)^R+ -LCSuXgOzW8d{9zxAev1OH&8!SUi{x*9LCWeQ^Kdgcgs$kSp!FKWgfG-Kigy&K~{}H921SHMWvF0_ltB -a21+(X@fVPqR^7?w#Wt59`Kn=+hNlKl3V3P-aF|JA|2DhU-ZS#!HXIN8~`Z#E~yn_ -MTSS{&)XtD?K+a)-um5EaSxm3%^!nghyKZkWdqn3*o}>96aE8GO9KQH0000803{TdPC*9bFG&ml03<2 -^02%-Q0B~t=FJEbHbY*gGVQepOd2n)XYGq?|E^v9(T5XTpxDo#DU%@&bYy-BC9$GXo;47||v==nZEiN -ezK@cdkOs|=hMOCDBBLw;Hof*D}l;qvLHvLfJaIqzFI2_JA^UQFMjXJYDKencAM4mHwu2o|g-)mL2M& -$PQZ04Rz<-aNIzv)iTW=E7$%R0+%MRib(7gTpfoy#@T@^d^$Rz@@xFEjDE5Veu2(tgIvN*i9593Q@D8 -r4iqYmF>*X1ZEd*M8zZ-d(-RfBfmikAKg9`RD7`FJJ!+)ILr;-p&|&NNOtKhpJn%=dv(s_DX8_|Iefv -2mRl+btz^v@k-Qx{QaMvbHmxrK7X%GW2fM^4IQQhLRXcqs6W$%>&SG=Jq(J@X -rp*InJHPogk+&CO}4L6sUF<_Fmf^#;+TH~dR4Z~|CE=?uSRpOmbU`D?Za(lhjk#cJjxUUlZAs_)PVWr -;4RPpT~stWt*U1#2r=sDq%vaGJQUt9Rd_0b;xd^WUYr*fnnsU|8Ew*;rnu7$xR;VYPho`boTE -2o(|37q7N)ChivjD*{ug)bS$d(V4xDeEKFJ#h4VKBs?w0ildDCv>4%YA1#oW>%wZ%^Q9ujkfIVN!WcE -#SDJGJk9RJPMPmpSsrq`=Q+FOWh@wC{t#X%ar2mcZXDa%IuE3f!jtnpB_s@xI!%{W -W@QCl(!eq-uL-{DOw8}u5Jr87|4){VjM!{Oky;MNE_V9-Kn4OZuu?7Y#Y8yflybNICYoAe;DAfRN@LM -ICU^1J5imib+?Gx$8Nj6tQ_8qp5cMMzlmLZ;UCuAnn;9}wVvPVFL+#D{L|gzZJaTP@g^uUS0&jS%eW# -T5fsC7rCvN^#4lHv5&G;5hh -H1Y30uN?6Az6v*k=yq7^i?N;2fFV@Ci=RS2%KRC-jLt4!q6fad3}bRx~LvIvhY$XzC?^VO|rToLUcu*;PD{Ps!;0IJ`qz -He@APmJutlj5Vy$v(}#OzV9jSh^>%KPwH+OQGmYyWEseF+VeQza75c{I1h11sZ0{v6a^3S6aF}MvStt -_h`{L95vO4SFikXsdes8M`xbFf1X%=($_}6i$I0|CnZhSkO~^pv8e0f`K`Y0~T!iM4AabGmgwTMj?#9 -!5CrjtU^M=AhXk-IE1G|h4VU;nP!@OzEf*OIG);+pnFnk~`48SE5hgsGi$+8nVM~x3wm~QbJYHH7WC1r?BJ#!5e7zY4cHdRcEg$7Cy2ZOF8^rz6_33xt)361l$zRUZVA_xE1B*;Hx+uQz -sq_)ytXPxqfN1w?F&)Z{-0--%1WDIuVg!U}z&Lu3&da9ObnGGlF%tJb -)lqE#k@Cz#%y)fd58eLRqd{+C+o!ijezSG{j70ZP6X%whbkHhNbi>^W-7HJF+6?>K?rMp2jh@zRT&s^ -!Ou!tdt)-hW3$vJeL}5f!i44TEsiIQ{>HWAuwZy_#R>hEG^zwK)VUGrwY;0;(az>$b0gGvs6%NaY3cX -&O7$DaiAi~VGV=gTwU!#dw!XG|G%7{=M88>iz6Pk0G_^lotio-!RC`J)_+nyo!aliXvXR{`;BcO#C4t -j-0vM!xbe}6V$HRf5LI2|UYGoew7cll(`7k+?(xSdpZUfSHQ`D~Kc+BzxN(P+FOQhY5D$?0+^OaU5E- -knK&(`pcvvT(D8Q)j3B$>OqZ@K3!!dOry%k5u##I3t-y!Q{S`A6;Dddpp^IwK+F(O;IY}lm(?}7ct9g -RtJpFWwX{#5X^Z_%d;!XD^XLBeu*)1S4$4%U<)zo`e>R(&_%A!RHHXKy5&;(c5l%{U=!qM?fu0q>_G+ -H>X!K~o{UW}RvwbULWTwH|U6bYLJ1Q^L^A0XQ$2JroTSQ->YCgD_l{nyDe&4o`6qhQq$!6d>K#_VXhX -7)m_b2l@}jx=XEq15qH}R8aN$Ft-)PwIa7lLf%FcSXMOVLYnmbiO`n$t&PZCzyBDQP^DJ;MqDYbdC?I -^W40l0h~-;FPB`q?Hu%iRu&fxj1DJzD1GBr7(*12!Uno%#GkaW{^a*<*(_(Zop;0aa*N~bMSK=TYnMiZamRzsE6U{V5c9{aXf%>}?56elkRA?#- -7lwNHjBQ!*udFPjP=#cBLp~hF#X33JK^%Eoq66(aIz@^wzE`)t7J34XZd}pGM>qn(h4Dmi;?jEW{Do-&yE3m>I@d3N+re()MqBmF5j@;ndd1aHJpl_F-rfhR}9GC!+dgv?pWL#7)FX)!oU9Nx}I$=n=Wee=*5q@qP^62QLv@zDJs2UqGk(gy@;8#K%dLM9eR< -4^bo22~#OhBa|fXo$is>n~2Gr7ARg0N4UC!CsDLSvDy0Cpld-lt(lzGE`#mDrJVeFy)6T!TxOin2LU* -j@un0c5EzKp3@D$l`-@fxrODhW@s;n&UuXTnZb&68+e%R;cqCEWZhPohHPmbFh%??wXk3P1zG0zL%vm -9jfUaDY1`H36LZ9i2#Nc^(z6J!tR9zR@}f!cziB-qY&wCYAGJ#jXE$CXTaiHLD!(zV3F4nf!FIx5OAW -Kd@awiQdy& -c=++pAV|7RoCl*)On-&HDrpLjE`fb=xJnEa@*K+@J+Hp@lgZBGG3F*^C??<7s+O -S{$oA&$os6gT?WeJXN5#ReqEJ2Jv(0c_Ww;3_tum`@OF#ONj|Iuf76JSr%UUKQ}-~u2IHvqGs4ZYnyq -REe)-M#PeyZN!qZRqOvopRfFo+9$fcldjEON(u98Sh{|vIpIz`y2H4wB{2zlWqDiVwLpk(=I~)7h_W6 -K`&DmTZJj)4&&k8mHLV!y>q+7Iw${@6aWAK2mmD%m`*6173nh(000;}000;O003}la4%nJZggdGZeeUMa%F -RGY<6WXaCx0uZI9!&5&rI9!TONeMs1}5S`=7dTU_sQ&7sNWkX)JsmxDq}w5_Zx>O^VxjH3U&Gec5*5w -*J)Be<+3ayXpVXNL50xqK;F(UhVoF6=v@WIgniY!-{RC&5bhsvBRis$p%_vP!X5bO+g;Maj5g2U*whU -R^B~@Qn4c-PPhw)G+hIP<7%gnjT&<`0$L$roO;Gf~i&%jN?q80`yqh$=^iLZ(-h%cV#VppD~yUT-=GSt4d&H*zbZJJH9j8Q!t< -s%5G+Ps5;ey0EVXAviqu0OSZlTwgj#K441GkSbX0JUiK$O!#9iNa=BPk=T>$-tL5=nHOIxFlV{j#U4s -aKWyQ?tR5*(iWT`HHKjmDhViYdy72fBALY8~6Wdb(SiM*`3c?vBrZn?i~aT3LCPQ;Au -sJtan%oFJ^tw-UTpWpnPzxe9Q7yr(``{Cy1_07M)Kn{t=+K-58Na0&jG_OH{+G1W-=u2M%Q(N}E=-s@ -Kn^N94wdAFx^QLOQ2hYPuFf#)ch`KQfvlER8ednBKjsR-u?PX^>pY_Td}zkM@tq0O>=z=2K?yAs{2yMA! -hy&I#ya#Ar*6@x>_8g^F%a|SV%N?rYYX}#H(?yzmG|NZ5fb+N-=%<|-Ezy881#45VTT-x5})*Pr(kV$ -xa{!d@_(8VL_3y)V5>gQoraXC58LsZQ6xkn_6(gsT+M1sPbO>jMn@)2N+t92$4tx;KliBHoYd`&wXXN -hss8;q1wspjmt4n}anc?__&BIKHWH(bmtr0nTDgGz;J7Fr&5Z^dDR8hMJ4+M{5fnVT=+GWJUJ7dm7jG -Oq3S`oX_OD<3?fM3xz*Le*Rm;%00e4y)C?0N+KA1 ->B<}Pk-W&gm}Y_)t&H&8KpHC0kos@J-InRC#Eo8fm4^-suhFXHVQY>^z|hRdG-t+`1Zc}yc5^(A4Ta# -14oY^B4q3_KLLoKDDj{HgmWhvyPha9QbTCfsE_bTINVw{jI)161Ey|@W2aA((_CD>o_KL`Lgc${S`0E -mDfs~hMdW{<4%L2W#_2DS*b&$ih?T)5qOJcjj>L}#Ro68b*T(79!zAxOR~nbRcQN1C%9{bu15c`s`BL%XOot0-bc -G>vXmBo;Ofb>JjS?-=W^dvzBR7hY9k*2sGR*cD_Uo^RK&I&C*IzTYpKqH&us4@CuNin71Yj6i_>~=Oi -P_nAbe4TlUKJ#0> -5=9$;C(3aI&^QRhCO%ndBYeLKOw+;o^Q$ubW>+n<6d=#uMrUQp}a@fx7vdgE+(^GNi5n5k&E?1I -rCSY#)Iw=^P`rdCClfEScQtN?tLJmCU%hlF@xy5=@%7yP7_lEjUqtjCViYFU_2aP6mS1n0Rs}x1x00|VxhCtUVt#b{RBY^a>o*^91)B1sO`DJTB2b{iNdq9 -UoUeQD}MLh1#!#)@1|v=!_H(Cf?5qQ)%6`bjd->~eUSBNG23|cO{lTHyMzxC3}@nF4-soU8HXR898Ko -RAuz|zMTu-PnHxUQs&t#fh8jGZvIY;)p+FGu@8qo~s*JZ7X4f#mGe9t1Z%jy@dSm`;uNbRTZb6p8#V$ -#w67y7_l$^sd;xGs3uBVk@#H#3ru3@iu?U}TwAEc^$C{9{@j54$_S%?A?buBgW|*;lu -%r2Kqyt^l~Id)ur2=Po=Wy&g`cAeB1-%Gtn0rd)_!pq0p3b3YZCHqoB&gCAn^x^?<8X4UK2Fj8A*Tcxu21bB7wWTU+Lg^#h$Ys -axe_!3RXiw+@CH~rEp~pdy58$noh?vn;YVqJDCt}f{HLSnN0h2b;!j>(7ResBi1GkY7qtBR-drGWj$( -Jgfle`Nv4x1+B|8&F%+j#|7`g3xqV8eoZ=h9&x-34Dd*N(XVr%CDz%a6#FY=fb(o|BN~~U~q^;_zzv$ -MsC7m($3dSIo-4U`4akHzf?uCv%fxC1<_)b6`;OyUz^)UKQACs|Xut5nXy~0AUDbbPcp`<}NlN=eD6S -DaPRO=Tx_&>i&j8wX{g1AO#l!U4eoE}b>#;%}fXuo@yH*VTbGuflIFtj^>g(X*4+B>6$SHwfu!Pq=h57^~Y{k-nvWbNExXF8r(Pk;q0Uv7@T^f@Lt%I^ZB(P5e&kl#WDi4BwKOmY{^nQp-~$67E;21$CIMyQ^ -l=EBTH7<6o;-SMtMSRr+`SNuGa4}4G`btnu_Md@s#-o`Q-YM>CsfV~in?Rwh-h|IP$H*V#y97F6W%Bs -i4TQV1fohtK3Zl?rJobaFz+te1f37Eb01H?8U6?8BHpar5L2qq8`QL7IgTGW={T)|k?QZ(f#Z5k+)?HoH@fI156wbvF}(Pk -57FYiMb1nCb8vo_YM!cysvoiNZ%zw8^XhMlPNH3mjXiSxoQa99`NW3?1STtB;DR)m7iaaRH15o4>8$0 -9yeg$TqZJ+ht|>)Fm|A4WC3H<=&ZgDW05-fhYJ&6+z5qvKH1opGv -m^w9wA^M~)g_9nHrM=XC@!R;-R5q%=FV~M_#%`UFWp0V|_Fa9z?q))=aAD)DDpYBdtc==hDSZ~CASH@=D`Z3Z&&|~;O^~`e_+8QfzHB`TQS&r)yTe}fF%$fHejGk?5 -$U0e1dn#20Y8|FB@Uki~smZ`2F2~o_}0lR<#516$l(6B(PQknXP_J}BGIv -myKKFVoZ%V!QQ*RHiZ&<86{NfHs-u#&2OZJDlV?EFx|xDqU+lABCdIb2M$-D5o2(M!Kh4~yi)<$rPVJ0`z?&ztxqEI?xlGf$_KWFA{FumIiv -5rXfA+I9VHwp+)WYA8u+O^XbR+h&+OD$SBwhhXv6YCcS_<)#b44h~xi_Y5%6D_u04A1XR%APRNom+Td -c*PSClDHwqRtP;4TpcXdjPYg6kBiq?^SXF^HUU!zUdZ;m4d)?{06z}t#^eLzAaIn? -)LxCXwFx2%WLB`!yTt>{B$d*^T^lbg>5SBs2WQ!106?NH67Wf|~9C;~^o~*E!YX4`ZG3n9Ch2k78 -^CiO1yS%1*@D{@u!)evsvz#6SIV=~F7i7f@{X!f*KN>yfl-aQdDapbw;537%YG`LzqP4gGXwa$VSDRC -kDM&di%*hB=si&%ufdlq*01yInwMUxC$j7uG_o?475h>Cq*xMw-L!>hPL-v$YioVgip?a7CFq%yctV@UE^jjsUz{ -2|BuS(l$D>Wb`^%H-wMeMK%ma-UVl{lgDcc>?M^$O?OzPXQz{1x4YWruRV8inj+^4?kCOimqF+;ZA$4 -*Z0mk2F^5rcbpodeaBHOi6E@TJJ%9I{+`A^78=)8nPG4b-sx!N!M`Cg&MyoIW4^T@31QY-O00;mj6qr -th=FjKEF8~1Lpa1|C0001RX>c!JX>N37a&BR4FL!8VWo#~RdBuJCbK6GJ=uHzqb8 -ID1t*^4|#9OjHEJ%V9Rv^IOkj!NLzrVib!a>W~-FmFDMFKNDJv}`=-90@$qtWQrNweJ+Wv$jlsnWcv< -19<_a~0<+wP@08g+Jy|uU7Fm`o>$J!#`)IRGvjlK3PpT{Z^&+k=vUH(;X2tnAAg6y8Rk)4o3;nZ9^tbAwsZ#?FI#`? -UJJaxWT;>3*;yx_mD*5Isjek>SRlH83#W!Ci`Lb9gTqxPZX$EbURZ{Arujtn;F0f6vVRV(`tHQkBUY< -u~QWZ_POsY<)aFtdy^f0WJWxA~^UF(E?K94T}bf*pv1mGTGH%*;ooELezjI;FjB+BDW(ydvgA505%2@ -sB7x|pYVos@Z;8QhcYR}a3fpLcvBd9vRg(|PWJ_$ID+jj}e2$qLV -|;Z~mPI**M_16J)vw5kKLVp*$ENCSUNI9V{APM<($`K_EaRSLULC)Ro*q3rdUF&#fBgDyN3WwFkDndA -c>Mfms&GJvtWmYRNT98L$QxjatO{Y`Tx!_Q;Co+Df))zz>cVNhO7c2_r^8h?X|?nbfA;dH=;`q<$4`% -5Phq^XEUKEtwk&|PDtxfTX}F52dQ~*_R3$(qn3k)woKkh3xe-jc4NUeZF3+J>nZ&DTdC}yT)j(evn<} -ZBZCw;V8Ilr)k&fQHef8$$%V#Ii$hIB$pO2pWEq -eX-#f#$?KMmJxQeCUqCV5l=oE)cWy6ypU$P_|Yev3?b{5(yUK-6czAXD{{*f$1FKS_RTKu7>nK99Fpa -jM=l+YEjmzl5*J2PpkG-@#8nE?#5_!JF9T`logYV1YOr;1a{VukEu|b<=aGhW{dw>$;{)tQ!Dm&+1p{ -_5`>KIy+PYS=oq{ABn}D6nR}1K%7^+X8ed{${_$SIweoja9buIUXw2E9n4>GnX;FT2Iw+|>8s(8jCg` -ihKgHJXF5(#-o)p(T+x)Qo}B#hy0}(z9_7=j1|b!O;n}TQw|+T#eRBNrMfBw5^H-1G9RKj_2#N*wr|R -AW-l7D6bz`oVvG6>ppV6}*B6%G}SZtN7RSr}{aT-+Ra;mlyX3i33V43S>4~98&%fRn#7B7=Pzps+*RE -_VBHPAA_8cEtcP~P&A^n?#tAq-SaiPoak74M -5s_8Zu&&LxPg$7n~D03HHsO_%4DDnp?t*Qoe2!|B{227(82>mB^5YuyDq(p|FWFQbK0{trBRTLMo-f> -5%MFS7|0lo!^37S)Qm6Rw5VAiaQ(|c#?uj-*CXPyB?{`hD?p}1t80r7Wc%7HeCq+5*X2`r*X8^$KgPh}-pk|zDY4iz%qjS_Y--dCLXjKz6qW|;Bz&!L&4cG4N`uK{uo -s96iXjdB4w4Js!788ukK$^XrXwFn$)e1mf**mUCQweo^Ek!9eRGx -dX-&pj#%P7>+>+EcL&^qgQ{$euISiUVr~Syz^)h%D`KkvyVn_*l31E5hs4q;*c;pNGZ -5gkPV$W+l5v};(tM9|QT1^srf%)p7|&G*)XK>-57w~Uv-`64<%ifGti+7=Dy-sc6b&4m&Sd=Wyr#Jb2 -<0AWtQjBYTRL5D_>@BldgfWfc@VizzR(lTgu1V5nDEpbV9haseg0Rpg8g)VSe^d``^@VqPlVR}%pRKAS#b@jm|2YbIR*O1b>?b>Y% -oi!nGC|As$mdE{SDz~fWuirFlWKMk3hvOcU$Oq4f=~%yh8$;6*IdqqINb_{_is_Kv9rs!X_VJBs=gOt -p4~og@3oC**6y{D8`jq!E6N4yo{SFQM;l+rvt1=RRs%LMIHr|-PD7KyP&R1FpEHOfMH0N7XojS#9)-y -7jcaozXML$DHt*QgII#_C#zo_zc{8fqzVCrM8!24k+r%=&_)0Ng}|dB10612X-^hRp_JTO&}^MlTU@} -9%}X#u5XVh?Nz3)dwj{8)y_W822t}Ib){+aBs2Dg%yHgytaaquS_QYb!06Vb^=^O2!HbQ)F}M#;9Uip4*ZC0g((tr^vd*$VX1CQA<2O->Hc7FAa;g#+97 -D>kdHke8%TNXlcSnTAQbry3M!RgpdlyeXCtF$5e^f!Q9#i=wIZ$V4zRBhZw=wEa1dXKlHpogpZF&U}^ -9H5{KNV0Le4ZmeNAc1pWH(e@`Xl`Cw9hKjvbs7SNNHoWC5oRxj9u_j#+K%+bX^JfS)yTl3@uktztX@- -i1zmAH?l=>YB$(jjw|0i7IOiPO$u>l#uB;Kw`UTF^keB&X*O35l(?8q%PcirP)Bd+5nt7$;1q@MJdLG -b*{EaWTDrbyj}vF@OZ4wJl=X7m~Wzfc$ix~3H{Tt5;uRhLH}`9KA~E2p-(voKz*0tcR%Fux|anvBsA5 -Ay_O2M#0mM4W8>_9$q>$9M3)<{d{VkqulXWBSaOh3Ot3egPeslp&1BJyk1 -e|kM11Ri0+-FKWafDf`T4zs`H5KBxEByn+7_g+tJ;y?NziHp=BjnRP?|IN;`kifo!FrbOPN^J_u5k@3 -%}WG(Mvm3kZPyVlsLHGcZL3 -5`-GgJirJ97p+vdR|VsUIx#3BYbaxp7~$IAY*9hM*$v3bk~LMRN6%(?F~cV_rqfJsTS-4An$wX<44vB -i(IKGM4^4v+HLoS?ZX^@kXN?bT5SwvVEZ2pfUiD~s -zYkiTu^LvOI0wtV%hh|siazv(l@5#{p~1ggSDPzcA`QDxRw!iS9sQAdtqU_+>YtQf0@vl=ZkC4Lijkd -yzJrpB@;ffu$#zCs%Y$^!`j7_>#O{Ptk^Pt>cUSL)%n-%xG*{?&tTW!102&H)uwp?D+Q5o_@jRuwzbX -wbE$Ic2pOkRj`BfeJC|rwQ&(#FhL)^@;UWQIr@snqND4;cH6=AZuZqvusBVpyI{8iXzW;*b3@oNFXo< -6_bT*bDX}k+SRf<1J)c+1NzC8x)$-0wZr490xa8Dy@B~b+v!XM)HHx3npDU)D9>0=SBrRgiE -DPgLIpFK&7{~xU2m(yyLZn)0cjTKe!IKfZR5M!bbFU~ChmUy-8bL4Gg_8FnXXfHne66SyjiSbWQ0RSa -|C@E!3S2$KG6P6aXpzh{*YyL6=8kayf6y@OXVV4nfFsG3XCK$YppmzbnR)cI<41aaaKEpK+|TGJ;`y% -y?6e4o}~-c8f@LVyww&}VHn;}C>_E|6>lu&hw8BcQ=IoO<8pZcl1hsUHaH4hm|2tGIoca&TE3a1K@$~ -84Qh3+7eO2^l6Sc`3U(Ed1q+8$eedoR5t(S?Gn93(t7D9%OSD*k_+(QKtN~=;5(J_a35T!I26v6S?PD1k^0^2KQv-jiGF~Ex`VeDpON=;x ->aDYI9TDrJ{j|vW!`?;R{N?$oSz=8(zn&(Jp -KJif_2d(c1ZFdQJ=L>oGF5#$pDirxocUA}=JDzJY^ug%{O3DK{EFI50`^)&-sOm#hRnvi8{kcU2K1Zr -v>l0IecYXjz^CP$oW#ycvyX5AYvCNN9Oq@%=Yp>4PnX*6WK(61KI*>KI3{Wkl0?9Ce9u*pAvX;70#)Y -p!>2JM`%AnDT1zHmTQG;@Et!M(285qTHN8V?^_Vv=pT0cAz%yX5^c)c9(8w~0FM0KBwxL(_Sy5cFJ^~ -!UVk8xpUknTWDqUjl)iOgzImu1!tYmMs;|EZl@D|$>CWmm?HS@Xpy^CNK){x@Zo!T+Yr7x ->@Q4wC*d^`OWI@gMtYVlceXrWk%?4%4P1VtYE4D&w;rTcoEnV8^9p`C1oJqO))rzCp*eaTf6-c695Vc -63cxKaq}~neaZU{%MUH($+=yMhk(=925a06INzGt-U&z_ptn=@RI}0P#>i&KGM+>^5LayS->5q4nN2a%{kSIz_p$)Pfn-j-;mV7K~_At7Orf2iya6XOhc5m^eEsY->82bX6{qnp -5LKrl6U0oob2gZ@hqz?^8Uh0nL+NhVJGH=s%(%xq)unvJn`rLe(y95!DJocZENdRz$06D^bSt6 -?9r#FSjAxGAkB~#E!{|R1gq)=o+75lnn@3Uc`9V>4!r;8<9)kCv3=VHU;~Hk-5iU5oXOQ857~GgG@Z* -Fs+&eO0ua;0p7d6j~yXSmw}xDziUo|*4<{YWGM? -sddb0U4{LVIM4p#d`AWyV^~QKuqL-=dUw+K@|p&;2L}2S*jKw`m1vP<==P|~CP&@BYHN2SVd@@89G7D -QHz@prt7E_@jwX6NLKBg*mI#wgQT4$i-zSVu!!AYkdc>fIozwO*sYbwY=wZRA{{-EI)kRz;T}g2u!3- -)$!t+pq=yw<$Q&kyyWs2tfLg5Z5A7%hpO$kca;$a_8SjQ(fr-4J4Hk)`mM)$9Y_kjUllBw1MsM>871q -I2aHHVNA;o3b7)!Q6T>uBW`hpPt~w1Q4BBs-QY)*jhK>83&&kQ~3!u}E#k;Ms>gXxPV%+7B^Im)o4ZP ->IhnI!OQIhSCl7s;#W}Sp1q$Y|}CrDs$0FXNX76Vab30#PCB_su@mxlKHU*u3tpJ?>+}T+r>U -$xH&_w?{UlxTA&fd1mgDCm*FAX=mwY;fi(dou9#94XHoUAGG^5y -ch_$*y$43rB-Q})M-8(Q(G(chu)23Dh8N#wDaj!Dlv0DMRQ+hy&*2tm)WXy(DmkoaFLAPc(j%On^uDx -my2nLvhC8%ywHEIypXb&&qdq+73GXz?Q2pcp9@dqI^>7~Xouzyp^CR?T4@ClmI6tagUTtPZ8kDajUfo -T>maoXB}f=BP7mwy}R-OUJwpDk|h(1EGS+dS?y!3$Gs&K -zDfo4LBp>AlEYl)=uw6tqbAE#2L^u97hEd>WLE4pPN{q0!^@N8(wCYg>7IeBO0aECP%lcJ~fg -HBz_HFKeQ>B%}~bJy=y&UMwZMrnXU^4y2m|g9bE4FTAn-P>;Qc$*Dx@wIh86v}0_7s&5NK;(Q5O(Ygo -f=+zYdVek%3_@h@6MG%5$iJkB_>u_-e@qyb(sEn~|_N1q4FjE}4j*)f@3~0D*^HAKk1drjL)5FM*uBuORZ0#*p8HGmv;zwOb#7~YBNh}A-*ZC&uv+7HlULOpq=NyD8de8`@_mWr) -P6(OFAduaLNI0#=*@G$x3KHMbnvWB0uhbAn0BiZX0sFEefw_yBm+lNmy@Bh`s=@XOnu0NC$f7f>+$Qb -NBZ`yHC1)4(nm&5`LsozvoBxGuZD#{~N~-|B>;-l?%J!9P1C*O{AULnoMUVg64>|AJi7z2v*bg4w`%Mv&B~-!UBzV@=MwH`f?Y+$s>L9QGh>Pzfby($EEu3ovM5$ -NQpBo0+!txRXqJ~r9Tw#|qc7hIJ>q -jQe&AvZB7zrupXMj&W((qL=SJzXW&eTIKu|!{z>e=y8 -EZ9J-llcu?W{W*|5XNyMU&#BT7J8(4(+w*4SYfIh+~3xF};BwoZ14p3p=|7on-+EN+MDw%&aEjlR#+W -3nnKa(C1PWf9V>6sjj{Lk4?PpU(giHIn>p4fl`iT{b|8{}=7!OdiP8fEl?)7WptwNL -TbPn~wBfg*mT1+ok#6M)wXty(ohyJ=*C^V=X&yzgykZo0T%KQXEJ ->LFtrtN#4urwp1FK#?`qz8Z*(Q(vXUw4vPNj)~l6-){ydB`cP3XV~?%!x(uuYa}oN?41dXMNpjZuGaX -w0%9N5*l#Qg#m+h!NHaA8V)6TzZ*6p9&wF2`X%B&D)sMp2jBV*$`lO$d$GP@GYvp=r$q|uSN!sk$*yJ -hAX;2E{|Fnnm=Dfl&2Nxcl!4-JXqs(s=LICueUv7+sNfo1o3jfoFE}8&jtWeE?L -BeOAsMD{8U=EmmKy()Bt)r@)t*!04&c2hZE5z{n}K0I+2Nf(L1C2v(v=L<&HqCY4hcIRr%uWua^O;1`b1ld8_(~skexgkqC8%{fa!%4sD*o6`yO~kuMs=-wZ=$ap*}m?c$~fwd$~q7BdA#xDrMgXh;-Da1nF -55Mug@k6qz&L}BV36_r#|TEjBLt_{XCz!^pX;WUbK^^boXy*PRM`Uo>ky?piN_~na}fBZwqDI*i~b-) -@mauvrx6CCZHYtm#!HY02kf2hqVBNURj189a`PBMMNv2C93Y?Y#Hi6Ryn#iU;s~fD@7P4`3=Hsi)am?4AD^;E+*${K -V0p#lDag)q+#Pjbdj-u9fo4$S7ANaI_&=@Du1A;stKN~iE@pJTPJJ;~BRdGALF8_um3O-uqu%ReqB%X -he>Qbcp8RQ?Z_?JofwpeYjxGuumSl;T(`1l30u%?K<8su@k>CKGvVggCy+#;%r*kosh=1^Y6}%7MuO^ -RJ$Ge&U!>j}R=@w}-YESk56vw)tg>`#c`?vYQo2`2}qo?)%Jd1d}?&TE^4Q -3jT2%qF27eFw3zhYKmMlz6kII7j~Ue+@HcB>N@Y*0r2^!C_SC&UckbALv$&}@c5O;R0?8r(bV(miS=B ->=kEA&52-b>ce|PRGuGUtV!ny(9Q?3e-|#&xjAA;!DoH2^i&TJUU$FcP5%Vx_mdw}8EDc^JN5p+bQ0r3awQTlKuFKD@8{$$g2d_=y5g(G1g2_CieWUIX2YxR3Ll(F&yw3%?Y*u3gKnK40+6vRvp-s+vpM* -{{Gzupjoaicza>{WpH8^P0CF9L&^%2mdykjt!7>wy>HX(a*h?zgF+^mO#O!7i!Qw+zGNykwxWmxm26xHfTXR02^EI|ylyhxUpm{u8Rmo8FhU>69isp?DLHONOcQJi~HiM -a~*Kq@|4T%mgkSK|tKVrgB3d|+5(lC>C6xa$=xc5*hmOxCn_XN}po#j|L0kI^->iT{baehEfu5t#S_q -!IEoZSSR6%4wLe!AL>!>wT~8hxaFcA?1!Tpx~KpcY&pFPwUJ?7sV#c3#0o=YXtCq_&@+khosCQKzJYr -@BI^2tv&_Mu`g5g99v*6z)?En{G5eI2t{c?IOjbOi1(mO=5j@f7q@>{^4PSqk{|NX^u1$(iWg-Y@CI8 ->eCdu^-XkR1?X+@b+^*Pnj14!osG{@VygeqF{croR490HLhRwY*AapmYF+Bfllz=;0gK)c=Xsxr&H{| -2dBk%8pjSBLA&<+?MF@w1*X(M2+)4?O{Qk_g%U85)w4Y#jn&bhNa2b9OhmTCDMHb#lU(%9|c*k4fh;O -d>JyTxY(nUowED>4K){egRM^vi&HA6{Q%|8mlLPAIRZ -BhPhy&s#!${6m}9po^t-6a`h1t@*r7C;Y0FkkN~VanC$y8PRv2fyfCR^2zZ(m6@#MQ+6!gHfSCMigCj -ecG)`ghD9uUgS~5QQtl*Ey?@iai*L`qJIfsMsVYarnEud~wf-@nV-o6y0P}8fDj+W{)_#IfldEqW;r` -}q?0QzNlQBgXR}H`zMI*^WIhu{sii5NnYXF6Fn}c(l`oT@YZ0>)3uhplvD&t}e@Ae{10B9OursrM|^t -N4v=7^3$?be~!%9#x`T}W_mrH{$dIfpFia!N!Q`{%7th -Ty|g?WXE?C#gt_CLJ4OX9`iz@zL+L9`?#q`Dg`%ta%Y#fe>vlBNj;t#HxMtudDpgQCD-#z*)=00C{`X -JKY`g0%IL3zD(o;?~YL7LuVIx%#@4Tlr_-eTiv4M)td+^?L$#MAK*>cobD@{?ubC95 -LS-w`G;)K<@p^Wa)puld?sPBa)tD^zOc2DJRi_>9v-G10hB*a!)C6^Y`pQCG*m)_tD1KIl@$dobA-Ar -{zWzG{v<>+^?WF}i0X0dFEsyX!*e%PVZK{@2ZAczw>4J6Pp^wh~(=WrRuN&matWfCq3y^eK0G9s;`D( -ZbvNRuay$B}O -9kg8kBHi&5~f?F^+Ja=Jl=5TVUuIX8L3@uTY_qvGaB4JKr^`wKoNk%=O52y`dQEgsgzJp#;`o!9-I4y -R~ZMXi+TqDi{_?@jmQPf-0COdaQr<@R!%-j44W -uVIz2FHX0gJJ!pur3j9wE+d9h!FaY$I`t~kt7d~J+>VH}8>CXm#s&n=j#N9#2U^=BBb7U1rx?&#B_AKw0S1K6jWTNX^7MZpUVC<@nSefKW)qVF8bdf&O>#xF|k -L!nP1^*;aOqm!?%%^%MFhC*23NrdO5gv^rjc)8IRJT@ -+ja?gg#H4~G^QLj5*TX#AWSpO{r^n2Z5B&Z(rAO;B>;iaUbadF%Z -s9*MS?8niO8X0dhu>k^8< -D@h5x;IhcNA8;}`!h3oH%;P)MGY;ePL0;>lK5fC#8Il%U|Pdgc3S+LXT<`nw?9!cFQR3Z#5t$z>M_gu -yak=Sh?H9>v%pCWJxrzD*;?0nM7n+$GyBznlnfPST`7No{=-DZXu0^T-P|{ogR@PS5-bK3Os -9!hg_HMbne=j`3HA{iMY_5uXgL9XxfI|LwJcZC8!q_97P<9@_3%E79Ey5N8@TTI;9*ZRw@<-HI}847t -P(^pd7mh-9mGhRoVwwZs6kjDLOqyVhlJC~3IwNq*Iie&M9gG_Hm|7|xQe5-c9HiPW(K_kSFc+OLzoL2 -(=X?D3&~dY2OimoNwBaveHF0BJerQ$Vagbi{0v?br9e?Z&PwSpMma8V6;r;Z^7!L*EaA)grHgRgUyDp -`aZghVDYhIf(~|+v=VJZg0RKmm9i2#zN`OGo|tMmKJyLEch+}FY3kpxY0otgQ;z?KZ}NI?~YGu%4>vY -@HKPbS<da680JcjJ~ -_~AdmRsrAAQ}v7HB+cXv1&WiW6vEs?KRj_zL!DYiIbGy2H82dltEV!N^j^6^bYaRySU+di<@{jloOCx -3a!SVk~EI)0cv1BSs7u+~J^PJiwh9>(F)Bje)D2E4l$1X9Un{I+Qe%w3f=`(IMNvGsE#EH%$7!zPJJb(4Gj))}Y+NOD -=uTTTa{ReTE`bdjf@a?44XdeYQ747(`ldY*OHHrCJQKs(FfekRrMtCnplCMI?=;>x2FY2p?Uy(^Bx_9%U` -|&tXV_-_{U#I=a|0Aj6YSA~9oXw0+&)6Yb+ox-<#Al`Oza;TT41M(fLFAJPg359;rybPGyWZ+D802kzoSma&Snd#5-SbiOug^0_MM(Z@7A!GyNQy|h|JZgFSuO -(I`f<8)zHO}Jf~>psA?9%OMz`=s+QNQxvL0$rWGmUGMB$Ti9fA>OEq+jq}4?*qDemL3Znmj48TvH9Ke -ru(>j^E202CysZaXMJMic1Meki;>Ac9mN(}^C$q|Fru<5fsaj6;0n69;3CcsLotzPY(;!nI87sMjxfTK!QK9oKcgs&#QMDZn&g5T -ctQURDH;S>%=Sc-t5&~mR$c`#b+<9_cz_1@Iz}dxWO8K#%JnYjn#`r%dPEt`8e*R$uS7~5EGyBy$+(0 -vFS-CcCNM8k9^`19N&@$bc2WI8^pss~Or2e%s1`#hPCFP@gM!T#8swC=g)k$w9#!h06g}LiQ^`j5 -;3}bI{=)ZJm{OiplZ#vO77Q6O_{#?hF`7UQV&*FQlL$2y4`j)I=bUB^Fmi|<6LUpjSpNPrwXUA{T7P; -o_a4fI0UI12Cfcl-Ew|?&vrFdlD=|*oZHflmAmG|CgJ}}p6QO6vBtt1h~E`~b2uH;ikaX3)N6&;D^^^ --*pLgu_1f(o4r?^^dz>4LS{vS&JjmLKbWoFVn0IzE@b1SB$=orM99Bb|w`YLF&oP9IO -D;Uof!SRD@3xFryC$#BotGzk{EP3jY9y5nXH(-Xfd_ye$&W-HyW;CWqLi$luv2d^JgB8`bBwjzc#g?0 -cz>>99oVmFu3RK4|1ILf`d1J;r=3>fgOfw -2qF=9+jPYQj#n6lxgn``$-4<^(HRBjDtYBZumE_HDMV_hnJce~{ru2cv%e=VG_oE=mGK=!kXMKRWha -FqIFn7WfbPk>U#P_0Fq-LM|(w}|Qc)MNcoJJIntYd!nqc5S$&u}H9b*(Oo(Aro!jH54r6bMzw -+AeiI%$L(NT_e2+|zM3SqZcK{4c0XJ9COdn)vX-C&q*f_PMs^KVvY4SF7PA(a~-}j^NIL$o#uf+BGM< -Md7oKI&|FLU454d_N%;Ng?i1OO@>T5gQ)c2a}X6@k2yo~r?Hf_hp{}+@vSkRHZ0bjmCffG*FHLqn}|< -IxlP^re^5&U1QY-O00;mj6qruVcj`1~0001l0000T0001RX>c!JX>N37a&BR4FJo+JFJE72ZfSI1UoL -QYC5$l+10f6qdtR|3MIMxVzz61Hov{)4iu^uEX=g^0bAH{&pmNd4C~iSwVkbxy-Y{f5*XF&GRj3$4EO -<65jLAyDb?eG0=bX|5?~g1r(SK(lZhQ4bbzU$JNFP1}>pr^ITY04)P)h>@6aWAK2mmD%m`?EJz?)hJ0 -06@m001KZ003}la4%nJZggdGZeeUMV{B0e;tvUD+nb7B&GEe6TCK-<0YtSMXevp0~Y}2!kf2@ -P)YXp&DT$N(JGZq#Z;Uu-_BRP1PFlN@tM#^l!{h~o(cH$YnH7L6rftzC6`9e6?tpa(ql;*MLySSdb}2 -bi!sqCn&`JZsA&4K+^bI(Dx6FJ4pQqOFd_NMXduncdDSmkCi^ESD-Yz1{jDqcd>ojk(9@{<}}x#I_2KW%M?d(?Kkt=1W;=qne1ibE>~#zJ(K5o(QQB9IVI(7;|`(NR@YDWbn1^ghjOq4tE8QH);5M234luJC1PD3O -&@`_6KZYpd83LzBRzkR4J}$f@zwqz>3RAG!+TDOMQyY0>Sp>D{ -;6+ppJmciHdPUv9@SfVmmuhUR}zkyX6jW^gCTYx4qfRw(^u938h+*~rFL;Y>@{h1kl(^YIn#MzF&Y-a -=C$=o90ugu>P}zhShaC!)9H;;CR&@leq-l0jKxC)CN&ZavW=N`OqYW5*yd`z@reDUaUcFzG4E^YW9>n360J`v -i&cKsT!~<<%X7^#je$K%_H7L@BV>Z;0T+pE_Vn%*W{Q9=T$*}fKQ|*S&%*r5~v?2>T!SxM245kPP)Ir -aWk{oud+(9e%Z_6~bZsiDjpuV?ykL$HB=kHdycTcabrsvh)8}xdCO9m4RX?9bLr?iq`gMnMO?tg6$<1 -EI#3CxCku4zf7gf4C3myxa^=I5A3kdaQ68`}!rHZmysj;qcyH5o1vbEDWr&9od`?;0xD+b=W%A#7m^j -4&IPTl%^A7chDK=)8UJJ?+%Z@K`5XnGBJSTB5Lqs6X!WHpCLZrJ#&Mz3<2Uf!Fo4`Tq^c9gmWUX*@YG -!wcE4V9z1}~`w5OgI;eTxAMh-L`bu7+L!b9T9l8X_J&2yA5z<$=qvfNSZ;qk!Gv_rZ&qKh%>5e_7A$U -*T;SAl#hiA=qtIL(_9f~g&v|q@J=M{3vYsKo8hMR)UJ0*}x6W8Xv8S;vAD6~K5iO`5qzCq{F)IC)Y27 -!1K^(h|Z7`${P#1Z0)2PA|Z{{i^uyg&9`Il3m(uH<<$as=st_GP>eEzd6Pu9QAsY9xruAk#6J)R~#1C -$gNN+qME|bbq3?4SN)wE3DoUOcz|m7?bC}5RNCB1C!M3YFeo$YRKY}cp6r&d2MP&2O7%cfp%Yn*1_Zf -TaFe_Y#fJz(N1gsv4j#97TyP7ubPTNVM=a7KoE>K`ZyIj<*LoSKh5-f`~8B;6qmF~;MmiAH!=@8uHMY -zLE?Yh>2n`92A{=rI@qHmwBiL00!T%PorJ~6SG3h7_kIMbpz1K)>y_b4F41wD879jo^>K -MZ%P~j&;;vWaP5Qh1s8$t73fJq&6o3_};$<-!S-8C1YzvWUP1LWougJO8&(1>J3Oo6%d<^ribWDMO7`6w9J_Fxtv{Io?p($#pT)i#re%u^7>}+_B1(NTqgF( -)y>Jt+0_;BUjDp1|7B^{HS+t#<@L?0w`a@u$@2U&2eN<66mH2ah?qcLC -F*EF+MGjry1CPWFESro9x91aVR?9zo`cf73S>ze1;DHmp0)43`506r`?FEaM25gHDgZrB@K6d~xmOsO -Zfs0(1VNovGM?zm7j%~^35LKf^_XqHlmI#s3UZQTl-091m=3Cp;mtDMb-k8<#x1N%WH8jk18G0@hB*f -key#|jm+Q}D=K#u=*wGn;hiZi!`w(X87!l-HvC$cihKfuFxMkL;mIrs^tjPJ58vj?2{7&xWa_66Iz_3 -Ur8^|C=QhRofW^m5iqF5TeX|DKev?TI2^bWEg;8nGQuxN4!ezm_UO~(k%n0KZvUKRcEX3e!KWBIr-`A -jPxG3|_IWQPP}qV4{bkEoeu68 -9z@5#&**K)j)>y8X8jX?!4KN{d@?l~fb8S$>PU)>)i;|?EJBa7g(P*SIfOF`mT>Z{cH8u -J`Ai!Ui1ta7cYK9#*8ud5BSfE)7k}5nG>=V)Pd?rQzdxE){7kg)lVgGmV*O+01E5{Q^T~5bp34b&P9kUR(R60eP -*2ky+S+9Xza;G0+jpOLi{;uzG@OS -Rn7zXG5X?*M$6Mt=U}X5Ng}spoo58LM{GtWsw8U5rTtAdPLF# -kjF($z+vwO~qcCguZaB^m~Yh;}x_z651YL*lrAw#9~#j3^yX;UWnMhzy|Aapm&ggWk-v{ru%8J(~9#x)zz0Mo0hx6r0 -=FfW1-e9f`m3G&iV$zhiGq|2~{5Ae12C_|j=Gg1l%7G~(+=45DD?irA6z8*SH3*ehc=zw%whBMBfB`Z -I17L*;SDPwi9q1c)Yj?#h_nU@ -tmvuP=+>`ci3yjtzbLKi@zii#Kmq-ZKFQure!(cWhg>{Nx)H8r38VA#C%P`PL)2Sl|GzIo9g|R2^RZ_ -sYPsk&a5%=qFI4zkaZ3uXLl@5ih8%wm4?@o_)gT2pZnZ=Q-dQ<%e)lxjt%Gq9}KMw+34o1frW)&L -Xd%YRml<;C*emFk5C3A4}uV>_&sqbBFmo^Lo0`l_v_$9gLd5* -eA=NJ#^K|K!!58h;{>25~FH66v@#p46w;RghC!>hQ`C^#xJMUswQ(G-OppBQ@Mkkcr~q;*xDX_b@bH}tpu4KAa&SMbmYLkJ`Uhc$(L@+hdjqVo(=7 -&u^U}FcEi{8`RVyFxrUuXs{wr*>IZg*;|O#M9E`OkOlmrnA3FHvbI)Pd5WfYJ)}MeHRD#gJasldqU)w -Uz4Don?evK^-v~VRTVh!E3Y&tEX%VVj>uMksBhZK8Zrk}ZdOKFApFu7P62~glgLRujVD9HAFNS-fhPbblW9lfQqMz -+l(|~AU@XHBQ0#Yb(*1L3;UmKY2dXM?Ag)C6B{8Gw@UR)f6+HJz_0JWGqzHg|{hEc!*s9({lQTCDCzx -k&YJ+YwnIUzZdgj-n?uMO?yoW~n{T)Ps5qfA&-WkGA|0gyW+)ej(;7L+Wo=d~-vx<3W5Z;eKulJZQ2x -dY%Q`NQ)!ZWmM;DNag(}GP=daxxGgc;EzwSrs*l_oyKgi@41u|SIVrT8dg4_e=;!M0KKW1L$sOBONju -|m}Hg93EPieba>9F!tnN&UBWAbfiE`sT->uQhjTvANa*bwvXfPuB9!Y`-e0$QC%!7Imc_F@^Jr3De-E -7#H#!)8t;)=abKC9#980L?02lg?k!9?>?^qfGmPp%;yCw<-LFX5iAO!k1o;ju-LHi9Quem(~j=*$Pp7nQ%Gc7;+0x5xb4AC-z$SaBHt -4FsqMs72ls3uuu0W58|VS6E~)yZKE0znN8WwM3Fv<4F70g5jM@E>XRvZ`8V){m^S-abkKLGb2Q}EYv; -Kr=SWXOAu$*;L54VG#!4X6jyy4d~>u2O@TPs~oYc<;&$6cA#J*~RfBQ1P19n50vt#@-b)w%C-*HkVC9 -vkF;U|qn|9fLYOYezU`RpWtoZ&&diE$aQAwWE{X)mlh5-UsWdnYZF7H8YsUi8TH;Akw)>eDJf@m*QPP -90mW@{82*9F%Jn1hw2AE`aa5Aaa2GdkE7q?rD$UANqzKY*5BTnK0&{s5m_9^!)ro(-DdB$Ea-Tuu6eGvp+=p4Ne>w3qYsrFHJRQEh}rSHpIPr^ -|Jrfhw6#*231tzU7#&RqJQj|h0ptjYv0=m2H-VnR5UIX2;F)iTuCaAr+)?kv^{Hh(Z8TC1El*4eR;dF -OkuZ*Y5xxx_mcH~@&$C`$;|(=}eGb=IPm*3{QDJV1@1h4>P5G&&EzDKgY4Jf4xI?WXK?w>v(!kU(G!C ->&~}q+->#FTZOr+NB}*0WCg|S)Z!S|5lUDY{9-}^Ow}>kix1REdKu~ITRSWe*SqP!y|!U;PgQv2ecao -e(>ZzW9)D^dbaiAg#~+ILppYL)TA7YDP77^t8_*bbVVI1e$hhcN?#>*`m9Hi$oxP;@@9FuRM$DMQ;j$ -N*n64rs!S1@7+-HC)VG+;uVERiKL={zVWsLp2g+4Sz421_#edv5V$U&q0)gwnUvKBWYxzHWLI}2IB3bc*ihXw@?P~Y6fd2qcO9KQH0000803{TdPU -1+jZM_))00mtD03QGV0B~t=FJEbHbY*gGVQepBY-ulJZDen7bZKvHb1ras-8^e=%Cf?!ZDWu<1K -D4Vp%Ya#QQSX4z@)`P+AQi-xk^CT@ZC6=mEBCSPJh?$zFxw3tVJW*pYZ5#2IylDO+(!6eD-lVcoqFJi -dV38G5nPuxpe1LA1l68@bsY>$&yqApy^q4kFArt&@8p^U%`79KP%;A4ktpz}B)L^QbN2PL6%Bog%B+9 -hZ-^D`Zs*;(7*F2^P;G8$A%5nTLO|M=SZ8popW>Cr+v1h=MxGexFkwDM1ZdBet^DJ|agCFxE%Zf+98V -E5{b-Ku-!5{!K&Z}Z2;&|RRZKdK^q^q*18X>23k+qGA`S)O;pEv5Md8}kMu!w)wX*YWw;`P+;5_2u_GZEcyrOIa_K#r5X)`osG-@!PYTw--0NJ2mSPWmk84_w&`yF--6LKjP~j-oL -+m|7Lg3HZ{GzJ-d!?f4+iY2I+hYjFW+Ye+0-M?kop6J_pH^(+t$^b(%DWkHCD}sV@NB;tC&CWAUTRT2 -*(geO!|)ji__gaXp`>3m3*x+h -7vKz5oj59JgXKpgA%&I34(F)($*(Yk#5IhIPErC0D>oIsPy=#n~{evG!UmE{Pj0(aUy>GEz}}9bZ6-_ -HVPii!E6je5k|ihX+DIPQC((fGaQY$xi?P&!h~JPdrMa`$V2)Z>kgWtFHktti5Q|7+<}D{qkMcEZ(-O --Ouq5--Q$P?yOnn|q86f<{-TnG8qnZEOeO+sX1fB9(U7&A!MJR`|jLJ2*MaMsZ8yE0KYsv`_O -Rmhz6M??mQxoeW3(=M{^nY$YZw}ns=|FGChz|IBQMV;XG)M#xNVZvnO?m{ceSJ#j{s0(O;IunF`L9n6 -7@iw4Vxb!3|1ckQoiy9vm28@7=)o8Z&{5(AHOIaP_by-_>Q=#61k6tNiD9>S^wCU0=Ih}~f@U%@V+K2 -NP%;k8&Yx1^*)}Ffi15qMKE{6`O9~oJl!+E}tC$!9j67|@XeO={7^gIGl+9{NBP$@_>31@#cWMfTJsaBb9Y -#Q?@~HhY1B2%{m0$7I5dP{cXn1s2SFb -?6f)1~mqWLFu~NP^5C*ETPGR0+$JXXY;+D@#Y&jO*bEcf6vqkf?W#Q_&wNE`b#3Xj*C2713F&tH3Srg -qp|okJOOH+guk(r)-;uw!pL30xkCN=;VZVcXw^8V%28xlN;?SW*qC@=B?Vr+MmftEU!olBNe9fqQ -86pwjU$XTsp3&c`51h2&k#DxY)iWT6XG^Dy{t3*-zDuo4(T_WL=NnNTWou`S`GgvOvsAOvrG61H5ELs -p52(7Ho#1I))BREzGNP>Znj78Zh3bbh1Nm3kd2dm*rSRar|Np&WZyqLiBG%Kd$%QOU(h6zi?DT$kH(}QJ*MZma2$5{p`h -5*tT0$I|7a+0Gf8byI?&oqBLy|?f8G0v4-?gs|3I`M`)#5h9h90Df<)>7!ac1&9Z%gj_*X*8y;%`*k- -+h7xvHsr|Ghg6Et7^%>2i)Q>q_iymRf_~vWA1qZ?#-QPP1=lZO%h6kTU<%M#NQ6b43`(Gxw$q-)2lx6kQ`BLWty?u8MBj@sdVYJ2I8B -Pan@Yg*KMr6ZhZ#C2N_XaAW&H!0e@>0$c0E6H!t2L*fw_fWJ=**1|~k^-k^v$TQtoTS36*OcNl;D3o$ ->MPNt5M4&$5!1^HaH<&?hQ0GcD@o0~shPgdWkqlU>wyX_4}rnlBF!~8MnbhW*^l>+mM_@0&ll&}PTU> -4Vn#%wtEaR%&c=YmQjE3-%YQPK)Y8MzeR8bibk>Arh%EavWT*@DLl!47Oo|G)RTlY-^09^Z>FgR4P-A -g%ef{B@L7iV;-d>)ceGjqAVgc=3I28WZqbNMy5S3N2KoNrU*MQP%Vm)!hSU6`KF -z>C4{gpZ!n_2m_I-kfR&e?>zaihcrU7vMWX85hkQ%)48pwPXiobT<{#$2#HpUfy72!uQ)B~T0&-Ay^C -(sZ$alpAj3tYa^m&rWMl=%hWC%<%@UiW(i>t}F4rvU_~%fQv_D|moYmcrOiPST^`K!0#WN13KH2eIAn -d0qo6AbzUvX>CUx9HT|Q`$o%s_^1015P+xkVaa`3_eIt|VOfQEv4>e0dbU&xo)kPHgb=ulr?~G91{lWy3suieSKlTYcYU5UJ1O>wn67iM@RlO?V>a>W -aJ-l7q*Y1FE0+z>V}N@I0~?HGjX$0!Z9E%pl^M#J2S4Y(erd*~@iSgXXNi{FgtGKa-ypE6&#qzP|uB? -64Ci{xJMln~9$$-;18snOaVGu`?=En^*DVPILqkA-^LuX|^L8?kL8?*U&ClyE^AV&RL4`(i@fJ)-Qu< -5N_@-@rOz?v#N7k6y!QY!8P0?2?lbrx!Yb$WJ=+|H63K$0hAM;wEKQDLGp+{LbJ{COqJT2MoJ>3)8_v -$9cQOap6DXyzaspWiiE%NBo%LhYUZu@R??J&a>W5YWKnl?*<~QsIRrK@oS#8+%oa{q`$fhhV|$%ZIb0 -!4AT)MYT(=BC@t~tbR?5|+`|~k(UeTo*ko=7iK-5%B{uQI%6ZV2Av;CH+B2!viDk6g)xg60OibH+mZ{ -@xNRp)>!tpT(Q_C%QcMuM!0H!;SozTtA_ktk{gp9cWm>tA#0uwkHcnt^vDA6oAO^OD`HLYcpJ|I2r6( -!&3y#ooI&(*~{!CAZGXhl1*aa(2kDV4IRrPdQ@%|FX^nes1(b{1lv(LY>&-y&=n=J#1+VHFLeHoPQr>r+DvDSwj{#Xao}HDUrQfqXW}()_+=3Su@8Z2FNQ1xXEphzZ1VeQG$Fvyyk%Y=}}f%5 -$Z~N}MmLEJT-c&@ePjplYRY3b|M|tBg$L80A3M8PPI?X|_d_WR)yo)m=w|V6xT{Na%&2PF}vGk+9k+1 -cB;Qx}Ogh0S$@_qcII=6Zt!~030yz)D=Hu4M<9jxyxk%3*Kik2gF;0nIM>;$C$t!qYgHB6EJUrO+Ex~ -Kiu5DKYMo(9HZs$WOdJ_RyYvtuJFKPp&k^{qi7dPkv3vh0EI9)zLXD2Jje{pWS_1`%zQ20-rio_^oiz -dcRXL96Bg(W)`mbk!~AZEMzQLPba-wCFljBbdxN60NRepn&JMzeoXy{myqd0~aI;4%K!b_^O$yQ_o*U -OcpL&&-B}QNyk9xpUH16)qQG4!Zj>n+qhrF>Yk~`}e~KU97>nu)pYu#QZE@Q=1?N-r#nr=oJKT{aIw -{BzpBd{%{d;$!J%+l(?RYA*SMOU|XgKe`6|>qu#r!=}dVnwWN=YN;+GJLMvgkv8P*!qU-y5w4t6}MMb -1hUbV>ISUn|K3sdSeUL$OVi|pK-XBh06r=Gbn1aTVtKO~7e{cVKuNYcs1Arst_${nRJ^k=lsW(Q7PLN -L~`ln)#pn;;5nM5YkSJE4+!bh;tmW6mH1z?dzel|RNtwx_Ul1-fQJFCieFJ!gMrOZ#94xs<+afDA6(b5CAOaF5=eA2J@m$cOEs_?=84z5aMN`o1)fl-HsGz?H4>Kr()v8X ->IESj=SXWTpM4`r)`G)T@;bl96=N -sk6yIuD)IlK>^fyQe~k2c>iUPsuddhnzbd~y^!|MLy)pudO?r7Ff~GafFL2|NF585*C!~F7yM)%3Djn -D`)6M)nGyh>1l=d6<6Q&%Z1|Km0fwG~CVY{L`rrRq6=o>G=CrlFD3P4wHHK*TIn^P9GUc-_UrhC+;?Z -7YJJVX$$#Lg#+2WNvg+ulB#L^?t0QO7M7G?RIyzkEY^5GoDlnlxOoH!MHC5e-ZP%0%=^5Lanlbg;Ea1 -ib^3`b$qQ0@G@!q6LJ&Uxp*I60;Z}8^MSqOVUKIH;+`Qhnjf{=AOsUU?YK}dgyrl^{8L{O%E%xy70z6 -Ryh1p$pgaSH}-Sn+g@4W*wOKi6b^qLul(QNKx{??D@$B<{j$c-1iyPg(D;RE8SWJ(BR@N3vxkZmBk== -F3G^gHxd63J)V?W9}qmd8eQvRhy69ffm>+I)xN%+WLLFWwd{si$1)JZEnLg1>ezs5cl^X~Yy{QIsd -}Sq$*FD>p1K0z>;+h<2(AdCD6$!R_CjY-0I`7ZkMP+KngZ*$6NrQqCOr-m8c{n;n|KvPws)^mws#=Z6 -ZW8Mt_xsr+N|mbPRwK@F%$9%a~4OHxR}MBMJG0asJjB*zWOzphpVbcu-r>>D@@irq%$?6)CwZUwUmYo -M##8qobrQMoYx(Ei$0iiA!Bj~j*H6+I-$aN$ZFA2!7%9&xE!<$eC))71EXV|5Fm{8-Y}4clyJ#8?!Um -)L1Pl8wGQzxtxk1V6zkg2Ag&f~i$?__WNJnli<0)c5ZF!(G7dyMKVGGag~GZ}GCNb;Yt~Si=J%?E6$lppsk;Ng~v|9!`1PmOG@>cuGxHUtnOd&1=d&@k0U+F`vw>ykc&bfF$kla{a+<&kB74m@nw` -hG5kMCo9T#)RB&kQV`lG!)l&#=sUmB7bHYRwZd21S93ZM|uMQiv{{j+FPw9uWvG}>Z(Q&Dn<)yphpYJ -ktMC{HfM@_{RK~LfDCcoi07o)T8P`K)prmKL6!5d=D)itUcNjufk03d(%@BI -okmj6#!%*bN(TNq-(Lp(pc^)THL-QG|X+8 -=UPC^~jRPxDX%+8Pr(AUA?yFB~?G-vqkP4{=Q}f`RUi5EtpAo+K3l20D;~Wl{`s1ej8+8ypkt^4%jq% -QM~TQQAq)i>gn8Zp8>Jp8_gty=>M=ZJgBxHe07)0cl1D-Z+8aBa2*ts@YB%7|fP+=9rQ0V9hNC2Zp!9 -I%8Ten`4`jw=TXn;)nk}EjH&XTbRWkkZO<6d%PiR4kLC;n;!!@n$iV<-ot%1wHw>BrCtAHgQQ-vDMYr -hefvAflr^7Q56ioDZipGGK4EP7EmI4btUdnV1^Re-v-_|XtwN_Ox@$9yl-U6`~&zK0=EkoAgEQrgrlI&xC`j4P{R3}whHu -dStwys`Mty35VBbU`_d`V*ksGUg#MvSZWN-Acu`(RrY{1u2%?jG0E2G -8M<>wl{iv+)BZ}ZRUU=cz3dRa^QpconoMCg&ex=lLb!(XqR5iO(bdLM9ap}>q82#k2t)H&3@-%kB4f@ -&2ayy>|$9RI7E(V-)EzEnN!INrl2A42TW_OD$o^k>;rYBXC%H|8%SQpJixmLs0cG5$y7DqJX74}|CN^e1?@jMWx -yRK)WP3bav&YGBz)e9yLhFlg^KZB#Xqsa3@ZkyG}o+IVEIMssz7Fo;$)UC6xOZl^U1n$9-nbmG&866= -;#g`HOgMlb#_xuR3ap*u!x*{%P{8l!!*7@vWvmDy#>zw`WvvG-}clwW@RuP1Vv%oOlF6rXK}q?tW36k{?LRKM! -oueoy;8WF-7dsm=TtC}?KGfu*MR_`8vXr&Dmf)C((Gb}G@Lj_0gYpDsO6e&I?HkChO2ixD5LPA%ueGO!j -UnqqqqFV9!bRO9$eGI8uAJLh*gk-lb3w*z%^oy~y)dCOlo*c_Knx6QDsFBHN(!M07Xb(d|-Qs=~X -Sse8P6w^8>_-&Wy0@NdtfJ6XD)S+VGTn7bvsY{}Ew9hz=2=pN|f``v>b=ij>q-obDOkaN(=DWp`D`>Q -)l?ABW9jT>(o^wg;y*cEm8o$wYPe)4hfTPGU+jkD&c?+$kRhii{ux;;SZ(#Shm+GEhnC1-bX@G#>415 -ir?1QY-O00;mj6qrtQDQyFr1ONcK3jhEh0001RX>c!JX>N37a&BR4FJo+JFKuCIZeMU=a&u*JE^v8`R -&8(FHW2=p- -W&q5oiTE<3M!DMTNZh2iCY8f;SO{qGIn&uhBVu&8}(+Kc)soJBg{&a@#ojivRUCHSXzlkI7Yir(!x_h -m3!!0_?qwK7I)iii!v-BQzSt$=The}vxWFu>?SrGZ%9#>il^Nf4(a1g`cLV(M`{*~5BpR?$#tWD8Ka| -jj`r_-u>UfVu))Gn|8$H(^{+2xy8mv7l$AFi*ju7Ag-9nWlU+*zI1rH7lot3?j)q_I&HF~;kfF}Q$je -9(eh!3Y#=XiJYNbreXa_$u=GH47+GUXGs}5N{qoWghWxq{=ZYt7TI`ez(5I6#>xyJ#An()+FO*YOqRe3rdTsR$> -+)DL_fjdcJt%T$BR7Buz3zLm1u?LH3X_5Deh5E4dyYCP|@%^;aklrt@eV_hOnDS+z=w;Axn!z*bP>ywViYNR+}Hv~+pQ8EqmgbiE+3bU4M#js`wS -cJM7eR_h;rHrN%{6q&=P%tfI$z%-wD-z~tm@QGuW3_zOg`{E2k9VK1 -=0fB-O&hn92IJ}Kr$-47BUT9-@L&Rgd({>8|>kFZDk`=Z!dmIa!4fJ`j{WRuGc-Dmfo(euW -pp8O|lEt0r5Vur6csTn}=bP3#t4c=O>=?$pf~?LuY8dtF`NV=+b)aN8YXRb~|wv7-2IK2+@SGC1zdRY -iUKg`(<7)fe4lZzB$RKe| -uSGkFGZKEEO(zT`JB@NaKLXthQ$*kcQ8Xo^1@>T`NfZ(u<&^m}`opKvluXqNGjhzyr&Ahy_+;qUn9A` -@-x3jyZXsTom`Ep>>_!V}It7_xdOrp4I)PM?H2iTd;8FF^2;SP!mouBi)?8xk=O1Qi0&DOrg&wo%I>C -Xa%DLgamv~q8_N0_!6`jsd#qDOd*e@VzUrviMH95M1iE%>jwGXJHv-WO4`R=jUch8;c(vb8#>G7@^4fzB3jKwLs}{olSDDywaevlv6G@E -dA{p(Ct02oUbjMOLbpm(oo2axUM$>tCH8yX?END!H4Oc;Iw}8EvwMA%w6!OcT(j5SYTpZ4Qw_XQZ}IFyQ!+Tbj9#xc3j!Z->}%5EZqDS(iUF@XCbt5@-~i-g=jriV@5Bt_!R#;D4 -q}2gT<3YJShZV|AE?|b_~(b)BYtxS;pfcqY=z>+igl+n*)l>azHeAbj$9vlZkag=PE;BAsgT@6WzWkp -zfNj;pCi}Yb4_l*W6NVWqXsw*v#LI0 -EE4Rxo237=Tb+RG&Hp}OC+Q&6X$X{NlpA+~3e}eNK*cKkRCiNYayINoNOwbpsy)?WAaWEA8_s>=|N+7 -yxdJfbSk^wwhK~fX3^QFZdNN7`%nrR9rscg}++2FR?5pM{A0#q^Fo~nbZC2L5FW{=-iYr?YqhNQ{)4n -;dZx5|OOBYsYyjX%q*DFD%K#8T9Kd0#S93!6P+zmz!)p -b)ljLjj1(|Qi3k9lx!LF*H+%#H>iU -{akAwAIo>=CLRyo?=)UZx7_wlv4u?jxa|)RZ^LD2DM<(JiacDsQmXHKj@-5>_ep$fmc09Pz$0qD0L|D -T=;I9#Bv0B%D^>-OxuIU6bgDL8$&^mVt7B-e1 -Vfl2#h2b)eyD7iqg@Uy7@thj}#347A=5v5#>hPf^jDwuD98jH$Z~O49(6*%0sJ82~r`uP*Ps+%?R!Fq -++Pw%wh1jrU*x~G3sC1?tAzn0Jcw=^Fs;#)T(RVYh1k10@($?sn;{a~Iv?UABfNqL7u{&9fX2!A>}9Q4CtS~>xs)&dJg*nJB*fz=(})@#7A(1LuO#U=C0Y^&73Jp~o4RUb!8i5gldoS?d1j{^kXFdc5!TCYCvh`e(kI)!mF9$?fZgujkRao#czc?w@Phj20# -O*z4-4R-Qm{P)3P%sEa#2X%}?xpBj$DNn=k4+n3%@1ZT6fR=9|AM;-Kt4+L9Hz&96v@JFXU_1ohL&Y~ -_B@L3Z5-07tQBF&n;~#$%BW(Nrs%~i+tt6eQnWyS>aF9rVHo8Qe#SDf4Sr#$t_R>i_=c4Ld{0f^ -74xl^fLaRuV`4^LjJnGNu(rCR07fB}YNLXhd;5WH!}Z;u!CPXOgPvG@d4@A75r154ni?zj{Uj*-wH0ef<~g?E2!DmK=_fga3jUz)H4lPf!4a&_1mYba{`rSi&yDwO)# -}fY&sm*;14t78jAJ78i(dqIvG)qGxilT#BU6QghgJBc}2!59U6@W_&4b%yP8amuh;h>F|2tt;CwaYx> -lXJ~#HO|+w*iEKNDYTNpyn;H`HI5qr%-Mh&$Q3@DZZlwa1PhXv%pQ%sdAYB|mR1lXy?+55Z6J_0%V07 -+BcB9-4Qx-YO2E0$#7e%~!Ku*QZ9WGvRt(y}LEn(`2Buw84NO#HRf**J9#ss_!8@}rAl6)&wbKZIpAo -)qObf1CeIh0tR73%d5j!EgnL**^8Vy?Aw%ezZxA<9pK=u>oqbCqDCKyLtC(53TZPy5rE!VT`0v#vsSC -bWle7xz{B91T1!{m%9#63%gtd?*(xmb;@;0UK~nA#@nh6_G++wT;ul8!r3fh -&gV~=}!rTq;Xu#2{={cWMuL?gLIrjKI^^*#EtVyfcz|4=zE2^sI);x%ndKnxJui1iJ_vwOV=?n@>bwm -=*L=D48|!|;8b@2`U=AhH7=kGQ?w%9Vnfpo3$aPb6q}`54Y#n?6R)9e)g6{~ynkyecJC!7c;(HqAZsD -NocxzVwKR3o!NDmGM8-K@k(ubz0j@a%w9L>uI;tGTN)}m+5_IZUyvuy5R!(X_a(Ln&}bn!L;Q84xt*w)Vn{PLHctL$ -2-H8w4Prhs1ybgnFcn?q>+dK+poe0DQv-ULfEYF)Q3fL^dt~PEQbRIvC(*zTgbEd9+W~Gyza0S*~Tr@ -UqoD?GSh1VgNTywuXJgAb#e4@F-8PK9Ww{L{}{O63kHwBsAvfS!1Awhf^Fn1c}W*O`=BaO -whGke?%*!AuEoYo<6?~G6Zi^pc*bL^YByF_1!pKv-FX>6SIS$_I5>z0;(IClXIL~ZplUVXJ~H+ddEd4GIpF@BVt05_`BE9x)cbU3~BFM -3xg5F9FMATAFELcS6MgD>2$Q4i$%rcVg;gBWAawh%b#~nC=%ZUzrlfC}_6I?6r7mdeH!Q|6j4EA~#*l -B;eL66dGk2ZG23${{c`-0|XQR000O8B@~!W+pKr?eEbYEXCaCwbYO>f&U488kT2)<4ArI+p|WI1GSY0=e;@VbuLYQW -a3qTFnS3Ob#bS{>(&CNoffQ00$^;X8LOCZ5YtU5JRFpbdpkJkAP4c{IO{*Z!39B2a456=D^437^_lfs -Ibe1z=KncpT$YU1`2g9U@@J(mgc&Gp1MaA~5qGO7IaSlrp2)Ew6RSYVE2AI2ib}V_Bk5npp -OTD4*An=BI+EhHH_=boEker0rd6d@g?8f-E2PR-<}^H?jJrS39HVSuM>igV;wWtDz3=Wse#^O5-w-iE -7g#PxCgW4V~zRbQk9^{nrt1_SjLsJO=iIxr&>Fo9Qb~nxCdgRSKS`35P?0^DT(@|l80e)tf^z+ -&T1b6`@hW{`z)MXu)(A?nj8(H=SVdamNlqy-EvBP0dj&fJ?4CgD3GGwVB{NWK3^lj3u@m%il*wumbm| -CzYdA|a!e-98Onnemg;BhD!Kv0xmq5@{o@~BkdB#7BSq{}>HRDwEDOg-D-e#Z{p{ZS>xa=)Vu|mxr!(r*ZwCAhi}!2^?-sHBuuD5PcrTza@6aWAK2mmD%m`;7SnRnv>005Q+0018 -V003}la4%nJZggdGZeeUMV{dJ3VQyq|FJowBV{0yOd972yYTPgoz3VH6g|IdllU@rwzL1L$Q4v;hgBx`bbo$}{J_0z4xj4aqB7n#rPTYYlA -q=3$Tw#v)FGMM&H=7wzI_EL?H`RL!s-vL{LN+AuR8-|MZV|J{`}k7_v@6aWAK2mmD%m`?f@3If#w0040d001Na003}la4%nJZggdGZeeUMV{dJ3VQyq| -FJo_QaBO9CX>V>WaCxm(+iu%95PjEI47?5`W-Vd!YQPU^>IH&r*M^hDqG$p_ktl~--AYnP?ZE%OLsGJ -CZhArWB8oF}X6DRr#6%PsP?}V#5{y#dSy>1L;e#yFN-=7`9jD%xJJ~E1`=XvjSUOIkF-l$rl;?_xJWP -Wq<-tQJ8I6i83-h?ay|SODOe)1w8Dv~Wjq;W$T8d)pIBza*mh@`%e*JEFd%gM_7BHDioZmD8oO$w*r7 -4kszRHv-UgRKEC=^N}!AnKtE1C?W(O^ysPj9X^*X!FGbo1f>J}##6=+2E(s2_@mw8inrQSx$J=|{tEm -g{#P79LDJ^GW|*ZQkB2CexSp>*M+TVFGt|J=?)!w6C=KV%o01VYI$p)60KuR}Fp3#RW_+fIu7Y;kc^v -Vc-`Kvm~ri1^%DIT#-m!79x!uk}|U_?MEafRUR3OAwrjP*b7xMEMWSjLj`#CkxY56>r9 -}7J2J5y=AB|73)Q0r%T>s82|fqkAAlaM9OOg6CV1Wy%#If^p2Au!%a}umUZ*KI -Gj3*d9+pn0O}`Bopkc6V*64juWM!lzNQSMXLvzSHH=;QNIM7H6;_!Oh8q@1A|Jk7?PshZtEX370$zq; -p}l+k!$v4g(hOBMI-draIH1p<^_&;!9G_U-%l)mLZn+!F~`X9ykk4@oGVH_$&{FRHw5d#jACs~fn}_;^0oIC-#l)gv24QY2=3%kgA^$)Y>4&4zCJ@i -im(#CEcCe=w?b#MU9eO+czeB01_l7q?^ybfO9KQH0000803{TdP8q- -EpY8|%08}3U04D$d0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WV{dL|X=inEVRUJ4ZZ2?ny%}9^qe$}IzoL -)P$gsj_viEe>a?)dN0T4wiZ!IDcD -uaXO>+6S;`)iV>zY*=<$N;Pvg$zUypEE*Y$z+!BFc(9TBn>QS#>z1<%TGQt3PJLEjm@H^ThV2|Bof)=BU#M*QbEZvHCev*{ -wfhI{XnM|@G<=j@1vW>6q!F)pC@;vYNv`lxDpzH-fWA2J-4Ud-Iqlo~=YuT=q+4;PGTjac%lUw*D&7P -7pYw{ztX%N3+M97N}s5HWBn&sP^Zi0>w-Q+-M0lxywrXY~=64(@QU`34vdYF?>R3aVIq6Ho}ud*DqOr -G*)Pf$G_JV*GYg2$CuAa(0)DIo6gc8O+(bh9O8RZ>!I$!ykg%0jp+b)sfxGjto0GD>QoL^mNxiSnvm0 -VTYt$^$JMr}UfvWeB+~!L8u0(lu_N726a01{UEF`3x)UDd!Y+EDCa{HlTLx?EAE?X$j;6ep87XvM+aB -KX>FdbepzC6KUU(qN5VPC8v_xsd(3NbgEbYY3%pt!({afQk_*IEdTx>Jm&()YBrPRCcnu0tWKLfEa1P -%1!V9H+w^WQuE2=x2X0{D9X-`f6TF4MV9zM`+rmoWfnG@h86an+4H;6h?Ln0Hy|BLM)wZ`NR@TeikVUvK^JW4m>0Ra6D0IwA2pLs(MvnP!~RaTc6kdg;EeGl2Ypo~Kjez92busnKmNgAIMQJ=W2LJx -DEhN_^LLjg!+?i~O^HPmp}RbmMnK=2-dD+syg08Z3E4JrO4R+)Y6Rrij3q|n?R@{%e~>6TP_MRj0y#{ -25SgLnr9(`uPpTgxUmqS(g!-X9dYA!rCCVdB5M23Q54Ms6#1h`b1IX)|^(FC<>{XO)9(pvk5iU+)$K! -3lT3i_xZKr5s#(5!LRomcT9i(>~Akj*#V|Cj_q7*fFF~XAE?>AQC9_+t{K#?J4$hsySBU7ndE~Gfo5@ -X2YI`dP~7I!P|jNVYOtVITJBGR#E4!B`8^XLF_A0!8|MBPNDRfP`gB^-0|U*7UfXZO=8eg6MDwNG*UW -!iyhvPTaXeWy`)dJqR+QJRy$=YBIi|sNhns@i1dpDlnxDbr`EW8GV;giT_Xhd1Cw{D58;PkO4XP{gH9 -RjqhdmjS5-OF4tvJt8e}C=9(*eUt*+(|{~x=kw|dU+yWW8d4$@@rcSf>&ht@h$Jiws4G1>f0{ZE@SOoy&Y9TCq> -3!4KqTSH}TXbOsOaNfN_L#X176?gSWp9xe60{2i2`VeR~;`7ojAGg}I>8H_r7ZNK*Gq88mq!A!uY?2}e=q}M6a=a@a#Szi_ -`v-ja8`)C+*ZE#p2zPQY|@i7M9}T$1^zKM&V7RP3bTT~}=(`;1LL5!E%TYKEuEGKqQyQ=^8i|1=Y2dzw -8aSy~kSN)3CGmvK*LU|j<|-F%V%PBnU$O1P&^-Ig6)JZkQa#qpWocOLTcI3WcC4|RcUv0-%2^ZrSTnu_DVL;6TTa7L|JX;;a^L6-0KP!Ze18lbB!Qf;xx;3hHC%2-2$kCDH`q -_ov_;5%>}#~H>a*sU$;x0+_C9LIJjiCTSmja;V}z7lm#yq8xs)1Y31!J&m#YZ-PQjQpTeRB+C|z<*%3 -6Q>KL9&q*RaX~f!4LdqwTbx##ef_`DU>Um8wk@ENGMwxC*;X4dBBI`6mk&hIoCb}-cPqUx4kSlj1#12 -%b{6^@;+a`!93b~4o*#ES+8dEC1x>*K(3j))y=IS}aj=tGw>wu451b@emg1{(2NQ!_bE7^e%Bix;Dub -!Zl}rtr7_*YfsK6@bFGsGEX1BrZKFpKn@E&#+&={)T-c6=kUTLg{0Wo=$|GyGbSZ5vh4OyF-pB+%S{{ ->J>0|XQR000O8B@~!W>aZw&{RRL4-x&Y^A^-pYaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZMZ+C8NZ((FEa -Cx0r-H+Qg41dpGA*3kc6p6Pz3JUzYv#Bju0Cv7DY4;4ZO6QWQUa -B$aD*WSr-ck>;$F9OjTB@(o7J ->J7IvQ>Ub1o)^Ys>-)pJi2&H}Btc18#1zI@SaiyUW8Up;En-v`rpy7Lf;|tgcV*2A&i}VR}fbqUr2{W -TTpFREDW017AvM_Nj3ovJ6;n-X90O=F2ggtO|DsS-~rAa$3C=EF_lX}BSrH`VJ|ALb;&5xT_#L>yP$L -9}t#?&f(UMwgE@cc;^4DlZ9C-*Mmyc9{P+7WtkUWmo`lu9=-+=*sVMrDtUaoP -D*~la{!v+AM%6k6CUkm`&qU_v(3VUTMln-YWH`gJ_AsQHGxyR{5Kl%pgpx+6ycwkQQ2fAw2t*;tYYlEi6_Z=ByuW|c5duWsOk-ZI?@*R6<{jz -nI-}dxz98XBv>VdH4*#Ae++vn8y{(E>q-*)Q%_9RaSW!$P}OHL0thU)|ga5Y~7<>7JE+^V8W#{9Mt==0(1;#5&{dxA-Ct~A|bwU&cWN4RrT|-azia{o=*cH@tfGJlNy -CS4KGqM?~hdMEg1NN2rp)Q8MZrHBIX5|2Er%q59PoB!%`(X>tQk6m1&*8eTRLrq*+H*Y8xzmW8`0(g? -H)r8cyBm0FxaNd}*&cf~JOTVj$e*f&LH6`T*tPPRG?pVOS}ju-rtPv9B3>PE4S9kSS4`~*#<8LA=!#- -JV)a1;`G+$=6r%F>zf2E5qC81^XhO4vY=dy`ABqXX+IK^{WD*Z>#sow7O2Vi%WLpoO+Rh3Ju++v!rLwGdQCHb%U>UVy>!BboLsEfp>B -5A@E0TCUaz-Q4_1)-f&3G7}gf4OH8M}@?%X`fCzWA}#YqKI{C8975>!tM;rE$8D0vTI|#qG`xL9pIAW --Q^&AxKY}y-o+fgk{*b;H(7Ylo-rNLXj+PPVQtP;@~{pq_i75$q)@>AtX%-YPFBq$DHASn&M=QdJrNu -nNnwJ!_KNk(4;A^oD@ZrE5o*bu)GlacsULx`ivYiCRk>~hp%%YFecYMncxs3KML^i{Fg2|k{gyM! -Z0i5{JykSq6^U1QqnW0(SroDCV7NbqPNd+Ou;)#Z3B^-~##-}v?u4>NmNnD`m_5*M{MlZ}g-pJBgrzD&9ww?Zy?LF7%>X8JTnchGdh+ -BB>Y+H)fjM}8OBl}!*QGZ4KJgUxII4v~(BR(G_|H0_<`#N!Mp=6@OE*j2@-}*`bb`AKdM -Hd5w>;snZk#C$Dkj;1}T|d5>f5vDvvWj5`7Nf0J{tT03ZMW0B~t=FJEbHbY*gGVQ -epBZ*6U1Ze(*WW^!d^dSxzfd8JoPkJ~m7z3W#H1_H@jS?Sq;PMd5|v_OisX%A^Y(9%d|O_3}~t=BE`- -#a8FTe1}-yAfc^9L@*do8gddjOqxbP49XGloH-)WgKBUt3>aB#&MDia(l8#(s&!qbwRmwU?dYo#i~7w -#((Ys#J!g+stR80m<3v?u4A$ut?uJ+$)r;?2wODDbj+chbViBM?jcC;qj1SuX)w%jCDDTc`1icdI9f9 -49mjaMK+W8!ZCx$+j_N~;6uf!+2mR%zAATbx`7cG=G$*MA*K4Pguzpl?>kQu^hkkVQl%$`MB&h_mmOO -;e1LSOYueS-oXSG^|_q*Qd9>YuPm=I7C&8h=y!J>#5_^0OvI*`tiNKBCgv$Ga6Km@J=Ezy9H3Q6CfH; -|S){s_b(ESyxP22;#JOV$BGOCv*Rko6Y5qHxq9#Nn$=g30LJTETOOZWbokcI%3 -ZC5d^=quX0+Rs7ta5TITSxdcG+57Eaz|-qK{PqJW2UwEx;q>PisLe|F0xr7a^elv#o2ypnOrPUsi?Y| -B63@>I{ZKiva^PN(v9(%-)ts0(|o25+!Ro-uzGOa<@H`Wd7g)2XNoXb0K?2(x=ZMc9dn>`3 -!uHIW94)<%wyibK6v{(|?NkIoBY*8GnW{$$M@>@7)Vtq@}f($!NwnT-*7v%RnwN^tpsLk?@AgdLy_zT+|AQk -P0kPQ7a;q8_H%8eKZiK&22Mz2_+jWIkU*c!o;^z@lJ}@oRg!<^l~_*hGR4*{>+)2Q&+d1a(>}KW0$SHe|%kN4fh -QiZ)N4=LY56t;)RXY+~ijQCaLjBFN5dF-RCmTo49B7^ls%#Z9C)CyD55IGY6LfxNtX^9gZG0hO2qy=E -_zZx>SfuetboU!3DzPh89@6aWAK2mmD%m`?eE!dct`005B&0015U003}la4%nJZggdGZeeU -MV{dJ3VQyq|FKA(NXfAMheN;_voG=i*^DC@KD!$(RHaR&s*yHPFKuOcVE{MArv6CUf8Vh&yGz -oP1K{zS@w_+V>5Lu;W1V;20AoaqlQxdkLJ#Y)G(c{QfyPWcVUcTmH9e3WMQww%+x!&(@_y2P6PDo2bekbsUtFO2FPxsgC=IZXIB6s)u+bTI=2qxcoDqgUb=eS$t%bJa;kG|j=7DFi -GqJF<*9tet5mtvITZ<&IIErL -h|(@vcdO*iPn`^2Q5KuAz!`&sp#@{g72W_&FqP)Rap$B)y`(^owj-+32AkB)m*_<%^R-9noi6f?-F;W -{m8j@a}6MIC3zekSae!ndNwPMpU`@TAMNj#ENUpi->d9P* -NIyWGbU+Zd-_hCEg9RGbc8sTD_Jkn3zf7Aao2mM=u3ermacA_C_~sa|n+fZucWMVb8tP)h>@6aWAK2m -mD%m`;IRL>biq002S+0015U003}la4%nJZggdGZeeUMV{dJ3VQyq|FKA_Ka4v9pbyH1m+b|5h`&SSd0 -y{uv>^v;H1O>Wtwo_0DicQ;EZAl}grvCSnKjg+is*6F9@A2u8uE=yCMCF|)6arLd4LOh(Hm!FkrZ`Ee -q0TCs3#A>BmTg|ND!)iZQJAiix{TQ46n+L_C!Oa2Dv=}P^yhedI-MRt@V!9ml+k?0|3qXcNs^+K%=T{8pk)d;+=uM18sS3A;8l7O(sa8^)5+@6vqy -B?@IA0(Q^y4d1xGL9xHlqko3{3#HSi+^BGz1aK36Wb#j6rg?TX7X#DQ0H}hV!?Vf!{S4HNq7^V<3#CE -%0gN@JpBYK2CY9k}&M5UUp{5sp_MtHV%|t+p%V;J%+V8JhUi_JiBCt>9`JvbL#c0HrIt7He24LuwB}} -tWZJM*lgW@=F6qE7c!JX>N37a&BR4FJo_QZDD -R?b1!Lbb97;BY%Xwl%{={&+cvVl?_a^^Ah6upYIAsp2Lx4tbhAYR^zIhf&Gm=vLML0at&1!#pq@o~EqW?dzsx*;3SH*YZ^UzPeJ+dDB$2{!!MOO -;K(1&w9_BtgRdKTj+0M+qFe`wZ^gPeY?*Z!SzUYA8v2o-`w4$zuf$KdnNnqi+!9v@hYzy-EIGIlQvw` -U9;lC?p9PSZ>p?}SJ`T7u>Q8?yu8LI-mYb#JFa#)P*l{F2y~2>nc(TF-tDp~*HG{Ir>wovRF4w -}I|Jie7JjSoS?KY1YTcspmBfK36q1lse-O94E`|I@a~Rv&reL3S@&{J^kIo-CT_r?)GyI9?Ye7YEVuo -y)9!)^5}KxjF{BE5yoG3|q6>53jaM9u-2YM -Kx5?SK=K|((iGgoZ%{SBTQ>(E*fXv{XF-yB!VIs_asaCnZ9-xo{#SYyrD>Jzz!J@_uC8*vW`#%zQ9rk -6_L^ojnM~;Kdk(g%V$iGI0#f*g$)Wckwrm5!5zGL`4rtpPBrg0YN+m3N!K(UG_L}|tpWnZdyr#v;-cc -`FU_EFfN%%P{1;4top4>MbR})#{i=a3RikSj0PZ=B_IHEku)HhM{#GYTu#J<6(XhiJvN?qKF}{t7P-07cDSXYMEfqd|H+O3IDX)rtUUd*48WoV~s1$f>i7y;k4UY@Ypm4_<b)T63u4kf`L0Hz*j0Rg91Mi_M%H5z#YWi=XU3L(Pqn%pBllja??dSox{J27Ff -*TyVD9Tdz(yU6M8;_<{fXdr>se)<0g=Q)|GAY*Sg|v%a)h>WTZE+a$yDk0Em8!+0+4$bpCYEIKjxnHv -3!vH14(F8J8ItA^sV>c(O2PPQF{$X!#MZ7o8gE1B79VMYrEHS&G -(hWP1B2Ba+f$Y%ly(NY)L~0xZy^$TrML58o#U^7JPBi;tc7NDIXi%01_CMcIv{-&O$6fE`o7>yBZ|>i -`{QY+|4*cgs^_z?)Viw(TZqt?5tIlwp$ibP%AMS46r$4>9yYXVfZtD&w0_zO}k=f*;6~3tIuOWgp`u0 -8MSS=t8=_X+k;fYJ_0jrXg6uNy-PpTbD0>Z-1|YT|1#*q+wTf1GwF0MG{Satm5VH@Fn$QCMk(O@` -X!vqx@43uS56~TBVjAou)pA-_j -2KDm((W>^*M8qzt`Z*@lL@qR+#%Brchp^YfAnxiH${ov!SZhB}=&- -*<$C1lB8~nRaBji3XJz}Dl1il@B9#v7Wnq)tKnhWpmpZHH+{onDWh1(9XU|n-+tu$2hLi^k -HsJYMGg&NF^==PA&%~<%lU@TR9zB})fwdLKJeSY8xRy}buT_a43cV;5b7(o9_*hskoD=x0=S+*7(hKG -#sedcY+Uoyc63Wn531rmbb(V_Pc9E0e;TyoBLm!sej4L&C% -DtGiOR7ry*3A%vq+RmreZ<=5Fuj=gW9tn~ExH4i_wS++Z(P(#lu**Jjg(uxKb+>o5$g!-5f%*)S^yNCH)AYtGK&u_iGjCdV!0+c4b+b#rG&5#>z -O(5nmFiS<&l%<|tz@U2M08GwHBg@{MQ~n&7CM$s&5p -pS`D4}iYa-i>)VKSh4$&c#K#-n)Fw=Cd_F{*&25?b3pf4{J%FU1sRU%(Q_YQD-|b!xpM0eNVBFAsM9P -#$vOB#=&8ud+%BJa@L_+

|XoD4)na*Q5bHcgDw5pJP44n!fBV;Ns3)-9hD1^ORgYn|4PM(<-d$shs -yq@EU8{1`A#Zd)OVb7^xi(lBf%r^04teyB7i~qz9=>-}&YWN{~$0d&unFy;oaz5AzgToo!#u_wS5sAG -#=1gv($~3xMp)n0}J$p+}CRnr<=HnKA`nAyw?9B3ZAN%<(SBNU-;kt$|A%z|7hCZ2$9<{!C;YWsE^}Y -kc$J4<~{S))BL`Gg#ASO+=sUh@F(~OVxLUY>+dApBQ4L_=gw{fMS3wXmbF#3}8%L;AM5mIH;U?i!2hX -Ha})n%Q@QO3uH_D9bB0suSu?{_cjVHk9f-%Z>VWS)l+Sj#i9muf(2fz=@kmq~2$YgkrV#)K`gd<4#=mHz1m0efwM+5U2SR?0F(T5if0UW?bKpe?n)EKrP+u}zP=rr- -qAV49+HNcbtU3XPyjn2&N%`Na}F)EEk-yfDQFupu^(Rqr5F;(>F=gzpwI^0mW95U1dhrI?|Ca9VScj$ZSlA -TPT9+r+0TjBJyiY`!aykDV;5pZ}QhdJV5W`MopU)W9y23UZz)Dt+uU3YYsb~8Um(b0ThC8}j){&s7uG ->Dy*X6X~{*;RKrD2c7d~|T&IZHYMb5KrVS5NI{=?1(u*e=65f -#Y5pjeUWLF4clB5$TsiGk%lzTsLU$RZ`2j@gDys+c3T5a6cH&f1-;)l(35Wn2deoheTi0kF&N#Znm(S -O>x7V&H}a=*nPG)f5bK;9@<$y(f%B^7@_o-K{UMQtdwx{{It`ciJ9B%Ppt1pF@z%qB6B^a^!UUG3c2) -c!lny68X6%8$0+iG@{N9pz==pG6aMX3lVHLZ{1MO#Ye$%}sr0=FHn^u7kT7-XY@w*ubu_)}R-pa@FM! -wu!!N~j-v1nrrg_m{ktEL+Gt1n)x@~{J;drL>8DD~{g&q=l6TtXo4YujPeoWY_z>3=emGVNRJOoVf_? -^Z|Ra00OxqOR*JN(>V%W#Q7QJf_7k)mRbyh)L{i924gOutcL*%wbPZ>F*&m0>*&~OOe=}gzqTT>>lRG=i$3&O*6o(kZs$wBW}=0v;(xq^Vhf|d23aNpL2>X?9cRmSlskdn5#RI -(wN<;w@P@f@(j^ASH#t22fq$LyA -BNmSh%zJg^3VV}I5t?%lefemqqIoLLy2~KY>!BTb6mnp6h|5mka!o4J8Ud`UkE+fV)L-|lZ-<2~kvUNa`Z$6|T6F -V(3q9n&!VZZt`qfkqP5D{1JRXSlhkvE7OGISz}f4>suI!}qSYg}ANj!98XdELhmLY6`M5fyzEGZ7+q6 -6Y#r!ebML*V1ZILn~J%f;M^kl;g#nw(pok?=2`OkS`1VK;x|L2N_APIeNCorGhqi{#9OS0KGYq)5p0` -*>6SeW#{)%$MTNO#(8FcPFO&liFb_=MClq?WT`&o3y}ro05Oh3P8Nv{V3Qr$KLCJg^dps(tg2|Xb&V^ -2C`)o`9RMV3bAdr(o};V{!AHT7LfrJwa`)nTtgTabNd(4ydpo+=u}SE;P+TgXhkZ`6H{*B -)JBD=dA%{sO}l>IDgsEPNLqXZm)xuUGba-JM>uMrQ5Sn-7@_DAI>Qj^#>oT)n2ktNv6a#49`cZYSc#QGf^FTjN@=)FjW2UV`^FPYwqu0rx&W|0gtW<3`kAdbMC>*V)pV$gQ5Y6TS< -ue(y+*)(suKoxndda~%1e)U{8z5xRiMSq&%;*!Nb!-`|gK_Wh;H|%1dMPK5ZH`muUcRdqGGu3T8q#Q5 -9nW7&_0;2ziyae+PmH6o`gf(st@2i8JIN2(SQQW05-0x91{Bw)Kc^DaqA=z^_LB4pb(vZNote>$E+3o -pgISJ#NX||#a@dZ?G5`*O3HyKV;F#+|P#dsBOAI;deQc3<7P)h>@6aWAK2mmD%m`;UvZu{B_006cp00 -15U003}la4%nJZggdGZeeUMV{dJ3VQyq|FKlUZbS`jt&07C&+cp;e-G2q)ppevalyBvD6FN!(%o`@P365^2d!(rv&QZETZ#kMH~Ykn&cFh7`rN*S%y#L3q;%sR`XEQTLh^ -_WNSt#y>03`p>o4?RdLeEVjs_<6U0dv9=P@Gg16uGMB?(-iSM<{Hia!D{9g1n9?CD-fAXWTIXfW{nE0 -jM5noE)scnyhALK+qG@Pbd8)Ve>l_JtD4At=u=oclg`A_{ZN(n^;-6@FOLy!Y4$iLbHLq3Pa8-JebV1 --%ait5c3RZDVH#J+49fN^ZXab7EwbahJ0k+P!EX>Ul8Xg8iAl2d-pXPAgBeSUqNNS^JX -rbERK74I&Pa+-$w&?KK*w7`NeR9>2VSgIT -=P3d6vz*gLV`8(Xj>E%bV!gqF(bVKo-pKB5b~mvVn?oAfL!|t)q@^#kJLwm&l4+X#kP%CFdep!QXSy>xzQ -4l2tTMOQcyRN()G5Eqivb0FU?nyIO2$4ZD;~K_pj#v_hNoB}v4~iE -7u^`}4W{%Es+S^`jIxVT1EtF*(sq>2)$Q@%#Puv90$Q|6Q*K4T7Qp2E%R7p=2?1=5xGx-pM~a&eG+3Q -+YAO*tujigQ`lf`&I0Y)uL-ytH~Xc3aesH{;~HgS7bTk$R#uxBG3j~=xT~68@~gCW#r3eX}=Y+q56~o -X1$CtSIp9S+bm1KDov}F@pO43I7BZ5x|_#j+DgX0nA}Gw6GrA>(&fLwilv5JU_KD+_JlToQ!a^PM^Yz -1wj!48tVx#uh;XmvR~rs84?O$dp3ASP_h>`lP#oc4RW{XX2zOHjuw7%$SF8i%#@dp@jM&bqIFs~WuP% -Tx4Ctqo<}K#Mtj-pZu;K_Co9#c?y@En*S3aU5 -{8s?439CmN}J+ofLf+D;})09LySvkpQnsD4%no5lrWZ3Z;(sc(n=y%AP~!U6lnmZ`1R-Dx8sutwHb(^ -f}@EcD<|>3a_vL1}Jbuo`k%W43P*Ot!@|++Ck&*B*#fDAg{QxJ=7gh@>y<@!C|b8PZzO?k$q9~_ExRE -smGz%$)ghMK%Y1c>ss6w@V9^-;#$ba7{=n|5U2>^iyNWzxGWlt37qZL?tM}i&>^yK56zDlI)tF%}PHw-_q2;W4yFV(9!VpNqlJ1aZg(!C;Ehp~2Ge)a;lA_MM6H$GQ8JbDW1DsRP#YxiZJvuRJNVS#5jFP*SnX -@pgBV4wF8T-DdxE`Q>3^Zz1HR;YJ8BwDsY73X#d|jt=G>{DhlDp6@!E>ZrR=jlTJs0LcKhLI1W82gsHJ&kj^=b8xCQL10$n{8&heP9oqNT?sj -MB@IBZVO#?%QEf#oW<#zvVRR4tKA2-CyBLzo6KJGHeHx^6gkkC4!KEPck5!WJS_h|IsO -Yb|p@ax;#R@}GK3k$?L&^s!Q@rAltK`e-hCsPwz5D?jf3wQ-%CICuPN$_<>er9;(O#*l|yKo}b)$q+I -K7PY{n`rSYzv;_~JkaGX>2t0E@OQnKuw!?$?kOBpMq>?3ieYj>w!usp#a@qmOm~T=(^#chgC8&iJpC` -x9WL! -@FJ8pP0gAdN;Lhu1Z2HWf8uT)O6GZ)VN25b)+bl%v_}%Af=XH&WO`hwCMCXgJc+sHQ78s#9AFEiv*a9 -Pwi<`~<`rScID#0e**~yX&yauc)yBR|t=d0F3?pn!KKmW7nUsXQs;+YQ27;Ncuu$%hl8it4C{@A#pM3 -82CJ#7LDV{H6zrlJkfqnG_1K@obAzOyC48?<&5{U$I@hQyG@tK`QyfC#9oS+D&XSJoX{@GJtHlHgASa -}uuYm3ihp5PGc0fO+$};OHET_nWdMj@O+(z>z~H5e55qBMZ+8VAhFg3xhWlXl!a=jg`eB)d$4q~vf(O -S6{zC=;PBoq5i2?;1dbwV&$dW8A2x@4Tx^nPvNs{w~yd)1!vMdW^!E}JGWwK#pdEB?K79Xji=LYp)%- -63o^3FWW-8KTwmITV|Ke_&~-}u=Ztvhvjaj^r))o=1rG#A~zqZb|TF1S)XQy1U9`R?_Z`Hc5S0D;fHd -Hv>Z-+uGmo4*<+R2i3}ZOq1K8>^4E`_-#!P`9BEDK2`*jFJziq9Is#y(Pqj8w{R*dL~E@&O{bqm9zx2 -87denkt}$$pBkbSGRz#jfd16i+5*j!`$773HN{7`gY&NJetG@5N8TBRLWzwK(G4O3llCN;dsa2Ro+4{ -_lt6iN+Tl$_>V(R?F6NkFm$)EuF)&x_Z+DZn<}U!>iuTUutG`Xe00$W%QSlZ--ypQ_72eSplFj~+5)n -U4mwnsf=B_R7~)A7Ctwr(_{MG-h-*5eTZy$LDji|}o>q<{AmMT*%uk~?>`<` -w*GPi|otw-6;uwl0&Rwt)f5oNQgD%h`X@rkPn%|yhM-=TU@lHst$vTF1Gm8gXo7J)Pk#^RT^AYNHkK) -pBol*5v^hSJq%m&KD6SJ{_EV3{*(EEASH=S}g>3>j50|XQR000O8B@~!W4*|qV32Fx`- -~|FB(KZ*EQb{VdSMsLG<&ENy;ICU(3i -*K01;?x#8^_o~@m?S>)yrpj7oOpTW3sj8APPiOR6E%<(4{s8HFi=KtMgnE<0y9=CK!QOhL&#|*%Qab+4eJjM#R<4o0LR -*8Y(nFlT}cDo#2_5S&o!5Lp2Ra~Eo2RGiSs#ILDt}c>og4&D^@W%qjIg_>+ES~-EWqxfVLh9Y@4Uxj7n&3Ucjr+OW+esc@V?r)PzhB_a-6Q^(;6xvt^n-Q#lLnKVFZNR%WJDfuT`lMU|jd}ye|E?jCyf^V1S}1aAU!owI^!+p0N$c39`DCd0w#MbC6eIau92hGFo5D}^V)Zg!4p^%hf7*hCvKQ4}RXyE|qCA_7lk(zuHc@XZBnV1*m3aPY)$%D^CC|bQ& -=cN2ZrU(jt%&8i5{@W*+2A4$4))!sUsht*{gWToJlCuce30cx&VHuK7@@HL~?=kCBU>8TsTSso8a8YR -~RZ~5FOhCgo7lG><$9Z#GX&!=6eA(zTirerktQNQ0OJ2MR6dsnSwN6+YXhGzZlt3I6;2Sz_iI9_dz?* -jwVsMl%^voxL^q^4C_EqfO+s9Gz`wr6roG#J{UG785K|$Skg1!uRH5@VPV4yW`A%Qo1lKc+L8l<%ZBH -NPF8n?#LPO{TLIUeSpoYq=$tQ1QMdr+DOlRqpC@)u!^7()m#FaopkI2^__#>GuXsG$28Mk*BIEV|gqH -UGp)dB;|AH=seb2^ai}sMvs)7zMv?HCghR+Ey(e#aGgMqO11`3y>ForOz3YsxbI`(}k!xpiN!&fcoGY -8@t;qcqm4X8fmir-$$>&<)PgFQ+Zj(&yYnHDvJEsX5xI+jRH69spKdMj)$#e_aeusCS#vlXo$q0Rb!e -h7+;B1Au=`yw;4rTcK%_mM;UfQ8PryzozVc3!xlVvakg{Yr#1}DtV8RTCYDxn3?kWE;gb`I;Z -N}!?p2QE^k?Q9w~b6UFBq-0mhCn(^M%=N?nex$KG4FWG#z=cU^GLEqCu+cs9gF0-lV*OphM?+@;720j -mKy7+tC#U4s;eqIZydkg7$FY7w@X~6|RC5LJL_khmaqU+gX|{y9t8aoIp-V8m)uZpIhr!<>fJg}7?~H -_F&t8(BqbT{OatPK5Z0Jv?X9_qtRRK9Y0y55b{U`puDtK9kLj37U;n8K -Obaa3@UQK{$@Xe7q$&Hv!gexDb#+Bp8R{0_D5ybV|#npUqf#U|kTH4kzb44fjg5y62u7vr-Yr(L%Dc39w&%HbDmT6lO -FsZtkm_SXR_5LvvP5uK=O9KQH0000803{TdPN9$nMRNxL0D%|)03HAU0B~t=FJEbHbY*gGVQepBZ*6U -1Ze(*Wb7*gOE^v9xSl@5sHWGfC6_z&f4`X_DUp -`!?7m$dVvCw@I6poPXS{8yBTLh5*LICaQznmf)wGO1sjBE&k?Q9lFzZFN+sSfgA1f7XQGqyeStK=Ylx -VDqTOsl=$8!+X^0rd|%0<87&Her7`#F2~{rdXm;UNex3gGCL9qKU=XTf)d+YCb`^!lnU0B2NkG`gJqUGe4e}D -~E!q9;^#VMu3(3otVP4o?@Epw5`V((!G#2~_6_^mxN~b_OELjQ0-qlUDW9zC$+th~r!cP3oWJIY-NE&>n!>Lh$Z?w>);W77%kVlKA8P+7`0O(P|W?VSC{o1KD>9}h1kmfD6IGT_8}&Q -Lr~dbEohU?7uZ$2)k#3g_NS;7Yp+r{3@kRjoqRqK_>&HG*z=SG22JU -MS(e+KZxI>2S7?=51FLtdI(rv2~(JyJB*g;Mv{=Hwojw_fVhC1c0Jxjf?57sk%CPKlg(W4}ovG(!|{4 -f6g$5PSoX=l~qftOV50LN|G1elyF9(kWSH(eJKQ-N(Q8QmbqZuTCBMUZs4av`(0&?fC5$Oli0ubs}n> -y+$@Zz`TZ*KN2o#^1UpG(%QUmof@93OU{8I|~$^;~#r#X8T%~PdBzigi4<=cLk#lF -4-82Jmv`{mTNp)?YM-B!z@~P8Cu`lSSw@C5U!~>HRtbmtQMn@NtjfK1^4Mb;geLYwJ=5Dm{hg}aby8tuI -YA?STys)PRLg3da1cyu7%yY)CEuqP^m9(k%g)9%ORL=`v%;q1&*17Ows67{y9MWNhqj)o@`Mdvy97(C -lt=K2H0{a(7;CIeje!31}l8Pc!W+K8Z<|i!p0Bd(Zst*p?PLAad?EdEZ^Zf_K;3n*foIOE>;tiGB1a% -TCdmEGo1`EiuJy)rfh(fI}JlP2U3Rx0~2n4M|4@&9H039J~IO;^dB2jR|w^29`$j>ROW9J+pV64Z@POqzhdkQ|IdhWAitnM4a_S?_6d1+MMfN}ecj{@PKV!9gk -#Gfdcn!%qRCra9twa6!mJCl7wh60k?9ZlqQqT9K5Ui%_;r}FsU;g#$;_lP!=kHJ9fDD4mdx)}yLRmuy -+R4DX?=QuEtjAMhs_fd63-MZT7v3`V?$g8L)yI!F_or6Uu?0i=;y7jES+v;@#S*M+bu=O1d10B>kP9w -w68F>yei)qlf&J1}d9}oW1#9HE%Jx0Qo<9rI4QS+7^b7&W)2~Q_eU<+_RDBp0Q!_uVoYB!S%n?cOdt~ -D@h*QI>b$PBVO4&_ImOh0FwW+^ -4Ct837BZ$8Zft5=8JKb|Zg>vv+lXQY8<<2@np$*uUn27wkp0duYaLL5-Il`-VbB$ar?`F=pvRMTU3cKv{5mu8<+dF%)Rnp41RGmYvW!|`+N^Ij<-G4VMcEy -x8TSo$(lk~^S{UjDrnGIIlb3S>zmK(;DkR9Gy{}N8Ug0c6HEeWy|;lb!9ATMfoaDQ -lD7orE(*%6xwK63MKzSu0?}$sMH><7K)WhvZHXwOVcz$S0nmM|F{LgKTB-AGC4%q=YmME4 -S^Q(vZ-pg~B|M_BJXU4mn)UvOGt701Cwg;fQBS8?=E2y{Lp2A=V0s#) -haRgz!*HMUJjW0ZiW55Y{iHm92-X6>W=l9?tQ$5ln>_RHi)~*n-5+qfkIHk(5Mn=O{&zk7@u9RK^oLo -1UN-_%!hF85m>l=sa5ZG;g?=PXvs1T}PF*w-CWbIg`Ew71ne{rIw!a)S;?#_#o`b(e1K@Yn=k(Tddc(I=^<1vyBZZDe6mptXo0ROo8lBKEcdt+z3pCbhX`489z|^z3P@%%uvTUF2me -I$lX&Gsv^+WjlWKGwmAM<5`*}YqBr-w!z&O#2M=Vq-MM@EG6V<%O`9Xc1N82}lD4TJ1yks1}wac}rN` -~v>|XQ2|ZjR%`59{fJ7${Y4Vu|3q&buU0aCvuvqh87N1#SkSM1!1ORzCvaziL8Tf7R;@q+Dz|xwNum4 -LiR#Q(8DVE(7Pi6W2p0nU%L*dxGeR?qTHq=!Ujj{)W>UZKQi{d;!x~jxM$n+{3n0m`fd)%i#C33XQPp -Xbhv&O*=8*H-E=fKXbFcI1hn927t)iVeK+GfEW(F02Iqjz5pK<=U~V5aeK_iq`aVnGftGdYqo9Zv?6Z-eB*uAek&Zi2-TrWH#%a{;jQpz+Vy=c*(BetgXqZqFb=1qOj -9<83)-V`18@C<^f&knAHVT%uOiy+(v=zuufo!&+3sIZO9KQH0000803{TdPFx5_P=^Nq0RI~R03QGV0 -B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WcW7m0Y%Xwlof+GX+cx&yU%_=zSkB6t^kK2VAj(6#4NzcF1iJzH -5Cj4(9og*AqDoSB{P#V)NTw{x9>>6VB=X#EJcs^)Y~E~0DJs_No=KAOYu;E(?j&_gdfq#`!$dr7NaAcxWKX;5*|6$TD#|ViQB(;RHRzgc9L}AWv}i=S14HFNb!zcMU4v9aVYcL`@o@EfKVfIJAtTa*neSwLY1 -Es5)sD0gZhotWlbBo{^6z;X#;f&=k#`5(Qw$TWZdfl_=FS*=yaZ=cgyThHj)4LYb|Mi6>~DIMtx^lhY -+I7osZAU8{xQ>O=lEd*?K9bR75!J?Iuzq*LJZ+g42J!ijL9K;WB(Mq#WI>w5!fVJxBEWLj7oVm>w%JF -=>y+(GrmHg2;I#_JdmE63d~b;^*)2iFqvV=KjueDQ_gD|sLIlc*L-Rx^+vNS0+Y7#lf4!q8wGZXtZx0 -P;DOir~hd811B!{5}E~C92w^v{dhJ;k@^eYG^+Vz=Lg6hmnrag647I?M&zlKZ)yX<*+KKv39eD>7qy! -@H!=LsN7*_y?OI;@@eD9W7$f=G&9l1>vcAuhlq;-5o>aRIw%y(z-RsY6e6RQeL!`SVbez3=Cn%jdt+7 -FV0~GoBY+BnId@S}Om`2MEk`QzRSdDF9oM-~S=mY4A8+r0w|TN0*%M2bAny_MLu!_!O~9UzsR-tEIU? -geOXMI;44#C1G1*=9g)v*MFMQWG?Q%KcvPKkJ)}YIi^{a72!_SXn;W34U?3H*|p4-^e-nh-E+bn>`R& -%b4Z`0DO<}2Eo0=d*trr3aq=9V+4%ws+GSuZ6Fgt1#n;Z_BY7K4uv -#PczCYZNfs!?i!%4`yVM+5Uu&YH6`yVz|$Ev5;)-8;CsO%aM9Xk0=qM19ZP;b_axJJ?KeG>DZbcBG?g -OCrqPAK_yBkyYD<*tkwEt;QtYYPgBk@P3I^Z$qdGu2&=>HOik%c)J9a>rhL(bb8Qatz{5a1jkWoE@eI -$b4dd%=`8c4T(1g$s6`qJ*muJN6Ympe7bg9>_`uukrwd?|bf?u)xify9GMEQsxyvEY}nRdDqy`Df1(r -%6nv;(~CYQIo*E7T|egOE(r}6>Pg*vii+bKGRHCNWlL6M`e1Ybd~)nSd&~h1Tiv|_3I)gz)<7H5=^#{ -0ya>lCCzZ^H~*6fOkk#<#^1sA5CQIq>Amy2cLok1CWQuX5Q^F5*2Yqs#IxgMi0wy^!fhr)KzIsclX+d -R7-%zbBsj*AaIBQ;C5pmX15ID5Tlu!D+@fgwG=$C$Y7P}NS|111k-;y9>|kPrJ6 -{d5~pt-DxVVUU#om+^%$2s%W-IIpBEDjK|g@L)2RRW4r3})faS|p9-uZ>hO7Ot3xwllMFaV -2J4s)#Hc5_c+TSG2t1vh_zf2@14R6Tm@-n~5(|LqSoEk2u< -MO*`U>?*@aUnv_W*G41vBMT?zzY}WQLj4pe4Goz`aFRk(eg0q9`T{SadSR&kMoY}9iI0O^Rl@x%zZT8 -2tpgB`Q2y@LNpJa=Ml`5f`775468|`?-~KOJ4q`j%!s04cg~kuY!sSb)#r_Aqn0-`6|yw>>(A_ato-N -@Uhxf{kL=wgbTxxq)4JNeOU`QnRsI>f*c;$BJP~Z*=NF2DsP4GM4UYrnWoagGW2=4K_E*NqRb8A3_aF -StpSxR$f}FPf8R>6^=kuYjwL?0PSB2*20^%y|`#A?s^)FxNNsLFYfyQ|G9+AF<$gg{fxe79`OidZ@&= -qL9)7Gi->LYA4vS&xiJ2NPxud5Alp|Gdq&?IBo*5n^Kc^f~Btyq-d%oYB~GOvR9EI%S)H-oyM!efT?H -|8$DVx!rd-0t_D_|H0Vp(m|iPE69q^TjAP*}(wDWS?nJnEl~k!sUhmul#DkyS6a5+33;N)b<_+q5lR@ -O9KQH0000803{TdPJ78H{yP8w06zc#03ZMW0B~t=FJEbHbY*gGVQepLZ)9a`b1z?CX>MtBUtcb8c~eq -Sa#SctOwLYBPgN+%NGwrE&d)1J%*-oR$jwhl%_)Wm7Nr&xr52~=l_&slW=Uphu^yL_k`fmHP)h>@6aW -AK2mmD%m`>FkRK%14000#P001EX003}la4%nJZggdGZeeUMZEs{{Y;!MTVQyq;WMOn=E^v8`QqfAoFc -f{yS6u5$3o#!soS;KgbVCFMpF(JFM_ihOBol}D@1|YTtyp1sXfH|5x#ygl+L;Edw2XhEu8d<=lpC>@d -d)u3d1*Ar#u^vE3g;1o-xs_;C8Qo0qz>q`P;48d@~klxDxctwxVsS^tA%MI0WRg2)c<3{&PE9dyL^9s -=ZpK>#Up=tU9BEgcZA4#VtYm)uKHw8yp{CUI~hX_`gpFwRL$Rlc&u%s(0tbs@UGH{-IR5bbaHQOE^v9RRo`pdFc5zCUvan(ahPY=YanA#)^&_!V`Gd`icsxKqfL=KNp6~ -k{O{8bN0F1Xg)uz@S$Fs8?$dXdxspq0SzD2N6pd6>OY7hCj)}XfGmL9s%T_7_H5F2@nsWAtM9?K>**u -0aVNeOmLr7)Tt&QJBe!lv8Mb0nZpMN6Xe#~YcXCJbR%}*RpGO){|4iUbzhDi%w!gn+!Tqya7!fvxHt2 -xygE~Hvgb1sEZk{9y!7uIGR;PO1bMBbu;xm2*E!q?_LY=jQCtro0a0EJLGx?15DfeCFW=h##`q|9#`o -CC2nGebzBkn^plbUHe9*u_T&S7epq$NkV{2$FoI#NnSvn=}hl2{#H&r$oRaq+zvX7^c(U7f(_!fiHmxX?B4 -A=HQlMC~Q@aavYv-w#8;!!e%?ptDu@DIz{+g#ja>VY;TO0 -lY`GHVZc;s0NP(wX}zJ7McN^?W@tm;n;$m%uW^UR*+IWc7w=?f4bwwCcnu;i{vHbT6U_&e49? -W;U$jW!{!=t8GvJ@qkx$x4EfWjv7MjC3_gdLNuT_W6c6G4HMf4~&HWR&KYchDi-}8 -8a_|%>lT!TFOa>~QGdBoLzl8&>#P)h>@6aWAK2mmD%m`+CGD;LTE001Ne0012T003}la4%nJZggdGZe -eUMZEs{{Y;!MZZe(S6E^v8;Q%!H9Fc7`-D@N%7kWzAwl-_$;MXTPC14D6ZY|AsG;oo-*35DIXwGf!`n ->QbC+yvKw*S;vvXloY=(wCxhXQZMJ#^@91&bz?iRUiaKFqzBoKS`3xC?Ytj>Rr9!v#s%xxzig~obMBm -wb^X`q7O)DnLyo;FhW7u8hmhPT_XW1(ilKh6$&Lgkc_<3;&)?8#!Zb4l%=+s%Q7Q0%{C^rg+?1JiCqx ->vUZ))_L@Xo55R-RJ!HgT3-Ze0@d^Goi!+3Jk0D#uB0%BKi#c5W1(t)@BRIt9YqLc*u9{BfW<@Z0qdA -jJe#NZ)NSZA*Osu0N?#spnq2M-4CqVj77Jl&h2d8)}E{jgQw3wDIa>mIx29I6y -HHxVr2|P=y5ncFPQw)EP{_#SFK3nMKo|0@WL3ZGO-2XXw3i?qp&eXZ&{m>3Myq6bW=R)g=%Kz7CR|RM -si*C9l50ecdU!4Sv6)Fow)sGOvVY3?|c}L`(Xc5^-YE}yUoLuQLe^V-(h_>Myj-B_O##aqB4aGue%b%du$p1dIO?*Uj)#jjB!>hb$fpHNE!1QY-O00;mj6qru*Rsgq=1polA5&!@k0001 -RX>c!JX>N37a&BR4FKusRWo&aVY-w(5E^v9hSZ#0HHW2>qUvWs0O4<}HNta$z&;b0vXFZ{}W9^EF -yuWzwpT0aheeGXf&t|V?zfUG?IWYXp1Y)dqExgSX<7nQ6t2~RT3)d;WH_}}UEDh;hrTX&f&G`jcA@!3 -WMk?T(rMLD_I8NbyZ*T9CW`atZDhZ@WWC$^;70w7;kl+?g!Yl2_k|5DnOyT4M=u;0cu`AJZ96sZQ0$oS{oU+o*`AX0(K(KaVsW^cmPv3AZNW#*lDh#;Pdi^VU4h%pEv*4%%F8Or -xuw5l!Qz900xq6;Z?_c`gEqeV~~QL2Xp@elr1+9(18rx*a^E7mU3 -qaVIdat(9Bd2Troe@UwsUk=;K5DBUE=!$*3#0P^5~@f@6oDn9aj08>1`MCW9$2_IyMQN8PdvDan1qCE -U_l#cSZpx=+R#A->!5(uu|pKXTI7mqiyDxQyognim8+M9kjemM&}8ZKyv&~CasFyL6?2jPQ{tz -xUw5Zg^Se{W~>xOlWVaKbxsT0sG-AwHYwc~c?um??D_@?`(+E_jBwA&QRuI$nlU5IliqAs5z!w4;~dl -m6)Upf}-4;rZTb<{)Fta}i~8ca}?ixjMV3AV`#y4{!Bu|2i}jB&N)(}RFZR_1IAq5w4xK#2xKCk+DE- -uro|g8WJ64Tpq??Osd%mdf7hN}nsq6O;xTf;S*X9K?0 -*WPqnRi_4Tfg6m0VBUmY)-v1r&T<^R$`!u)+FfVq$DAu_>$%1ca*2@|1s7}!Hyzj)fCPkjfU8N$>)7k -!>)Iv!lF%=V_&#ti$;7S_$9$8!{!+Bg3^o`2(5Y%W(`Z^Yp5=}{l9~%Q4Y1kFQ=@8y_KPHcG^rF-|NNZv^R|2-@Su>-4Ko*6oQQ -Sx;}0_FoM$j*b;A!`DWd+9$79N>CLqo__-Pwtqdl8yn)djz!sdxeLTiFuKO^Z_J45L;ta1NY>5ZK2l# -8>QeRNK*e5KdQfEr(dzrbDN_{28TM=5$Neq=2u&KB5@S=p*paqFzbKGLfCflm3zDE{FJu2>L+jxVF*) -25}e-&v}0)L#o1KbmcPLwwYao|^oPeJ|T2|iBR#a3*gX1~$5Kb-aur(cZ7!7BWX#IkiWDo3wGPAC5YP -)h>@6aWAK2mmD%m`(ry0006200000001Na003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVeRUukY>bYEXC -aCrj&P)h>@6aWAK2mmD%m`;CD^JYs1008w9001EX003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVeVXk}w --E^v9ZSpRO@HW2>bPeHgCA{DA1AVUTWX}c9|)1vJL6j>n9(#hs5i7H7o^NPOv?nqIjBs*OP%s`NsL@-a -u*ku7;I6(}`}Ae@0-bHVzTRH@y+{C{yrOwxU2|{)U_YPDmbhxdJVFRlq3s4nFllK?ALM%aw*_N=X%~6 -|Di)@_HjXQ1+gB(<$h<0*}$~1LSC#HA?Yq4HMm!Ewx>E>*$3tcwIueMIU -DDVpx9)hNI6e?(E^$LTj?<%E7y%XpP&wmTgrd!s0|Y7Nd}|iB7WhcG$dIK%PDx9q=N1C=TyH_q7?Vh% -{z%Of+hGSCk6rlgu5FvD=H!pfvg#|GrQzZs;I%@T!E06$-e4d`R0|BSR^efu_mh$A^2ab~?QrLV|IIO -NQ&{qm(`QX|OtkCSzMEYj-~^19$^8!Dz-=jZUytBc?t>(n;J502?nlXnYD4CkNrN-bR!d=_?HzO=Vb; -%pRCNY6FdxMbbO#+0_;M^7V2grC()V*0sbclFPO}t}oehUTY-cS|3D*Uz7B!V?pE~68h>El|)K61Y_k -~E=XnXhju-b@N>V?hXRRMi_(^mBo-n0Cl*e-l8!P)9RtA3(px%uhlo>FIJkipnKgFfnUSOc8vZJvJ5w -ADs(}Mzmv5?#VTt9tb$H$J^F*b#GiF$eU!1t0kc4SP` -!(T0@JHDc1Jdz^W>-Gi@BdnPV2qw>oOO+Rw}ro%8elyE=%lAGZyC(%Ua^%Sxjp3urX$p50156OhOy9J;EMUVL92#-kh6G+`Ql=21{~0Oavk -tq#?!_+p)@zB9WaBh{e@@HOkICn#4xU+=hBkx`!Z5e!%3IUH>-5xEqss3U;=-P_Lg9mv9Ya@M@OiBVm -QP(B65IGq`7UwbGmoQ|x@K+)>`nkjS`(s{;-=NIim_((fc#5Zb_JUiaAIlJpe1lQ@s&1H9p7nIx|EAb -7e2TZU@pF6>MSE-2AFdnPA`a*W0=3b-%T)3D4vj-H`w>kbN03A{O3#IgG%W2MJ2RsrU?27N{TPL~&-G -dsTch~qpEGdlLw6m-~`GL-TK=Q^A&V!@0Z;CO|1OJnG{MT-payXREQ0U|YVqZlm7V#rCK7#ex*_jO{V -Uz|4vJMArp<-0TUQq&j5vFSNxx>an4YRjKc&yH-Tc(-TwzUGH!!FYu;Jp03yZ)XBQ>;yiGCXIDAWxY2 -X=XN*BqpqS?ir^5yz&kx7Y6)XiuZPNV^~FthHH*%$HPgJ{+H~|q8Z*Yow^_mLE$OTbiKh|Oa${)E&8v)z}<+o!J;si492_!=omf04 --*JG^4tTBDn2@KDp-=)X63k$ -gTzaw8~Zg>z=z)iSjo~;{Q8fRf2h0OS+@SW7e`F$;M##w-<=~fN_nO{Od%iSoL3d*_87~hvhN)mMRo3 -6Q1(C0X4L0S&Sh>M`?fVFy<>wn87~(yTa4Rb650jI>K{-`0|XQR000O8B@~!WlCbOpBnkikKO_JEA^- -pYaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?GFJ^LOWqM^UaCya9>u=k-760zPf=v)e!fXNCM+3eXmYZ(H+T -0>-cX8(#0xi)AZzNGAsU&XE|9$6>dXTbYJG&nyw2mH!hv)G-50X163X&wdTGx^#3E@R0q$YH$L|$u_* -yq`-d7p|rXQ}3*RPC!=+~4!^zI_zk2gzo$9kQ=@6(>)u%!F+DEB5*vQDo`$RG&YMHWb+#UN`bIA%;>W@?^b|a;bu1LJpOqMi{*-OeQqf|TgZ#26WMM2AKPTrMD(>$k -0V0nzNknC%m0s}4UR14WL3TFf^ZdrhgUlSahu#9WE&Ds3$Q_f2^pG8xX7&@M_c7p3)K76>j{hZw0jEy -jcj0>((U!aUDop9yIanIm|m4#&qewTb(8>37}V|nX+1s-d;fB5a=Z^`vPZm$2C+qX+A#KwS!rd@cy%iPZiHN-8`!cl_1c-o7=xD?Li16bJ0celvWY13{p1ML$P(9 -z$#ZGdBd@>@_v~eo7^Sd*2WgCImaX2>T)Cvk&QLs~(-VV(Np?LjELX@Ed7ZH?dZxLftgA5UzjV;GGDb -EI+OJ_8#}Qfl)M3BZq;~+g+j)STx_0bRP@O&i1*&2Z2jSOSY}ujJqm~SkS5ZM)347WoR*cH@!Lr%GL^ -vZPENA+j-=4EPBf(-vu2ev-46U2{sLih{^8H7zF9xo~`dcZ!vC>6+H!J2Mob^bC3LUWZxARW8bFRi!u -N&0kw!4dZn`pUTdh8(Zzyb%l#wPKjMj`%0-56V##w(f6*=Bwb;ACn$ZImvv79s2fHJfoh7=#_fyc2^KDJ);JJ_*ciBe?Xd0Y(G3NBL0T70P1g@ -plT4I>Mhp??bV`;1do4huw!9DXwPm9ojM>nyWXlLExQ1*3&nbjEgSvns;9LqsYbJ!GgK#bCTyse64mU -?uMX-pgIZ=W4en{7+Cd?gup*~4><-!<2q18;b`-!2b -SfPv?f{sk#_SG)YU%s*x81%aY!9T2|``X8ucC7pn-GP-18@d0-zMDwfIMO#-J1UYZI7vlXvQVP8^xj4?vG&U$_nnRCZJ0)m*o=v;fxN4%WbuX`U&%OHjS|Gj78c=T`!;wpNf4}- -@_Py9GwvbwwcJj;Jd%UGjf@dcz0rb#uHBD4BO*{qvCS7&DZnL-7eoq77k}$|{Op?wc-5PC{*9@*bZ8j%zXdusUCq -Rpr58RXFCo_?cfusEXNKKmZQjEQRnGIU${~=-9h5)n*{pF)SU39va$yiQ~v6vkAN)?@z(XW6)LbsyU{ -z|b~M@h_@W=Wk5mP7=UCDdIQ0+@4lxZX4YS;ESGw*z*i9$Aq_{rU>mDk%EAS?1xYj=#iQGYS6-)v2Ne -y$z-mXgKUA@)P;;Fax7D(c?nTchGncIYDE$lyO7Ou}fmgp4q?}>}t9@<7RtvunTUeFD`7-ycR`O>vp#YH* -1Ks071OXNq=OKio*CKGKR&bq1oX$w!zlmyPd769>enxR}H)xK|;Gj+-&!*Hw}t#%hC9AMTCkmuH#b3B -BhFj?F+h9_}4Iw+W{>MM@}Z5((Z@>Zt*an5SrZz{Z`avX3wE;=u?`Ym0@Zi!~Oqc3xx#|jd>k*GtFFe -n?bIA*y0-5sB)d^WXL9DGq$YtjcDrGZw_4D2}3^1+C`hSq_?+g&DU7fI6=wOGh@ -%~U|ZD+(QWk}xcPNnI?GPqe;k-fnu&c29pu?o!}f4##D{;tq>Tysv)APid!v0?0Ljk8FoV!3aB=w+G9J+cTipiDLaH$sh!en9MaewRNQ#SadeaVrtNoo9v%I|P<~C4v)+7 -OWs}!`oYE0SShx+AApGreF1Y)r%d7fP*oOAcwl_Y-nL|F-M^WI{ICi-Is6sTGV-X4q~lg68gXxQ#uCy -2}bW}$tt0^7INPwVPTG-=G}`~FQpqCSmWQkA!l+8HdeaPLg3(dmgZEc!wM9NEe3p3Qm}d^kn6cl5@<{ -E-Mr~pCMw*@tM6T1H5=Iz2gdDraeEwY_PR~+HAjOjFPz*i`&Pv3{LKfOaPYXrd))zI)ye7;ICgGtt@- -|H%u_J^AhOO9eQ{26WfSC>wg+9rfsx%rIc7!>XS!z@0q+=ar!(*{)V?GFK}{YaA9&~E^v9xTYGQgHWL5epMvmWVHt3g+XBTM -0_3jkcDD`M-3@lr_KKoVX^W28$dXQ!;&ng$%?uwRCCW+KUU5bru|y7s^Z3n!^n5 -IT`Q}SZL5aKQnkD&I6j!o=kwW2?(3>)SyA2I%JSBJt<-F`ZK^%1Wu0dCqRer!eplb!W%~0@9pF-@WHF{UN%*^7iAlplvjtcsCaJYBr^sdsj^%)S=SUR{Cg`4;lA8&l> -WObYreTNe>X+eR$0y4-D_sNk;c}mMn8n -Oa@PMg1%2vXpgnG=9?d{f6QKf{p#g6+57L_zP)<;6*jML#H98f+E+&5Rq^xkica!IDAqWR?>IP&Oa!v}-Umek)$%!)9v6(3r1f{Xu|Q!2cd#vTc -CAaBk;uccb6TW~ezBacSK*y%p`Z^eoA;lJ7;9EoZY?F1BpX??lGe3aPdk0z(3eEVVqJp)kb-OU9B|va -^4JL#Xz1GuLts=<%A9m$0@X@{E_vu0YVks`annNa@V_#HK29Ne*|xUdeU`yu%y;&-l6!2qo+Qj{&(fy -r9Rg7(kB#2UA-q@@##C??jKY!%m2T6|%geK^%;)JUdOz@N&_Jwrk1@_BjKdHt5)DgkjL>d&Bvfk|iXsXxkL`~9&>$g-9>Ndf_`WErgEBifV+X}4s4CyzQq^R-(~U?G^i;pL(Qg*6Dz#gXkmtc9M5o9OD>hUYj;iDi0X(OXf9hJ(sE7!R5$XsRpETD -cd%P%RJuHxeMzERR-%Vl!LB-NLpR&$Ti0g4G%dl;!kLbwzHc@Ay3}E40P0QHit`*m7PWwN{{yb8saIf -(OoWyO!etMO_d=wDMlS<{`e|NCXeX7I}rDfhkSEW>*#fHkJlLUZ6nI(><4@wFL+Prxc!sEDKOMJSZU?dzzbDbU09++JCIGtW=#H0_LfMm0%QnnLV*PVA+8|#0c(t^czME -102Z{7eCelA+OsekSBiAEbNk@y3N*bJEzfz&djOef$!%E%C@{!8^=n8>Gf+Oh+lExWfjxE~25K!z4#Kjid3CXC+ge?mpWlKLcWcaP&+B8&&jGj2AwPxM -;rzvm7oWI!HOSbLwT^X9l(i9^lLHul-s#fwMbdNz;eT652#iJw_B*(ChPV?x0bLD5N=4Ssqu;@{t5}M5XLxlkeRUh -CZaR7U;3t8qb;NNtPI|#`5))$lI0{%&Vg_xI&M7QjD_q1d-pRF6L(kI&k8hBH1%*$0 -TykT#Mo$i#%#CK@F^DHhe4TOh*)EWFdW9j4%B?`Y4VMiNJ-15?oEN`vLLr -#Xidu14um}d>UV^lZVW`z?BWw8S?zU`%BlMf6QgfUzwSw1l55k`(5Yj`Kb2*wXta#Qf*!20nMc)$pNL -%0c9p1_XCP9gv@8N*V47fzV6Hb9D0My-R{RqMEW?_S%a|?QNJJ2qVm%j+maWTOA`D-^yo4?9HVz$4x)Jxflc -}Tzu1k|kM#4?417K#Wdk-<)7}%m{+RRj4d)@+Cs0_dk+r3HOth=%s`KxNkz997asDEiS7*us$cf#Zq& -8T7Nonj69^6{2RppM=xHUHE{b{vDC+Y^xN361Pamc=S7)K#gJs6i_BYV7{A+LQu)Q--}#AqE^79Z3{foXVXUnPP -)|fg;+_CdlATO#0|oLHGU6b3Xctw@t6VJMv06c`VxQp?&g*EHJFR)j*!%eY7I;7dD%(~G)Ee{=YFFL) -U>JgYgwY9*g$-crrB;EzC~vM*ie{PW$~7`!oRXQyd((7bdK4b%*^kL_H{ir*Wy#_t`9Ec$61xEQ6gj -t76Bgs-@llOF`e7IrZg@qGDtaQq*UjNddNiM-|@fiU;Lyb4c7AuaK$im8ZBt;JIZ9{ -n^rXZHpV4&U)(^PGOn=u{s+=4>%D{&FG;BO95yhcO;>D)h!q*-2F{8-irWKO)s<95zx^>y{G)(VYT&+ -8pgPS~vTm5&W*J!Mm`+*<()Hux(e;`pWmP_(`^c1a~jkOk+=^X5+ -EgK6#(0+m2yv2;7ZopXY!<%S75SPG|Bn@!g!-L$1sOaO(tWxT~hV%>q&sfT~^Xy%%hiS^r2i&xOu7+P -o69}Oj8Mz$Q#grtKrYI|VKs}XR;WV=wn#{m%sIKm`>-B#2TWTxO5(7_{+Qo(FfU84L*Q#r#17?m1WyK -6||vWV=@zrL0Z-s#gOeYkg^({Otqz>2aFz%$-A!9Cz*w~&C*tdXuhX89#NMf>HCP8r7%`;}S+;nWpdP -}d=?0qtWUhVVXm)ocRuO>+ZeQ=^9g!}f5YZ{;A?v%Dj<@`)x1qV|~;hfq?NYmC(2xizN!`SY@pogoS`ui}VYnX^tzBlkt_ -#Sf&=erL>bxVQ1K0*^mEvGAOT*H(>aa`bcU0b1?Q49BT#?`9t08V9!Vn%J;H$1^aV&}h4{gPuE2UdS< -0y?E(#~c7Zm`hX>fmlSxZ^$u54(AT7ZmU+#Th2+p&(l8#aa%MR$S~h3CP0?6P4Th2o5k5-DJ* -0VQCj?6;q?fk6pkHDb$kJKK#Q)FvF~4gVBfv}7ADa}Bw7IHnGSS1O3*{ch&4#jHz-r0P=+# -7XgiH+*(a>OmuRdiLZH7|Oj5$a29~WwEA_RYtw%-2GVHxZ2-)jlIGe6sL#A^E?zHU+Enntt6Kn_Bf#n -3ZY413CcdYP^K>_fj&v|w8mV#bcMaUo#j05+u-$>6C&+6RG>I6+I5`yqErP*W*d~_+&yS%N*>QgRvz5 -C&{PTbFqEGoBzBj`?5BX4ENi_E36_6;nruXM-Pea7sS?=S)63OhjhR#8)Rbh`twi6f{?P%==1=+Mq$uOVl$!t3a1!8Oi^mb|v=#+@ogA<>f8kU<@_)4mI*qzY|=yx})H_i%>ziccx -=P$qU-079RJ(l(}C)L|Lg0_SOiRm<}j(hXk$5wJFD{a!Lq(gfLVUWK?5O4mvfXo#sUn2qF}J*HD?KxFGcU)@8~k|1u)E2vBSO3{IRz+$6Z-mZ-`V>Gql0U}&?Bn&_yiHa4#;q@K -}~ntV}oMSj5JCgv(5NcVC2L5)$IPD_pArgNj+?ry3D4e?RR`D;+Urig?DUYpC@P(Kk>HQfOG%;v1XMv -fT=J!h*{?ZnL)SwaZHahSN!z(NW9py+8dT5@e}Lt)GETq)HyzN(=J`BO}qW2{$G5K-<`f3wXYv2mQ3y -7F5Z28b8}4PT-=Q_vWIHi;D<+G(i6W%3g(!f5`;&ADgEF3>C)sXX?Us~+)NrCY7b+-zNHg8%ZLU3H} -u;lmi`7P4pOG3opUz?2wp&WmLJUz3gWr8O++o=@}`v#`P+#+7;hWsW295Z7pBAyTB9UTVR-B2%&zQ-ieXPIc)2XjeV_4ccfge(T&T-0hqd^^Z`2wQJLleu;+gWWLY)94Kg2zoQ2J@9R`Q -q6U5%uHc2Lm{904xZZ7WC5O_P32f2RZB2sKU_prrRNd)em?aj1>IzH%CTJmr6tB+vSETJ{+*mu&@irF -|#&fzl$0nKGeL~j)CJ|wf(f+?9-5-IvN1~1$sxMl~ZDv~CfwOy@JPxItsRc0Qen>TJj>7)$WS!}se?9 -J3R{HAFD!i)m1Pn1Sf7Uz26Trl8gaV)-WSHuT8gpymH%qC#MBRcBEpOL;2X!^L|2)s7&KmHyQ8>r`P! -9jD%?hJ7aM<>qV}lu{gR?$w=BE1{Zp8mhhyBaPynx=~eE>7~6B9a1801;r4tvc9%cjE+|Z!`2*}2M|5rTv2eQ3n}9oe!esB9l27Tg3`J;~vYU!&l!LG{L4|rSf-Wy%%aUtU -_wLuPT=qyu!F&?R@eC4wd)l-eFYq??c--mCufO{k#uJP7~ -*9RL6TaA|NaUukZ1WpZv|Y%g+UaW7wAX>MtBUtcb8d97AaZ<{a>e)q4iQcZ=5@dF}d(o}U@wXT}F?V+ -kF%YlP<1)JI?ZT|hv7zhNCRoeVQeE#n4yYJ4BOskSImesb_z!()}rL?7dZB$WPV17?XYcEuu3z-v=Il -oxLGZWHSUKE|@wcp;sb1gKKAngEaz;?I+;0FvbnJAzGRa_fjdJi=oScxje#1^#VMO<4^n7F0ZxeA#go -}u-)i``WNk8k(i@7d*-tIMzK?$_<@_3dXYJDV{t3B}b!9Y^>mcM-i2#zyo9at4_IA&j9MsO*Y9G=7V5 -<%@_erkX7xkDUtO@U7%57h90-6s_cu5GMg>%+zWT=U{IdTfms)B{n!DgrtzsX^5c7XjRwHh|)7xA1s@ -a9;PH88;>rMs;p4b9J(2+JuWZQn)k3(5Dt)?T6^>b*ZD9OO6%;Rx^><%b?Fj?6cURGy5LLt&YVYMhlrlXzm<@|19mue6F@ViDQ=n)`{a+|-ZAv#U -WDBYE>RHf3AQ0RHOHZrBL-OF02wDrW`#(sVJ`d_db0GsqED(ub>S6z;v3Z@wh=8JQS*C?f0J{?3BNmv{;fH%!Wz8~E;nn2NLs+6IVd&$`mE6{< -G-k(oroI0v=9dFbNKBbXA@T$u4lL1Eyi&WS2ZVgIMf|Elm_7tihOs(Ac?CPO;-P+MRY+{c{j9W$!d2? -Xs6Q3L)(8ouesA5cpJ1QY-O00;mj6qrt??u(Tt4FCX#EC2u@0001RX>c!JX>N37a&BR4FLGsZFJo_Rb -98cbV{~tFb1ras?HX%un$tyO(piCZh2eEnr)VK6n|;^`Ru+P@oltP4S-ayc{1I9ps=X)}XM6qwV9j@j`jN@aGJgY>7W!{=dv1g3Dd=|H)la-C3y-)3^KQP3e*Fje9b& -?Qxrdh~+_{R4lxA&^xZQ_);mU7OcVR%%|3uLs^3&YhI;=e6B0W3x_S9G5D1_<0{{kPa@ltl~~||gQ^f -~yUSW>Zr~4IF<@$1<=y5(TLO9eQs-_TNY!HE>q=xrIVlaZuRS(4(vY2g_w -Kvw_Ny;%|C+u3_U+rdw||-1`IL8Zhs!Ala6i$p@lU(~kJ?P2zahII3?U`PVDR_4J}%gw%N&gV@1%4NH -u8;t+Yg5Zjp*AN9xezz>CuG*|)Eoy}-pX -1SXWp>=O{XRD;96!K+&osk`+2nvcC(jaq3FfS@XmT6_r(=}vTe-$Jmg7w3nazCGyFwwkoURUH>VRf66%~30-BXL%Xy8@*S0dLDv(Yz##M -TThAHWW{p;URigg@sJG%K=apbPc~0!LlP;ogC$oVc#0`mt)*K7Q^`WeaG#R4_SyjA*l5JNYXxS@#;(1f?TMKSWVK2{byH*Y6GRl)KPmo8eG{?EA%=l#m^ccsSC<;0;{iC47h2>RZ0W -HxgXk)v2m^!xWRLum-3F-OT&8#OP(l9$Gz;v?z*8tFK<~t%fXR8qTzw1j;Orl_-w@TI<3wu#l}?QgKt -UeU(1LBt7XI$G@CQ4-pA-;#8SD!(NUuV=e9AM-*&rVjv2LI{jDg(+dzIY(YUO0!Ndlz+y1`;ATZ4w7& -511vPv`=rknM%mU;!xlH$d6-wWDJR5|K3o4pfFu99Z8&$T1`blQQn@X({>D6{rOAdSsehvtrFAwYPee -jL~7H?BkYgvPBWSsL_BUD~=PMKH=Y1aQ=o*G@|(}84zMAM2mJZEP6;3U~5=gRsy20EeVbwYDkqKHZmV -7SB}t|WD*(cOt88u -3tyLc}HZm0=lcXiB^7tvZGwjT8uNOpSDalc*@cjJRpWMZtwVb5knaGVH3z`9^Rx1m}1>gormyiis6cK -{DE73ywL%i5OSg1DPY(6o#{>66}D@M_$-jVSK59>ZTEJs2wwLG(VE<>1`8&!h)Cz0h+~$GiQ=5EpVJg -6>)T}Ac$0ai|5-a@!W3QV{Ly}bAz3hzRJxgWqR5ZYRR;+X(85!Z9Km<=4+IO4vmTpSPqFp0d!KsLOzG -)d?S}1)Im&jft}8%hNc5TM@l2Qa&!7`{?adR^CweeVYfaXN1o!gDRo86FWpeyu8g`63px~Yxzld)oAf5*bJ ->4hhpWq;Y1+FikfzT7{?f$6d8s4}^BogSCdsyEGylamsvdiV -rJRxz%iJLW^h#i=`V$aS$CtlD@(>U%}RjdDpk}i}$9dv77CGjb -N=GSGGbmDtDhqn`yOGJ_0k0jm2nD95l+qIVj`^}T#XZ-6o_8tgQFXM3hW&I@58htYcu={u~;4Jr0@Qw -FArgRvURJY2D@QjY*TronmPuFdjTB<#zh~Y4eG-+_rOCS%04G$yq=WW4aq1bpTY&VN3pU!3FG%dy1dcv%25BpU7S+$E9~l%HG< -+NFNOb4Qq$0#wIr$VMccF>r(Y-W7xL%CgM*3o5UY#84L4YsgC3@m~*=s?S!;!egDiA#=H~LSwFIZm`G -O)b!8|0CLG~(mim@yBol3MG@kz9@4u9k%_Jp$#NZ}a=EXA>Fc`oA()lVP>ZNkQz5?r}mpW)VPr~%y5b -$+itgtE7klQf!EDdWB`Go>=7pR(8MGxsi`UT_;g2rm-<|GRvZhf9!3{`Xhg$2J4zA$;3I2aKR21Kia& -YdRZt0FMTYf5bf}S-BJzuZv)qtqf>D|^y6}Zx_dUjRg+5B$T?QE@0dIW -i-VnSzCik-WU|>E$PKP({+O3en&uxYRET7yJd9y8>X99fVc*ct&vjeZYHjGq+WgNTRj;rN~+29oUMu0 -$F94(^}Sr`f?A{)w&*T-0n8KDWOdER{hFnr-SU~lPE!kK9h-9~)PSkRygKa#=#^@sU@@S$@JP>0|@JE -5L#RUc~W`T^4mcjnZq%9H)LpVOO8G^9VX# -r&LhanR+SY;r%bZw%tqbgT-xkC%hg=Z$Urg9ue2_n>N>fj{GyNf54!?%O2%;b&@;i(#8o_;$nW=xxJ& -%yt@T?Zt+?sFShLLQrp4Os;3Jc@b1Ph5@S$+8ty3)MFms>@t2?D=EDEpZ;P00(<;0rT -ZqqWm#Tv)E@7X=Jizp%Y5~e??qhRJx^+;?CHju)`yKfetJwB2d0;U%w&wS!Q?+sO9KQH0000803{TdPPfS(c6$&20FpHT0384T0B~t=FJ -EbHbY*gGVQepQWpOWZWpQ6-X>4UKaCy}m?|0j_@w@&Cyf}FhTbYiNc3HGKeQD}!-WuDB-L#$U(l7~Go -GFq8NZVSP|9y7{fCNa&NxXiU-`*kuxWnOo-vNE_;KAsv_^nQ*Sc<$-Y@TLjH3T -DWW1%rxD3|B20s0UL+m*7AL-11k76N)z$vUnI*kep(2Ty~2@o%hNm&w|4m_m2mlCcplEs)8>!!Y>|rz%TmaggY9Ob03jT*M|g4aa`Ru0 -H=jpmUk0Zi0_4}xkB5f`Z;yAsj}8ux_YU@tP;w;n*1Z^;<{)S_?annu+?{ac-kZ#eh}5(qn`zHpsrz(*|ivk?Q8g@hru0T7dqcg@f&qXPPI)QYeaAYoP$SUTc`Qc45P?cf=A6q_ituPgCQqEkV{=cV1%};=o)KMMi6GFp5MJSk~fgBaOye -120Qae!cySKn5TX{n;qcLDtSrKotVE`JxRQ{m7>`fHdws$|U$wm -o+Y%u?Ie)u_0jGjt5#DqbW04H+ZscBHohIx+TY_v_GefCounxoGmb6R*}f-C2Rq~sgwnngPNF4rdE&4 -a`c}F5&^)4faDfG(4V$=X0EiO6pWWJ6I#m8CzPZ+RC@@u1x-B`4gI<2v$4h=bn2?o$5A;Bs{J{2{bBn -vXt@roptL-14m$I;(q0GVY*e{}yB*i33xl=po!p|ETw9esDzmhjnp$#7zVF|Km5%zJZtl`4gbO2g=I&mkbGJ*38t9X%4%mjX!+7RvWE{(8foZuJm{}WFLOw!!H -kyLYVTaEuF?{W{8HRH>l~}-pX#;*HpAC-WXpj57Dfo|aHArQnKZbaAd8Ceu~ft}r)D;_b>jbjqVfkMA -wwWK3(+U`Goel*^gkskTEbv|7$>rhL80jWq6@v4qhC>VhFJ=WrQldWZjn>L-j#8%ZK*^#N}13yGS#`s -Flgy(f^{(4=5_aj)|dHhtzh&Kny2Sw}flQ9wOm8#qBjJxE<(KY&Qb<64 -rJpaN+Ln&LXt3D2rUQC~u4T1z-&Og%F^2^|MLyJD&?u`MH#KuZKvl9rPNCOD*psn6I`nSs0y(!S%hY2 -QFb*8~L3B+AmI&+QvQrzOo5Ua%K$NJnkBloDan;;CkhUe18=aiq~}6Rk<4hMi^GY(v~3dr5c&a|1 -Dd?OiQf$XMENDJDCd#|LKznMA -Bg0vO5wY9zd?5hUIKZWxZiX2IqjO%Lt=dlx?wJwkDwIkpMi;P-f>iinn)@HiI8=WRh9D+c!wS-!wjh$`418T;P6odbf$lymXW{;ev?|3sFqZpjxM_|AhZ_4qy6xU6^H%yjj(l -Oa->H=n~Rjn{nRb(7VZ-f%sp=gPx0Vr!?L=45S7QC7D(^a=`w-E7FWE(x&{B&E#a-DQs1&)G&?P-7N8 -aFS|Cv{s*76{X3yL^Ye|KO$8*sodJsG;tTPd*&Wf*@&O6eVd~MG<*EZ{!5mo%zrma`Y0-;4WYTrzJOd -1>u*9tz+n@*P0r`uULkw6aVZ+{5$qXi*GcXrnQ3>Q=_d%gKW>Om*y&N_zeL-<;btVCC572912ob%Rd@*>Bv?R3 -P1lDiwfL*}QT$JD~{CZ*pY -+Y$ow-W^v~eAK_TpZn`QI-`kIEp3cM;u%~q!uk3LP$nYEjsjAH -GukHP_H=Nx6|VUSOMD#uE^-TU}cfGH@U-Vszi*>jC62lRJC``$%8K*Oc`AWGx(`5F7dO;Z@sMo(?48S -Y7VrQsbi%dVo+*I4>4^0{T<=~??l>bTKuSiIpwl8rKbE%-^GTE{bYJ6HynaFEY^>p=rE=ols6Z1;XVO)VQYkm&OYUpK&2&U1CJNSeeSu>mO9bm7vN34`7PMF&hU>vEF){whGZeCo? -@xwIYrn+x3*^FKH;GMzz8!eKOvJde{Q_6ENdz1PSYoY>K#Hl$P-MM%270D9XuWudNJ+)HaA1AdENPwr -kz5k+t^p`Yh}8rgK5B`#K);-`Z;i)5Sqf+NP1?#&o}Hxa~8z$%H4M^CByag6jsYNv`!!H0St=EG0ATw --Ub`E-4#%dq`Hs-aNG3kld6x7HHB+$}}^OYQ4q?p(zKxTiM=4b6{%ffMdjjKX14u@D38p1MJM2*p1|+ -l@ONONNWuzxPijWKFJGh1I&;TA>xS=*?h{D>e6cx88OpKHf*b)sO`HoXBiv@BHJAF66rz-Hj{u6dnS8 -1c-hn|Zf5L}I?W#`>YwOa4cxwM2GC{e`genqX7vW!KRAZCjBO;Aq>AeoQ5)^(0` -xSk$UpglV^@1k|3I{6mf63#bk_6uQL`kd?nSfD)&}v?akib0h6+ABExxnhj!XNJi`{(bz0Q=8i7r;3S -fqtn`dM8-oRdc1>kIt0T9UqH%ed?zY?T(h*9TmO%@}SHdx=!mNEqgy^5S3m)l*<#SKl7x9vRpX@kyZT -`ZeIiAVun7!P}Ts(o+!<}Y00n?Bc-IT$`=nYFDHp9Lxi+^XRng&_Svj1fFC5E6aaLtqXMUKo6jXD#+D -hC}_m?TifrZQt1a(^bcS7{K)#&u-(=&o}_;3d|5aj(-J&8v@Gw%@_8`#hG=tb{Gy`$95h2H6_YvgsCFn?%?ct2BK6ta -V_&sKm@XjDT4?N!=<;hB2jrz@Eqc)mD2@r$uT8+a1k{ZnM-Om|5_7>tk2Jlvt85vrZ4L;Sj7u--jT%c6&w(J^w^L5JEIaHmO0xGWSb92Xe -Y;S-miNNL@-RqIH3}bg*Sr1%iH@(X9?gR02OiOeSVbu-Zg+nxkRFW`khh)<*;9t)J$q&yl(&Xcc@i7Q$@dvKQx(q2L{*kMV*_$f$*+H}~GFdixSyZ| -=W@Ck(VBY*^M8Dl8yUT*{&@!$Mwefxtn8II;EoPtTt}-+un=`SUH^;|SUhA8}m -YqlE{$u_7yI!MtXfW72krDkj1hBY$vQJG75dBcb()56=rcW%6UJC|;GA-{%WYoVjuT5q<c!JX>N37a&BR4FLGsZFLGsZUukZ -0bYX04E^vA6J!_NO#*yFkD{xe)0G3F|a>eo0CbUo1BUVMPlC1c0iV6maAs1N?VDQ*o#^wKh-97IIK(6 -DvFL$WYY8RO4nd#~2>F3P0ZT3-?ZHInnS(ZiR{?N32l&`y{8hV!Tzwg}>@2h6FE9;&7v+3k--R01imH -O-08NY6tdRwYG|11yNvSRnP*m6;JJyz^e{3%=CT;}zTWo^?y%T(@A9@6ZZ)kV|FLWiqe*0Qb{+70U#Q -CHr2MbksRxyrG_Y0LgGlr7t{y6+@}_xjybRqCJWT3$DGxyh^YpDe5MJ)5d|&DySPYFYO${LeeoIOJ`| -qP*k3WY?nr*x{?kU#B;1emFoGS^XWo{=R9hp5|4>S`(RN-LtmN70z!i8LI-{)AdkRMaJrDS@KQu_V69 -Pd|qFdZBsk=Qx)0mh8=q7ujK3u2S6l1;M*=(1i7h`MH3*9Q^FYh32tB~!Tkp8gsyE -!MXzUIIevK7+U8RrY1Kv8O5{d~muc%60(+d__pf*e$GgSgdOx_~F1m!dj}bZde2MU?F!40s(yCP~}Ie -wID75&1PK*9EmR$T=Meu(BZo1*&csq1c}%6E?Qx ->o@nH1z^@ -M3t&n{>R379&<;n)_VqHZp-z6LmjE6_L%O#Hs!W7_K6Sj -4f387wfA{@WmJ7lf8M)y4><>Gqm>j9QdkzR=v|W0Mww-ED7L9!(aDX#*npE}jl6TtCw(@X(f{w+0ftI -@cGtifyF@DJFM$K@^JBCIEX&0m!L9<$LG48p-A8I?7m -98_8Cd$P%ECs#I$~U*Dn#F(fFu?HRDae`I29pRS-oj$76Ju8ba_^kJub4<3&4z7d<~3EmBNj66dvxh8 -sKmMuE|zEw8JPgL2#o0IRzRZK~UoI&}bEeuPc-w>Ov=q=|MGIlo^GIT!>>Fn392F&gY0HjMmjm!kl23 -xEAQHpY9jCg;L!rnd|S873#SY%L*S^C`r?F9xcC#uv6+QEKb(aIsmlLrwAqPj))ytXF@b;5YrrY(|=e -5jWQ1K0q?aYS@^2|a0|&{Qz7|>o~*4wwAjbG>8YQ3gbJ2Xa0RMLio!%%153bP68QpD9r|0Bp3gOQ0rR -IITL`4ja+$zK`RhHqL}ri$lrsJ@N6IBsF%QU(5VPX{6yz1VXZNFb&)-E~eev(n$M>&HR%DeTm@5)^69 -Hy!_f3?b-c!~erGrP#iFMuNc0Wm4bjHkty?rfGrbto -L2Gq<x+wC&kwMgz2q;-lX-;aK{gnnH%RngH-WaG+| -3?jbC;)r^z6QYs(ILN$eSza8Y{5mfyB;O0WqaAFj9S96Xwm!Nm!069!(jBxORKQ%j=%xgufc_0oTVv- -h43HNdH{o?Ns_XZZp%jz1AWM);E_F|5T1fO(`V4@vWbfn(q_x!ydcUMHv$@g2#}0Z3!bS%r8R27BHEU -423t3$XB=E^?sJm>2sxY9DShHrVjy5nsuxF*wQ;;h*O^d)pO*x1N1*WD*oxzj^gY|5V=1eMsJ(^DyQ( -R5-5G66blNZhe@VC$g|HS|Yq9)>npypeY-MV3e3gC9AeNAo_9_#|@(~vaaVWMc8DN)~!K-*3t3B25aL --7S#;bA0i1biV8pe&-+cA?gGRKf{D`$x{k?s@>&=axXOX0xE>2S#RiQk_(t|2N;<|@F^)tk2^>-ZWk9 -2zJ4;bk&Gc}m7o){vVe$1q1{=Y;ECXl46*y^;O3_T^(5^ODiJIMbnRY$9JUz@aQct2d3lV_V#15CoY%Xh_fz4kFpJ -9L=QBj4*`DjBWFw>SqRF68Gt`6jJ}~0d~)_=dDBkOz`dqpq*|wpiuz2Z@>eFD!7=eNXXe%`OerrdcL2 -bts6xT8oIMwv|@+*iTcCTuYpiNy~ffZjfd17G?vOQs7we#bi_dv0{b?RU+30WSq+6@yB@Fma23Vegz} -(^qX(nr#zaA}rEn6FM_SH1fiy=dyok1B)?9!vxNCvSEhLA` -xRW9@5X&ICAkzo`>Dw-5v)OZFy9V6nT-(Ks99Yb@8Guzv?z|ACdL(N4lxoiYrs)L~tr4SHvFmYT16ag -am)OQfJ{E*RT$uQAZ|L!+P0>)Tl;mhM`*Q1G1S@dcSkcsRA4$f|#SpR=05;er#}D+U7GS6h3^T88@?% -HaVNVK9RUH>xlPJpV7Q`#)m}m}$TvG$wE-yh9%}vesC1H+7`!<=aJJwzUXXj%c5J219L|Z}x!i@H1C! -{6K&0h>Hs&ISQOctWoqPG!XTv&X057DCsTgSevK@I>}2W_z=X%xmDh_+nlZ?tb;`lky#cVgKrY9@DF>Y?e-f~;|wzlnO(*@=rxC?cfA*gC5lVeV@|4_ -e_Ks$Y23D-7HmE2lK3M@JLbI6GDCh6FEkjz3&l9lCUl%pdE;oveOnGj@;NVrlB-t~ekaQXg#E;w}7EQOiCE`g{$PFlMtp+>5nii?vr -3St9=U^?q+)fV%g>|LDte5|&7H-4FVz6 -JzbFR*9iz!h|UJ5Vu`sLQ7@^`5HnUQGKwy1fP9kfHi|`$_4D%oZIHQEEp#ZG{B;<3swebE)3O%yysh% -w0PRJ(JY5fIT{kzI*uHUEs{B%09r`mc;Rzh!%!O*R0Xo3nZzRt6GAFGpZpwC>+uEe#V>QOo@IP?yE-L -?i_VZjH$q{sJJ1f133JiEw3-pQS2b+r%U#nHa??kiEY|@kV4^8waf8B*lFbG(La^mP<0kRQsj_5sP8($s|tgS=t6F=3R7aKi}jO4M3IxSoMbG -OWF_Mt)!h|P6h!^0Ggu8K8^OpSA@pyGXL_+-w|0t83hdZVspcBLS0+{S(lqjX+x-oV#i=)4QxPw@SD6 -XBBJuV+BF^80u4wc5x;#;0*IQU9gPTB={2i0UT9v73A;e+>)s);3ykw1e85!GCru1davw&vB6sVhO=z -KcOP{ -R6@sL~`%Euv4K=PAZ9)`k8wcew*!H;Dn#UMFye2Kt7F4%Y4l_?$!9_xV)AKGz -LU6l&MQ{&1Y*wm9ITp&fB#%h0v0%1(T95-29-K=$VEOl_i}BYubXQYj#t2KD?~z%EW3rR -%A=C*_!L>XOT+ABz8K{vqnu=@G2!Ee*gzz?gZ9RT*Elf`slpNG;n5p<-bjE{u@>%#EtRGuHIaO58y*1 -wq83Mq$*=?$LU6quE}~^`+5EJ<@tnXlJ~(&dF&V$N@0evK*Sjc~g!zeMqYP`u9zwAJ!^>apYQVj!+nC -`ft24SdzJZFk3RSXZHy-G~^6`3XaSVrBm@plN(dH${zg_~1Z$yZnD4Lh1eh!^G$Nm5ekAYeM6OCc;xV -iN_#JH>n7JJ|vSDMvBLw+~enFS*Twm{BW(WeKU^h{#A08Yg`5zF)TorT@LIid5#MBg+dBkq85#8Mo$1 -!!SS=KL&TFl#s!!U0Zpp}U2Kj$nN}X3vZfc*=RZ9W0_a#)2gFUeJhd&+p079ue2NLC9nA!-JSQhC8DhR8XwE#U6u@Fb5TScrE3EGE+A=93~24Hp@O7%cbXFWes5lftv5+)m -6VmYTm3JqZ}tV?7)a2Z{6+^prG`=3*rff>HJhThnH$i8v4Pw%EaDkD43JlGri -P?~Qj$j|B%ZK75L(eVvBFO1YJNb|a9e_iT%8azPFWi4NWk7@DHKDOnFEFeA_T9lsl=Lq(Uceq1jStEo -dYeek2m>|4;{3cmak{zMP$*rEbG562*>NL)@?P8$JJN-!+itLW9ck4CTBOnQeN`J1MHfuSB}tcxHlk-_~`;LiplM^2M?dUn -G@SK65Q#hZGIwfU0_CEVQD#OhtZ?5BF*5rbxlN3ggsD^H0ad8!n1K;6?7KuOk5rX!r!n0b4wBE10n0rq6eb@>_Mh77MEMV?QdaGOg{G8uub+Z^ -XmB|RRD*M+u*@E^fefGK;Q4+sT8)GkqDIF@-&THR9>i+3}KfEPEP2hsSl4WtFBNwU?6x1&kx8BN3uBHHSE*U83JO7Rv` -S3%B!c>S~skf29|Bxd`I2}7(pD52S17apWk=Wu4Sq?vp0>@Qc$Tt%n`4pl4c4EZ_w3MIXnZKizuc))5 -9^Io0|K(V}IGyU*hpNKpa`7T+P6%FypB%H%(#tf6CkR-Cw^XbXjgV-WvD6_3XAM@0+u;86B3trm&?z6 -A5lKAVAQ{BHsqR2l7egMvoOw#LibhWE%Eho|Umt -8U3iaH6W=Whelz6+qI*-=Mo%4#g1o3!HzFdKMej(XPF?RP&SB>#|NWML5iU`nQ}8!dAqRe=SI?lYFY* -~4$e$r=)+#tlJ}c3K3Gf-IPXs -xtroV;YvOfwTI>M!=JN9384lbV`J|cz7q*T_u9lXMZIQWlP)B7#q_QBakd6Na6 -Zyoz-;2nsINY!ssRM*&$HY$$5$8M)))n_MF-0`9hw~7g)v30V!{_nw`;YS=K46470XP(W^e2aUu27xP -3qB})=kbbyWxSmSFz>F5FtYBchnW4%*OQ_yAqiZd@?*b=&w*9+qT+SW1w31`G;TCkiHJ%X5c -W+CD1Rp`z0XU73plr$vBGj(Kx*%!GA(00-gjR~Zz^+;a?+$Ak0>&*dQl*SR)CXIqq2*&k&P8=cw$n^4 -iP4xx~N&~}b!=`k>2r$xPYGzwfy;vfYv8k<=bWS87FGR#fv>!(oQuV8b=9A;*V?m@@0MOtQwh1El2HC -Wr#`Ab0Vr#_n+kL$oEe$TD$dfQL1!xs;_xr(TAm{ovx*b0=vMn>4b&(nY7Udqh*^SVkYjw4;=HaM6{= -a5Zdn^2%s1q|5FKtRSrDA4A@ZrNtwT4@w7H|P&1kbY*NG!ME8oq+cc0M3@nx>=%GbGg~>X2z*{GJ=G+ -tSd#IV)-pLPqO)uOaQP#4+D=YNu|6ef)r#-D%wMpSEEMZj^xufo<~`7M4hxQFXqrxNXawa -zSXW)&aE&S@zRnZVVE3DJsqy8C$>PRvv=SYeuo@Igc<-?i3aEc -69sbW!nNp&MLg$Rs-s2g4vJ5*Q#)`|17On4muSmI;dKr*#YsbPKV-OS0+TUJf5Dk@8Th#9K1*xz7)y1o5Y#a{?kvJVIOQPd{P(pMFAxxVAz_E11+~*WmPH^NPi|1io=4wAk0@bfW1}o -|?j)aZ%sX@}ikR70Y1 -gsmoyNW>Th_|D_JE5|GQ=(Hls2ntm08u9?6-HkJw9fd{=^}(AqQ+IZ1z;BJ;~jc_HWE+cc{uf8G&Pyh -Jix6*LW=HYl+aH(8`-XC(z$+lEUnS!PV+9o`WJsGY1N^YQY3}eMHQ@gu=lI8Q0XLm~N4B+EVDQwLF6u -H+n5ZSf#A}8q{h`hM`PiOTIuLc27L~-46?zC{jGy9}mYzW!DX`Ej)hw_3zF?ydr5g-O62T@G%L~uJzU -oI$WtyFM=pt$zQxcCS1kbh%53eGI8M7d1vB`8iNBWoxB~%Np|@Ziw|+|#3y}X5V3U$ghzq~N(GHuqh5 -mey*iZU0p4sg^k$H>Y;4q=<-e7;)cjWFw+}`_2OTr2`=pN0P`M0dkV>%6frA}&;>VeT36EXH#bNsCx< -Si{3@Xy3-_aDR&~t5&;C385El2l9>}hB;uKQDo|E8V7@$lx(l>->F<0O*u18>cgc=K3ss<(A>WP>>lC -0X9-s2EJP_YWS?qq(4Sa4Fjj?`ko=h&_)P{kBCe?$xS5?CaW%s-e)zGp?C -))rbu?md5yg?+c-P=L7inFqCv^&7A=LLbU2i_W~lkrs(sQVjL%uIJmC-ld>qfkXgTs|jD9`WXJ -S5|N7Sn@RfLBX3$jE53=vJi4qZG6*`3D)2ENQzQBo8i -0Q3<_B5}tvbc1iWuR=A{8WUVQqPSyD(f51F!CV{HElt&F(2GWz_^nhI)0Xcx)vw&F|eDMN4BONNS7#` -uc8>$=h$7JANaZWbR&bXkb#;hZ>Tt@trB{(h#qUyY9Blr^-+NqZxR8_I^sZlvpWG5jX+RY-D=!FE0)OFXI2KRl$RM#2*xMulQE&NTRc -U69EuM?%-a`>fZ;p-SOY*tMky)!q5-RIDq4zBLZb1U&ad@qKZwkebR~jy4o7oXavR%|jV(~9yFmmu$O -jD3#hY;3y-do1?yQ?m=I8`?Rv?vUjFot2W1E-3S@)h;N1dtPRVi@+hoNq6h888RN}UI&BjnBd?i8qZZ -L>f0oxCrgm8s<*X3!DMRG<5?h8liqJK|42nP~dyCwcz00sKAVr#4aCd&PRD!3vno&|{bj_cBq69&Pgg -ZK0FhWBncLOe+TjY*NM77#8&buW05!5)T`a>Kx{L}-5?cwdS -w-?dN`WhV|J34JZT-l^=KDoj)bKpDvZ5#p!e?Blg(T<-aOLRsQM@jjAdHMm`l?RFHElA+^F2^6<#Tv) -W9dZ_>P^>B&lZ&^FJm{7Wx)iV)t3B0-PSx?g*D5620~Pe57`IFtEl!>CWP)=~d1BoGHgW8*b7yrxuJ} -RRlR)=qP@xoLi8+~MVTs<%OO)%9^_(udhTrn}8n4Wa18L!wSLZ28h_-me;9=BIpDesIB ->n$vh%6&5mz%BfNlbSoQ))YMn~JwMiMV32I9NS8s$Z{3ZCfGI?$&A))ysd3Tc+#Ej|G@Fp!|i7=H)Qa -B#yx9GMlgic%lOr|@)nHGn|jK#;a^ke1ofLL=f77V`iWx!nLXj^$%({n(^q*MkKOIESBOnM@$+ZVAO9FV{ylDvUo>BT_0?GY^rkH_u%S&jumxqmy9FrIJ=2~Q&+*~BfQ9V7G0s<|!}LG--s*6auw{kz9aN(v -Vs~IMbr{N|;a0nVc%qGCOH@vI`k3-VV6248F;gI~z^xc`$3`zQk`n1R4!WciPNol?QN_%|D)c!q4m!p -TmZ5&${gfB^*u-g{YjgStnm|z5s5c@ofd(xF2;=# -iA29D=wLup5_j#@g!5d%)(@jxb`tMD!Bo -2D&hbRGho9EyPu4()H~Qq&QNKvqhHDk9ysyjt4d_Kp-Mv6;6!b+L+ZR~Nna8IQ|*on9>>lLr}`U~2vE -yB%6mJU_l%y~2-g+gBWp>m4-#K&KCvIN=Vrik)(7%jfLFD!d7J=xuY8b#dzU)FlO8_HaYV -iK%RRJFP2w!B^4$fdnDvbvd*?mgE{TMmXA#5W_Zsf5N8swkKr>JIb|RNVaPBa^Z}U2DLYWd#~RQ>@$b -{XC+t8pYHcp_ddK)6#4;lTPSKr@rC51LR -#}T5`Szy>z3tLcR=ttCNq5Er|O_Iyf@XzPt_bulePNnEvtY1X)_2=)m-{4ki8lPY|ZD8Dhzl2VReoqh6+HMV;VX9{h(Z(^C~JuZAu!`5J}l -o>Om8x9Zg*8qeI7kAECJ?*V0!{ECcVBwVg?1f3FQMJ-~mVo6m3GKQXW2Qt}8M<-s`EaJb_v2hMRjts> -_d_A`_Ey6O3y>?v5K;&z8e1Tw2mDhS2#UyjkKz7+ttBuA{ -Sbj8Brdc(j~gq@JuWGUSImt`hV4E4CCm_fi@~tK$;Xs(iWk;FNNd#V;_ -|u8Kk{&zzT}8(OH~O*fyt3>9+#_x>ADO9KQH0000803{TdPT5?&l|Tsq0JI(e -02}}S0B~t=FJEbHbY*gGVQepQWpOWZWpQ6~WpplZd9_(zkK?uxfA^6n@x)v*tI2b{?GhoNbQV1iag)7O=}>}g*u+JX@uNbU9}D5?s_ -)s?pJ!hSM`3jBeFtQ6%>uqwe9KNm=X+>->L#>c+p9nvRu^-m|9jDd@kS=P~6nEkyRz><||{giIKI9s% -+K??)K6w+Yz5G6Z`_t|1&F$Y}l#d61swerGF3|j4gm^s@_+bvA95O!@H -^@(JD@er;%Hs7KHe6Pzc;B8X7>Gmh20qar-eAX!{PY$+waUN|EuYP1@W>ft(rVfEL6Kx7`Hw@NP7Ug`A$|AZ7B{=e9UcoBCVjz*;{t=-n6i -C4x!Hr@(8R&veg<5rvEGP#aH51*Kk=hpU+H5w#CXG1mo|e -`6lU$2efBxg2qU<}XQ9yVjTpV`>62%|PJpa6wCr%l?6S7j$u2GPzIA~Yx&3Pqj_3OW5w&K70kh-mjW0 -{Y&_}R2RqlNtAhQ_jqBAoUlqD21nIVpnUiuwN} -FVOj`wN|xu0d3m1oIGBnGYLahP=|#bn=T%t-RgwfLn_jLuSf-`v;PMDM_XH?%#f4iaB>oTx!nHWIRin@gqC-ZXeaOxL&Oi@9% -99$FSQ1Gp9sy^cwkn0j2j)>BZ>URwNcO0j17_0+Xf`R%0l!MsAFZ?Cgay$E-8NR0z}(;Z_-wHQdVWEj -Z4+8rVY4XDXjyOct!}{a=1jq%p;FLEBS(=lB)P)`jHpB5!oUluc)+zaMr;QLTdP2Z**I$B1YI*lmyHx -Tx4;DeJqUy>l68bY1E?RA(KSc+D9uMO))VHyU@b7iluOMZUc}iJvZkP;p=cv03JLWSwF~5oGYQucpi8 -p9aAO)m(w&#a#A2fEh{ZsT_Ll-@1n~ibg@M6TbD;@Fnf^ED=f*D@hEjh(xN+Iv`9zeO^*zd_IHW@DYi -+CN^*7Yl20F&k&zhoRh4>mYid5X+12Xrz)+4&8Lr|D&Zb4#z`a$%RKX1(mR6ldKUKfd#H!pYTBs -3mg?m##)J;0|$zfW`CV)M?!a??QZ;!Vvc*)hcEx&`u-s2;UvJpm}a{Zk0RCX0cNhe(|8zVpyf+dWdB$ -=Ay?B&C!p-o}f^>Gm)2Shvh`;yCLzyixl?wefj1cc|=H$n?(*4gsG33K@e}>i-a|tk>i`0vThg+!|fc -laoe3_LPWACRAC%Y=2KHJi6{T_Wp;U-j53WQ%5j-&1*e(E*|)Hl>K%gHnZW+Urzd2CGsZESi$#=+)2c -UYvSj6F)qCPtW5tNA;-mwG&wfxXxyCXRLsZJHTq-1AtWDY0-Jw|v`2vijJGvDkb6m4T9*@OePj&Sf?o~Ehwx+At=+ -@yDf#%yT|JBBbG3Ie-ch}Kku)+dSGHjwac3>}!5l`Pt6QQBfgH8+Ge3?wet#IlPh-xZqVO3f -EwqW7_{K@c9eOZkhGpf>N5uDV<^p(LkAit!;P@fM#$SN@BJ>SbvdhS -;jIwSr*o5t`yZa<1{W(Zgm@$6{83Yf#obG>NIz8c|(9_SxqxrYG-G<04_UZv@+MkG|pVP2V7B=Nn-Ym ->&KH-D=mSAJyo9*brbPP)MXPRqkeIW|8;hQKMD{xY%v4bb_otLFQ!t4s*q^i9` -Q)VUq*b8vVTrv*x=jvl8PHRcvCIlgqS53X2Nd5SUSz(pwmtIfY+y;PkM}_R^qY1ljIMfwB|*DOJC6Yd -Rkw7)*zKEm{~d)~zofj1*5;{#Uq?;55A%31sMKI{WS3hEqurfzPtX{vVpGioho*%YC>o`UG0(W8ATmw -J`N@@;G{BfAY>QWge-ifFZRpv+^pZP0&%aI)F(~4~PxJa(OtEOLJoeoQHMs>zsP9tJXlm~<(u)k2ol- -pDWQ=TZ3Ujmm6&Ld4j>(JjMU8WFrvYJ^^z=@7)^-DP7a)&=J1go=mT;r!n=z#LwU)IJe83%F*S9Ru&; -d$f-5@&(XOl!|R^ng$Xxi$${26|B+pZF}?S3>0zJsQ5Tdsa@-Dv7Eqg_?lIU*XRk-U8&-nyFgT^qCt@ -~Z4M;r)roFn;=5l@3%~uNeH^gMzP76d>pF@LW6UU&GK)n}yc4;&;q554 -TkA^3*nRJF-iP3Wz_rCod{C^`ngXbB<`x!r(-|F56?)T+s!E&r=Tre6Et!sL8#`5&Er$YPwTJhy5hIrv>K=3<)XNvXU6djBcSIk&ns1z_3!2T -)4`1QY-O00;mj6qrts?Le0Q0{{Ry3;+Ni0001RX>c!JX>N37a&BR4FLGsZFLGsZUvzR|V{2t{E^v9ZR -!wi?HW0n*SFl(Fk^zN>MNa`-bk}v;U{fb`)5F3r1lk(gT+5`Eq!RnzcZRk;7%7`>feJ8SQk*w4Z{7^G -G5Wx=Y*V?)K$bCiD7A4+tgJ372ibWYMVI}xRt}D?kgIwJj8VE??1bHQ-W7Vgm1iGo*77M43WlvyrK9l;~6e~|{(PMgy=%uXeGsEz*k{O~!O{63w0%I1I1X1BB7F!Ig7_D#g_@u-LZw() -Aj8dhSxf5hG3OvlSDMj$Y(l--w3Y78c2e}PL`XcUHP;4A%b!#YtE4c2)%hp!bTdjREL132g$FyTU~eQ -kV)|D%Xl2E)cR-Fyq~&hI5zro;iuI*OubT?lJg#}Vba$3uGc1z8^5MBZ}_8`OhT(q&mHL@u)Gw;&d#f^`Nc87P*nfI8;W0 -q=19*ucEM!vb|LKI7XhY-8s9CuRa)G8xRhXp)IcNaqlJbEButz -V?Akehs>$uJcKW!b=jk=%~U3?T4rpGn-&E+yMe4=jd+l3~ftJRR7?jSjzAIhI|{z@;c3lOR*QJZbvRE -bkY8uNsvjE2DwEDZ*aYhBAF4QJHexSrD7?!^1|KPCjiD^q08((QERvW*d2Dh4WljYB6Hjrb0Zx!i(vo -nE=r20Mfz;$O5>Nvopt;;$3G$n#6wD8r$!`(o;oClIXUs4HDmGrPU_-YBUTLk4FvaDTnCAI9fEC -+pgL>(=Z{*kO{8oIWqZT~`wtx32xI&Eg3;!56O>_6YvD{ley#zXzej_Hri@|2~}mq`LaUbwO+`L!I>+ -N0LVQg$JaCyaCZI9cwmi|7!LUj<>N^MQk0vEek%x;Uk><0HXEs}P##dM&^7Clx+mQ+z1$D5n~zUP -IcNQ#>Av<2255|2b4l84WE<)OE2y^qp#+jo5{(ljdeP2F};ww86-cOvD#&(75Ijl9)gw|%wg>bjKrL0 -Mm47uB`?vo#_Meuo*-H2C334>{7K7S#&}_ktr^`Tt?#hIxUOpCWWQ -!mXUcu#Hza8XJzrfLcMK8mF462Cu`)|i(=C)qt`Gv|4rXuZp-K&z_ -?}f1ECB#_fEi{KlKf?B4Y6{mIdL&!LA#%E_|x!6Xj+ -_Xj0(Nnp|X-d{3+Q93+hN1s+ooalepVjs`M0<~KFpwuGhE(ZC<$D)*Cs!_u;7as+&5T4dDLA)ow)kU>XjU6`gR%08Pb~SA8zP` -ndmzv0xp0Cmh!`NP@Bx@SL$-<2OWi$t6Cg$-&dnEg;Dz-v)R#%t+<6#*8M2ah3ZPFYM7Co1Z4<@B3wY -1}YR}JvKDt_<9Vq5tb)-p<<)qh+jNiqoOB?$8s^Zr|7i;_c|H4+KZ3mim^@g!@nL76>ya&xdCWCkS70 -RPZ{&Jd=p6oBUo_^(^ULr>5QZZpI`fOQW#J=#_i8ak6s@OQRYO(<~A=G -nEb8c@R?$SWh6<QHpMy6;v1mdj0 -jb!HLdo?UGyv;HY`-z0hkR0WvW2zs*$F)zUy<~b3=p74GXWmS$}YHWlLCBik=mMGz&jT7-Bj1JpMY>% -T3j4Y_WtToCo)#e@iB{liP;R~n#Vl-W#O -I=Wp0TbsgwZL>wq*PB+VpT)_+lH4QeZXrEfbdO-N2zwqBzKQ8o($*!L?_t4E>n=&7gYiNQ&jc)HQ4u> -*~~Vr65tNVtUcPD5Za7$4N8Dq^m-eeXXp6*98pW%^@Fa4Z;17z`v_A3K(1?;%+P%ql_CSq+TH{Nuk9 -F+Gzogxq8@4%vnR7SHr%kgUBW=&_WC=lERL_D3tUa(^v4yLuC$C{@us0;UQtn7YjH)!>P?DckQJqrZS -n&q!CRCmOeJM^`;X#NJ60J%Q$Y+}U_^$}raOpVDgi1OK)4plzt5HO`)OB5>buX5z>H1V=YxhUKmi_hf -^i0ag5L^AmjWzHwGl4XRo^@kx1v?58FW4Xa-yTrC69!3raQYO1(mh4%MM~oz6TcceDs4USE9sz -ZLp&bZviMX@7A!3UPeHQ%$)MLt4|87O3+sb|ogPziw9g>zqDAjE_co@KzLss4}H{8Wp<0O3p23#zL-N -g3Gfp9){)&jiDN%1hrcr+Hx>E4mH_l$(&Y{?r%aeWRg5(KUA`Ga -llms{`4Yi^7UaxP -DvafN{62BdG1vt&dzXrA3lo|OY6hA9lfOr4{Y8w-2n~?(=K{O({C3sNei6WF;fSa~GTcR8kEa9edK7o=fS0O6ab5z-vIW&eym87dB&c -mtOaMmk|YP`}TP-Lghl4if>xv?(({;kz!AJCXZYkVU=z4OFz^2`IYnY(GFn5mDV>hKP<z=AN0Y -)T2Am@KTUI-OlcKfI$u%E|HFac_z$znB@BnZ+j#=Hc{m9AV>vuFw*yHUoFGv#W`7F3rIUsjt5TDx^b) -v0tO7&vJ`?AUR@S{%;E~f=e>}sJ>7D^oi6cY#6+kDue_DOs#YXQ*M^g<&kN%gFqIhQ06Iqv)Vh(%+gg -(*2dCv^MaHk(Tu*hFjQSsj9}_f^fwtPjPn|6VAPHCR3Y*2;uwG;Gek<~;k|3e$FO$%Zvg!07zzB{A}8 -CsEie?Ujt~JC9Y#5{=c6&FxcmU&nH%AmpDH}`HpJTraVb3jsV56o^TZn4rPdwL)7Rg>7u^3u8t;iFbjLnk4u>*n&Z$9_|DyiZ!?@Y*Qx$7UpFG$2vW -meEJK!8lDKJZ)^%bj|mOL!5)4fna}>x%}czJr*zWYEx?vCQZa(=#f8>-8E^F0iebO<;@3LA*AR;GQbA ->GdYtiIx{c1XL^s*&jJ85psXH7dXSe^*~;$V8d5%y?|-ASUMtWJ*wAvtwM7YdY3Tpsogs)varmR5FYz -|tm_v8%ppwM7u^HANj~w}BXXT{&1ik(c~d$}`7Ru<+E_+w1fiEvNp!mFXp#ieMRE~`9e`w0imd9Jktr -WMyE}c+VdZUImg{VD^RTu53~r?eEIqXF2+5CD-wbP}IlJrBr7xH-Sj@g>s(`=8^4E&}_s4R!jGi=>93 -oY{v&-S=X=;d|)#TcnBp2)cdNF@1nljtq(2u1ab-wfl35K9v1Uezi`U9=|3d^nnkk%hjj#S4zRJkha4 -wCmt3k~adqfv&rh)K2yY_piX%3#f;E?Q7EHK;1utm%n3T%Wzv#e2`VpZMr2TP3aP@wedkL2%g}2Wif# -^fX*!*^{pw@Y%wGO>6?-2S&aohq^XtM&oR{br6^pRe|{LJ*d+?1QyfrE?4b^)-C%^R|r;YfGjUAKE#br|1yy{QD`g4PyLYPmUdo=QW+R`AhawzT78y;EEl2M4yQ;#7I`Q`-xa>!E -Co^$VvN51jQegWBeoH~xHI=fxHb^s5XFZ4GqVLm};u#vWB6QI}uZ9tSQDGef7X%h`YS&O4CKiMkDo4m -uLL+>=&KZZ?Z_4W=7LZZR4k96Nd3qY49?4){ao-JTVuIAL6{cm)94upt8#bpJWf@3Iy=u -p!b2ReQL#sXERWg=#p7*jlJMG1BeGr;#DYl6S=J$Iu*r7U(nxoOj@lpRwO*i=3a`W1Z -)HhMK#RIgtVx`De?00k@yE!6NxnWC-Ufv7x>ZlA=+N*QmAwDXETt1~j2`UI8pVcm94lD*2F)D!8*?b$ -$Y15e~quY_Q4T>Ms#Bl=Ml%EMj@#2DD#bM&a(nMdr -nWz+=b{z8>i!#pkT=>Xb_D+x-QprDb$0+I1}j{~6*u>Pf3u*mn!xa+G0;mOgwKMBu}R2oD1yH6$Cp1^ -7L}N+NvtU{4FW0B%wD#%^Lxm)aQOWA73C3347s`!jo6y*)qJAuAZ<{B&N7UO*#jS+nr%~mt`cX+J`oQ(&z*)jjw&Z|F`&*sbVBrKgnTQ=N1 -@Z%9I6tOl8BS{7#3{W4yXu~_0_Xc9pg#uT=TV>biVr=aLXF{eBN*%8GcCm6g -eOZyl8p^s!#3$^tGpP{QYx4Umz6q4p4iAX9AR;doAiMBzMD(ZXUcua}WsH8GkUnUZk{g`?Q;qcl!H+2 -F?)YoF&Z55JV;PO&l=2xFC3G=T(rTn}Dq5o)uZc{2)~{rN)X6{Oh0rU`}8xvwidC`eJx*N$lK-QprH( -*X5*U8{J1l!?;iBvW%&p-O0CrscT60zU>c^Y;WoRU0v1+T`QO=Eztzg$19=1B&-q)n_PXbUGg!VmO1- -NCCqsR#dsGGL9)xPj(NynL~75^STA*y(|wda;nOK#6!5c#d3H|TcXi?W) -Q?F>Z%5oRCrGg#7rOdI@=%EcQGQxH6RKV&*B+ku@Q5m^&G1I@-< -|ASZ)i*XIRR$B3>tk4yRw<&oE!w)mToWbQMnq_WH{uw6!zs`)(vJ{1lBT*J-4QUEm*&{0foA}|PtA}n -{$wr((;XS&;!JjVS*&OAcq+k9hy*CdPLugOO$Nij&wtS-WO(X@(T%>F(SfIvwRr@SK;VbMjR)_?sXQm -~aIP*6jm!{OjafITz99^aoXf)ZG^a1fCg?Z+^f`e)sTgpcY*8vY@4|P&qEE7avD -eF5)(7BeaNOVJx&9=@cCUMHbquaWxu(gMwgGH!C|)RSoJng8+)|?v#je{9x7Eu3gC3kaUOH718|Z&Mw -igw5~2pIG|FqRc2psq8PL$=sCZZPkg7=5qDB|l)I^tf6`2kQrJHplVttDlJ+P`dcvu^BzWtCAYwLU_B -U2qN+V{rHE{Ch{w4Mv}oy3pt_CC@Y<3U95q|_s$3fi}LiA(W!gn4AR3shHfDDg6ZDaAl~yUV1x;kO7T ->?Q&N(=^pL8b>z<$9hPA!UJ)NkFOa{1()N(7ZUl&k;XR=H9wZ#62d`r_-TmQ<3RjT^y>BheE;$pAB1P -%OUO=D|A4xsW3)9G)f=xOreK(Nu9AnBe24t`8)qZS>^Oi~*W8;5tnAuh)SMzjZdttqH@gzx1fhLqi(d>_QV&r -Ap0)1+XtIMblhyTe+pP7;aGRaMF+R#{6#h>p%c-M*Jkuco -^$H7(_JusLjqk)yv0h&KYa59tgIY_L(b{|0xa_Y=Q9v@qF#`3Ee@K!9|CXd~n%A^$d`$8_Mi^xMqG -}a9Bm*6{-(+NQ%6WJJevO0 -+&xR&r1;DS2cV_*LiR|v`Yt84bUv#oR6Tj|cf2O_F;IBT}pAf|F`YEV*>_>%u@##+uLC)7Y>*nL_R=> -2B`g^P&xW7y_*fy`99UV~30p4F;T(@=KT+F?;b2nS8Zw7j;Fk>}}EXT7-FvhC#Md&BZSUGV~LhLX6x- -UkHww~R&AgkTPVyqT_*+QtG!7E&)oX(ioJwLC7bztM;8LwHOd~qm3aVi)Cm4<tHm-swRn>=+#osA8c}Q+lZfIkj364=Zy1#U^!;XXv7TDe#i+*{zQq -gqBxM4V2>eT~$wGc2nz+bK(^YJ&Jy)qW2&#^+As7;!tL9!BLUw`h3^w3;z}YJbaNQ-RVfw&%t0-S>0k -q17Av1{Nh`Y0@1t{=9fY(Qd}Tpoo%A3U+K&PR}kvFB-KhvoC}U|aDNO!&&P(JQn_TkY$%eKpSQ)WX3p -hTUU09ON&kayht=O=G5_^fJk~s)$3b-1$qmXVn!hV`1BpCF+y<_-WGix;mP=h7^&Oysx)C0eQ15_-%z -EG3D!!NU&S`8nmADW>n_Ec{G>WGeMDsjLL_7r*U8dCJv9E!AZ@UmW;vJTgAz`d}EphY9=w;tnn742B% -zJ5eTAvFSXZKh0-fG%60+bc`5Ra|3;#S6A9-w|#p!%iO1l**{h5hGVj)TU4Z4;M -S}5Vdg{+eZu=U9>_^=j{IgP)h>@6aWAK2mmD%m`(ry00062000000018V003}la4%nJZggdGZeeUMb# -!TLb1z?CX>MtBUtcb8c>@4YO9KQH0000803{TdPUCiy>L?2U0JbCm03HAU0B~t=FJEbHbY*gGVQepTb -ZKmJFJW+SWNC79E^vA6T5WIIN*4Z}UolHo0xDwKq_0tv6-&|j*eV+5o43$b{@6%Xn<|$vWDc8*Kdl9l>tR`%1Or(#S&5<FGHN(=4mRX`1iblqWMl32JdlaolrhVg+`L1Kh!Kkx0O-z% -NH({sINXGbz}+y@c*Dt5G-Wg@P>95$E{Gvk_hB#L8YXhaogJJq_)iaFj48gk5fD(wSP}#byc;t}ff)-Dd!QrXL1H{c@)^iyLlwhwNI579q{od^p|eM# -@Ks6mR~QUIIrxF8;hN!}z$1?bq$yV*JfmVMKz=Na7h)&eyXqa=_y25O$U)5Gd9#g^bn|U1in^fYbTRx -kl(Td+40lL)K8)3VIeX6_c0378eKF}yLS;-f&1)a`Z^10xe~Z?k52t;Ye#Q;&UnsD;zmV1^E38XbVJ3 -xqS79)RdLE60M!%U1>FdkhS(o|B(>6v>QUQu&S{MU4)@-CmS~~oDyVp6pa4)XftqZqxeSOyY)cU>%)! -bpU0`bomp`no49FmYwg$J?X6D%Ic0rSBHN@NXXr$JybRe|u?V9vf%Md3IssPA=$fvcK?8JjZjDoRY2G -Zd)RL`=sb7VJq9`XYWpmXBbuholT2IjjexNRF8CNfZd3C)jbE{-yed3 -By)YzZz_p;|w0K5q>jZGg!FNumVg!?M%^eBjPG#s0RRDpjRn{0#sn_=kO76xG)kI@PujghA&H#Yf43Z -jHI~o#cU=gXjAOm?15DocK@NGew0()boAb1?B5Ao87iH2+m0eK7HK^`@#T7-a!im`eOM|4|AgP;JK5~ -NG8Pa7V3qJ}mV5VoENtPmKA0ls&Qa>;m_S8}}N`_vh*jtN&#QM-g3b4;W(o5KF9l3{933RI1(0xS@S0 -DOQDI8ne2I67e`C#>T07|g5uP^R;?P^&CMR^@TGe$a)?axH$e6ruJ+_)x0=9=h!ov>x}v)#Z7mv1Ggj -(4{K;<5t^7l-F&sp=Iz>Tcjxkv6FWk99`4i8f>6c@JE{50vi7hYv-3J?zlm&E9K=v94G6R43433^Hc-XfO-Drtl_2A$4Cda=@KXoyvc@F3C6AY -Eae_v+=#=da(??t0F%r*((xXm(nXhIXRo+Do)XRD;w>trMi0tIVVnrbmfM@s+RmR$degdKA*PHH>A`3 -(yGYu$TeggIMAkCqkpbp&V@?K4o(p;uuXm2J;J4h*1lOfop6v<LYjs`Nw45BKV%C54VOF@YPRG#F31tz52C}T -xfw`=LrqfKZl10&7#`bvAt`Plo -`#|$mV>eS}M`%3Y{s`B#@e|wmimDtVipa3ijjOhzcx(9rxj+?th1*PzZ_~g;)#vh9H;{m68?NcIBsu% -35jvCn}qWil%*(F0<}k_{2sIf}QEf&YFI*0kyBX?>g^yYeCDF?$CWwu-UQ|$$IZkG>Em5ABVjnxE0)A -g*WRjZr4_Y{K#f(KgAePEWucecxlplvG48feXs%t7O<_D_LB%C;*173@mEQ -_e$x8uSczceuiR&*5Sz^;x=Vk`o0=Trqv*^es8V%o@#GKrykbcaT)vxSl%(7299Dr!C90J&c -@RB1z?SBQ%~|1u~s7(Lz11+i7$JVYWhIJ06P-HrZLna9|R&jKZ8MQMV75v_GJfr+4VHAeRX+x)h!+e7 -6nncpRliwEbnidA*yO2s(QR#X7#aJt*&Y-A4nM>5P?$nbd3>iF1MLKD#6Mo@WV->Wino_MO2>pZSkobtz{#>6;IxHFy(Viu|$mo0=D*pIX2j --2!fSlI`+W3M&YWi;(cIml=j)d!Gbkq9XC7v)$q`A-=#Wr@rufY)&N4{dCk+(58Pd@p|UlSU14xG%sdj_5{$V`0>>Z63mJTyWe=^*^}RE%)~A3mOcaoe{yH|O0??rrb2aXpD4rD0_CEmNc@N5Y9^z7;3a~qU&82Il8fkTlyI&^v;-V0 -;Xa19Iou4Z?81t%Nn2Jk7i!C{IK`|M0jLuhh7?c4Mimjd-Ks(M(4WBwqZ8IQ&TX_yBjOXnM-{l%7Okc -_m$=?4HBe*i#q5Ts4P{*mL2Kk+IqEr_}g7dU>q$jv+J%m26GRI6j42k`kS7)c}@ -WqQVm@W&$jcIAX0AhNd_3P5;To9-`+&v4ata38$1#F%%8<2}0h7wbOq~Wdx0vsY}6#c^nBT;2HY#HF= -5`ZtJ?$HkkN^}Ddu@EDRWY(s9<(F3ruEWji$M*J_CnCc-B+z|OtRi -&FFK(hX{^Jp@U9*DH0{o_YtfXOUn;0NOIDW?&_Cd?gD!($%E?d)!c>b -WIukl;~2qXxY$QjDB_p!*BZ*9RWIFi+nUiRY?ys>j=Ph7lZrMZQTm`+#NF1xIw=P!>=(_nOlOkgO{DB -D0=y>_QV;xGT&?m-6zZHo(K`W-_oM>2#KlbTN9D7Q%3Vq{{$ms*viB0oc+)j}PY3bIhdB$Q-`S|%!AN -omE^QWI=7P~|n)1u&r`q7N&V%UZAOZ2tvNO9KQH0000803{TdPKS?;>_H3w0B0cp0384T0B~t=FJEbH -bY*gGVQepTbZKmJFJo_QaA9;VaCzNX>u=n+5&yn_1tBAl1gvGpNiL}i7f2K5>Nd9yVh6sf&rrA$wac? -s6iCVI?c@IT&J0OCc5Pp-=%?-nTjFD0ocYZR6$HUW(-sA5mb_uPEDE6wla+fERl`1Qnx(4P9ZX178OE -!e)g^BVrB{<&nnufc+u&3Z1i_@xYQ@sDXq#4xG-YyCE8Q?YH>zwKk=pkuFu0RQa58Z#GL?(W__tDJyc -GT0Vj-)Ae^uQwvjo;<_qH(;D?lylB)t<=u5@DLy_cd9_f6VtYB5|Ut48RGmkE+G2}}bkzvG9WKK+!w` -^)LOzonnQ%w}h^??K?=f#Kr`gC9{HQ@CvFQcT$;u%1jBy|D}3q^xe|~ -jAGkhfqSrTR31)j5#;5(_2{}4lRaN43m|4t2rm%JB1X>tS7qbmyy!aJW%VD(2Di_)|L@@X2Ai-9vIF6 -h8T3&s9)!lD;b_A<7oH&hhJUFuf!E@+Pxlpv?}r%Y>8T#y>o>P$>TX~fteSM_Aq?{+rgVXf+9cl-(ed -)rv35L+&|$8seMt5kzJ0d_d0()3CGGgXPnLzdWGEG>1r<0;#|a<-lG?ADarEVTfr%R~y$1n>mJgYBtc -V8cCj)&V7Zk-Q|VRAnyobcZBZ1+de&ePEW}3Z|{;EYKQ&vW%FctGLBi0*zma6~Z%U$ke)Gp6n8Mmf&E -xu~|ybz{sZMh|*JLltufs08>>A0|X=iTIB{=dWpQeo-%Pmst|o$Hn1Y)qIk??X;DQ&>$pE|&DZIC(+I ->2oJ!RE7m+pB@`k8O%s!e|3qg~n;g~J(5fCqqdkEP*#p}Zxc5=dwdR|r)m%)zMg5L>Hk!4G+dDdX6+e -iI@2;>IEs&*x`%ovF`A~F(M={%apB<n3~Yw1D(iu{H>jUzDt(Hu(AH`)Bt7d&V-_n2k4f8WIJY3 -KK0BcrZE@7%)*se8&f!tsVY6;lOYjc1`?y-Q2T)_`%a2qiU4%hQ~ezZ2U)7F}D9FoBBxbAoy$z!x`2M -)dIYc7uL&F+te)_wSt3f=e1TDW)M4?*gyxz=f=PxfddPMOfj^HLp=F`kDu -?6HZm*=7w-@iu&ZcPd^-^X_(9(2=^5ycw{u_(E(9&nRM8T6q(U>UScvHzyC*-Wi5n_+;vBkjCrADM&g3NFj(mJ9I8Tg~mlGa7gwcr}HojV7CSb)OrnHk{2&|>{){CgCcIv+iG1S(> -0{~!1*gaL+#%Q!Ve{xDP^Id1y%lLW>6?6&J}9|HnLThTP10|4~kKBfE%l&axDA`QOavKpjQ%(PJSfkL -6_In71JaYi;UO7T(3TMTBht=kR$EH&gWG%|3r{*)8U6tcp>QIwinS&#B^BWlPf*6%2eYRu9$65Y{4*s -V1lYmSC8Y9)XGbVCkqDVJM@;Ks36>k^$@wP+FuJ`Tkfp#la0FRc{`B9t+5E=$>Ld|43ct_Tn)HUw}9y -d}Z5uOlG-p+BS?oTk=xP?MtFfmXSOQ#T8Pq!< -2^5zrPy>1)JiI9ZHtrT7Mgj2AD_jPZV0PQv3P%vIYN4QhqGLx2FdVg&E4xGojWt -DKsLdQ8oI$bpnLa-2vnyd+T>OeCYbP4}cRrc6tCjn-C>bY{ZzYiWPZK_i?EhF$cgm~Nx-Sx<0rf^Q>O -!1JKR2>fc=?EXTYeUe0G=V(ORXF(HRfo6*;uvZiOmKNatp=DrI$RdNG$xQ=8+1g9TtnJ5MsT -I;b}_KY;K)sN1qU_`{1=d$}}OYska&s~3l_4-a2h`k&B(IpH!Z+A1S}L$FY*8t=tgGNiu~gS5+F{_WY -1U6JrtYB8o3K^<0!JIGFeB9Jf^it#nyIBkwKmw;^S{KBSub_FSll*U8kUOOs-=+q#QYr*qmWGgtmB{u -{*3eGM(PiN;J&Od%UzX}J(S0FGblR%|g(NRqC?L7Vb{(ScFC-yJ<=6CidikBRCe0FyMKGH-*9z#Edqd -f+hBrBB>IA;qRbaOmuXB}smfxlk8{Y>{|tdUU40oW5pv%9vegyuFASv((<+>k)n`am%+=+KAJFF+1dE -|CT;H}tulF*V}-JtlCrvbk(csp+d%_UmZ#*cxOEVzF(GKFE8vblCo^sqn73#%xO|cw~OY=ju+3LvOfy -jOOGF&&ZK*wC89N--3eF$kc}nwxB5ch*Ug;X0PniS0(-$YU{db#WSc)1eDwELh1C!%hTD#+4(H -J`10Yy*^j3elMV$Rz9@@^mjza&2Z;2h_7ZrGNY&H&FL+(sIlN3DyU`nh!H{kg-#Dxj_cgdVb_`DWS0Q#ZQJT)knt)+#I8T;K`gZ7A2+l#yH>@aF9Te4iXSQF?J8p@tOCU%vkC&4`~BQ# -cQ%SlO1`qY6#Zy^BE?jly3K!kFarL`Jg*2SdCW@bQn=&yR10{^iHPfP26!yX6bfb@BG<)#B)iZ){Xjj -w(xAcS7~cv1+gw;jk7R9!l~(dz%Gu4ibcJo5;h2S!@RmkRThG5h`c26~HwY_8u1tY$y+*%&dSEe%nZ} -eI>S0y*YY){1w6hSQL`(Z7IotFI%?7z;~f~nf){z{4gnAiVt;Gkexudcy@y#TLwh@Fx|TkypmK^`Sow?g2>(2v5- -1%#5L{E{BMi$U@A99tx|2C|8oZ>hJ7_d}&E&k_Gr&xKWess)FA9$y%&>_~o}u3t?jpxF>9Op6dhGV$> -gR)q#HI%O6VEQ;bA$gap~2-R4jz5$#-n(rP;-n=EFlZ@URC=^4K&^Pz7Y;;@tw)&p}N&x|KSI)Ybf>b -+NinduQ7wZwXlUB!d!!^S#&>Tn-~jY4V_@sV6%nru$DP!bsziAo-Ku3ESqRExEQX6_q(>4WL{L~^T~r -kIOC86&J4)|dd52+ImWg9|D$P8FR8MoOuq*ZxcEEPd*ec9bPv`sv>Ca`s-}EwlK3n0*tAWFJF^*nLbG -#8TVWQVFFv~!68^&FGJLoJC&?1h3{;wWVUo+U^LJKL2!!WHFJ8X-?)9+Y@xSqiyVX0Te}JdE25~M%U! -q3J7NijX>*16g#^1itjb}aHl4V9`bx1d=qoL=!Lr0@;E0|C-{S8MvYA~=JAQR?MJZdy{Ew?MCZy|=io -&Mt6O1$$tP) -O9KQH0000803{TdP8gjcxV!`a00;~K03rYY0B~t=FJEbHbY*gGVQepTbZKmJFJxtKa%E#-bZKvHE^v9 -BR%>e;M-=_8UvW`BR3hpc`q5MYbXjNDEC0UCVc1Yn4v=_F -w>S3>H`iB>x1a9vkAJ+&G5YQHFIv)cuyRRLY%R2Kj_y_S_9*k`q|mJWohQ2uHsU~Ttb#;B=Wb*6t(bt -mGqogo#mwX-Gs50i^tp@WuRp(`4=E6I3pFYmO-)LDjJYo@?Ki5}&|Yax8&Q{#2Ybk@QIc{1GbpvrBS&jvV-olKTFhlvSXm|ghd4Kzo@V>7bf@zd0 -NIO(cPh9+1b#sM|E>HS3Ch{0YUiOw-lFG;-K^EOOX%60kincE?etCRSSDB+1gB5o2GR8KlS}=K4wL_F6k{kNxa#jJ}*7BH6y2#s*i!d#M|wC@z+s4au*{d1k#1b&(D$f5?)0iRn?JNBP -wU2%hGNy{s7y^}>~A+q-GMIbaG3pJ1ZKT#vMpvL0xXwdQ(3zPITD641qLI&T*@snD^^yxJXW_>>1u9Z -(lFA5Df^@dri$++B9)2Yk7e230@e703i#5~>~iw`Pa-qUvK?co53rptROl$LR>HpZZI&Hv-rSs(KC&d -J&c9QO+7J -}9M2-1l9AYm`!X?HONeJDPQ!}&PHClg|E#RM88j+K?LWqjDOfC%o8GC0h;u -*Q;!d0MBsiTpkH4-U{uc7>L8&UFbka4#h)KTu~c9-wo2vusz|bAv~Njkd=hekV6_-}(8^_s_HCnL7-Z -YVoY)PU__^^T~fuO9KQH0000803{TdPK4(bCouv50KxtfEww4oxXkR6D6`e`AU`!TAwkHf|HBmoDSV-#z@K9F@=?DKf#;$H}?qLdXb0us=N3@wfK3rc8AgEn2ybSo@*!lUz9 -yq_~CDN;T2Msgq=N2D0)yIuTduTlBCEhcRNBtRzTYTW!j0wQ0w+ttZRdM4~ob4Ri)~_UCY`&b`ekYgH -yEz$WFv|6|k_yAj1eAm9jwjRP*?tM*;qzOReB}XWjIFT%Q9GTI3Q`iTg%iB()FEfsWa2RV);7nVot&J -^HkiMHfaVmeGrpsRHnc^>fYUT<#$fK$4%X=C0o(=w%T^6*;#>=*GC^?&Z-+5@L01_pknXMza7dg*4ob -cv=nBh_gDzpUa~oZbNlZIhlswbhL6-w$>9yRq_4q}D=_`z^6UNy$={6zV;O~H623>8+28=Bv@gxKrtm{C2CQQqqN4@LUEwo{W-DYCRdBP0kaTP9Y0U0 -}$mJJ~TVBC``TyJ@`)@oek683(0RRBr0{{Ra0001RX>c!JX>N37a&BR4FLiWjY;!MWX>4V4d2@7SZ7y( -mZBtEe+b|5h`&V%7p$U*0I~T|<#fA+7)8q+^I>KOwdS|^Ld*kXT)`hyEqh>(KKcMUqU>9v$RaJ`}G(9%|<{*t8d6l;7rwVl4gG>WH!72!^;q -eRXiCj7P(ZPt&l7A5B%^QM&(M%vTGlKL8*mc;5)kCcZ)M?NL7?>IiVUtpPVH@$mIrtlcfC(WUQ4dwNR -!~uytF^3L#8aIiwgXS8axfyiBBi_2?obQe74>N`N@NeeIbxNA1LK>e7+?#($YYL;y>$qwZ}_x5XIx0M -Rx!GE_-=!QYm-jv9-edKnw_b%(~+&1y>jm-Xd*Luff$hM8{kY|#IM${-NNTv>Y4s^z{VPw&n{jb1@c!Q}LS?4}RM8WT_j_Q;swA$=jlmSD8fQxtgo4xKZHdVv<6min@}Wwg}X>q(p4S|I -Sf!9n2V^(!;+$BgCvz8M#Akx&jVRn@qgBvjOrx4_hM)1*Pn@;2%J&+g^tMduQI8ja0-!&^8b^Kj^hdU -M39cCY0p*UN05AI@pG^CSKbP)h>@6aWAK2mmD%m`+u-GhA*3007bq000~S003}la4%nJZggdGZeeUMb -#!TLb1!FXX<}n8aCxm(ZExE)5dQ98aZpxR!fds1SFFvJ4qKXa#j>nOTNFiC2()~b*hr*CQg!`hzkLrW -$!~En44V-+7IpXB@wwNf(KTh+vURQDEF)Pr+Bgz(tE<*=);*6#{dw-z4cp<#@bGITjFPIbqtVg>HnK@ -GsT><6sj%w;S*5z5q@u+)PSGR>$a(QG#V{OrUjnUFSgtrZj8RN7H%y)!{HjYhqJj- -T}6+0|9-g%cWBsMeI@+tQ-a4XgP2&DB*hA)yu|EV+{V7d=odR3i!|E7o>G(TgQ5WyMO=uy4sLPrQ-}n -kM+o3n~Fu1&JlR#j6dPRMZ$<7*R(ly)GfK5^Gv9oKjS=3pkZjw`^#k!_!KeTXGtP3*-jr*7azsQsyNE -j&y50ZqC+vt0H%8xN0CL4f6f#%=>N|ku#m&r71`{v+e@rKZR$Tr93I!Pkxq?48(!FIMljFGO!JcA}+dw%x~f3*m5=#eEQcyY=6C-?|9ID7}=fq!LDt?FMyt-y^|ud(c -VkCdFqDrn3j9-=wFfQIaC|Ohq|;_~`NDj;0!kWH_z8C$Wj*A6|YR0`~O%gXxnGUnhU0;mBWVIEp5_DV -6M|alOseVOpjBM;u*#ZaDWr+VA@-=}MY~!azYQ2d2FBG#H#j8?^mTM1^)|bk9a~kM^?erd3YX{I)Zm9 -CnSLMP+%nHe%#kT&IQ6Z4*bqc9bM^etwX@KJWIN+1K;ldcCLT2YKF4%%k-c|Em%?UL6N*=;&bHg4`X) -h}$lNAA5+y*+263AIm@Vp{5cJnO~;^iZ9W&5(cwv=-8e!Oisp;LS?YB5);19{*z6`q;%;E1qoHJgAPU -!j1CsUgg+adK!fP7uh5HKsnsm~mZmw4`(0-c{tolcNB53ERK -I_yS2fY7L_7*Z&584=r6-G_J{r?e#Uc&edGDni=QqC^*@`Qo+jZ(Pz`$t{#peuT&pk$CY%0;R#>x8w( -D>Gy27PsF~Nlsp5O!KJINK+tAZ7GV`aYf%PBohPt#dw*o>I^DdNpquKXh7>j^uPv=y4M-(%>NUxopBw -%ek+1#sYO5?Z<6hy1kbOb_c2(EKuG(@=0*a*wU0VVQkD4A_1#jiT3P9Xdbq%^*)X5U|&;y19C@Stpza ->PJcFx-q0T?J?=s4>$w{!&KqAaqB_4t3VW!u$`?+>)W=WrSQA_;8nMw9IR-^D}5;Ged#Y1bsV9SM^UH -6DDWc^0SRJzh{@=0P)h>@6aWAK2mmD%m`=L!_;@%40074g0012T003}la4%nJZggdGZeeUMb#!TLb1! -INb7*CAE^v9hS8Z?GHW2=AVzEv(4KHE&1H>ZmA1kMZRh1P;@omy+`BpMHi -uDsGN$(73*(N>COnr*6L>z=;g_a&-nuDrc^f0dq`ou2%WUVNO*&S!6slhwfXlwq^fzJy>8J+D>fC-A3 -o`1?0i2)jRjH-VYCkm!U04MQBl8_O5Q_wt^g`~B5RK7(*@Ic?SOo!Vi|*_0UM6H+_*jkEL)!qu0e=ow -sYB$AhzJVz9A3E_lZ8!#*I_%S#5#V2sG5ye{KmU6J$$U@#q%LmY9UgBvKMy~?(WPH~Bf*}GsQ;aamD% -@U(Y`YV738=0_Cohy%exF3YAAfpxaejH4o*jQUgCiKZjd=0urx633iCj7Y)7V1bFc>$v!=*Mm1ijd^> -cc}uZ#e2e6ib-Tkzu|$pQEgk%33r=?EA3UOCBqN -!Op!^pE8ECy>j-)dVl5Qr4GY^AW>*}pjafpInY9l7yOb-e460B*O=BnZYElb7njr(@``~#-kuIkYQ(# -{^Z$og?>gHw)hra?{XpcAY>6wYwyA#_Gl}Oo{hXiAsA2I4Q -eDqlC+71Blz-_5~pSjqm`g?a@2cK%LUVz)&$n&qvj>N3{leL^7Ufxr5k4BgaiZoq48c&5+aQ}>_di95 -fuwf2~_K(RBA*mg%?TGzFr80R&)y}Sz3^N{MI?zC1`DsT;k=vI2g;oQgQ{TqOIz2kIatw^mx1PZ#2TM -TUj@#r%u$Qkh{43Fz#Ipy#eA+6r`cj!zI$o%kg6+mJNT@9^%o*f%hhk-C0JJdKt~XMCNINYVU%q&0P87(&Ew7RKl?}0(z)p^E -X2^pOj5014bW))1&y}*0#-(7xx#vj-hi(@}qs&)Ahb#4T)w#oso%0E!xH}hz;jWpcaRxCv9zs2JP7;F -XZ1Rmx|0I16Q|dL(Yi6~o$GiDFcyB%j8s64DFFu3!#Hpz)ti&y~ci9$D1h>X9(b9A%-~j7@m!VJ}B=8 -pnGK%j=l6mR(JPAyAZd6)Bm@?~s6`VneKvLlkUxnU@y$hTr_l2**Nh+gnx`0YQ-`>l%v3@<_|-kpF$} --4~DK$@bb}r~^b4@7=ri{dHQ^d_$6C)i!NSlZ3EM#p{NoOTmk_p^5rFndtW!FB|&M6l`hU(7Gu7@)n!`5ZNmx?XM9 -toje-5NxOjj0>3TnSPOF+`X~TGF_Pn2eyqdo|y;)pdBpv4yzT+!?Pjw}EI3I;x0jF?q}f$;M%Z1+YdUex8Oo7Ze -HOeWad_{7$TG5)8QnkDmBuh(x+faq1Su-&utjvm59(uhK4c$me38)zmIkd-ypSk=1;VN>> -vE+nY@DeFS(Ilct8w&3%OL4)ovxmj0D4}G5ayf;QgRUK0~27BCHc5(*1* -6q$_&Lx(mZEKT+6 -wJwzPR|;={c!WU={g=)%nN8$GJhYZkkHWj*gb?oro(*cFgO$BPK*k-~8>bZ;qb>`1YH>y!lpH@(MjyV -aLCmu1LZ}qDV}T#6((N2)2_*-A+MnS=4ROGQXx&>L=$J=mw1uHRj00Nck;U(t>YeqbKuMQ;2#c=?)@H -ki}(Z%*68tz_AQ^sE|-T#Y%=#qQ9Z|qDbzhg`gebkEz9+yM!GL7VT3CL1G>J=@@{g{1iS -;AI+7vS~N=+pe%rs%yZcdH|>EhHBKSXcBOpvX~mK6oazZJ?_U^{_qQ9;6JI2eXT3yEeWHNTU{5NZPz0 -pJmYZdii=z%$EXL(|VHdvf2a69QyP2%F~dZ^vk%9B9R$I4PW^J(ylAOcN=EJK7}9VyLB{B@U};)6`*y -X-WKW?C6?>rl*tKQN8fjoPNHF -7deh4HPwI@hGB-rxYvxmHc86xDG%hq*U}eDvIVLy^!EXS)T%=@GHKXK3#?*yWSwH%RIJ2=e8P-U9yVl~LXFKZObjp;oPPl(zfckw -(%oicMq>E$X5~INV@b@ft}d_qadFeBniENvXus|wc0=o;SCtrOWkM?=eWL9$5=HgLwf-YTBx@I& -9?wNwf$;*-Rue)U(K)QH_7Swxu!^?(D-fodxyK&uQb1wo#T&c3Sv`W?=29dOTPCqI4oNRX$3npf)t@s -D56mLTN6Uo={@awcx@Wyd&lCt%k#^tYf#YbC}u(3R8pD?TdY9ko_x -XL!VcMH@pJqj8NS7mQC`#fm14Y}oDH&JHv>W5-tGw$RP -!4o@9*A8ptTw#J<)V|>;kBxAI>^3_c(bxB?OeXnBC*yG?zI$s7!#(8a*br_HKVA93|+}5a0?Vo95F3c -I=@?`lBU_AkaTsdoPag1G@vSyorJ>^BqfF~cR?iW$XSZjLKu0)glS?x(3UFIpnY9jF9>A#%@Y)H5!3R -X)x5;S9tJn_s}Dd4wC4e$2%dX1^mx)zloY!&t^VC}$BKTsyxNF6P`^Je`F8eVj?$`Y_5+#9q>O=nYN* -woq#|k`SR?J%I^^#s3d0z-BVU~j&yg2s2~2$%c{G5VG);M#|EBy-n5v1Pd8jhqOafp&+*ow@R -gJwT?`lX;p~v>axh?)E5zpj4&JI)>*m-RMBROa(=J_$C?^#m^xjcFwh2eMle9(QVb`Tc|#I#P*9G>Ej -OBk~UQ%>Hy$GG=+1IqiM>}O{gMsuJ(eWz>zI4i{0aAJD3JkIHJO2qO8~>5ZlWtLObh~B@ZB|5-pnWp4Lk)ShMR2; -3-snw3ZV-KtQ`O=sRAn*d17=acPhfb|}4`UEcr79jdZay?;%AX`y3KgP*RKnBoN#iW{#|Q3UsC(b9p) -p$?;%zOhl1hnOy8*=2xK*NhN&EJv7z-Z*ug -}j(1m!o5j1+bF<0qW-QR+;_On(MZQbQcC)0|VVKdZ7Kw3BH(v%d=S^VDO_wE5E@W~>NdgGvf)_N<$Gv -RJf(r3cUO*I(Jg`&L=wuUkCns~#T;w-27p(_*KTH#2NkCuEsIW>z6PCBXT5-cY9rxyL6v{!1V1Tgm4` -4Cz>)I8lA7yZq)BB^cEsDU8(1~hbmQa)~3#>7B))1EzXZV6>lOalkwj7o8Xz?0nQOF>e11@z-pzi3=S -=h2pYew~DiFq$c9$BXy`C(4KRhBX}hWJ@kqedY5(Cam?@y0h-m)#Jkpf<5L6uR~naL9kUzE5TEU`7J^ -(9DjGy0$8q_MjkhkD&0Kg8C}|*Eve%b~-uo}@d5$>D -r#~+}AS5D7%8yNeA1&{SBech@8Q+u%?Hj{xEYJ#j$F*$Uk27yL^VFSZ&92w-wRulOH1T4Z-5D)++dyl -@j8nx14l?ys`Cfl?wu@fFaNT@J+O4j{4BbbhHNHYdB!>LdY@@xNV0C}mYK_p4TU9mqxq`f)XO9)n206 -F>zPmBwXlVhayJW?K$mnXyjakPGQHE)LD9_6d)?;|XDM(SfobpkSc5bEJ~B!b5Usju(wF2=d{`acjN0 -sFUYGuiMzOPD5Bj74bzhnEFw`m#P6uggdY>x0O7Yog_6pJnLE4z}4MZwzI_trPlhO}O`=?E=NE&)TP+ -h~Y(J)P&m5X7;#648rZBa(Kuct1yAUiZkRrqSMNWK7$IoRcs3knUfKzz%F9D& -R=x79y=*lwoYwM{%_$Rdd=V)tB+WBKF-PQ_0Zr5=U20jYhhfS_xTzg`&CzUW^CiMbCdr9P)h>@6aWAK2mmD%m`;^ti* -HFL006Rn000{R003}la4%nJZggdGZeeUMb#!TLb1!Xab7L-WdF?%GciT3W-~B7F_GU>XG99NglU+~MC -QY1<&!%yX?M$Y1vkXN-62}y&@?lx+_P_6a03bk8vOAAG`(b_BSSEpsi;Iio6pU3RTi!aoX)fx`N>&T_40A7X@$BjG^TVgl509UZ6-`qF# -6RoB2C13O^P-eUPwI``nAU_u(8Dfh5zthFzlAuU?k5UfzZ=k6_jv#Pv%&YlvbdFoI%&RY>M<-uChx+Z -nxY;C%AJCy%z*6->7ufdNCbWy(%<)Y54fKK(&RL%1x7uwmn;R2FY_o1?94HRsC$bE0)3R=&Oy;*hofLNADvEESxva*xHOdg5jYZok%!_cI71J -mi6SQ@Sof4Tz__d768|Z_4I^G)%;emj&It`oVA4W2|7KIm>g*hs>as2Y&e{2%%qlt9* -t9^1{ei4LE>1jY{5hwE26~FCW(9;3XE2p$il5%56)^30Q5`SF;zJJ2#^PnZ!AC0u23 -1)?)bb6L`xQHz7kuZ~2}XuXCJ%XHcxN}XtQVQL_stK_EaJd(-wR;Hg6Yr -CaLPeF{TW97%MXK%?tbPr`gf*&!z<_GG6EPsoW1V>0ZxHt9ppxPS1&IH$D1pla|0aU_Lm+z(2913d?G -rteIhy|JrT}KM|(pY1mJssT{wGtU?Q+wRT2fri6%o{{1nmSLAXyQ9R&AS$%-=qLRyreGV=t9oHldcL* -UA?)JD>6l#=j3t}(bAi1R$#2#_}7{ia@k5%DxXcF)pc-X-wVO -ON%JraRvX+Rhp{*6U?xGP=3@U*B@Rgq?u$og(t|xGO_$UF -LMVX}(ApRfR;v;!#xw)zEG*Ak@e2K=UMCMpS9_kv7uzp9HBO#2Q^yl6A|;_1_;VE -#v-_GamwOeVj7`gBAq!Ft<=1s^N3J(P%8HF*=kRJ-d#rroqCGMC-hR|>WRbN+Hvi)Or>-c1+;H(Y=Ln -aNUbgMnB6tjXiCK#o9*GX@OQ4Tvle!9w3L~Y}j9mn-Xl08oDBMfzbEVHh}$tt}Ab5_!y!YDE^K7+2ArfyEuLMy5+$G92@ -woMy5hoN8~8j;vrrD1fMCcfqc9;yE+|NP{8abf)`~9Iy}k*t`kv<;I1T4hu*KiW;RAE{$N8(^0fP5uf -O|jiDFxwgHn?0@N42Vq>U4V#%#l&$)v_cbJdU&lxfgdGE5P{ ->4>ECC7Nga>$a_2C+W2Fm#ez<_}1U|Fty}*5|Nh9yTb*peTKn&B|qE?Qk#c`{DT!_#KCgTgkb>H&#f{@`8QK@Tr$L~?bYy;;mPL-M=zH(U7z7*OGJN^!iu?)Tc_4t$_ -3}rK^@?FHZQpG?uquJ{1JnM#Xv!9X{|L4_5&%JgL4g|^m&eej!=Y)w>q;Xq)QodseZo0 -SnER?=gqjP=v#dXjb4CfT1E*8!)r}3T=YASY}^qAbJsqrzDcAa`P0hjU@=7}S}lStK2N^B1-0z1#TG5!7pnlwNn+eEQ@p!3B*978;; -|*yF~=@kF!&bF!>RZL`&xqI<G*( -%U&^;mFl?$LKlxzUFe9Vl0R%qy}ahb%pQ`nwQ0~w4tzEUsLu_{_3U_n&Pv{fANEW)rsya0R8So?9YT! -M$TD&;J_gXK3t5wwt5|1ixgn}!?X{;z5bcMr2;m(jV`pq)XRUFxUKKO! -qyqQ?(PYS(oJ}fmEFp)+AQ&0s+wSj-7zQ2Jg48URKOx)T7woy>q^8?UgT+v$8+duADYpVvB_KzN*V`y -4nVbw+w)6nG1y*pQ11D)TCIWz%37~}V25WreL0|Udx*N4A5`NXcPd5h2W>yyLZIgt -T_j8R>55a$;eEORc`JA(pttXxw<0~j$CILcTtTuLX2OK|c;0!9I-IV&7@wgd_j^NWP=57_C#ZY8Rp1u2!ftJI_wBtEJdW8UoJ -S`O3rM3?eIzAr8zl}MGSrFNSEq%*EB$=Z_Qz-V3=|BQwR7;Cp$|3SF{L4udB-yQO2_+HEbTg$#?IvSV -G^}JWkc{aMX+nnIKH(nhyJAJj@NH=v{{05`fCL@cvA53qcEZNOOn_lRLtOl;OI$mV;6YU8(1+bk+jyi -z)rqm75mi*0^sQbN6}q-4J5tntnXRKuWd_>15*_iah~>;O)HyXgXO|p#h(aC{X8vguaYzB^CF+cdacmf+{=~N5K&Z>51WOmE|dFb8F{b -5hKw?#mD(ZSz8lNxx8q=wOyac8Y9$PiFn3N6GOn_SN4A*J*T`2N&wOj8Q9Z%+a5C&CM$;~{qR95b^M6 -VT9y4@`GO1l)v?#F}~K)5Z+(l#1-Vq2oaJr@Bd36DNu6z8+~FXH6o_GFA^9$+TzmXh!$5nQ!;?DOZA=$}6$^AT(M>W~NQ9XgWK!qduA^|aek^?Je&pDh=*v~3dN`7oteW|K0W@UP}owe$6^O-mc4c7$?`giq{z -LRB0-pzteeAM`lHV8i{+8Q(Ot9Q0r=g{VTOj-jr9Y7I>a;#(l(_>&hoY9$d=Jfm;1*&5K|dPc -o+|x%uO8SY*I=_U2awzbeNIO7+r#`)lBV7a$Ck4hWIeZGi?$s%!$mDJ|IdyzCVt9FR$SLFxgX{wNLIK -&x>TiQ$q1WQ9JNhiyv!b}cj%omH5Gqme2IzfoOfKxf7X*&{HoRamg&mS46e_ClnuO%r5JY3N()0oW>} -N(Fk`y-!0up~I!F)}?vjNZWuT53!J;SL-WyOb*vjTiS*UrO9RhUNo$wZkR;3h(|p#*=wBNYgEfTtvR( -lL5lE3$Wf`H)@;3FB9|5PDEr|6@S1ZHKc9#(kI?E1GnxVyVipo`;NQzCF>in@6tUyxVTxZZ@lzwp689 -l;wc9uFQQRryCOeR&sI+PUBD$!>}x$iUYgaMtK08z%(^JI$!_cHs(gkSjTUa#aWL6z($?}Q@M7S{=)T>_PMZd6@$U$GNl`@ -3GW{LSG?OB*!0BtDKdwu&Vzs2}59Zg{92~AmO4k90%HLwyvm}eUkS)`7{ojis*K{tQnKTaS3A1LhFO9 -$4;U`yl~*rBz|w};%f0Oi_*`tz@}OtBP#uNEsXIxCErdtxQISaVafRUl=5`mvT9kDmfY;Zv^N3s^fJFvd>qU -=4H{W#+WYv_D%*i1)VVMQ&yySa<`Ai(OHVO?`GiOfMUUGhs4M{tpEsFOGX3*(^}`JT4RfN5#_jLn+iE -ZCtX^TJ1kZeV#me==dCA2T)Aq+${TN0A-=#%i7RBQfm37N{&r9omwBQuG6p}St2f9}1cRcW#TuUd;dj -hPt!JXn+9tgdKj<0Yfat^eBeKdgGn(E=8q9e_QG@OAGq-m|Dupv9)HKi&aT?4pQLgtCZBWLjud}E}|3 -r=y!1eK`K6FQQSo={wT>@$P*mAz6Wt$mk`foI4PsYJ|LWsL;BNilXPEz-Z9!qS3gWD&q~Gs{Ka{JjxEs? -s@nT+xY2)Inuf*{m2K!KIICaE*<;XgGV2c@Byv?@c5>PI8c|>CGh(zAkgYE1=bz1o4#p$;`KIJ{GGS8 -nD$H&Lp$$NnL)vPcWYZ9;;WxDdvL1+gkU(4kY3r$ofO5&3Ev_$7tC?@9}xx{~3Jb(UN9ClT|_-~$;@s>)yIc`a<2*wLArYwPQ5Gv13`DUm6p0xw~k8mn%zWU?-hr(5?Lb;<>+lJ -ks&FqkM7UR6oD}#dTfwtcv85L~_xOaQ!n5Hc!0|Ki(kqn+fUNwC;8mk -8(<=Uu!F=gVS=8>K9p71cCRTA`94{y~qd$|7lENpXTL5d3N-<8+qN!9S=FunSbm)UdI$YY*E$-Wf+9G -*Yl>)g=w$^+y#SG~Y&9n$R7G?dNyaPHlOgG}LgPVZ`-yy$2Z8TbYCmSzKhb#$**RQvE^o4b%UW8+D=7 -y=yx9|F!+6t}Xsp0;B8FS-1G?pVr+_DX|Z6IDV_MvE83I5Fb`aRI4gK=@KAB%N5yDvnC^L5wr1v>M_M -5WnzmVNPnk5Lq2a1h2JQ`4m2Nd@u=;d%maLuR-)hUmi&WUl7qj^2kG3o{aZZ{Bzo8XFoj2a6NBSjVpc -+jmRsf8d!>By5T9DF`{!U3knO+6A~c`&y8ccO1g@*2ksHdeHFqVnMeW;2;iXxRd;y-r5mwmf=FV@oMB -Ta;y`*~`7fY*9eQeRO%mgbKJ2#()o9jkJdpi!r*t(Uk8RTe@_h -+R`ofiu;AIC -Rpd-d4v^Bi3~FkZ=*M$NfUJCbwZGv+dIVN}j5AOGo!JIebSx`Ir<-|%n>ipiv6U8l+w4CYIE`U0y}K@ -Z0t@%8PJGoKM3eWK-7pJIB%%fu4w232}jEsC`&My0al+Lk6OGF~SW6y!VALy?D!H68{|JX#@dK;Mvs9 -2PfL>uM`>bCC#kn!2T>*8;l5_hZGQshiqco2$ZZe8u8rzEMLpc_r(6J3Cj<6;-*|8g&`y(XGX{U45D^ -bbHESk(aRSS}a(rctV#eFB4``P%0xRlx3e2guRC%r)4`&L?pu(eLlRHXRSdcLmtIRP -%%K6+vmyD)x4LAU-Z4R&$DgX?1wWKoqD$s*Y0tbMH!W`7)RXNZ-Rl -(8^P=u1&*rge?uurKGwG6alA1rZrO$YvA&3#sWk-9~9H^09i~V0A8nvG5c|GaaPet%}) -XwF#^X$w7m)G`qS>Au}3K>h$8`{6bNRbJG?yH4$YF -wd)ULS!D@mf+4v1lME2V++3SdXD&Tgsl8WTGqIe=Hch*q@p3XUp$L-)E-C^zSPu+17S(D5?uq+4?0-t7sI37>WFj{-frAVCLynlTQw1Z4_bfs;Kj!rT1wM8!2T{&yrZ%Jr8Q@|O -?e^Pl}F%w3>Do(oYe)7MwBD2*7!F~m`df{KVx1jwOSt+67^1Zk{V&W)6cgqZ1xF^MMHV4yRn+f`gAsv -R1D@Vq604YmlF#;jSAHl)CIBhUUx1usS$@)L_y({C{s3@!7#!AJJfI|Hb8p{Buw?-Tp@*%&J-8hR#9I -+IBzF|RxKEbD&NjsQh)zKU9!{W>!WIa>_Aj*N`A|}y)KJ`K`*~e*0K#TOY`NoK|_Hp-)W(uAO+V2r%P -9k9(Mq&ij~hE1WtS4#0KZ$aDmd-j=Ml+GRx12)$;P{_4$V@dXwh%i}z>mPhC$&$*67{vY+AqF(Ny`>l -OnZ4fY6V3?~G5Z`i-j*~9MLKG%K(kB&<a8ugOlrOTyEQsB#MvrXC&B)e>$ -6`^%@xSET#(K{)!sxkidx3F)3)gS#W!9lKO!(`w=GQSdFV*>N?RwE{8kPXDFC -#G$mnwP?f@Wd7Hwo5^j`NjzU+rU^pE$dz#HzhF}&3G8R(slrE!LLz5W?GN4P=@td#&`M5iQVDe@j57I;KhKdSl_#vYN6)6%HBCrHqbY%U$-F -FZx-uvecDTaVh@IRH-&;@)4s`!RR>+&c|E{D4_s -`c5zRV)XzksZd#nheF}B0VkG@0nH~Bi?ItawC`BMZTa>EyWQSioB=V!8-PIxw|u9wO)~#jMl0(kDDIF --m8elS@QE{9y@+xGF(Lr3=+^an{H_Z;Pg||poO7C72y(CvL%)*QY|Ox|ST{Zm!nwp)fzOAB8IH~E_6! -&^ICil5_s+ow561QVKP)U_M(m_!uzB+ijJJW35*85CKOk_uk`$M9v7$g6l}6kffZ%z1HhG|}B2T|^gB -i@M;w6c1T(Xrcef{kd(385pphkRs$c#bN^jYltafVmH%5<(CSVO|Az%VelK$`0)L7`le7a$5?PW8qhZYsv^AdZEj83Bm(qW$)uKz#(E6M;Ze(P{PV2fPz~ -1`t|h(o8`p*cl3dP!RY#gQgqN`3{96GMbO9zy}2qt=kyd_g7a|Hd-5t#})#QRd~gGwTQkM20Jcib@?` -(9#zc>k9Lmq2E*cm$_ss^3ee+aVK)w_s6~<030|$o9AGT)F%~un*nQpdcI@(CV6&G6e>7k|a{aX3!}d -(d?ReOunPUfMNvx|hulS7}^C`GAvbI(Ah(!J#AoUGUU8|N0ih2u~Wkq{tN~{Sx5!m_krv^MAwFhA8q+ -h58GWBU~|9`~#>fPC4Z%=*6#}Ji(S1l^h?@KBB^MCL_0MKi-P8`Jxc(3<%Px-tQ`W5dMjI!obx_k)$D -OotCv<$xUj(4UUh4->XNkdIxWhpa0$vahrm~vgJMf7$)E~gw~GbYW1FaVV%`edwh$*75HV3gOxP -&Ft7|`6yokJPg_-Qw;HXs~pMKJBJ^kt{&0o91*v*1veymc`H~>V>*lNzov>r9y=OojdWw^leSAS0J6d)x-~2MYhYhARTa^i(jJz% -J*6rL)^J?w5@={(zgo!nhObPjqEKQ^-+#AlG>rchwW|09uM!1l-4amOJgL2^tq5qbCSCkAi5bjBSex(lKn2EcoO459p;w|>!OB=h_fJjR9lvDYE|dA>>4?4oYO7KWk$&K$S+FUrHh+6>6_@O!NGf66#j0o -EG=1M}B*^lMK+05^w@$h}Wg7o48iRK{~_-#djq-dLcXrS49ZL+eYXa#?3Z?DMaV8YG{F3jFg0DE;jl0 -=v^)Dhys5R>a+aP?W|{%B1LR=H!(?ltiEu$d#xiXAU;eyv;v18Gs4 -+8rozfHyI^Xn#c^X8fpf`U=WaVsxnDyI5p1MO?-71{y~+{YiXcehv6?BKMKEPcRV?;JTPqeRc0wg)v5PI*I;6^D>59%`HnP$Qa0Sd7l0i3N*K#kS -Lh7R@Gy=}X67*a^siQ`LoYPqx*~?RFSj=QQ@a8f$vC;T_5pfvK8GuPmb6FRk?NIPvFB7oiJHyhX8Mhg -aJ+y1-_F7Z8TFU#~u6H;L(j%|4fkD!xbjLI&XeWBA!0J5^AEwtk1ai;DMawX@Z!S7I2DtC@8uxkaoA7#Df4SL9_*Ypu|Ww}wGXJs^B>U+t`{T@cY$;|}R$WD -|IdudXk`8%}1bkm)TdHwX0*{c07W+eLEvt18_6+ppnMj)xro72;(@I-S5XgyWzRi~fmCPyTvfB<-Efr -+sAH=CkXqAPxLRx@8(jVJzrxvM-at^_i^h`G -{+=|vR$;!DOPGNu^{ZOwYDr~-C&|_cBZoHl>+?hqxN;Wf!#Qyi(Oz-fR|xKpokzd?N)NSk8~7HiQLjU -%&*NUFlV|E?dvz^~?sFLuQnzrKRM5Ha)wCe<(pHACw)`Di^eB&Xg*uy0#Vx;iCX@}Lh4L-*wZ8Z!&nX$j_x|2(NRV -X?j{vbayiPeLUkLcQZfptWzY=V;?^Iv{-kI?k$?u&gsld&daotlmI{s&M?0|XQR000O8B@~!WzcL9LD -**ri5(EGM9RL6TaA|NaUukZ1WpZv|Y%g_mX>4;ZZEs{{Y;!Jfd8LxUPJ}QJhVOlf2`4ro`v4|h^kj_2 -i|3{b1B^lk+tIjhZ_6%h0dMp~=s(~8rI{?t-i106LJu`NsIVqWwt=22?7YgdOeyLIb^<)0Gr~?ORd&X -Ec*gUC@mM`_KNyEE^h-A9(+8GvxKj{L7=Ls8Lsh_+V~RYnh0+Y>H1$er1jxfFvLM_V_{8%xuf~ty1zH -C+(K`3o)kVw{v#%bFuC4LJ%u!!DQHLzt&(z!fay&$qKho~j`1abJ)HsxHXCYqZo618v-`&hvT69~;Vm -=>3#r){U3t@@G-AG&^o86Yp+OpYg*{m(`YcDbq7D&6>(ylD0WCAUqM`^iA;8cU@6aWAK2mmD%m`;%}xKsEC008V30018V003}la4%nJZggdG -ZeeUMb#!TLb1!dobYx+4Wn?aJd8JrwZ{xTT{_bDFDhMLCj!+au3k2r^!6xYim(3lLTo>DIAkY#Wb0do -?N!c-q{`WpZO0pkmJr55L~u-`@Wn30+StU(6Uj -Z2~J>aczWKbCyD_m*ru>u4HD98$wrdoV8Fq@1iZMM`3(sW{=l*H{SNu<MfWSoC5Dv4qyPN(xSeA01tJRy&GW>50)|5Y1f9yB#V37WRx -uYZyAe#hNn-G2QCSw>{(P;qg8TpAMJ<}=pTxmE&Bs8qQdIqjD#mL9Y$FTG>)Z(TS;EIh5|p(m6;GMTd#>TrW^wG -oInM2dpFsGd5$5vWmK=ED<$n}H79DV4%7jvq5E;BXHZM`HiJ1NIMdY0+0ILMYp7iBcjwlGU~ox)?f8c -2cf#+a8H>%!G;~JI`jL^*+nco{@BfK4McB$LJy`OPoZn -=^-AsulZuEs9)ev71VpMd*J80@dJ79qu&am3tV1rD<8PUaW5XxjMGX4%Q$C%$5JdB#?N~yyA5=D_C3B&dq;n)XKq>gp!s0yLZN9Bpi(N|>dXad;JrKt -*ja7A2KFPi6qZ9(ps=16Nv(w>yrnl~d#puHK;{LlzlUg94L-qhKKVw;!1e#veG#!jBJe!KrccZ4GrC< -^9Qnom;tLCaN5UB-o_6Y&hiV%m{x5XG&q9DL5>v)lW}r^~y$>xZ*BG0Z46XE@dw9m>g)nN~I}WGPIb! -CP#4XXxNn&$)YLZ&Y387efbcIEt%DHte>@^_2l+8sE2+Z=}PtAE&)VH%cb1Z=0}ZwQyi-bXQ&?oz&ah -H<~9s2JYlmT9@s$7XPkAnH`u~d$KbG2t`f20+#kdye7;Ie*^#n^djRzI-tqYXApXT3W;v8liJq25ao{ -1eZ)5?;{G$keto=tNIzVn&eN;g2ZoY?Cbjm>-!q6)rw<9K&_IviHKjY6|{^sml~X(w%@e@_D#xl+Jw*rZxKDhyPuz2GubG|nLHBUXJi9jcE@<1D%t3u&z -jv;5NT@7A8#A6lNoBxN;EkK4zpP@Za^;%^F)(V`F>WV>{9yck|;glmVMs)u^4M)*xWJ4CQLHs0 -|1vgP-8u$ZBkWbPTkN7YBDTQ?1vxlXl0Ug8m$k2)svPM?P3`b#6o>bO&sbi6h|5Z%1`7Xfq&G?^_R$$ -cXk&x(n=t-W(koAsD@tE~7A0`6-IM*D#4Xrv#Og(~PZRWEpPpYnegx-d0B^aPR>VAXB@-Etrv{ye2?a -sYG_%J5ExYfHY9s9o@h-9X*Bdsh_Eg!KuCQG3_J`A*3k2Q`=x2J(I)hBtKSp&LAn2I5U5Lp(Ka=O$PV -C(pJyy=4lW_>TKTUv?!y*0{oG*-iRTo!zV3*5g-QfW4 --E^-EpjJR*&7=U@1444m^foz;dkyx10Iwe^5&U1QY-O00;mj6qrtKz<#^E0{{TG3I -G5g0001RX>c!JX>N37a&BR4FLiWjY;!MgVPk7yXK8L{E^v93Rl#oCI1s)2D+n(FNr1!4-U6gRkS49s) -HM>fi=rqPMxtyc5~(FAxBmMMNztMt2S|OeE%D7G=grJxsbq}^DO=MjMhN0{Bb7n)Nz1A=jQHo-tb1R{ -?Usvec+>|yD=h=7DX(xtm1Zh%+%i_I-J6*QHN3%O&qN`QnC4|m6w|U*Inxsq5aut`ZW!>oVL2~3Q+k2 -+@Xe)&$+<9030eg>`<=7K07#zz;nwg<UstQ;>I0 -}%o_KvRL-28|LxwNzh_ve0y__}Enr_)~BmdZ=21><3hKToE8^xbm<7ArI;z4;XLlyCsnLGC`B}C8~>Y -o9uU?s|TEPnyQ|62~Mq&b+K6zS+W^BMhP(_t4V4SD>4U4Lfi{2h9d(q}cF&)x5}^W^?1hjG -jAS-2@N1!K1@u7qIImE|Y9+;VQ$gJy-{}_^@I&@WdhK8-VaNoI-4%2NC!$gpp8Cp<7Q*Z+_?(uk}T#Lt32{lQ%=0Y1Pa^~U}LyN;Ueh -H@?@=#G6%V0k?67Q()&ysw;*<8K9+FT`B))zP|gIq3TaQrC51+WUvcY=BS>BISQb^9fGGjSi$5$mYwy -vyKUR0;5ybiR^3TPa&n*gBl)`C{O-1THv#?eWV#J5uk7Ypg`n#<^#Nwe`Xw*S*WG3bpLl~)p4 -Z0LRVJQD+qI>MIKwjBU-1IL(l&Z!{+;2_Wnnk@UC -N>7_o~@jG1cmdQ%T5=j+a3K`fZ8*tkc9MQ|mkgT*cJUsWVexpV0(@x9WC}54M6eef)D%wP)h>@6aWAK2mmD%m`)a=@ -=Ch^000&N001Wd003}la4%nJZggdGZeeUMb#!TLb1!pcbailaZ*OdKUt)D>Y-BEQc};+_(f`Xzjy&IHLGc9gQ>EiFx+aeQl^FeaXml@O-*8>wgg7GjS-+bv`;D$R{!;S`cIKF%jOw^5 -8y*wQEhuv;d>w2}`LIpB|IJxUR1^z>e*n7pny>X#+>pIlBnukUH#oOwPY?y@6aWAK2mmD%m` -)MdwU*}w007$*0018V003}la4%nJZggdGZeeUMb#!TLb1!sdZE#;?X>u-bdBs?3Z`(E${qA4EIv8wYj -<)W-U>+8a?$}UHlb+rAP?{3@ZLk`))Z{H%qw46v0O4) -l*W3-SI(%)i)DBojpBP@tv2<8^ul^$l&fDTvtCQRt{;s{O71uHqZdV)OC?6592YHRnJlFS49!(id8u4 -dNSD?o*uq-@gAr6%wy4pQweZjB-E_Isya20bqtPf;+&OjyYdn@#q~6&5)U4jZ-Rx|{;2Mv|PlYN0Dh% -}-4klh}$GFbmo#1d=m5h_2#&Wx7Sq+tp2;*uaU7VhB%~pa{PGpP&21^b2vh%FqnxnzS(tFKbzGPOERy -d(O_tI!)a>fbo?v>8Hw{is;aKU=KD448sJvV6p^ak7!EVY7ru;&OYn)AYF(ag_;5?=J+UT*}TSb}ONx -{aw+hQ5X=8N1#H&BRW6%yk!FN?!&ci4mCv&whhNOxAHLSUsKfpdQgncRU-EF$Z@rKzc`kVN#RfgCOxb -l1aNFCc7#RmV8X^IYPN}QBg0~z+&(zvZENoBN3=cF~7qfWL3g3=+LaPC~B|#Dd! -A9-+DPGw87v5yx!EXvMF(k%` -tWwCQp>YxbRAO%sdUks?-CDQx}wx)<5)|N+Nve@svI^lMc2feZ=^}C;ZdR4HlM|n@-rRfNHMU_@|p&c -JsjA{ya`{V+-zSAcUSu*m9ZF1$5q;HtWI@3y1hLc(85bs`#;ovFp%B?9w@V#})F_uR4&B`c4q~X%5RZ -d$z%j791D{>Y3~c+U2bJr!p0-BV;eYP;2FEQ?dL0`rHj> -n3W0B4ov_ye-f>0NZjkOPk#ZGGkk!(*gf2?3ql4u3g_3%UJ;gxe4E2Y$SH+I#h0Y -v~fI5@oI;%>mtP7J`S$YRFGq?qzcN#5IuH@gMDcWqcXWoKM)?w)?4WN3-)zBJ8P9;aTRn#0w?SDTHwF -F6uZHD(#Xv?|WEyf^5PH%2c`*Fw3HfuxO-t`h4*><$+-jT~Lha;_rBz`3d6B2Zk#&sD-I-|DmKx*Ep8 -vlmAG`Wr#>{I7m$I3prgB&|X$Zq&UBaC9~JbTMiNMc`<^`7q2X6gMBAc7MyiSE$EZCSPAm6!zaA1 -AiDL34meV|TSGdZAek-m24dqp_vi#y3OQVtNEBanL!VPK=28ctkyom35d|{pxuf#19{9frxSClf6uor -AEln6-lM8(j=;V1H?RX^n~iP^h@N=6k5a(8-{Rz?$!gmDFvmK}y5DHPw29@1V9+P!&|1&tVF)Z>gZ+~h^dGW{ -v2%4hUbfB$;3L?DCKnW#hW*inBHG#3l^l(Ta(v93k%60!QiH;f?|%h{hIY8j>0fIpgY|3njB3|T0w*a -;%W`%_)USQB*oLH!0VuQ_!SjCf;0$}Ac$9FABScal7nSFbh-}296D1N1SPP+2op-4Zh_^&Mm9xOtf1e -q-}ev+O^JstfziNNL;ptKI+cKC&yu4B7{MgkZ@FHJ>BBj=r>7LZgEEUFp*?0YL*~Pb=8&DFrdUDJXz3 -;Ty^H}XfEGi&ffuAH=@Ao-5A2jZJXjPjEv_lIz>dlL3HzK)CdpeP^|Y~O1}|~MpYrUl!E|Ub4Z?#3jT -^3k*Io)JM)la13bmFm_!gBJq!YI@ha(eeb_uFG=oJ%2aA?9BkJ&vo9K;!eJP5&mAMuZh_NR^X-Llyl< -HMHjs3-?Vp(tGHk}>NAyBD}{xHza32Soy}1F1%Shvi%E`?3v`)WAiU4k}LC=};cSDMOT=y}Z1j0uQZB -?1lg*>=Cp#sVh;Rsmc4GgP<%yn6mw`@QYnSzk^};=_a|j_~Y5-)$ue?-|3sD+>w;st73;f;@6aWAK2mmD%m`)o59uH -mu003nK0012T003}la4%nJZggdGZeeUMb#!TLb1!sxaA|I5E^v8mlTUBkFbu`-`V>SiyCgQ&0y_lQVJ -OzF7*-TTcj&2MEG80Wi-!Ir^S2)9v^>vS}YdV93c?qegZ#?Jq;AH4|_-%v+p2Jqdxfnq -aPb%Hp4Vd8(2Yh^lA?Q2JENg6J+KdjszueH$zt1V?G3p-3s^PeHDLZj_(VqTXHt^_5T1pdM=~>#M5brQlVfsB%muq!a6l0_$BpdU{!YBR$j4XKT>19O=LXnU2uw -JHK`JEKDeaqbb!%*CDKp0r^yvdhed4Iz?gKlc!JX>N37a&BR4FLiWjY; -!MlX)bVi)mv?E+s2muu3s@w5Lj$v+D>opi?J?l>bk9Qdz~Uq5EMy3jL4BSHAV7rhL+Xc{qOsnc_D`sC -2!g;E>=Kni<~)g=Da@V%w$=YYnCL-MmM!c5+>JGS!>1@s>~ZL68nA5GWj5tEQ`s+jY!Kvi$|Tyg?}Qo -sC8N9%0I}nhRwfT^DIB)}q -in$M*xYR3(c-wDfN6*KkkRvZ%4oxY06Kaayh`uKoD;*Eiq3et)}vxD&Y_e-+T`{S&lqDpD=t3)jow+#TH`35?q%g(ASfRuD8MP5 -rwB^Ue*WCi{EaQ7V9e-%3x+7bZtnRC-Fo) -rlQj9%KU=-EIWQ#cEN7SLQEzkbm;WL8+;70|7f1glBD2k_*FESOkmV3Q6d+qPP{=RY0j0JRkZ-ywaDg -d$@6@{)BDISCW^E)tX_~Zxz=?zI9|$J%-PhBna&MESc_(2FH5!&EGvs6&F+hG!!|3JQcID9!H5LIZ&} -RoKopp9l;`Z1Mj;3&)xb|JF->!&205XKplT|kgr<<7CrEs(QG$rDSGSkf*9?9Wo5`?*qU;v78>3Gx5O -s=n%bxGcGAAK1JSLqI#i~?FF2HKK;x$iUCyMsA;n1`$&B7b0S9YwIk0aOe5zM_{A6hPUZO1;z}sc`tT`gmHM{c(vCA>q)z+oiR7pjkOrw2Zfsst -__9yvn^%IP=EQp^;aSX@lU!QM*p&6X3T?uggEa)mo;=Gb+!0&yB9(9iT9M4b>D|sIB{R}8ac|U=b7@j -Yr=Zs3=`#>u{7Wf|S-00HHd_%hzoW?di*?y|)+(>e5aZ4JtD8RbUr_wPR;KhL|#Fhke4VF(z6vkR$s#N3#nGKh%AtT92 -_QNWx?*nc2V*gviEDm)^OgEN-?b5D7f&Z$V;9nBE1mZSkNFZDjVc(!5@sx2nvWCMyFt)R@1Xw-V3&p8 -4?Rin_3~zMj*68stK2~yTu<$u4T^aR`Wh513VDvBL%g=2~0$mcMy*eiXpTzGMKYPL-C00^#RI9EM{l% -%ej?^9mC))hWxUmZ4xmo1PQOzxn=4sMusuMQUpd~EUIBx=G{y4E<+lG^eml@Cxc3u10s}8s$6K1Z|&4 -C%~TSYz-}oIZHjiVEXdGPP$LiHOGuiL;}oILtv1`RvRTP=1x>(VRv?PO;<18xU}Pq8zQu2WG?!v2Y5f -;|25pSJK( -Y=dH~4a77YiUV|lH|yBCA6Y+Nj+5(H+c>aYb@{Zcn9$ZI-OhN59k>rQgew+$o}Ds___;jejv6mt}JO~-I>@Sy^h -o!oe{g3Ym8^yV&6EK9Wq+$YnB#a#m-QS(wwBMo}h#~Y&WM^iO9EEK@+0x$57|0j-pU4xq@JPoHO- -z~yLe6jV7@u{59KGuYL$OAk1bZ&xVgZq8)(9Yg)MAfZF9|#J^WH)%Nz#ai5Rr+}F1hTH`%una9Zue50 -Y5RR(1mN5VJ^lcEjt+liU2w75oXBm;fONp3!w!Hx8R}B01`6-6X%^En<_)x8=7K;IqlqU@(%U>i- -?_(2BNj1x*e1zFgpUbDLrJ0|c&oIzYUZN_oOY<3f^-#);{VM9RZRWTlIgWSZD1Si7dBINO(|+W1yiGA@dWhjOcG40eiA -+z_bRXw1GmUBs70{4t&kbIUvw;`vxtg-)?YKl|L%u>JLQN`XG*Zu5ad8$bM}XpyVt~~B<+f5FNIdT55 -Fj%>E22G4@2&bhGzZ}QyN%gqS4R!dyk46~M~T~HcVClJ*aAEkCx~tvhtS!po7-zf<&X;K8B}U2XW!L` -*=^}cwy^3Ta*3ma@cA7_!Gx$8kaBGGv4FJ22`gZdrrfwIeds18t#?Ld4BWBYSt}q$$x#q0GMF_sqF5m -EbOD;`PAl+D4Lw^FKP75T2Gf9?EuU@9XeDV>Pl=Lj1MJA4gF=g&!dR8PeT$-O?p6jkAs_%nn-!;4szr -%~P(rGzEKJj7N-CKSJkGWC44|`EvXj6Fa0zvBVO2311iaAVJ_GMQW0xy|65Z~bLrZm26vQ`zg||BgJ6 -9f_xBaknnKiix!KIg$Ij~v~Q~_U -j=i5w)is*zy^vLsW^huY)Fk@bGZ2)4-vCY-Zsmethlu*<6Q%KJj;5*=P;)e?4&PDTV-fe4P$MN9P^nwDQ_dw~ -v?i6CWeE_p<}S_b$J4!t@7mfX@!;LwvL~#Q#R4pUnzBVUco(5xN -@)b++RltJ2LKiWPVLxw8jYks_YN$yN3L#C;o3fl(5Xqa)kr|IpjDTe+`QD#9Q;&lPp>f%N-h3@4-092cXr?7QySr(s9Xz{|Xt5z~}?zIpW -~dHeHESGU-~f7BHHlSrn6BnF -*ukLi?tkewqqhBpvmCvj%5z -(S;)&hn%_QqW4L9Ng5x{7u$m&(c*|bDh$WD=!R!ED7ZhxRA9)nzEpS%92hIp4qc!6a!QV -#=l=KlfQQtP-6Gzniq%!wXq+2I_0XQnW+b?9(|IUUB8al@z?F0gAZgepWKi?q|BZ>Vn!1WlJ`sOzLwg -9a#sO$HfLH7j#8^!f9{>;jn=LsjQmsqpSxnd&~=%IN5iHRJF5LzErl@GHRbN$mn!?6g@ykD*{ndGrOLV=eiWarkC+O0|l{wXt58_A2g-%PpZm(2a-+cFaOelQ^b= -3i!Zx&qi=`vC8fVoe|PA|yt`$Gbn!F{2w=y-$7`J-H$#!~MXccirgLrQF}wfAWrc%CQ$ZDsv7k2BFFB -A_-_YA%}ea!_)B7Shmxw*xxZgmyzQ@3dRqtlnV+bL6+%R&=ZyE*F3z!TG}m^h~dYegt?R6S=0_Gc@9O -my2PzwZp%@czWLq;WQ*|Vy@IxMPAtWF -UC%6o)enT`|`2TbAOG(LOzRd^6!ji-gQzB}*V%Vm2PYWKWwyb|chy7%;J@TMl_avL5nA`BLXg24`bbG -Vm{wEN6^D`_eL#)^Vg4MQB81hLJYX^b6d^dngzmE$NS+M*4(sh$wFe~OzVlN!UC}8x4F6+4#D`$(G7xzrjRR@!=v&?i+tw8s$=>)z3MfEj(V|>6hnS0F+2sO%4@I$A0Uy)bXwHOAV_R$}P1lsF8WVivW@VakI$orR&Sqs{Z$ -F_F`SU6B2nF8jE?Y#l6UkF^!HctdA*y4Z)5^r1GFNozuGqZ*^ZY@o4a(V3VFIPmY0 -M{9Ein)Da#&V2S_vZQ%%9me75xcYp#r-jv?@%`S^XVSjnX|(nZ*RWZlNk2<>u=9Kt~)e^8PvcH)4)}d -pmX$_Li~Za;)l5UKo-k#Hhr$n>A-j1mruL&|D#~kNtHavm0EPH{%?;&p0n1tO#NpUW=GG}5uLa9BGo* -4I^sN0u$L9eb=RDjIkgT;cE7{6W*>T~uipcQ_U#dNN9B7aYryr~T%qpJ9N@9LScSl`5R~(4JZ^80>s3 -u>yap@y|6yU{lD(KJHH9x1qonEOBEO=9WmLBMK7foxY&$IGwvoF|B(k5u*VHC*wq1!%R9)rH4LILhy8p+;p4#1WeKA&Wc*S>0AF6ny> -hCCy$8t~9Oz5=$%+~v@qHe3vNUOlFWx23-&3A4k?r`RBgiKS8WSE-}+Ik>WW+A!3|27#TW3KIt(-;#> -J1;|Iz_kAXP)h>@6aWAK2mmD%m`*DfpvguQ000F`0012T003}la4%nJZggdGZeeUMc4KodUtei%X>?y --E^v9hJZW>=MwZ|8D|+S9f*e!OI+?1eQbitTWM`t<#7V_Ywx%>H2n3pBk3axH1C%)`{r7$E^@)>`<6V -B>0rc_is~>oLeEfZ!rx}+l&NBAff__%qg7RGSro0Bx~X^+F|oxvEM -CeYYib^;-$zIKIDwN_=x -Gi>EhE0`aVri$vmEP^Hy30cbpTgJ&<7SM!G4TOoU>p*5ryJx!9Ma&aN} -cB;;4`NlG8eKx6KgnjWFAOfc0`-UE%#zoB&G*gr?qH<*R~SsFknHe%G?DZrt|t^XBL%ijbZW48IO`i4 -5S<5egfx;F6ZQaLwx<=-Mob@^}lvJBMK@U$Jd`$0L{rg7teND!%1;9f6?CDqa@&1vtWY3kKZ!7f))My -#S?H0xvJ#7df9RvZ8+A=Pw+TBWLx7vtNJtfvrG#W6~^d{ZM0Ct>w8Uz1i)YX2P(d<}{5UxEJ+?#rdA) -oTogc8)d~;;uD+ka2>MawWwbn&qKYM53E{o*5q6!ammxUxy$fw*aDuf*O5OLDA>}uur8vN$T;4c`2!W -t0Y#V*JUqU6czgkCT|7JnAy8l&*IjaUcTx+0*ec4NTZzOqU&5mQscyjdqT2fltLyV44FORfCINesES3 -@&g0y^J)ZZ0Np1!N9qME%kdajvQ!a#4rPRW>@6-xvV2DPa4E(b!&CW~t{oXCt*S@J}zM1sf(vY&OqL@ -sNP%>@|O0+h`%5hf^X)qPf|-LzC(;nf_7&59MUPDrM}lAEH*Qnus_>;r6_qD2FOiS4$jQBfT$=?e;X1 -j;AsC~^uedA3^EU%Mot#TSgdK$`%SDSq;Z> -GjtY);hdemX1IjCYq-$WARnJ|WJ?PNlqbQM;qjcL;Nd^2$Jb5={XI -f$A~iT#Gv9!=m%OU?c3S`*Hr{o2wcIDx4~rMt34`q*B{k@6xM0(`$?8aNeAGqMEa@l%<_<|b4Wbp~LA -HDTpk*i$6;&V=8uSSxQe%a|?b_c@F`d9SxOtS)M9PbLfKasl%Zm=Bz+FbmSaMuSQGggZILVX5EOw$uk^T9{B4QB?K90a|M12zNgwVM3!IB$!p6H6Nc_=D(3`0_sdt*_O -rmBF$%9?;>hj6f|wL1Whevdnb4u`H$o3>IIV9-riN4cwEK^oKu!W?<5E!Rx>W@o%R9G+Vz`CB4CsKmf -IN!$ijTZ4R7dl1NnM@K%4DN$$_gAPWCvP?D*9+9{QQf`6;3m~k)kIfq2m;bKtL$2zQK6iO=GvMncg{$ -RCUH~%@S_l=lMa3-u#2ScIRN{aX-o=$D8p%4@k+%{gE;ZjenecOsu#sGXgw-A(4$_4Hn7qY+R>x#15+x1>?y{1T;x0e(3Q_RQ0(HY;c_+~1p*>Z)XHaj2)*aEMk3Vf -kgVxzU@jC<45Bxqjui7r#hT~B;i=rDhna$_ElPStBR2-Yp6D31tLsioDy@;)7$=z=LT8Ahef`$nV-ri -#3s?)(0qGoc)y4QdIOAs??b -SreAxh`#(?RhP?P)IL93E0OWr2$6Ih4nIP#)n94x_Y95$#+oveJA6G(~!WJr0|B?Xbe^U-7bz+Y!|+CLVG5s=*XKJ?6*)#i6a&(A^7vRDz_Jm3b}G6vU59IO32fF&JYnljehM>?zGI~p6$ -}uSw;W=|)C!lX6h(2GQehK_F3@ocy2R2>;2{vv_eJnD~pCiB_^xYG=Y#XX#Wst -;B-@lIvzfsCrD%koCe6ka){_v;$zf -Cq+M=*3R-p{i&=r#Fe(G2#eJR?aY|#ce(fSEottNSbbxr9oS-MU%!yPfut09QT(ogc=jKzW -p2CdF1{ab;v^Rb(LTfY$kuw<}{04o*~w$2Sj#54!&D1NJz=M^%?sk*4OQ(J_ykW;_*?^pvU6n-gd~3s -)bvOlHk_cQFec==Mvm>~FMtVaLq7%D?fj6&Z9Qxzck;l^xk!a7(Nz!!a;a>W{sdd=lQ -JW4t@OQ5gvOtTgBm6&M4F^8{bazkH97k(%_KME%-p%h@KD?LXcURSl4`#U*$$;kf3yTN!8>cv?+LEb0 -T|?)j%c;*Pqs4=ze#UgH59Sc5He&r^A@P2FwFN(pz;Jc6G-366#Wrp7%#ljx%w#eP>l}r;vy`WlC^cb -YZ=5Y1{!#LIGd}yIM9Z{y4reIUB2ud?IZE|NsEi?toUL@uW-8)d7G8nRhYw!3(kI*aKv95X6o{zeVIf -1j7D`^WR2*#h*IzN&=04@sa27>l7p#s2Dy!Y6%tTGM$mI0OEO^lmlsx$6n7 -JaZGn(%uuKW`P^P}mi57s*xYXctbJGD8i=n35=NfKVhU>f%CY5hE1%nTo|70{r^R4-opA`FP$_Ije>xdv!}kD|Rjaz!;$L(Vb9HwU*M- -q7rMMbJhVykMY%1A$2|sxw>gd-%bTuv5cTI&221@edbW&L$kDnhfF6+1zf2_iYJ7Hia!xWCj$;u$g6T -R!{9J?0+WlKh-ul=Qy`Yg7LlZX-e7zW&O4+;Iih!>I27}(@u|xh|AUztJ!|sco1&)n -)ml3gFhTe`&i8g5KuKhHQG#RKOp0_{vuSls;DbS^D^bpZvtY{2D)0zvY2E89djD#K1PgXB%eYjlviiP -IHAJ9>%6K6b%4<=BbrEZzIZ+}{=qdz!saUOe#j%5M5^GgK>9XwAoLwlx+q?DEWFd9M>tsV+G(-W6^A| -no88KDg;aoqVq~_t+3nCUKra~1~QDdz`PPl3pS_$Bo0!8;Zw?dJL*cstfF|e)npjA;zbpo2Y=rj=;^v -;KK>Om$<=Oq7XUR%-dU#soUG>tpEQ8xu#6xntu**ztT*M# -N(`j*nWRXP4=h-gse_9RUP;C)?4uZAJaii5i-JRm8c_;M*R0C&U}?QT=4eKWklL-GE+-4T333M=oFvF -<$t*J?MA8^cWmnHu8I6Jq(FOXCk0a;W3&tS%JflJTCC7m@KjJ&G}{&_*GDzUUA!g)D=rBfbSG#>>{6Y -k;e%DNX|f?4_ZyLHyb76vayr21dhxMXD{NQ3b<2yX@2KZbW*ySvi{?6`J)(l`d`7jnv|?wpJ`>xO`2j*tAwbntg%@ln8`WCF$*>ma}0DL;hEjfMTwuwIXzL -wMuln?U+uhy6_aV8>UVqHnELKarMmz8TOx_OX)pZ~!urr!PhMHr-w@tmnw{v$Hj@xmlw1J1e -P|_-wl`_h&-NhRd^8um1AqQG!pA**RoNI`}BrI~2F$rU)EhK?`Ikr-0u1N_4Cz()X=B*&U%?OU(TASe -Br|Sdi*Gqd5!yhq8)-rNv(v?!!(rajyUCW?{a*x@kLGx8MZ};-KSW_t*z3>e=b5iCOo-q$CD!dB(LJ4 -Hg5+)^XDG_~?LJ`~nWY3;D7GIj$M0<8$}G>i{SRb?t938!-mSJ0XD>L49GjoYD>TgfTrDtkE{JzBq+m -u(t(Tfej_)=1~nzGLY?KaU714Qw|Hlu$v83l4t#^qSCl&|AY2>Fvu8nu>*9~+3XlmU1FGHoc@d++0nG -%GUH%SK!i+cWL6_<-8x~!@X{F>yTS|yn&U<}hYuif@6@vMkY6YC9%)k5YHIJ=n?x*~7rDFR*<>dircC -m{S*=%6MZ~G;D|Y1Z4q7mS8+?M+$+pXS3NCfK{f<-d250$s4K^RI#JZ_?`sK3eR`c02vG3%}E}5ni=X -OV!S@p|7UNw27+g6-swXcAseLKi58PwIDTOJVERljaXf=Fr6_t=5uJ|Hm_6G4k5_^`!Z&9`X -z1N$bj!)-WQkKfNr7{sw{l^g-G57*fSHYhS4Ua0%bN|LNWPkN8|cq52@uKw>4!R&P4fu5#U3fu~bola -284PdrioRseE{Pc-&L5nuSMd`MekVC2KlPqUTjb^p^cQn}GxeJg=#p%vw%VyED@*uH3#*9u0eK9$Kx& -{L{M;9yQQHvZ>tKYssL%pbfiRj(V}A3Iz+P&fe{D}JiJ+kd7(+QjydhyG*-+gK9vW$AR;d9dt8J`*FB -&+3Ki)TCpt_(`qt)YLFtQudc?Keuy<=1U!KVT6lkU+{tDH88$onZG)IM{?^YO8n>GEP)l+omkEM{8s_ -NS8tuk%4V0`bX=ueb!wUjg~@GP;iGIRuYo -6iNW109CeDT2Dx%vzEuf9so(p@lK!xb}Y49`osGQBItBvcvEB+})I2;cV4{Wc!JX>N37a&BR4FLq;dFJfVOV -PSGEaCwbZOOM<(48HqU2q_l!WM>_uKv7`P1=pTx+XBs76Y0 -Kt_ikGM5oDRK<-pZII8ffY3lseT21H=dvXtPJ2?i(2t9B_7RPaG-lq4&Sc#(*^o9-)w89Zjnv%)$j3$ -HJ6E-d6!wFn=k7P6I)0wkfN=hI|54ICpNZA&LqGXxG*F7*!{9R<{=NzEJ#JFYXluuUT{eT!RnY43bGL -mjGO&+g+Zb8J;1jhpR49cp{x;7i;2r$2>8j!nlSKSC$DqDLitQF9|tS)s9TC@tHYFc)+=@}U7@@K=5f -2iY8Q-{W#+D!Ys}{Zz~11-l+YhuIz60p;`#((QE#EH|S2mj`iI&M1sc48XW5nlhk=zVF5+h{gEuHGLI -k+}{O2$mo8ygs(!J%h7Vw;ozhY+@XBlMD~UqyRKuywpD&-s4l62Z#Eu#PQHHuK3oq{Q3_X7MfTyCwN8R5PD_#Q9Au -%A->*5VTA2#`_cZdkTMuj8kpIm(kRj>||*{#ZHB8E7n)tBfF~f -`Iq8@hi}|0cy;fPkm24bBj**d9{1KxZc;EPx%;?Zl|{3JAy>c&8luGbhGn#T<%%f1(KOj>yy8<3CV^{ -y&>Zk4A&!csz*p%o3an7#>d8S#^F0Jv>!ni={bdWL>>fVu|0fE>mmI>mO_f}J?Szh>9~x4ZQ^s%lBrZ -5{0d!422^{-D7;r2zsmEae8)ZB;49&L76p$`B6pf -Uge7ytkOaA|NaUukZ1WpZv|Y%g|Wb1!FUbS`jtts84^+&1#Ne+6r!kha;C5ufP2l930 -*)bYCGIZIT5&^CyV(o+-*09}Nz`L)_u574O4M*Toc9dbg;r~pri;o}TBIqH>y6Tu@wrh&Wku@VkBHYE3wfIyCV*>QAdj3y5f3DVRUgl%)m6e4_GPMT&)H4iUi-j!2Vfe -K)Sq+^_vnlvKMFvlS+MH(=UX0l(ou`N*1-cL8vSPhSbE#{5@8SK0)FQJ=@5iQXvu1DCVy&$BMcJ3CD) -URNm7cO+oq(RJ(rQ&q8NeSM0SQ2+wCtiIhNK=xfT}zM;=ddn9id_g4Io~_lBKXe(^#CQB`_{cCjfT!? -A=v*efjG0HvrXw7z`YZqZ>Y3Je$3II{V@F%lA)zj}SN)3qYstOj^i0k*>H|#b(7P=SK{FT7b%zY_3!h -w`h|!x0wS&6j=cbXRoAFNC{`UcG*wzIc6&l;Y!uH`o74-(O!|MvhPr6t -4=Ka=ip2+#;Kr% -%BIZOHFzAop925+l0-r_LPin8!=!@&usS3Ocs7F)iX#&Gq`MNq0=pzHQUeOSA|1o^Zq8?gC}Vs~3S+h -0#L;OqncNQMmtu!d9o@VS|C3Ruu46@u{}!>LEf5it(OC%?Ou;j->W?2$Wq`tv+QFRR2rT3{=^acQ_qp -%)HxR&Nh>S15EYeL;As4*>7P8Fa=t(qTPuSUkLE-~6nGur3tLDHS;%*6ql|P3hFXxr4%sjl83zX*OohQ6D52Ux(1r}du+Pa -p`ETOK5)d_T2JlFqUx6Pq!StWSl4pA#)Yxt%vlZjTj_(aKYhDx(i|qA4@GH$p^ynx -}!&G~n?lfG7T61{p-t!@-*N3<=gH2Umxu6YTOIV(U_!4^33Dv;Ol@p1Ef?Uq9(`q|9Qo-(Bw1`bpO3^ -BmCGJ+fs{_!9Uk{JAd0#sNI2ALD|BpF@q1VuG7`}JHEGMi~2Tzr<+xF8B?m)$d`khttIVmd~N@dkT*xBq}wr!g7t -=$c0YZe*i{p=B5(E`~1!joVyk-SP(A0%*rg6tV;z`Ro(^rO@6Q3$SHVVc-MFcC5N%K+Z*p&sOtP-K9> -Ua1-VtKAW=1h}}Ue@RR$Y$tk|K2FRf#oXTtg(o%wXX02hr{(0z1m?K$bIDT6`vT9?+okv1w)guktUyww(~`1WX}tRbJ>P+65G?rYTnTap)B=l~ -P|TfPo3Xh0H?+rD7As2ffLR -DA{u9UI}AQvOJC_D&Ui9u5)=2U69l;!D{7BkvhGZQqvGY#I&0Ju${SDg9{3xj=$xLvlBTOt&22R$oV -&}e*!NviL4B@Uzav`q#v!%g-{?P13QF`?imJ6!FvHpN>+c&-yrsn? -viMjxQ+V$@0*_lsYdor4OAEQa5fmsVI%I|S90gdOd@L9gT-uViT?h;N04Q*VkQqZf2mE`?0nyK)$XJSQl=f*Pm~&l>qSeASh=ibCah|JhLaq5+L@zJjKfg*T=MTf?<4mR -R00(>@^?zV9PB&ATr{Yt^i_in2echjXL5AhaueN>+l${Yu<7@P-sFRw%AYVd6=EP0(J_>Q -bk*!vYw#J5UP%d;v=kzuI@OPXrF(F)(ddq_4KI5+}1L -^8UV8Q#zK4DGH0h>U4$|i<9%Pre7xp8i6P}4ob^CAvKA$Z}n$}1?eI-aB27_4JeCnB>?JkWUE-Bdvg6M?U8jtW9 -(_xslj|cf{ez1M`{zZkjUAmOKO|54iQVb)E~{2BzF(xN8m`LLW--91(vs0(CTxh;iFrah?CQ3K*EHQ?4;1eONi~=>np -1QKs<+jxYXw{d1jtyE7u+wi9IrwKK3=g!S_^HeAfu&5gDV*e0J4KFLv2S;G6;kDX-aEh-(R7TtE;2f< -1q=wtvhDt1P7Op6YoHJQEtQM)b>}K*Ir*cN2M!QI|2La~RAyQ%p$ -NmY&^yGBN%GA{a)-Uv@LzuHKrJdX44T(z47MGreov4(CSI2)IVLQfb4S+=e2oq8k#3;t$&F}8t3?Ycp -=kwK)=PA;P{vB}qgyTaLJAwZl`y)60n}Uze%DdPi_XmYm=Tt^IlB$mO4BRM6YCpoXQnvYs5fX2jjWy)My`kY -rI|I{9IK<&|9pLk@IUTfqiXQ4C)00^P*tKuG<6@OpWG*0k7uJlDU -oP56z!vogCne;=M$|I7K@%I3eyN-xB`IgH9FPI+(avs}(KXo|TX4qm~N^B;e^e0FE15ir?1QY-O00;mj6qr -s;J=Nh;1ONaV4FCWh0001RX>c!JX>N37a&BR4FLq;dFKuOVV|8+AVQemNd9_wcZ{s!)zUx;I0RqWbTj --&u00y>5x9FiSG(|6lK`_)vVwWPdBxNTk`rkVwC5y71P15tn^Vy&8o?uXRf7A -)4|AV>Vp%~mYuMCGN^>@C3~jc@MQ}JT~8}vCad4@`&(gvJ8hn?nH~74hTp+hq1C-s&S<$N_$$ji8eqt -Ff~9Q0{SagYrHXY3=qk%HE}6CDM=*Rag2`g(Yju|qe7rh(%G)Ln-v&4X6oLMIV_3YT!VbX>5TnW7;t-B#$CHlW6+ -C(13JbDcBS0J-Yn52t+}wN!D#W!wzHdTxR`^~J7KPY<;&gbez&fFVkCQX>aPoE(u3a{?_$XAhy@_eut -O&DYBEXzPKo2u42h}tFv6wVU&!iEQg`OD{<+|&bs*1&5|Lk&Rcq57e6Y?&#jfw2S5(=r|t8k3^@$0ULi5tCM=9bSYG=m-XfM$T#F -TX&Z8DZ>?|4Es|=XBJVkh}Ham&IU_dAif(}j|ARqlpgwux%l-dA5rkW_KAnC3Y5j#clk -npPu`uw5xD(w^vPFjUr2hUyF~`_cBK0ox`LA&_abJdZQwxphZd@cwt;Np4hZ9Fc%Ec7S*EMCd|)-)2f -;5vkd)%g^OE$@ur$D`B1vX-P04~Qa-U$>Ay_OMq>Fej^}`VA9#rZQO^$gOzxYjSA>r;~cE(soBODZo< -{SZ@IP{JbKR`RoJP%ZcgxWpiIx=cmY}bw>0_nW7HSsj$>5Njh_>@H2FGzC$tHqVEE{8LzG6h(!8L@lBvX_;*!lH}{JHmGJ8$9w3>M+;A^0xmjig)awh;jiFKy -~}@%v(gp(A3%q!J_9sPiBD8GDk_SAGnw9W{CT(p`5Sp;&xo3}173_h#D{plwxrT3ccf#u$y12NoI?J1 -J;$p&o`a3Bh<0&W_^a%1P)h>@6aWAK2mmD%m`>-7%6(%B008G70018V003}la4%nJZggdGZeeUMc4Ko -db9G{NWpZA*3QABuF7D5qvCyTUFEHdwti9Jt?&4%Y2_gYBzB-muKMp`8=!-(gKiJ -YckrFbesi{*&(JYl(t;Pg03#%1i_{Rx4;gv&Ce4^c_gc1lF11Y=VIXIw?JQrie=MLAPx5l<(*T4T7-TdY4&0nKWzkK}o{^Os=Fn6(Z2>)b4@*=+}awUp%O5oFE63Ja29kMj4L>dW3u0bJTTx2Cr -neV~j^@)G`pOe*DaN-39TCm*!Qh4x`aiv%?gYSU!C267Xd|hZRF;i^ -Pb*)DG*xtoR3gMQM&!S?MvQ$*@xJMdP7TrH2kYpA8&w+EWx&8#T0t$A -?AT|TX)T!f2x_=@;qad~lmb$%IiK;h5EX+qwyJ97S-oX;0mQ?j^Np3j%Bt_YAgTz(sUdoiOWu$(1S?0 -LTUE}Vz+$GCnME-sMk>x=WntNC%RAE+Sbm&o;UO6Hf#i>u}0Rf}sG&r+UOhuJ2tY9f}64Fwy!4R@~(2 -oUI@p{VjGHhTBLuV?nNx0+(0?IWoY2T-M -ro;~d1H3^3uun_1xGlird>qu=W9OC1x2GJo3-k|ffPG)5W1cb@O@GM2%$OA1hE+#(t+~GVts?z46*Fb6J%pHdYCnBLweWSfni7}_DiZC -#o-ITWS9_H>H*1}*r4y2-;$`C;vlmN&SbR4+q-1`TfuYR+`WYeL1&@8pnqe$Wv>)8lt+ufyZ8V8 -@OEkE3$n+1iTsD7N|^MoR;St&%m=cgpb@$u4urNu>N^CJzOZ;ouCHrf8j5EiEE@`OmUPFo&x!& -r4BxuCOsys?9yn0*)^6LhSpTOt=oUx0F+!rNVU4qUgL_^QuKJ1Cc{xO!?_L`v2Cab5!RbJrhW)(cuBpvtm1HL9Ko)pK@O>c?;+ -iO&YZy&XX%?CM^6BUCAqPxpWJgc&aFp&E>=dMD&)^wT>~lc)3PoS{X1h~j2Xzz#TY-YyGggi(f#*Y!T -jr8g$%NlDSvq)waLhzK>kPW!@x7Bpd#Vn&{~+$z4eOcB<3>%(moMQf -baid-cC~PdIu;R{0Q=?R>KI6we%rZq~3j^p|i9S7$%g02Q0)u27uMYxU9(LUmoyw4%7B$VU*mI;%QWl` -ZIz;%hHwji1@VXD(5O^bXZAM_Fm0=DTBH3;U7j2V9`Rx$ZISjphG+D> -S}2#m2RURAP;AHx`b|igcPb+$A4d`&1LkMf;|Jk`GfEHcXCs&!nDb1V`FF6%#bk1_}Hl=y5~F@Ck3?@ -`k5LF`kLTmIttn``w%1;oIJLT7;S25YvFR{crXp{j)l|64+3WKVrr(@fWJ2@L5-_dF^#OQ(LvzaHtUsG=YkOf^tBTC*;LQG2Olw^>ZQxyIe0-cM-H*}9Ie7Fm1nWQ4 -xwb+%AG9(St9r5E&fyAHhrclAuT#e9$ntSGog)7v$vgjvv~JZHEr&@{}(?o0mVFpt0FK&0!H2}?B~_! -s=6g20ss^k^=I;U*)6(4oBQHm~4%x<-L>`N{3oDlqYrVL+VC3ns~SoMOFHX -0MD&fn{^ztK}Qvr)u={&8LF@KLtCgbCPc5f-cWn8*A5I;v__;sBn)6cp?2D8?+8Xy;jM?=t6tX3&`zz -@*m&+7EW)0XKaGCJeg||Ghm)Yz-$?#7Y95v7aozWRv22Wh90&BeVPSXMgS@6aWAK2mmD%m`?Rsje!{k001r$000*N003}la4%nWWo~3|axY(BX ->MtBUtcb8d97DXkJ~m7z3W#H%At1ZXp&fWLv4TBzdDWqNvuXl7?XWlU;3kU5Yh{!UO|LrBF@Nd%4ymB*G3Rrqw&xC4E;)4=OV%m4iOQ -Nr^qupTWRoQ+t{0Z_yy|^#DbEqJGu8{ac1HJ}^7x!2!}>;>_4wPktdqVTAKlI+$s=)TwrxB>AV-CtYT -bKdo!Hi@s6{Pr3AnBMw$w<^^!6CV;TlpqgJ?JaK7h)JTd8~E>i`6Ad&r7Szkk1ccXcUVi8siH_DTG`M7JOoa8zFa1ON>nM_M+(OzD@WU$ZaIzNQ&)Zlnh;yp!iEG4V}; -ueZAxgg^Pvu6aH=WEGkg{9P=Wvc>od5~W`~T?S|RTu|r5+u(g=t+9uokHmYZ4p{Q3cj$5ysP&K-RK#p -YE>`Fr=tn@klg^=577hBg0@){lHUK)*1-N!bK_QhF4M|9ouca5)*F(IC^r3w~K}gv3^&}D>hzbVXGw8 -kY;Cryo#Gk4y&~5Ysnka6E9^!sE#Oga#mUH1o7<=u&uIT4hktU1{$KVUbHa-Lj0P%IW#W#c&1^qU?mU -hG`xFbVqIm0j)9?Qb_0CV?v5(#Y@!5pQwrASDEf=w9Cf~KHEQCP-EQ^eIREPKa-M7Wt9QfSCIx#7-^* -=~dA25mMt#X5L8^W)xmEgiU8lPqC;5H;sFqz!BXg9GG0f_|Bcr+maxyUtR7D12FasvD3Gw@G#i&P&WE*I)0W(6H%)Vjr@Py&n!;Be3{799 -wT3Z>43Px=SYKCu~A8cGjPOz{t>&i0DD-JMDg6Xh}bBq;n)TqLg<7AYe=@Wz3ja{dTKn5t5*#^3m_l{ -<6Z(zgIPsK)v?-|bXYs^-n-3x0RizuJlY3W&-T$Vsn_j585;gR@t;NdtR#}}HzC_t`|_HsHK8O$&bYi -b7Z9>T@$91z_Dl8l7orw=cgVXSi*|Je_gPY{{K{@9gBAM=Unaw&e?`zCj@j%`2SdsM~gxXX^Ddyy8hs -0pBXYjD8bO`|bf8+o$9RRA~6u3K}mT>C~pKW7hJzhN9tHuw$a%o^GP!f^ji)?0nZr>XeP6!vZ)a2vfI39R$C1ZjSGqa_*hLTwT -s{(9{{{XSmGg&|$&Y@NZ;Zs^TF>X6K~kd)%DP8~(>EuW?r%$p252EZx5tgip#Z!xNeaCz-q>vr2XlK!u!z|h-Al8;RJl5{$r -I5TcvIzFA)-pJ{sPn4rj6eKaGNG(BHQtz30kA0(ktgR{lBtcOZJ8pM(*7}jq1W+i{^+SQ=#^0KWh?-q -5X!78Ojc4&N3@RIJYjcaaVb2Q&`z(q3TR-3(xPKImXOTA;#;oSn+3xoC)2-d@oo#mL#@-EY#ZJswE9} -P;C*tfZaP5*YJA3S;*PF3R9!K8){!bWHDwbuvi#^|qJuX;3j98DyJQ{fcFu@h!=!7w;i#EorwPNc^Gi+F@qEFYpvMy747iPR1Cz)6hMk8o7yGz+_NH}w& -cc9Ah8z|WhfKsFTmUWBb7F_}JzsWZOwBHm@i>fPd*r!MC_n_nNRRiO#E)%9jHmw)uGc%b?*5$zTZ#Dl --p=;!^Cuf0TCcBO?d?2&va`Fhv%9wg^1%!EcUyAexa^|EKJ4p>di;j_;h0A@3Wm#RLN^)lASNL-VaP@ -6L-QyMTt1Ey$8Y|4c?t}-W+LXJrWf@1)E>qopC9;o6~eA5rdeVs3+`x#Cea4>o^?SVKi -uV9l=4Uqz>bcEgwWKVoANy>D=&0081S&=!cySJ7Be)27A(Ad-Yr+-mltK`%CBrwUINfi8yMo;^2C{Qm -J?&6fzStp)W&Gsa*cL2PEL8ogeaX`x84jV0$pC&!EeG1+>MIzyrhP*guY_3CE3rZ&?4xhBZgAn1CtOs -$ZNNr&^c8)NHyR-3vu0a7IWf9gahg?^^xi-X~x{j_vEN2Ko1(h;Slc2DZU0^%whaX*IIHp1~hH1~+2r -CrF1Vu!$G!?N+IQ`wON3OHkys87-yPo`|wPI1dBfz$oD)5J)5Sw= -zogR}?xB*aiou4$P#iD}o^Omd8mHuzuqEZ0y8Clp(GVXUfGrj6N_W34}zQ3y%;G^};O05{Vzlkfnmqj -P5M=JL@ya;Fko%i$jzEU^b9#7|oDWL|pQoZOkN>Yq1(>7C7!<@KhSE7g>O7W9F0q+CtAmC4rToEpkxv?VzBSm3XV9n`*6?t) -P^-8%UXD49c7};}tt#qkM?sE*!YCev39L|XWdnz_4TTUD~BEi{_ad7e(w9@?%WEBs>zn(`Jq(bT$QN9 -8SU2rI594@0IV3+`q3E;?|*{FEbSc4`p$V|e-2UfMDk&g9ZztF43&ew -*;E1Q%Wu1@g$6{arR_P12p|{6cPlGLL)lTH76dpZ`V|;m<4W?Ji-qL9@s9R7NdhkFfn(BFlPZn5L{^b -UN>^0S<`i&egFNFAD-9Vx9pwmIw6af1~m$mXsm7`$OOR}JRuS;RD4jbljB;83E>xn-~E(chCa;SzniZ -WKZlu9vX;a^%@=U<9F(5%^)B$HMH-Th?T5fiQw(9=Y#_F6U^wss_8)*yI>(1shn-g!Z%!KM24Ex}1fi -5XC=U`Rt6`o|DyrjjNBiw#1&t);Q%Op+U*O`=FkiOwD>w#ew2_NL3P>;8^Gnfl<>z7R&h;7>o3-3w>S -wHUneWh&3#%fEG~=3dOO~{d?pxV+0c9e6N`TUvHrRxNRr-E7A;(P-CrU}-=7N@GjL2LTaKkJO4b~#7Q -NaiiJ^nAT9p&%?W)WVpGSl|@xx@oLjLC0*L0&r0VJvNTA>_tzKMgpr6ziyUcKo_?czKEIu+V(ft=AVv -hgm~PgmS|HAUB(0Kg81!Uer1R9(RD>4hXFWV3H;S{A;p~{Fn?EmxOjgan$TqGBrVOyvm`MhMuHujOMq -emk}YPnkhwt&izFq0bB=?MeD0om&csyYVoYiV}60zAW#bIk!w}MP^*nHUJDj#t)aU$nahTg$*JtWP<} -Zws;eX;VI1{VfL3@hzZ;;HPy{I564Ih%dXIqi5zu}^fHw7oIq{912u8(#xWbgAs~52eS<+;5=($5&7n -%oGh!w2>rUUC`z9+Z9+Is{OLt0w_dZyOReoXUcg9!Cu5ZD&_Lq7^fERAZ%XK!1qAU92>fd*Zrl3{5At -~QGKs7RJ_65weQiDK}%1rq%V@VS_GTpG0&?iYZcB(xap9YU;=py`(2?iWz0qu8vSI-dVGKo9%v%P1Ux -1T?nNv)h6hPe9`%^+(vlL&M}b}9oPduA8Wo%Chg1i|NeSqOo~PjN5!ST5k>Tqp%NSl(}sG+*6F5BbJz{#ep?iqhmK^ZoBeQ)rlBgYgl7HNEFd3UoS&Zkw7i78Swg*>r90L)b4;wPa2A)eu(%0~e^gkv!7Pc%tWR?(sr1C -s0E|X5S-%#RTh!uem|V?YrVw_=MEqC^drZTRX;=#Hp-W*|&bgmrmIUnY?y#jo -3BOr4U9l6`r#YmPOhH^Dj1K6;;W9ndAY10uh1e85ItP`aNj(kRWN%Nf1jg4cRAsr;(5s+76qm$Cby3R -P=n@6zL$TskVttL2F?M|4$kT&tQ=W&~efPsvfGnus#w>SI0R537ePs#!p+;I~Ff;n)lCFWi6KzG8t>J -|d+@r1WhdCFKiQ!6L0t%n2QJDrJXi4g1El))D%JrF{mU%g&xy*WQxPTE^(y-oDFWD_gp+*N(Ruq-0NP -5LaTwxg2g0v0n~|)N<*@JkVNw3iq{-T(ybmQmAsrhpiOFinNdP>1T3MG#8N!23!zZutK~|?;!L-S4d| -D)Jq2i2q0-GY!GU6hTT7xJZkjWtW`-!Z(kKIPlON@pda2^9Z<{%H?0&F9y?iL=Zcr%D&MA*HP0J|Ak6Ve(-gV>>!LdUdj-a#z)1x%w9<+)+Fd_|De@AE42k -k8t!6j(!_(^zr8)7vfv?;-S?lWX>SV2BvRj{wfliKj*8}4LO^rhVt0f@ -|kn+U4_UsXY)%+ti+r`CC_>nm -Ccnid3Ia=N#!?Y4IC~zk68<*K@B`DI$1}MJXahg{k$5QZ@YO#y&f%Vjhh-zS0qG=Jy>EZP?|u>`Ydo&J;$)?Qa*`{JO#~JIcYSdk~8)~i8M3t-=!X;aK`dvYeuf6kq84_)fR`y01V(fe1~)w -Lc;JE$MQFj&MhEJ{9XSjjKd++=4-r|X11pU?otof&KZSwoV6w8UpfvME&r9JCr?Im`)nffpH|GnS^4j -c@=}ujl&3fmUzQ=1eXQ$Q&8LKk7{1dk@Jc?(jgiOQ7@ww$FJ$;g=e3!d1wt%h5#uoe}q{1zeE`^9V>G$OxyKvOg!3Ws^W-iMi(}q@ -0YU5tO6n+>(f6noFO+QVB~=kZnB&i4(!Li*p2X1cux&LVO5`QA|{hg87()Xq!X^8548xDE-J -+`n@h#AIykVs*b#zg9fUjZl=3p$bDbSMP;D>&bC(OXCC&MrGU28DE2A51PEP^!qEuw(ZUhtN!vam8id -zo|9^eV)T15-y5=)rQmw+i0Cf5@pJn(@H@y1!abi0A@$cba{(R65T!UlsL+mh=Ib_I3~dx4R2 -t;z~c`nfqm5nb*&xM3;G0{ba06bbsYi;56xsQPG`-1EnDZjRM$)k+(2x!Y1C2r$apXf(^>j$Ec1R)fF -lSxIYy9fy-(5IH^hvBM#K>ke6y1%^HwIyamRy}_{S#mpT#QQ--ajkI3gO$Net=mU%td8u3u6ek^MvE7 -0953hId!_)2O&tGQcilHMqNWFuk=a4o=02dbtT+f{|hfxo|EBTV`K7BfWgj*zxg~7Q_-H1Ead0cOdGK -m^8O^2k>W^dOSdvonl_PW^y?YB_GsC?XpOKs!_@F{+}k)09UlPC(K`AM;YR>^gKCskYMo%UMKsa*6~G -4E4qg|b;1j_jj9gtH_*?tZ^IFz!8F847oQSQ!1fNgr5{%-Jqz6B53%bg;U9AGW$X+q+Msj8!)*BY?+~ -Tkq`_J^y`8Ze?2}xGf}&+A;~LNkM{N{ -6F+iekusMd%>bJ#d6Q3vF0uPBfwR!)ohVYpYsxH?RIt`7TVdo}n+-S9PevNiA+^_z@P6 -YuDAG*mES5i_fWzc8mt*gWHqm!)5Ty~T8tP`9b?q -77j6q20mnD2nJPA@xGzh0hbJfYkIr<3sxg>demN!xMQqAW&gj6<2yYW2E)NZV>}TYmwMGV;%Zc+_g`< -4^icY63rNH!^HM%_aMm<{%=Sqi-(hYm}N#K8wqUMsAhjrq#K`u2Wv- -(nj-|v*(Ac%Id308k@9qn}?e}hTmPrZ+3H%aEDwMKdlTh?sP^D(C8>JXJs|(%?x%HmcE--)8PJ*Jl(U -T{&0sY@bk@3+SuS?!tU8jV_2d25cbx?UG-k!u#nkPfx*-LdZk+uE|&cex -KxcNX`qQ3*dinyjiJ)w-2NLX?}X$u224A6Pr~wi<;22SrYAeW2)bcuw;0o!AFXkTapaB_{v?^QZs-6 -#xJLaA|NaUv_0~WN&gWWNCABa&InhdF_4uciT3y=(q*P`;y4&`7>vrAPZGD>9IkD5ddy}k8 -i?Ga?BDDl%TbtYe{mlmef*>f#j+4B5&(%3?OcEFjW(I?q!2oz5o)xo2nNBV$@$~VNKM&!5-{Akg6^Cg -FA1`FS@nGYDc%F`Bu4E$Sc_K?uT}ZJzi^uSf{xTH5%TlF9E}lk@MIQ@n>Q9@4zW{_qF&EQ#A@ZUUb0q -;ps>FGkNg;2>a#o2n7vo|&%hEU>OL3i67u1Xf5&?+6YY@d*6+`J5%Fp2G+$|^KiV(i2s@e9VN7vWaQA -~(NMLBttaUu2S`N6aO!{hxeK$eQX&NHc$DCIxrX$jptTZniDxQyd7z%YxiMNx`)QcCz%6^QF~nO12&8 -46XLSJ!bV0ZNjps!Y%3RfA9lGw82d07w<*VsrOc92{?opLUNAj)wr_ZwDv89=$#hf7^ZaYWMKuVE1VNf_;>N!!QtLeNFWn5BX4FU;txosNJ5z)y^f`9AaGtVLTV<*>3KSae&v&SJdt8 -jT*)$r?ueNzr>R0lDnKs*C|Np9tGJ>!txiQ78=IS(8z=DQ^ptv6oSq6G_$7kvJMUBl;1uETJk94fV$a -Y5AP>Z>EUwZ-s*N;I&#Hk|EN|bZJsmOr`^YMj<0b}4G2oUgWV+u@9bGcQ@I3Xr7Cg -K371~^=4X?2=|z8qA@C2X*iAdFK9{Y~KSSr(5aJXM7M%SClj5GeRtPc55 -aW@H@u|Qf_}5Ut8|;ATwU}ZDrUgimDHCUDwTQ$nP$8>;Ie_AoB<>O-OrSG4j;B)Oatz#$%LTo_(Zwik -d>#E+Bobs}9HYqbn6pR#Lv%s$b@Uw!xh#XeP77?O!e)z!MDdD%E(&m!3AFagE%_kob! -Y2LqMj;MR>kjlLlqsNpzM1)#4HNN|YNxJ4Vs6%-mGYf2d7@ZU7f7h)X4V5ZS{k)i~Q5kDNDN5`J9)NI -}W8sspJVT{lSIn~X8)X$}O^7YfF;(OE{3e?Bhe4?TmeJA}vWw6K(ry~@F4P;qUhHyA+0Go=k5`{8<0b -})FYGGf#SBQ;%eUZr<^N#U;eg=YrUESE&7`;9`_zzGIKkps956G+(X0LE`@6^cBhWnihr2KKp>nTKFkUhVRPAkSJlGZ|Wt^*wWv!x7gz}$bZ?p7Y -s4qy-AM9;{-qo571nwLL9&xaShtN>lt093v83i4SwYB{4@Ql*rR7^qY3e;fRSnHwqO)j>@?{Nm~0jYA -pWA(ZTf)661ab``O71yA#P)>#jOz^~V2Ac0uc|}RNsWEU=)ooL=+u~4n8A@K^n`q$8nNZbM|NFX3a8;H9kQWlpme!o$*;IvW|Xpd -y1|_R)lQn(1yMKz*h=vEWls|M~Gx4f0D%<@&F68A1R+&s_jk_S;7}`%}{(R{ -#F+W!%(t>8KJ88rFaSB3#MJ7)40fymmS0u{ZgViArnxnxCnx) -_4gsA~MriK>fIcBs_WD0=zxl`D-NUzoe)Mqgwm)_-Z6YVhxj$4`y6XZwGc|iC7 -NjyLUtY04t@dd))*cGYK%}Xk!RpKj5HFxA-@GBWv4X#s*qFfRcJcYg<-m`obnscGq7jQMccgVpU<~61VK$Cz8ZkRO`|CVFf^IFmzd7pr-OBZ1(Ew%&-u5gKXNX{&};mKu+0d~_!WpOYo -^OgX2j>GsOHwxF(zWm8nr=V0HnC+S$o*mV?o;1H@|>ylctp9pYU(_hVJXvLw>$7sqaX~~(QnH`saAfT -ii9Fw?;$>AZvQPz=`H}Sa2(ClZ&j-8_zL-?-jKJf=@a)NzczENh -V{%C?kZHv8@O>(3%QfV~u!R77D$btV(B@?vKGFtq79!h5EITpMu^;uK~Ryw+SVpC>m%2?LuSd1cS2y2 -DR2Cj4Od>hYmPgai@aQ9YNwL&(5_{c~dPSfb(zRIGUp6Xwoc1@DP<)Fzu&3dgM=N8QBjgKgq8^@1VK7IR>s2%9efxk4MM+>0BmYb= -yxr(<6UUV1zm?9KSx^*Fheq6>S$&g<=LG0s2f=!bhycALD8KucGeCE#T*=l@g>G$xtU}0$X{L*jkH6)zaz2SeS=mqLrIgOMpW)GbyZgwc>R^*$%={w0lBi>Kh@UZ1snjHwaV6F-5fwIDWMTOc=J#e#;04=amZ)5+JGQ5b>F7b9^tgw=0hU4!Whmqoa6sEXY3}$gY#u2MPD_2u3>CX1FEskCEsZ0$4a(SV>;Zt{N -ezACyd9I(3r}vb<>JcDmNm7Q0IZ03JYVArTx6J)@+vLn3cR3NCN(rW@wKq{gy+XsN0e -J3pf{+-+dHqo~7`XY*QI%%Q8+ux97XHLlSq=Qe#OoZ4^)4N?o^2WC}^VpiyJWg1vE -1Tiq=-`VGtjq+kpfNiUeiYt>B{$GN42(rNYZs`zI%VAKeErq#Bp$3pv-N4Z^q6Kn-&@&pax4(0E5j+?@~SGC?}(@G!_k&g@GYetx{iBgM3;IW|!XsO -3dmS(kzVVx6$LxK^SVSux!N?%@D-8u#omXC|6^x{xDYGpgb -u@J@bQisfN0X*fbiZr)@v--PC|Xi@~vf1QE6pXY&26*2`s@$b9p_aR?o7IX&+qWza56g8n5x}n8}*c7Ef5-lr}=Q -RrT+0DhsTuP2=}PITSE_@t?DKnk6HqHNa*`W!DG=p=&GOm`S-Sl*z~S}dm;x3gi`VBs+hVy)+Mjk33t$w?@q4Npsn*d>^#2}OBpp(DQK%Hg2KjXAkhx?s{{g^YqI2##Fiq&>3t+KkgE;xCT@tQ+Vjf5FP -&$EUi%l<@yshg>q!2xO5JlGpOKlrU-Yq<*!4sbAJfM9yb_W)?|;OpK*=Mh`KSg -IT~yQT2VAvSB26qbT7rz*xnz~zdZx8^#8|Hw!_4@49M_(VwaN@Htvjd}m`szH{n0(L8Qx)0$vP%&?Z& -1*Z5_>0f*Z4Nnuw5}1W3!^&@SiNWv9)X@4gv*^QX;-#m6p7IcVnzrX$S97d&!IDmdnaQ&cd{1hh}%;Q -d_H$ul$^=&n_?Af`Clk}p;Z^TQ^8&=}N_NaG8w;Ru=J8JqNyELr_|rrY}XbssMnR>!5*2n{X~?pmHr0 -t$@vTZW#-vZOsdt#lJ#Z>V6VTtHRjv~tN?Dar-SZt9}A&Q0LB_LH>`Y7;(+wBwB3+TIqN{coa*LT8bh -UoTDSOw#5TlZXhPzl|Pud}XT_$~3`J5i-cAx>uRMqLqMOebDsPoxZS8uTkU=4;fTXSc>yCd{hm8u>=L -gYG8jjDQcG1IJo9xU@HgRFD2*zS~g&HK*Ns|4NqOP@d`wbmh9N>X!9Ja+fcsdAg$MB3uK|2PsY{6rXPR*0wfGAzTb_6 -0Z8{Ic0uxJ(#=to{5PW5l5VYdV1O$3RU{d+S6lZK#krjySw!pTj#eO@&8jf{{` -lOuq1dI?_Px=w3X|BrQpjsji>To61JjLySMV2PC&cRaSoGhY18=};mYTcvNN2naj(N7C#f?`4Ip%m_?Gc*$B4CMm#+ocsI1-I2^gQ~F}7x1=^nKZ$W6wmIm{ELdqg*XY?M@CdDXHL0;R7^M)G0(h -ygfcjA#iEmj6_@fYR&0w?@&Wa*~+5Q<11R57ez6PuV004oY^ZEdVMw9uVQcON2A4c-ht+6yKG%Wt`%=>Edh3dPUc@DBJz%_f< -GSIGi#i4u*K|Ow%~zv;c%`CS0nvQm>6&_975=()jv-V -NMnJ{5ya_2Amar}&G{Ix1n}g8r{>%AU2D5r#BH8{NstD|vIVBr}#U3F$fSOqjEIo=48F%HbdIGZ(W2{Xj9B2H}TiI3CV8)VC{(q$XdtHE#yUUR*tq={K`9JFwJ72 -~O24WY-AV&u(u`}E*wzbuRLbelJn96UPGTcFv7Ztb5G_H3jMZ4?EYsgDVap5YGuJLJ+ -EE21^dNfuLem6LWr$sPA}5uKvgd;<)4+py~k6=7GR_eGlb-6I%>!Na5m%?1Oi0vZjyg@$`QJfUnpV@Da&0?Q^ -eXV3u@=P6ulu45>TXV-hey&&3qYWgX!OqgO;nq4k9DuRU7A&n;0Hrr8+O}~imdVL77=-l=RXsk^)idv_n&v<_DrdF$M|rvJL5vcJk}YWwdyss|Q34TQj_4j}bXqN!WIfhvPd6Dn(Y#8 -`TVP_}mthlH*t%zm*aJhC;o&USe1_(A)n2b2P&Cw7JqAvt@Ws93bc*{KWID -?()UGx(!h%d0r32rrD%Taej*3AES=yA#OD^bgld0Qe<j5}-!m|GI)d0$6y<#z-(Yv^c0XgIPN@yGu -D>ei{hRiT+LEk#?{Y6R1GfdroLL(x9h8(6EsSU*v2P&ivysC_-iq-t;4|u-c3}>^x3*UdvGp5wM}{S; -E%wf5C?2HWbCn3nVN>`YaJaz+Q0fy413V9Cbm+aGhqXSR?2WK1=R@Mvyz`@>A2# -hP!E<3u1@J3>Awi_`gzwMudrG?@$@$g_0bBAAJ9TrysI9IP3exAGs&mILRT>C1Qs$M_18?Sz~JK*;%R -ViYYx;ZV06xb`J2(^K>T3Jx-XqwpgYKuumY;Nc4fayI{4=fIEjC|T|@5gtd#L(d-93B|h^3~vN^dtTIqy591UV%H5rL)rn7Sa2@({jr+&^6mK*L{ouw4!T8ld_o4RKGoM -Ye8^<@Z9Tx;`!LC)gxUxY|PZn{pGippyu}a@Sf&Cy2~2E;_s&kA)-6xN{M@7!JEhLoSrr|aNnV)jScM -g+EZ_*&s}=@#OY~cm-OvBx@>#;-8$&)Ho8myp1yN~QkOCix(M}U>E3Pv6jFS*2?1Sp`B`p{0s(^&ZSN -cSmb2CV>-EoWc@1mu^*iEh%?dSHl?&fi`jxl()?G9Ed$WbUP>Mk-ZDr`=H8IY$5N-sH!BHX&p0MdIlE -E`=gw6}w(~$ojjM2WSw@B8;puW}aH@Tn{jbJpO!%Vf%mN}3?3w~8im;bZ}MeS~@~kR$+AZOaCK84iI8CLU8Aj?@mv0~X(Jt?5H?9^qroye@!9Yd8 -_4q)7=2s&;JDzb^mvTb7{w}@MO5`KW#t@;;h;fex=j!9cZ|h|aFRFG9O!8qs|Y)4FHt5UDO5)MPY?@|5WBiRq-(M{I_)!0u -mVA^LYvSrihpU8i_hSc`o^N(I!Eg{5=k?o)vLUfo4oEhSsXQ2R8L>)L-snA{`D0zJB;hFVHEC+zxZ=+ -)3lpHjxSC%2_nt*ko9^jB|Vn5CURu$QU*Uu4yh$8Ra+q)Yq9b9vPF;!wLCbBW0v3T$fh(M!*5wpFUI& -3-5&$P0r~>INPv6)voAP_QrB!LtS@c=5pjViq16Kz%NL(5K`4m2L(d^G=SML!ChJ5L(s2tCv`b)g+b* --?y-Oj|5fT765pzWUXHE?9evS0TTi&GN(e(v1LWlm1)GSMJ^B)$gJMe(-OF?LQ$C< -vrSWzy}>2*;in9Qh7>3AYy1~0MzG+<7qh7PQ0e5p?@OC+6Vj(3tWqfDBk(N+3VYm?61;N1f}TH3pV`) -Twor@}L?PCZPHGHi3w$sdSbs*0`ezWek4-Fnh9cLvIEm(u#$W(xE-*#E%rUFYD&oW&`0Lg=2fX`y;|L -5aDw`UX*V&FO(T>e$@ZO6L_CVdVXj`dS}*_}6)QgZaWmcBS`2Iner16q%da^;I&sZGa9}$E|iGDN*DM -RnS#xp=?-@f~}0 -cgPltHk+VQVNNuDcCg+|>iHGxn8ldfv9vqxw>2PtKkc|5Z|2Z#c=P8ioEFN -E~ELImns&PESG&J03HkST6r&FEolH4N2qwk2poxD?!Hok>A%@DO*Ueh4<;Gn?GW>`{I<7l9Fph-h7UM -js7GR37&pC}J&xrQdwNlsnc#J52Pp`${LIqWY_Ygzuo)l?O^aBL%;m_k5p`P&fDFoM=98V{AX2kY;4h?Y4e=81%imDP^2-*?Ot|Z{l_;SS5>I1MLmXc+;qfux=(F3OeZ7Sk(Q&fTvS3B>F8k&vg-9;WF-={&%p3GZ?DAo;Rq27VU -fW>T?o4-X{z|H=^#-{eO&Gh(Iw3Ky6I{KjX~K6**SEjhn^OHj%~sHk=n-0h1kkp -iSi---JtXgR4!jwKp<>noYGtSB0%j6^SEmu)X#n4H&Gl9R6hoUyS~hm -!huqJ<;URKmMdAU*kBqDMEX{Ch1@4H5G3LxCrg1a?15gxWoMmm3^nsCHdyW~2?_UI6n8~+e4#iO!kMT -&eeY|;x_Bo)+3VOy?r=5aKgDjeu)G5XHi)pSPqEW@A&T*MUh;T)B&)GGPs -V2UVH}4wUJq^h04POgK-#3ghmGYU1++o)%iJ;!bShJFECP@S0c2L=4pffTECdM=wNfY}CNfWaoGo0al`eo0;5 -_{;YQJ%i+!*QHLOxEX;7*;Qf&BZJHosL+Xfx -Qg{nkR;RA^)jmh}DrCO9#47X%@0Cj_9I48?3DFTBe)e>}hdBGh(5_1gv`5&Uz -mU@?YERyQU`oek;`3RA_6|aKLmAqN>T5Glu@jK^$EQ+QUe2{5<^erWd;mwTMBDkRRz+M8` -&b)ab@DO>tv`}q7dNcuE%+GMk;iEh)AFD^)vqyAlmwNQ%o2Sc!eQDgNgGNZ46>?8OQ}X|BGX~5%4o7c -elt(U2aE!!@j`(s*1Ull)pD(=JTz1C}c4U2Er*&AlYu&xxFY3>sFt45LAD+N7UP!pV=gp<9mQ2*{&Gz -=z6K5f^Iq^AxtFAq#D6kWGGXv_P7ocdp7Y|eK3S>ADt;TlL{?{5A-#2cSdb-N1b+-1m+jzQG8&6iX(O -8-E>v}Da7fo`#21Q)f_(42(8r#^=gB0qtk5{X&(gw3f_a!SP6H0Z%KTz@~vU*PM`sP&qfm1M2@L68Tt -Z&Ni?f>-pmqw8|NqCc9X$u`!pzo&UEk?gN9zM_kUeYg!MO;qk?`T)&#E=Fl`_5qvJDVo;wxF>F+O)_v -2M!#>U}TbNY8mfsZM|18ISidQ@13U$nau#WK6%w{Wvd-t9@m?7jd;um(Fxk4s+>!W2Q-eOQKQ4!6W^J -DHeN6aj}hWi^Iy}CBCPl&O6Jp<>ht|fc=kGmpm+W>q|n6(Z!Y9KL~gSgFmYk^4l#E?{2$dD@?k;l87< -xzH>ZF(=MyYD*rn0T@A_yLZYcz=qp?8hK)<66a{+3o5mOiCJjKHcS$-)LKN_Lbk48Eg&qHA2{{c`-0| -XQR000O8B@~!WE{%&KemejF>^A`b7ytkOaA|NaUv_0~WN&gWX>eg=WO8M5b1ras?R|T98@aLP|N0ad> -3T@o6h%@pEi;z0ipQSOITL&C*hzNR>+m$mrqnUn&0#n7$Y$?n->Sm<(aokF9#8Ht_j+s+C=?2XLZMLj -VUNAamN%>9{Gwp}Zuc4cKFiMMF*{2qot-_#eoQ8Dn#WUCWbCK+Z`eAW#w!*EnzJp(-adDNcKIfdTot@b#Td>h+wl3DIcr;?kVwtT9=uvTK)eq#qD_9|N}p>yK|sNJyHI-Ouo^ -PSOzei$WbF)D7BaSrvG@Q-$Dr&!$#cNlz1%dmNtp0{@5>q)#U*xP6kzh14f6|c37^4zBZoI-8UwUU~4 -S@@H_1#-}9HohrW$Eajb^HW&ds2aKnkOq9&QD5d#fTs -o5dQ*xfw>~N47XRC3aXL++6tvS|UdUSggu-o%lk;gV{!M+k6rDlBnwUW_$&)lMqI42B$Cqtiv0 -7Fo-bNGu^Wp_NZm}oOgeze96()w+SurR%swi**S{kS4#f9HfpD9_Rgt2O|fHLxy@arSpfB2r$WiMElf -t6$Ok4ff@vj+Zm5fuz))Nad_kDw#9?+mn$ -x6ez)bBpcXpg!Nd{_$NH|Ih#2j&msARxG?^gCq5?Z&~+x=6q!DGEG7K8*4MrpGnM$3+TyJmNxLu)n}Xv{mwIXbrG*(GL$U7PVypPj1;YA;v0 -~}Xbbo(u|{DMC}*5Kz=~QjI+JXj7R{DDbU4;1Rhn{WNUdKhryC7v6DH8ApeY9ODB|Tw&z@xX9eXJZMn -YyCD$u{KE)rPT6VNiKtsA~c;`x*%S{>Pw6CwlcPv$_DjXq>WG=H~(r9Vl}|D0SWX)_!DBc4b*JR0Tmt -jK9G#4+Y$_(MEjf=1GKVbx3Mb8!)~4E|U#>eVXAVFk&c7&!zvL*pr`k4EzXDB?ms8pXeiM&kRw#Voqa -k||$YNz?`MH_8NqY#dJ_a2sGO*ffiC)RYS#Gmo`$8JY>4tX9yM`3<{?3)Z|SiskU&V7xxhJ4^1BWUKR -oB+u7zuiHK9x3pRiU(Gz8&)U3Ots1jn$EcsirS;=q)-dN_DB#zQXo;6GEe9_Jev;jgV=%Z**+tw5kiw -KBY9@a;1b6A*yu5#NGVHQ@)R5mjD&+MJjU=**zXp3+Au~||tD20Smv{6IjBYawzs7hsiEWT3k!@K5d6 -1F2C7*n>cFunK>(P&|-+uq$2WbAVkN+O1f5S4VEY>OC2mCdfueqz%)PEHnp`8kS%jj!p4mT9E*FY;Jw -h|rMIS8_E<6;rzpYK98JznavC=reGV!sZ57X|QbvuqcvA6vBbuxFyC#AL$EY#?YJU -@bNrdog1@6v@v9-f~4>`(0gbT3201qp0U>nS!>#6Wh-O!?EMz(>u$jAvV6T<&Xaih2T3yLiU5lMEYpu -4ANJW*GM^iC#>jJ;Ct$m|l*VFHH@-nljMno)^y6phveA{(luC-h#(p4E>YpSRSr?6!QB{xI5S10X{aA -G7G3}^;mxNZ1m2jg~>iUVcr(@Rsu+ -$3p#cOT!?9vAtF3uy-p-M92fTKI|gP3kF+>9F|bY$0pnHHmns7Y(pNl)nCV!C=LG2*%HC|7PbWE+G-Y -Q>Hhi#TX{=&4j`Cy@&0#wn;U;~Yq&!#;S}+DTpE@Jx>X8Svk>*wKQPZxSc^dk#7VV+hyTi0rleF%{zC7Xq(` -yLjqP?w{i&d=b-xmbDqIJV%Vz5T*^Rnp~HfA}JfDcq*qMNLMtb^hEa1nC>O>4AofDk -$egkiQW2qR!zY(J_Th%uq#dDbKv%p=5>)}3?{{Stj5Q-MS*@)X|)#~R}0%wn@6#2l{4eGZT9XGbYY%d -xtiwb*RGt~;jYZMb{*|1r5W5-X?lY%sWpQ;YYp&QpV8ZmWN+~0hjO5Xa+JeDSd6kIN-mm@L`=aSQ5k{ -F7}YQX5PYQ%dset)rExrsr&2mdnVpyihN`g+k#05)ge>?m2mRb)FIj)HAGiB1g~cXIV+KSRFuX_#jF` -aiJzDLW4wNxA_?;BTEJ>#_h9bh`%6rhlcmt(iNz3D3)-j$VfX3z73LAosuAvhXiqn9k_f9SK3+ghM8X -z`La&nK1O2RRamH!t;*G5QL7xX$=tQST -@)CQ&{AQM$~sy=Vh&*nAUVV+4!_OX#XKu^Shm-zQ0Nt^gxJ9KpQUxL!NOh}gPvtFwu%}c&sETUEN&)A -t$#*pbjcrOdXY>>v5A3mOgAxk$Yx9H{T>j(qDx?3+_zNE?3EMvxur!{)d`;-Y4NJ4($Z)a7*jH@HzD+F4h@ti)xCmr-<(ee^UEb -vGqnz4%q(@4snK4-CSlA&X^JCgNn;-CLXgZX;a}CGJsXkj{OvD+6C@dtXDjt`#7z0h-=m-|Y5%}=4PW*)RFx@IuOSh>Af|ni+ -Df(omKmIs+_xAOB+nkI+p+0N(X+DpZxmqaWoQMBlhY)gyf6THa2G3U6`uxH?@x=KkXrXrsj_PE+TH&@ -3Ix?PTlh59&ZKzz&)>Lbq8#Ig);$^?A(hce>p%Oo-y@p){1{M6dCH90l6CX&ZS?i__Q^0 -FnmW_8#)EpbNWZ^)J|V%XsF{dYE^f1rUtzt7ps^g?+_I~7Bgr7VXuw&$j({!v!_#2eKu%}o;D -(2q8SJ@#jk2*$AE$(jNKf~r++8qfXKtP)Bb7>7)!PIvZjpCWxS*o9nDbS7WVi8Hw@w^{x2#)21!8HX(+x; -5aiufkQ_Ob*oo$)G*rW0HjWQ~`ckoSY1#D}~4Bwg!S;I9N~TQ2v%fr%b4+pk0^EBN5}$lh)$WJ9VpBc -*N;e##9oRCP_H_o-ns%Z-}7aoBjoTN*zM>_DW5^aiAamJ?>y8xVBQ#p#Y7n?-Vs7F~Mm7AZ5hhL-K)C -*fxq{}4v+<0qL^$pd*-e8{}&;6!({@T?$@k%+x?e0e`zb;(ed>%1e;hp%&mEVahj7akU(2>+ -$Z)rW^rV$bmWExQi{O@WSfyuWd9lCs-dj=Zph!BVR7f)AHyg@{IJVT3a~^v_BqbJF`jv@Ma^%R7)+s} -cO6-lfg44XK`8Sy+Kt&DL87j60RAA4zPa&Sr_%^CQRxVLn#^V~ZGQL(IZPKkwn8P-4t`lI5V)S;{R5<}tqx&!8`V0y$=l3xfnnq5SoXUS4(8tE)>o^yd> -4QS;my6ND8h5y8(9;`UU9wy-E!IwmA5~XaWMogg`Xb#%$exudCtlbh9@inE^tQKa -7tT(M{kRafyGVIi(fU~Qf~j6a5MUi=RfSiCB3xPHaB%~;N}DH*8w%;<=J4(=c=a@@-|9zpkVO1?}pr8)UBo+Ps*o?@0>6PG4 -lyKUSSDZR=Dgw6XBlZ$xrnKCS-METu`$g><^W7N*ny#U6!-F-A=P57-P_rv;3995grBp#{dZ`YzwcF2 -yDp_4k1lcXyo(Q1XbdnpQqV~+-_cv123<44nn=ht%9tGB7n$L+5>ay)$`Ja}z1ps+r{@6c?^+nbJPJE -77ZEQeUjlS+ZVYtjmd)OTDlm8^-iL5M)0uAtovS0Z)yELS2E$aHPpYFrKBY&D*y6n$;xHiFj5MGPI9> -fz>DvHX@cSEc3zuV*W@axA=Dc=+$~3NMhzPWyj^k{~lbYZBY^G0(R38R;Nl@oVqV6nY{#>3K{@z0A{5Ly8M!JZSif -8y%XobPcWr$xh{AH=K|b~Im{$Hkb?hwiy2LMaD)n&9CIi=5=Bp{a$mS4wwfFILt}0kO+8DENJyX@+jr -U2kxQ@&_%-&APQ&Q13KXiW0_>z@;U=AVX>Rb0%e0jiZLoE+s&npzCaaY5g9CPK6`#fhFqRt$Y#O?NOI -J~}()#2__z)ry7))n@dtC-r88@}gh&KXe(6fJnBkxwKK2EKek*gT7NPzFlXr4?}_8-kk@elNE15VINt -{V}fy0SR>KSoX0`|)l)YTswG%@BVV{=aQ%9X2a1NQC)MusfOv&%Tze#Ri6yh9%PPd4}&KOJS{`?U<}` -@5aKDnrkzHBN4P0dyKAT%;(t^?rg*yVNVYBaoN9$=X3mTzJ^xT{4nn7A_08{pC)b_RPqc@=i(Gf3K#` -`4T0j{unRROBJxIC-@hJpM&G@Db@u1eA4lJveSh}heFv|?FVQP6nq@Uxnq3UyXf9raEY98gz0LG@7G!f`@qY#!m`Li^0p2|$D<&p{aAYja-moyMIpxv(+Gm&Iv} -Bt76s;)S73kVLQP-tZa(b!OiX~C#is^BR(GmmY>aXW6*Hxl-De<|LZ}Zwa-rb-td>Z!G|N}OzLbr2Q_{hMN2)~s@KP4QgCH{>o@jJ02Qz>u55x;IO69%7@(!gxpX)xC>$8I>28-j -CAr$cm$%S64>E2W)eBlV#3AF8pFI(bn6m@A^0l$KA7B$N)Rh`B(9hEP@eVHTMg|y4iB*^8W^a80c+ -VywB`3tDtI3!(c~iLiI-oAwgLHrM^jDR$wm?3U^l#pbkT{+1Lt_(UT*XxzhBTD$cU9Z3jLB|$qGNoUrZ@B(oUaE7B$dj(bpg{pm -w=Bi#42;RO@MYuypot~w9`BfD(H4x+a8+JdN;e=}uFbJX!J84p9-eEf;nr8{9Q%1KS{V1>9Gjo7&rz< -=otx{em~?(9cc#50@-Tr=%M>LrTf{FaTcR2->Ng(x&1UVl|;8bjiWi82P6f!hA -D4K`7lOf+nJj!8gu7~zYy$sWsEi|2IqyTJGd=?Z>rVKUq_A6M28QPT1!R}Bk6e1A_fM>3-OfZH_}1pf -EApZvTP>r3W}(J9-wXR!u(cLz)yHKCcN=*6a -4ji8ZBewZbwkqqvZPU=f|(^PV1ieA&?$bcU;Ur*!mrS0c)_(5Vhy<&DcQa#LXtBp^gLPLPI#5{0}=|C??d@#Ta-V7@`EkPA4B= -@&DBn)Q&dt=4`=}z`i_iivt1TjnBwgpit*cI>uy3!Dn~3 -&Mxb7>u*TAnp(OG!FPiJz=4rZ1k$Ep1cPrz_P+-6lLeZ#7WvATI&#FmGR$Gm9l!l6+SI@z$vt&UIJ*9 -Aj6K5?(n9b~aYyvUb%GGsK#g}^<7Q8sgz65Wu6VJgSM*y0HHM(`~n_eNuU6i>K28rnFT2^fFITW^$)b -`>{hX{T3V1S+2D+)Qe-tSK6iL#vL+4F4;*8`>(5mQ&Cks3Fw62VL(=pIaas7&sCfo+9t5eLFu=?W=!# -@mg6bUst7xQO+K9Wm$Il*4?yH!cgDT;*MN0Qt#SKb1TA$PXM!L` -FTWWEQfZjHOc_-A8qf~;Egel(%z4!#{7)|cLormD3k@to;$@4z_N7(d7Gfli1UtU4AUfXl{lxU=qCVxUpyW(fXXAv_2qjyqJZbS9VV~qUPYImF$iJ!RsMZQTpu}U{;}G#Q&*e3IZki**5BsCFwmjhJ+g% -O@_cr<6Y#h(CD_W$6UWaNPw*}83_In%2z1)Ia&+Ss}bFU2@44v|A(IKk-vPN}XTYS-V(xoiugFtYR|G -ZC&BqDN1=m+208;^wW`y`l=gjcGCPRl5{ULTF4L3t05FO&*jf^fMM2*@rlu&Z$zRHsw_}vQSk1z0PQ -%z`X6ND9rkB6h*wYkfit^I8Soxm=KF()bP0&#Gacu_4W9Wn$7c!Kfx3(!*97v<2*sP48C`+s0a^Fpu0 -v+TOxES5Vo870?{2;f<#LL{VEJV{)@W@D(#vhQ@cZ3MVS=jvhOf&x(53}4VcLXzFk25wH`9?cX#i8u2 -2$z7^Mab7c6>!2D?w-g7PPaE;k@T+(P_H+H!^oqHj*u^RA-c!b-GCqfdeP#J{Ql8PgeNm7x;K= -rWZzjFV^=d*O0amPcjAd<;F8s*T7n@yhYPd<_I=q*tc}*qZP-T~R&cPJ>R_6SJrL;X{xxpC0Un&!T++ -m1;?0ykuR2G0g+Nr0A-^6Q}W#5yhe}H!F+Bs3+|Z=a2BcDJJd)NnlPo(viWupucBvry_ki1cnbw*Gg) -PVN@&A8R>XY(~S|hy6GRxb3kSjxqypQ)|?5efMorAPxs|)_tvH`4C-B58B%OYl5JZePM!dt$AXIKF$j -#=JGcx2wAOht#6V?sQj+g)`GwWNQ4KTLp;zN+Y_7)U@nBoL1L3ZYuthbULUjdIO;T8w4%_4jith8YB9 -BZ@V?yM@YAU#4{FE(#i_y;@594wG;WjgGv6L)w#24UG8<|F;!k8}5xIUi@CJo8Li?X{9t$ -4XD7bg8t9iM7#n(B!gvi>1;v%KC8oj?3W7ds+qwd+aM*2VGh2o4!%?N>#4EPU8uW2*y+Ev3ehi_8Z9G0iOe9Hm}R3?B4Z_Ykda#soZ(a-8g^3eh@ws9p4LCeK?A;U^ -4BM&WH9#>&&0*HI89pT(pdA?my-V)+c^}8@=Qpod|M1x%>vx_J69UVm&aT^$Z^s -ltFl#vMFIe@Yd~*!QPdv1ze56miqBa{>Wl8U`)7xe1k`lqJwc>K)2Y|KZT?k%kXpTd`=TYtC>~R?IJg -T~VQYSy#?de}qit7{^!#9&eq(k~P6ywnrS$G%oec5fLWLh_lxp-YDyIcUy$s9%ehI5?j;Jd0_?V!AO}I!$FmA -X^0fb?d*`ORwdSXl71e+b}O3S(#|7+eIjso!79S|G9()FqyF>WEoG)Vwx!f`#VWZiSIK2m#FawRL1rE -RL!yNco2c*JfxRc;+15Wwqy1!gd9+WUqS1VR6`vLtm*AV|GMe?6KFstYO~G1+aYoDJZM{f1KNgeesa$jP)8~ -lcKRrfpnieehi%b_2|dfZ@>TWgT|S3ufd1gxoKhjc%`hc=UAe?D)An{omuT3luoTS3V26kRWa -eqzYIp@9-lykk@QIS7&U3F^2bKG8xphqpwZGiD$cge8qi>+A<(2s~hvDYfy3`a?n?vn=FvYtiklcYeoh$RNRbrgCA36p_27` -ICC`ko()&bR|wlpGfhL=B_48Uwps-1d*HX_kfo?b9u2Ycee1yxZo#dvBa-uJhCtr?zpNwjr51r}3yjZ -gJamq3%FtQE^(s58C!*I`$?S>s%87?-$f-5Wu$M{2SE!HBl6Vr&oQv`$QT&)Nd4An0TM$58tj5RGGyd -!+8yQniX&gMA9=Zv=nm{s71+BJB4&y&;a!x*&g$1&^kNF)sqVNGE`J+KZh=aXKNK9JNPd#rbaGyf-CJ -@%~nrk*rE0y1w0uPm%EM&v~758mx|@mOwVq>wg!C5sq8b)x99drNrc5n+aM*twt!iVH% -xbela#~%<6)|NaR`zLV5|bjDn@Hifwc#m>(+p=0QHif3nmy`R -LT&`9y0vTFQ+kAbS;hb0HW}x#L=83vM)&R|d&X}D$o_roe!{ciMz;|jD+NN_BrXm_yDdhq%<{o(+V`r#Qy{hiPDBTjYHieF+PZeuDZcU395=rCQv(l+K(m6Lviq?&J7e)yMCdMp|G`}iG* -wy_E!EgeRq`IDIFdeu2|SeKHV#FJXKMt@47V1=to9ui`hwb;v~JxqJ?!4rO9 -$V$HOBPzttPTxa?`k23`&XQ#2Y~#nETz(rDB$Em9ejY;Y8PlOpfqD4RkDIAV$N!dz!R*_Q)p-%GI5_- -1R{+_du`op_fU1D#IA;M1)=eYZ~jcG&Ot`u(TRkDs>O_(}!~AGx4}>x&#zw1G=>S(~lk6}+<2TL%KpX -2z?qfmnb)Z|$3EuV=Gll2GJRhJ*3_VcbBe-I*-y1PJA=noU7M0Y2qDrRXJ|=)#DnUjZOzVhy~KY@;3t -d>j7kpGTmCf4=gU^Xxn#sOlZroR2R}(?vw(!q1}&oBCT3pa9yzH>`YdoWjO%A>T_eAMzc?#w5fSiNy^ -s`{uJjiSHD|voE=PQikux3QE$Dud%91*h30R*(TiUI1EJNpdp{KuOEln{Yxre2$TeP*u-nW5Uc#F7d( -`0mm@UMz?VD_J5JJQbrZZeuFuj#i9DA_e5Pb0gFZnWe&HORu>V#+i^omhvGRA0?EIZ-2cNFJDbI`yQ3 -NhUM|E3XZv1yoE2$O}%-W_D6{d@cJ0C&GiSDRdq1&g2$b)UqT*>n!zfH;$kxhCB-hmX1-%uK@A{S1cJ -?uT})lZx)Re04(4UPZJC8<1pM%#eRl2JG849OVHDVXMR*?e``CNeMY@bIvEOWlyPYN*Cnm7Az(X(>GK -KfA3IfEp3gVlcK(XA)}C^vC6nrPlKpB~D_K9J-LR>v)bvyPcB8d{>|r+sLk-+>9x`&9gF4o}sA(?^ -oEIzaSp%i8E4OMRTqaB%oD2TRC44c(e&W8w?#_p~hvAJ$afyhFJp1n>f41ZHTw;K -6o38J$^97&y3fp573L44N=iR01keTg)aa&B#P*BoC|1%VinQRqS(|<=$-CPNC@8h3>EK&Nb$}IPR1Ew -ubw%=R?T{2S@OaW{OnJl0mCLk!NbpwS%o0_KQzZhtT*s+$=fEJBXUEpn`6mYEp>WjIbk2wDqrd^kRZ -?^a+wB=bF3awCC|%(gxQW7{dhe9&cJP0Q<*kc)N%ST3EyQgFxMi2MQqwIoJiYD@S^t^Ng2(^vu~#H%u -vqIn7Ae;FDzX8xEVJ$T#Fy5SkC3%uY}&9W&kXlm&WX$!-zz0_m52b2s!7@pZ!SuK>i&)z4CWFD>NH}2dsj$ulFIdE<*RFnio3o@8zHixmg6~Vn -2jH?9!3I5vy>hjXEOp~;koZL3Zw_Y&EC5`lzSp*51~cS-)9o}goNCt%*I)?o -)=;SDUg@j!F>AM>BQ8B@AT0~jT2LcLahT+9iEX#ruv(Dho<534|i;8((&&F$f={jYLJpbWO5BaT0z{! -p&|2*15Hsi4yL1AZ|f?htC{QNa&Cur&G?$>DwGDOROveBtH$E6F^cAe&*brI=={}#=(LvU%4izDeNY} -DGHw->#FeZllHJH2n2qa2Jd^@BkmEww2LV{_+sEH(1=H}3k2)^@*s~Mh%D~(IhT!}hrCQvIO3O&-Ha0 -~X>kpe3HoV2idDmKmUe-Y`6T%fWz74!$_|1v<)t6o(=V$n0Q1HbCd|gQ6gXeL9TLgap&8;6EvYPUhJ* -wDQRDJ?)BU*j?bu$jcMX*rf!8UQy8gi^m8$j)~ALEd-lvd2X<4&vjY0fNvlsC_@+fEXb(~#!E*H!{k6 -?T%ZATU*GYir;F;ccf&jX|vF$2Rk$?7dJaQFk0p(f5taN2gj< -8mrCGP>i3UCB?XJ`rf|5;*y53OoKzFc!d61F>UTAh?Qn@+jUr}W%gQ)nEGza5b`Jwys$X78#2&iz=G% -rsy=PtLmAQ(?94ZR+2FDw@e}3HQiBeB1OFiv%aOf%ykp$>@BZ@k1 -C%^g-)=z8IQ`SB?_R%&#uHeBL_9QvS0NgdC>tJN#dw`gE)2Me!54(9_#I&4zYV~|U2q^QXoP_@E&p!N -2s{)uP#^+ZTm~wqB0TWI#hwPC}GsGX)(x9N$X9Nz~6FB=^AK3KX -rJ~h-l^r?{TMJZQ^(Kb{DHGG4^jk+>ylT|jAcDDA)Gj$9B~26rFglC>Qu0TP{Mw#20aW{_=HL<)o3y&$qfl{ -l)<9nAWin`pU=(Q83U@@LHV2J9*E(x_UA4gfPk -^w@<42tKG_Fa$2v-6qO+Ne)}%Xf>6RgTbWxm@oln3Al%i;jqDvqd=S&;zG5+&9#Sx-i4SZ6FS}}z<`L -Y)^tXNQjPgE93$Rt{y71)nd#?aW!cam^C7H=>z0h9TiB9gVh%J(Vsw$nM0x?Dl8H;e{PoA>jW}!>XP5E8IG$zVJw>aJlG -r?}MU0*@JJ2V)7Ok4YAfG0kWotTRwwf8d?z3LG# -&rW4r&`@VVg7@-@-{XU2y39wrXPjTg7uy6Z?rbS>_QSa45ViPbP@TfP%4dXgkt~u5FEr`)(Mn@zgNsL -Z&kF!Sl#7$R@vnb(l~#iJ`evx_jx${kAPwb`xRUd_E}Sn^b^&=z!{K9=tby+O>|$uP(^yV;L!0)omo) -T`Ra~0LtW?v9EQ+?!SCdKzqX3^iiuYwEA4-As3wvLJ!b3XQ>u9ilNXi#=$FUgZAqo=m~BqT*CiefuSe%OuSqPq-16AM7MAcPi -(06o(9>Mi+Pg#bp_kc)vI#_L@;01?HD~$!O9B@8v#L2Db^j%?);<8t5k480Dy%v$*r5oM~aK&3T)&b<9HF!Pd%@;<}XjlDNEzwZLbVJBhZWZhWb@iXDm;pKGJTCFTa2AySW0wrH^G&^~va{Z -IcEmV%5>=%zRe}YbGp&BGJ69{fz7%e#?G -2j@gdmpU5ZM~9nj2|r-sVyY@@&&C0Zm4NhyrI -;#|6WDR$fJu#d23pLPP|s5hQ_ -CTFs%(T!ol_DYNkZ(BSm0t558cW`&L>T6EEc)xO$|MA^80Ztfp^q`kV%!F)QB -Zo|iSD?$Fe3#Ka)+7rN4VrsB(aQJPono}JZDW(E4{>TiYWR>{9ez)j)%ys)Um-RO6_z2S6xJRCO4E)J@~NByTq-DiWrQ4bdV{?q6E!$CBUpFP*J>@T3I#v9ULoQsm{fZ}L^(+3?~r^zpC475%RR5;^iipF -#m4IlNMA3nfv9zN~yr*;Ro98?ry-9h~g!bNZURU}sbrep2Hx_PVy -J;iEyd6)hvK_D8Z9sjKcoakz=l9zc)_}TKbv`x9NuA%Qd{!ux)z~UMPn4l)-F$Z#8UaDcp>4iPuY9?a -zP15W$GRHhcFh@6$QGcP$u63(HygohS427SjpnWIG$qsl^2D!Ha}M;>!Ns@WJF-AKba?la|Hx&dqm=~ -)y*O@&0@aQ2H{34vAc>S7jnFsvKT)TLPyY|Lfih~0f@Dp{GShm{IOyeKDEcd!g{c14vt#(VE71yX5Ie -^k6`H#=E-%D&9e1|h$gA(pvaE&h}N7ZAI#eOZf(l;6_Gc4SVKXrz_4QCM}*tdjoeiYT(8&HBiFyx%(3 -VlcU$fZGJ=v8B)SYTeQ8K^+3qbN(dDVgeM6#e=wS&W`i9PY?TF|#MXjXp8wW(M8ZB$6ZZC^%2q(KR6t^I$+xvVE-Ks-9kI7Wa!s|LoXTs%2-S&s6jK#( -o37hErK4Qph2)1Nx<^gZE*L&9l_mYdLKm&oS0iBqWi!+hsN#YK@VY}HUPSZ4zaOvDXP1!FdWV{1G<;c -pOt~S>+&=B3^)GKEdhInzB`~y_X77W+1s=kbK%}4i{&{S^62ORayYaiF`i)L%v#L(1TEy!I}oGc!NTk -D1I0S_fYjB`6xb;Hqq?dG22ckgen8h^EgW`-ibiGM7KhzsN29VsKkgOGTUn7>xiPZv1LnraCS-0*kiY -WWm|$^RU;@`vhlvSH9nTEfEKc+FN*uRc#T+_sApkj$2D-+WGO_9c}T-o3R`fVVM*XhSL6XaJz8ppi{{Tw)%`=0zd@Mg~n -{4Y#0#C3vgPc)v#ycXqd%GKTSWaV8>yzb6qn=&Q_8&i467Cg0nPhR!@&)FI;HNe!iGYo^?fsWvBHqL6 -3X_oeOp1QnBtFs}{WRp)2tw+;*;*G)$JvYR~Z*2#g*Hs~n-!ss@t_-xGR&}g_+5&~%u4qHa54MGp*E^ -+IeB8y&b$1gYyisM=#VW_Oq1|;=zKwAa+0EZK{7exT*wr6AcM;EZsUER6aFNHI-Qn<{e^_0j4`q(ZnK -42Whb}CupyRrG5%A(o$&7to_r4Ut|cdxF9b$*QuGf-(F1BQE38ddKwp(@=Z(L;2Vo@dAfl&4K=*w -8?PI(@iyBmDPN`iQ6~bl77B9-XNeiuc^RucR;=DRDZ%w^n~59&dXf7ytkOaA|NaUv_0~WN&gWaCvZHa&u{JXD)Dg?0x-X+cvV`@BS-L<+`F0O0k@_+q!Y -yI*HTzn%KG6-R?fuE71~VvzADer0i(h?%#g%0e}DqO0tu_xA(5vZ7h+%02mAggTZ_}=sxU*e^h|yJ)U&f&*GZCdrF^}^CDr6UBl%&uyz=@!X^Cgxou -K-YyP0HISkD>TjL`9K}k_aG*aW-1a;9@?C2o`QDqEBy -kBc%-MhGQ@LZj(o%>7UWrpYXktsnrxM}c4$1&jmx8X^Ld3I2^~aP!5*G%2n^fHF=H{KcY##|1tf#VOW -<(LBy_QN+_J!bqU^G~%jMRpU@pm^TXtb`tOPjEKo)g;ST#Z?4DxInx!_Mmydb!3by$6gdAP(lI|G0$>p)E -#e+JMry-I5~cG`osRa195mF-o88j>*33Tm!h?Q0>4|K_~G#M+vD#~1(bNVe{}kHar{c`AN^f?cX;#?F -@Es3x9<*4PQ>v$arox#>%)VWp*TEx@%sChhezLt=TP(L_*A?;d~_0zzeR%r!P`o-kJwm9j0PMbayZ`R=@WuD9_uq-P-@ki%d~yI?cnN@y4v${FgLV$y92}j(h@fS7Dh~b -%KgG$n`>$V9bNk=J7~WAIUmU;v`@6$$zC9J+9>0Eh01uxZK=1aSzdqo`j{c4-@%8@Un^3&mf3yG10o6 -MOIPa*S?BNgJ9?&CbaUcHw;`H$N2yye`_~`T<{6yTG9=|))m47%qIS9r6yTcPi%&T|D&;TM9>KqdosC -jh2a1iO(bAX{|2MXa>zCSsr`t$N&|2056!RqEz;^b}(2C!%c1Fx+_yL$y)y+^ -WvjwdDv<)jaWuJEDJ2uuq0RkpCDwu(HvNya!)z#lL2C?| -$JlCxJ{MJ06w`;LeKIAy*-HUtBbEdp!Ifiq2)$S&S4VXo8O*4DQ%^Rft=z>-)W8;?cnTVR&J(tgPD>G -+eD2%yKfhg`zeLWq_O1%@}<8V*}ei)gxF&iyPDPowb|#}voUK4}eyurpjNl4&UxbLb`3-lg8}4gvgl7 -;dSbuM?Q;XgXwete)09h@e!%a0g8{TX7(5$_4ESeMW`J#?mDqt-VLjYp -mJ9q9wvY4@5Q1CaqRhI0%$qnbd3N1inlL)MyIWfVK9d|ai+M8d4Q}FeoaMcWu7Nax9V1F%kB+AEtEk{ -Q57e4dvjxbFG^(ix{eZ=cl>@HZ5sySGY{9?o!%tca_X_6_Dmjx$@8&R45H+s&O{@D1xIHz}BLX-fOz` -VYN3KvwB(PD>7q~5(JDeK7)s*Ny6K8FD)DA^E#DC}we)*(*&TyF?VbLKrwUi+VOrZqG^ydX29*RZd=w -b?6Ht(!3F-YjJxlg(#qm;!uo$kHMx590%6~N>&1SM1gb#vP%j5g9S=r5iD+EMp3F-L(zzaG2V(wDc-1V -)_CR>3|K@3HpnRh)|3JfW3c#_vn!0(n7`+66)f_DM_&<UF5ipBEY8M=nY3#_S>w!Vo=>h(z((K_vJb=}X_Uy~vscBq-AchZIy*RiJ_L^|MR1mhwqVw?NUvZ53jyvwT@*-|Bv6rMx#NG -v_^eZfFrb5_g-cZm3Xg!>lBX;;}TG>4e)8q9pkOoz7(YtJB#Q{zpzEdtin^B2%*fM4kMvU_$TcwmS|P -(s`SOX*(b8E|Z~E#}@P2PO`VEzxfThj`*KD8>sb8#ozl;dNjN(0|5xcAUS-@|eJxQ*oTe@{QSTT+8M@ -0Brpk>>T>hukELA5LvI1yeO?V|7brw&f$sMPWw;orw1SoSeplJsj~}Y&r-NB#{f(;LohSw9hQUl??sk -!5A_L(*$^*f*s610USm8DA$c(-%;~b3NfDQl5RU-P5JAIsG3HecEP6hH6JpgXI3~b8(;Xp?o+j57mc} -uiuj27*U^+D{L$8k~6>u66;22@!dIPxjz%4S+bU)y-1f51rOoE96STh-IkWE -S(A?LUkCc`oP>-2ZZS=S%VZ=?g3gJ2MQB3(?_No{YuQc{v+h{$+ujt5*P?M=>m}%ea@u;s -%W!XOYb*y$j3|cn2JYC5Iq33o_zG0(;^TcdtouxyVUs1n$6Zi90xuf{yXJR~?X%En)NfuwP|G(cPdO+ -O#X_YXaNcB3I%7i9Z*yAfP#HyHO$aG-9&Aa%vUj<>;ZVon~(|iFkFHi7Q2CGmv -%HpMnQzR{F2p9|WPqxAmhCP^Zd=pQzIqohDk_2RsNKqk44|uY>iY5mjE)HOa9hBL1Ob6A;G$P@fn+1l -zXWhf1Sj6JN7f%=$@ECd+!yKn^wkQON6zWg|A3ALFCMfqv6h&b``=ox*TN+?Q3e32PCRF4&N0GGJO2nuP~sFY)oKEQgJfpnsE{W-qeoVn(38K|;VUM*FV;_Ccz@l1R@# -WPi5WZ}WH*j}`Q4?(x@AM!)%Mxt~%IEj#j$>GC)o@%K4vgXnusuujgE*>PN4lGMXACWkXV;)5T6mUsQ*vq(FS|f9Ooa$4dPDE*>pl=5OL}_>^q5@-DuN-(#th>tudP2XL -+_QOrLyl1~N=)n9?#=c{u-T>%W3?APk{6wBg#OzGdhW3xkXaK<(DXpetY`n^+5_pkR?A`;62HHo=5z9K6hb`F -QzuGxA4&k>`zx_DN~-N2e2rPC-g15O-DdVgg_c%%nL-cuj2QNfUWjbIhz{reu{1)wQ!G&`g{3xrO_t$k9npUFWO;~BuF3J}k?wqTnpFj1x|ns&cAuPYz5V;(2^6vGoNb?ry*-fPlZn6rEcOlF?Eh_Wcy!9ed$Z_$k^Gb8XwhWcn -(?jgoRSpl}U;O}jY7`kP;G6s{#dy>}v$_q14je3q1W|s;s_7(!?U*DMDNQY;qK?(!kvzE}D6YDnUp|) -=aZ@f9vrtUqG=xKWPM5H-gkn78hf>8y$O=(JL3QL3HNewQ%o3;qBL?)waF%L92%Zy3nndD+$M5M24{Z -!*RvK@RUHsIkq;!yDUgp`nn~-W17XgWTD5R;vJYv9aTu8C#dq$;kd`RMSJYDwSd;`K9?6k7D0s${3Qq -+r*DeE|N?MT5pNaL!ZJCrx-Alh6Pa>&&r3E1rT!U1GnK>JmM ->^4VwQ$>)F9GEyrx^B9FU+V5vmR50f8MABosV*#z+18kCBg1r5w2S1Js+BkrT$2*F^=vYV{>U3Q4( -;K0O^x*6Zb@6mHxQtU49Zr{XWPGSs2!bUIl`b=h5eEGZUQ!V!gee@v#VCSuW01V%IAEzC&_nU3P&^IA -vrx3~Mv5*R_-ros8JI7u*CS;mPj@s!YY@67hb7FXMc= -u$TP%xH-93qvUQ~>dWB@0GI7gWVmX-Aa4}A1u3#CBWFsg9-J5N6Q{EI(-`BiI6ioN`XzC9AH{pT-U9= -wV!Mlf})Eqyq^BC;EgsO;9@qCnxBYs0=De6`crssu>V;`DyXk~A2xx&tvJ`>2Z{lOLfijq$R&$pQjm1 -yubU80c>mIngyxte#8V6*i5FNgeugIBB5XR+lT(o;|pY@1f4Mgt*1vii -T!w6bwbg+N+9dP;*4uDy9|i(VCOQZitf!i0?IVw$0$yhZm($z)j>vmm;W#nG-|X&7vUZj|zMV^>5sSu -!pJN)S+A%`JewOi4XRio_|LOABCQ8Cu9JF7zdur@N9Bz?g!0++(D`7s3nt1=P@A3$GnR5FN-pprWscb -|f1+1+Ws{ma02#aj_&FAYM^hv)>hb$b~PaFo+M4Ib6iKy6Uc$BVJ$TX*TZvHcOE6cOKpi -Dpaw09qD94lVP -jK)qeB#kLi2cp=A$f4_zz6j@<5)l6|U@;5@CB5`nsZTZ5zhOZK5#XtF1jy&(3y@2F}CUl)4|Yl~6-IG -l0N(pyN)TD%V4V&I5De#|h3m&1{_zCAUI`Lu*CJaUjb;y?{hms%lFdm9$Y8Kq|3={vK2u<|@x_Q@%Cf -BZPTL&(?`-GD0nV%_obExbFwC-4Efn_hqyaHDpPn%+ZMC-SZ3C%b{4=!Q&&|4+bsVrZ3~X)v@f~P(W? -f&Mx+Jk&xwZG!i*s1MPU8N|wAUe)+A{BMA^o;`-=Fc1Pt3V+aTDVL_I3Sw+397~Qt!bA4uW{i;dTPJc -@i4+}K~st`wxR719Nu*hJHAv~CuS9|?08f2O`T7)U1Ycv%$rh;w~@$5WB!iwsaut8M10Es% -=tPt?7$1lc43vnGVek1@NsN?j+-0HTN)8FukQRWs@JYXdCgrvN~53;{~x`)pS6Hy?9^%*pV~uA)O+4D -Vft;9r!D$U)qV0nZNEPA3M#1f5+@1&4CD{CIu%09#)HIidVR>Y#EQzd=-BXddV6Y5Be4M%s$cqVUbd! -eDV4UsSX?(vUIw1_ZZX$l0^q?Nl2k;n+v6Bxk9}>cPr4v6)?1FuHH! -=5W(4dS|(lM1G36gD!+)xOo6meE+6(7C7zt+jLP)F9IHV-M_C!~vQ{yPF4GL!8%g_D?yz*jP(8A3Sc{ -6uX%eoulG2&7aWRoW5B)-lxCTbyhHSEw!583OnSBo>8zVbK)xag%+a-9zkW3Of{xTAvF|t9kjN6a#IB -}b>b>fm6Tqs*bra)ykrQjp$f`bnnpka5JMN919C|}MIMbHMC^z=-vBeRzdo)VE@j9qAvj)A6?iBE%mR -@xz@D4UcOT)+Y^6z}1aU$Gh;4kkI@mqPP+Zx>iQex+TLU=4LJ@x;bm*#M#xVNihtqMDLX6=;jLcqphG -ZnX1C(Z`G`&F^U$jFagifuVJ*NyMv>At|E3ziHMQZj@MkrT`q@Yb}_YlMmGPa;!N7;*LbQQN70M -aZdEoW1UJWSkV0KxZ!gH?Occr1t8sbiB%O(%oW(6Fk~zQPV&_JAybet+4ih*N_DB4V=_prExvy8mOsl -7xOwNODZ|LE!;cW4oYft#guEf9{E@kBp=`db|U4Pu%JwuT3lBZX!mD@QLVea~v7nJU`|BKii1fH$jv} -lG$v>L%hu3x_ic<(&#kKB=Z<=qjZh7W%64*zO{c$+kD*Q8z1wCW}EV?Jg1=%a+gkLwDrc`6B|emu=}D -cl}eWj=Ci35DACh2gZ=Sq*nP8kVJVlB*(@HTdHHmyc1kvtG-^q8|9mzC3hGvVHy{iG)IcB#udY#`VT;xa8QnRF*>Of%r%HL&#gRII7?%+&<*QMfBaF>j_W4I6 -#72V>M9Hm^M)g>AwP*KL9|vTABNhr7D6)1uHKPdy9~Wnlacj=gsbVFud|VK@Wl<@<=r|%Fk|;Ev93{4G7#hE>B -o#x$1|tZoGF%hOs0X#ntYP%mSx$u-vOvx`WQQ5ktG;(*o7K{zeso2c{(^nur}wCMd?TeTi((8Yc~N-V -f(H?#Rl;oUW1Roly}*Yczq9b(8uiRQ0puyslgJ>lpE6pzCd)R}Dh<4yMYz8FekNtyD^xE_+3i&LS8Nr!nro1iv#JcB)c9)l>#; -=iXyUSqcZDdUV!59}X*D!m6fLcN!IYPxH#R>e+B8J=iw##OgHa9F?MO&rmk%m$>+(YCDhx9mqjz8Ao} -G&V-NKjY8EU(Nui~V#L)4)E`I7mLW+#5b@881Q>_3Ae$LX&m4{fXLrA9#_5;&f*Ra1pc-metq6`R3YB -JH#@fKgZ0o>^drOtu|LUu+9`|=1Kk1td;hI5X{Q&5AlJ4Qc>iBfIc)iqpCbUcGLSFqso3I>ySkZmGYDT@f$5=SCml=EN1hd(+Y93ZBj`KbByfgjR?l$z+?QUz -oWlC>9^0FNkT(VsKZsnfbt?E&#!L9k1AlPQ)OizUE;qUy@BjY1x$J(XUA#8r$DIzIFnz`eOQHeWA>NCKY^{NWwlDBdm@6yhr2Ecu>?&_V}B|lI70~M(Bk%ri -NG>p;#GZ0a%3|GQo)D^D!9XKv@FyzC)-I@3*b?Wjqlm%P--_u%N68~e|*CXeACLBZ&L7vhI@ddqmGQ@ -C22GjR5EP0!?W{_XM}#*slYZUw2Ud&-_L!(d66|Ll|5~n0?rC`8e&jSZ__cx66a+D6~O}jw*6|$W_{r -YHI3(#u%XEc=nA@6-M88`e`BYs{`iN_xBS6(@sd3jkb&^GLp*iR*G=a}?XKPvq1=#?=ItBrPw1r?cyVrS4#mx8`? -7(|o3MdgJKp_T_2&9q*)Zv6blY?t(vH!=)6Ch8!}J#yQ0d0Rkh@b|hsMM<_JAgodT`@wV8uk=XB17#` -3BalcYqC;hPSIY8N4>d849-%823}s$SR(0yiSr8$eb;wbU}$a1$Wc7xe>JJSxZ(C5T%&P4Spvj9`>MknDk`XfLiTz+`DV -4)RS%`f!pXLdB2#e=13omK8HqFE2}&%d=fk|U_E(`9-&2@5A<;Qi@<|Btp5`qvog*-eZj{oJENSLHmrNLi+*1w1T1wOFN?Zr8J6W$R -FE5!jlxj0RIS#!ZCFt+x3SXp+32-h-{gh(ny)k(b>UPSNt39)qJXLwEn;}z1nhD;fzS$56dfou-SN)dANLjPM1|60WZBtuPWh;n$ifi`aw^K7off`{nV27ex2-{Q9hJ -MMQRJ#hqRHDJV?Qmt;u%IIA2A+= -L+ov5IK%(~8V(|nEUwX;nnKRYV5sUoO+60TxL;JB+jH7C`2_uOqNa%0(hKrYY$BhVv2OUxoR+Cnn)950eIw6|vPJvK~hb}A^v|jH&KX^?yq26wKhJ*DT@09)LR -Tt&0RmVNAV#ryVSHHatkKg9h0Z8QqUTOREbndyD{Y?onG45Mg2?0#Zn8(lK$-8qyo4 -oPd24MAvUe@pIOOYAeaKE2s~<0t()xt`oQf&tJ&pZQM!6W>nPa=X@e2l^bsi{v$TPyhdNow&W`9`m89 -oY5YsJ7dM++nXo;W)~5z7Cd^A50Gjc|%F*eXqrz1jto>=x#;f=1jyZDkia_@S)h!~+YmKW9o^)wb#3A --qm6RaWxyQv4?TdS=lq-%%b=w&gJ9mhG+W4-zI$fzKpn2itD0|TN!ZAx$lES634?;wTs?cAt5Z#3~$_ -p$bSj<8vGN5qn$xWOxP?Xu|A~%;DquK@+BMxaU1LK%}ehdJ%Bcn?oJdnhIJsS?0;?14QE{c1dl3k3A> -?D~bn9~7Rp4{vZ2^(#8D~)*wrN4s(4A0@_7A!?80B;DqG~}Ku*dXh0h9v^>`y# -s;YH)?Qk+69JSaQH7sXPXw?OWP56Jc2_LvcoR?amjLQ%I6esAS?kD;~s#1{ksmwwlqRLoSvH@uU>lZ5 -l{OBU+v?`q7#mO$qlTmmXI@FXzF$qC?aU-m6s6U(81Up^;>lMjDO_hn5IoQhz)E9vD`}28`Z3F@&3rdx@9X~TXwz -09M7tOu3?xY*8(hIZIc{xCP#xB8|{7QEt#znPh`^F+jFgH9;ggPh;&RCOPLr@uWs%6oQVo0q>c*V+Qi --5)mC5359Bpbw3OLa}jwS*5m0?RACy%qdH<%#~Et{oJ@iOoCWM0RwDq>e(_l>C{c0EK=mPP0c54N|4xml9v!bK5rYHi3%12(1cd;s3M;4wcBRbFm149YfkX-U{PzLw -u4|@Bp-n4IRY)T{0Z+nZe7br6PmNf?B0v2p2Awf!aaL%o2X8W?nsMll8WoA3JMzMt)jwSlbrF+P`_E8 -eYHe|D3ey|K9ci7nSI#ElPM+D4;GxwqFNJH*UcBx@%2w)THwF*-BE@;5HYG0F~RiZm6Wgv7;EjTSg>7 -keaBl1y2iuAsH1X$zU?S$YlmcWnms};*{4gtDCLnTW!9(cWm$#W?^&5Z@Tf!spu7%+{K8Lahs^IO4;N -F9k!lY!=2EBapjs6Q2hwm|s^=7l)dLwwdvWuZJtTazW&l3YlO%fvfOS`##RacIFE`;`Hh1+Ryx|%P05 -jEWz5rOY-MkDcUCsZqdgC^!j31K{c+JGCT|@rbl#YWl$5T%G&taSAq4=c@y>9P@IX4)Xxe_so;Is#n~W%|aq=T)u=osyrh2aZ0%e!wfK^|yr@y&t*5pHuD{G+) -D6ko3MC>>nQkF*wB8}0$=;~gjo4$%LDK=HH>5gM%{Z!aN-{jcwFNjze_^O&79sdNN$&R -vzA?;%{$WE2(&#jmqfKaA+Ol92J=DX^)&u`Kl`|_gb*RIJOdOW;NGg6QjXP3_?g5hB~W7MCeFQV45jP -F3p0-m=%X?bcG@|PJs-ANo>n+^5*SHidHqPAJghdP3Eu0tfrIB@!@r+eoXgI^xEV8s*io#uVAI|`|>r -$={zLt(>70E9*Gu=(F}KhX$GS?s(lxwELBhxIG!vS2Z$ -8B*>yk0FoQ&X&9T#}np|=fU!IsNz^@TuQ078$aUn~2HHOvFXk>p5CYrr}xhJi|(}On#qU1U63{a@n9c -*h)TcN50zn-;(A<}c8L@CNvS9Hz+dDRwFlad?!jgr(rf`1p$-Dja3*-TaCEZHF3w))uUCN@x!3NfqAL -D}TGc}2Y}I(28y=AG1ogFE*3-+1W$VLzaI>6>JXheu-EAqB!QZFnNqxwD4Fvw8{-e^8%I$xlPEh|UKN -S2~w&bg*8x;MHek49(T<(7L~p4Y=>$&!*3_@lwVDGt(2X76+Da}&|H_5iU7b;NuuriV$NFOVsT+`HYtB9=Z8&gBW^;>V54?xFQY{7R-pHrm2&pAI|5 -FGt$KbbL(4msgL#wY!IXrgs{lnlL<^BBR&x(EKd8~BP>TiL*BU`O#>r$7lZ0wUP3O4doCY8&`S!U?Mh -i4VssibKur{M8(g8LrboRE^k7N8_SO0_mbJTNi94_Jk$2C{gRW90~{h*B+58YrWbdD$+3WnPp$W&JW< -rWTVfIDP}rk{Dth}Gv;!64L#peB6Xpn}8^l#edsR>#vv%#dm6Jax~TbU3=2t@hm65&eF@yR*}M0w3{U -XQ%(%>7l6!XK;0T=2JWAq!qzpuD;zi8&*(kxh<=3&CVHyDt5)rj!O*i(CA^~q*LAg^QNPIqc~{a=UN9 -Qa<#WkXm(Y2<{sgKnt~smH%f@`u4i$kjf|fSE@AaFQ1_?OA~|vleuQvtSV=$CSQfX7z~fNb)9zdy%!S -w|yXIg!?Dk!cdD+uOK+=(IgDY*DC6eKMWqJwc(RN!Uo7fI1=>VNc8;+zes~G&!2@5G)WdX<*r3yk?(& -;Iy{E8Y>3O%tuLY)`6d1W#oxEKz(bLhaN%+HNvoSZWid9w`qFEcsDK+NN@O6#E2#l?IYky?W<_b3nF| -5VMf6+UeP|AsNM*h*-Y_l7o>8A3^;a2ptd{j1@JtXlp7~f0$^b(*4=xni7@~A(dbr -#;SYl~blZOXuH*%Zv5=;_u-Adtb)13ccMK?AYWb4Ni$>r?R@%b))m7z2(stK5EI$;uep2O62pwA6+`h -m0X(K;xp;-+JAz?Em5Idjjuc<#OhfaS7F6=M#zW}Dtu;dDc3-eP9H8FG{2=~Y?Ii`~bM$Jwap&B?#Im -*tm_pFEx>7kQK~A9KmxRXLkJ8x91A`mYqVdIKGg6S;pX`)~M)Y^n0(qE0Er@5J!ClHKXut5*-K%Gk#Z -_E)L%Gz<eHvH>LXd{SV|}XMn;+ -eqaV{Qgw52$^~il3LD>g~Ng9bLyauHP;uFGtcO% -2Ti9GEbbTHF|>+r5MGs9IcuENNfnRmxZgmRh(-=Qx9FuTjxhyN+5_ij9AT8<5Q$dPqOqSmS1FOe$d7* -t*emst&*ij9*E*@9U+}w~hwiuNgTvMMP~hTr``rWIH@FuDs!>n^nTk4NS%DsIE47r7_WFBY`>OWnxAD -V2am2IjXDC%&J_Lfs?QjSWy*WL!Sb--Yh7;_8Ztr(HbO=FEPMHZbgBV`Pnhs6}o-_#pEiyrV%uRy^cz -iD-!cm7|Gc&4Hah8hTRM>g9)~1OW~Ywm`ee}bnq?WDSD=%Prm|%bI1CIKJO1kZZ{b_L0NcR#F$Pw%Vp -+~`2C!sibfYIgPfIN17Tgn6HLuU2^^FwtbzuN0}VNPLY&031N%eE8$5c*=Bfa3ixvPY@+o0!s=-PtJ2 -NNdaQO6e|2f96mwrUW;_{Ntp$LbM%mw?8Bvc6yYb2n#N#a|_ElHtWKSDrCWf;nfUCDnWp4IMOsL88=q -xn&6nod4I3R?!%^(n95Q)uTY={?xSw>X0b=#sL>M>VzsLsf296ulgz3KHU4p?`>Z># -nW<}H5CC>uz^K0&H{8DA_erMDOQ#Hx7Bh)~k^ON6rQ9|Wy8bWzcQ8Q`N7Y2e9Zg59o-S8}FW!KdR;Ci -o7_6|b7>P;y-Rk)W;1>h6L}?ixBwON@J+j&<+Jm$Goiz(WAC^9`c=j2`1dtXk=koZe`2ymbhq%#Usl4 -xH4syJlBLs;zV}otoeu8b?l`yY|bh3jzidOk0Ak#NkkQ -jhR4=s9u=gHcKg=BXhv_oJv$h1*5@7(`kX(y4vG-lyPV<^pnk#S(WV-GfYZ;gQSG(Gs=^4shAARBnVg -SEtTg9YY(VIfG{vq?R&(;-jgcT7peDBx;JFENY5-B9XD5QxQ(Xa+j(G(lQ9j(D6+NW`_ -rqmu#Qnawv>sA(sI#P1SwM -(Z1Gb~Ph)su-r*`AskJl|AJ`&B&HFjBt{B*S~;OC5;0;7o&ns{e8#kcjC90KH`?6hdKyuInNxkMgW2y -6E%`I~JPCehhkDO{^*<)n=5smP{3mszaMK&u2uV=jzN{rSw+TqIeZssEkoE>)M!u_&w=;PAeURi)r%D -m{V9|4k=6!EQ0~6ffUOEElVYy&vtjtan}l-gr6JBK>CD3AIbscaSo{Od)tm`@&QLIfyDyd8B=;{ly)= -&`nMcKFETUq#nK@Z?ag1sV}{?!{Ai5tJ99@FR-T0DJpo)uVqqD@VqltRPey^wt(NESxlBt5&|eXc&SbTg(x86&FZ^w| -J{}tCHVw_kdtw+8bIEk-Tn18j;z}$lWk+7q)wU8&_4ElG)JR;VlUMS=vUM6*zk^fO(uo(-Je3$+~Fq& -)s}|cyus$dHCuT4CV{j%;77sfAn|p;`rr(c=7H2(KiPtp*Z;K!IAji-=Cbq^EYn}j!sX+@jLPS_5RU! -1O$paKREs207{*HdmxSu{&q^w0n|$g7oWe_fBjmV9*bAsAH5KVM<<8S#t-lI-@ZL~7aE;;gAF}D5O0p -*=i$N2PvApPkTDKOnBDWP%AJm;hIur=(NpOGO$M58XaE$=tNPVHf25l?lu=Eaqj%Hu?s)#~4qEr^coi -E&r|*UxuVK5}V6THZT_;LfA#L!MVw{Xg0R`KN3=xTm+zBQTmV#vC-uQlP2#rdCz1UwC*tFI* -gYrSAtHB0XSX6QF&PmQwuTvy*&@XtiG)C4+}qVGD6S3=IR(jL2(MFvx+>#Q!S17;pl>1F#|u1hKJm9x -h%;ug7$RM#ll`GiJtbaB2Fpcm6Xs~2Inmsswl^T)>D%yJ!6U7nntsK!I#&*fr>6h*wl~dnHeMfH#iMI=2%pB2vMUpf8*a<;qA{MI;w6ZiI+Km!E>mF12k+<96W_G6T;#1>; -Jz`Nl0}NQ0F0wb`X)!JMgdD1jYem9eyq~3Te=04I`HhrloX9`C{r0rWE3RPZWZ?PS#fDQ<#BiL_EtHK -*Lnko=xf`f5_dw*=ZR)!XwrZ=Gw3dXECfc2*q%^xFJp}?Pc9QOuOfg_IK7`KF^WBA5I(5{#OsJ%LG -cmb8=C%ie4xIowi;=z;s*7z;7M2y``bI8;nt&_J6hkhyzt-LAHJuNH}1yfM!D3Z`nBqS{^|&KpMNL%+ -uP!c&$ho4JD-2?rnP~U^XL7Y?GUSl;)~BefAR(V-TC6n&z^k#+2>yvQtg4AU>(VCIK=B6i35&oO|mXO -$43p5ZD8=jk>^_{qd6`w>{!oSROWkUJ9c+yGawuE};MgXWT@@HWs&?x#0N=EvXp+J`Pl%{U3IN?f%Y_Ua! -{?0p@!EOo{DIh}%IL@Am29bl1r-Xmb+6NlVgO>yGU!_OwykwMenPOtH=es#|Kwz-m3Kw3F^FZ0SjGle -{rp^|r_0jmBKkv4gk)p59e5o=HNSx_Ey&QVf{T@Q1gKO45!Nxq_h#Wh%PSj_$Hw!7pQ}b-d9> -N$(mbOr$szF<>n23?vR2mtATXM@me8sz$(wdCRur^v!L46YOR@P!$xJEJ{s1lTSv%y)TfhXEhutqZ+^ -Q?qx#Sjt^#R=7m06a_wq+ml}_ZnI2{*AKtb!F%NPtMbhhj2xt+Cb9h79t&f(8uPpXI`_oKSphU{`5S< -zxZ&*7|d&1~)hzrLE1<9glW?hSj_QS|>C;3Y)%@|tu$zL47%+R0r}L@V6eq_Q-zv>MR`dF7F2i7l~uq -;VP!bq8RLzDH^Y;ZqiWz3B55nPR@$kyyHB+Lshnoq#|v0IlQbyMN-;$79d{XX1Da53jp`LYs(xbXWIjb;ye -@ilivd22y#zKO_;=6V+@%iqBGv;PqY*!a;Ev((G`sB>5YSMMA?So5W<+}qxO-t(vT`-DrrR@`Z#V)i*uG5=(jFoZF+Z3qR*J*bvE%QzKvg{vbm^EwjO1&Zi!juH$ -gnoMkChT=-wNGwui=!cH*(N!FcIo4M+MRf+&R+rM1H2D#Y?&))P`)A{LV%gaX&{{Ee=R!pFrQo|xrO1DB0iCKn0|3u5MX5FaosUZ7M{5%j<;zd;f*vNFuH?V1TOM?kH$Q -je*JrRu0Bu@J~^2?LH|Kg_Ub_LVP80Lt4kPRkwVi~VuRwf^$l(nAaL{F;xT47(>4tTf_CE4@S1m?HiauyFm0RRT_DR<}eYY(Et&x=1Oc&? -GTw>xVZ9DDcU1!M{D51)yDFO6G3nc|WHh@fXtDu^#^$Y*t2)(nPp6qTstA^7Pb**ypULz=T5de_8L^%mdOTutHZBXSG$fx0nn#09aG{|D|2lW -^Q>X>Ppb;JkX3Q?Hm3-Ax1NYuSdVPFS0fWKc?d#}7n`nL*^_UHN}U&emXYryn7X;uC -&@t1j?O%j>LfmS8;_$Yf3jjo!SSgQ;dmS>i_-`-P^PS`}KBOY)}WMx=n6M^ATn!DVk=EZ0^-L^u$#${ -LG7Htgobq{uR+(FGA3WdZbeYR7srowkjCS)6yHeZKzF|DM0F+5{qwN*=a6^rq^c4$aQ$L0&xUy?sJyy -aqc0Uvv8FLPq_orE!s9Dxj?kFGP%dqhHJV#(T5?u{6GLdcM_aaoj`wEi|J4bF -piJNG=2|;@iCaie+#47Xa{fDdfhW=JXWXD?z2{?(OgA-+Tfts-|(Q>Z(i&A)M>9CuhKymsB{moWH(a{ -)z-EZtkS3cGPMfQ`q>N>YO-Nled)BbPDoVjK{3ev7F!4ptYAJA;WQ?z-q#ZoT|qPTm@;`Tar#aU -x41c>f4pjc>u_W&(SpdqWlJ+P_z85F_D9aN|eid-&y$j|_KT*T82dOgtTJQ@dwC4566#9mT361+JodT -jBCp+Ew7tO&MNrSMlNR#c%e_$twh#%co`9qnNCifZuIx&n4KIL^m$9*;4hsXvCUB-dBTBx|5lg<*?Yp -`qlTzInbkf$BNN%R-~uzH*xovoYtJ6SM-pAyMl-+l1{aCbiz0`ouHB;0GM~cvSOjj(H~n=cdv9NcQ(# -yj-DbP#=yK=ssP$LaR=BSE+`vZl&U9&1%KZJyxu)cDGfltKEI&>Z*5Mz4lh~Z@EmJy$L_C4hEBi5^Z5 -#)mR!2jpLsead37n`}03+MXN!tU(|Zd>N@xXJ@7FuK5}ON64s@qsRAPCqpZ-Cjs3BVYgO;Oj2~2)ta# -brd0oaXz+1LFo^#e_cCaT8hYK0I=$g%{b4pt;BQ)HYwhVmxiZ=OqR1T_TDIQdwet;r2IJ#I$AD{7Ct` -Ky-*2T!!LU{!O^tfa;(;+)}jGTbi4fW;*AY@};z<00VucRlt07lBebM4u7D7LGxmDsNIxxi!&8V}Q@^ -0$x{?iMo0Jwto(YqJ#5m0)jU@*ZGJV1Plh5Zz#42J8$F8BcGdaZ3sKMdO!jf)U`9!G+3a7Lh4cg>rpj -;p5atyRZHB@H7-}4o@)95IU{v7o6%2Z*jeim_UstEAl0j+1}Un8T6k$R@Ab}vn$4)!IinwwbL~hgqi1 -(Cfly_k5zppqB=u#HAHx8l%7;yjU%zTb>Ga<>yEn0dBbk-Kw{Ypd0`kHg*0y}v7Qcuxq_n?8tox8+S3 -u>f`{;ntb#YyGt!tE;}6zb3kataGLpab&!zQeQKjYdKQ(P+T2CHp&H+ -UAW6xezVcQcGFBp^IFC-sj^nZWyzSw@nP>Z1@{Zv&&>;nK`~w`>NCuv&mqgV#m_{p<=5klf!_Ux*{RV -vTVvGWlTEu8M=RAZ0TwIUR>r8M$auewCNZodfHcvSId}b#8QSLO~%n!?mF>%*xgGba{FVbk&L5~qtcA -gu<(r@JlYA8ABB}&?ji$5Pt~eSWa(I=NV68x^PY(YZ~+2BVVj3{g*$8T$aGnQIUEi<@Q~8wX`5=zloF86<9H0)GMajlmoDH}WBVov}Q?7>;KQ`fAp-55yrn=lVddd@WugVVO7$=<}Aorq9s4cH^{M0%_(p1Fyur_@JY%sxb;7JNpO7PRW`$q@MjwhSl^)8x%@}cGj3%!@w7iJ%tc -d9a45B}r(E7i{m~GT0-lN!E>gPq0$5rGPXfw%e?_L0^L0OLWY_ZQQm=2Z0p~9RIMS> -vleU&dzh@dl4d&8{Mu1pmpKEI72beXC2g!)WtwIk^x`R6v)XW(xIVfD0a1GUrVj#Wls13`-xC#e^lnD -(v5gD|{VQ5W-FrpOIX0U>3Hq}P@DvT*Hx(8$jl!%0={N*WI2>Z-ar=4YGV#nx|izkEQG)Eh2M{PUUS3 -APb1^m}Gf*#|?N$0(`y1@`BzRHRKVz9bZ-YqZBv^leRym2>1R_0X!K|S}o)mvu=Qt@N0IIY(9xS^{_> -~F*Dq6&xVSOUtugq$BG^EbIt#SL7gglP|HsU*z1^X6ojzi$)2KX-Dp;u -Zn>sEFdCaq>Ji*McexwdMxl}goyIsuSyvnM$o`NFh?>uk)#e4Ir`LiW@6#NBg%agpXZ(E;rX5kEkwEF -#bris^o5Ye?^j<}-8ob&6+u-o%6hs3+&NP~@7FAAg6R2@GS_FG2+T?1Y2CI(1}BM#b0S% -)wjj1*ktOU#w3A*nMX3k23_??}glptCBC+8rx*MOB6`GN`Wzv(SFE?e@9T$dhrl#BH$+!J(IUl%QQ6C79-{(+x52(L!*AOEP -ARv+1*_nix2O(E{_nnHI2sXvT_Rma==?&9~`pYOLpa~?+RFX7*(*SazCF1u||6uZN`O5M%3Dq_EP!r* -NnDk*klwp$Y@4ByH<+qqIze`@S3cW_(K&N$UjH*=)LG^Vdj?-EaK3x4lQl1O}SP7Vz!Ok&nQ;kKPbqqmp)SHGuB;Dn@hG)bk<2l -w1a%TeS<8lkJPCr#WGX!tQ$Q8VP)BJ*^vRqCAeW9tAafbFWpqm>%m{TAM1?eeKUJIy9xv+b39Kr4he& -s~V-;^m%7V_@l>vxkbf8|Dl+!qHgBi2*2O!)Lv?zQV_x_fa0qQMKM>9?eRNkRxY!;1UaXHQMBwN72VK -JMr%?w?`6bp)>xy_3fu4Ld$+0PlVCJ=AC#kt=b+Y^97zA^n@LeukQg?|` -M8tihVc0Xy@rd;skOS2yAJvKc9C1t%gil*#s!l>h5(aG5-MvhfN>Lus<&fH1Gs@4m32N2 -CNOSNAS@cSpFs;4V#?;(X$Amh1qpbQc1;OPAO0H@7HlOHh+JU!O7&1BPt%Cxpt1%YraGQq|92(f(~Cf -CMjJusQ`#L)iH=M+Vn)`DdaThmQ$mO4_zM(g8v;yv_4_bSsUAFpNHbCjqUI^Y=OTaZ26Y|7!9<~ZLTI -^g@Pf$UxEXF2?{>Pe=G>zCEDcFXE}+$|p0}ei%cb -*V1C#wGPGc&j3}!I88$!ed;$A>9pEOkU6luLsEmh*+3cktwlA3V2Wo3HBcikl7VZoxx5~Hp&4REyqn- -|rdK<2={ICZw_xhe43$Gs}9xokv-Q)L|Kyg2Ka_Z-tS?_q@D;|ZnI3tGMK>)prQPyVCjD2tijP#LV%< -B4yf?9F-4|09%we~i*PX5WP$7ZIALV}){owuPT;#8lb{6_+|e#4q}X22W2sEl}x((9kq#mc)-znDt;K -NASuEifkNllQmeDxCb(`%MWTqQeW6o6=wPv8$GWUsjopJ8rxtHjmO%@iA9)(#fLF$h(YNS%_D&(AG99 -3`edtQp8a$@>|vzp#0Wl5Tbae}G#?hVUda$PNpX3giM=Ps5jaOg=5<2^l)v3NeS4`|uO{PUb -2GF$Ax3zQr#g7N3qk@!Z>p;EGF-S3I|A*#pq)^`vdJ!!`%>2&p#2f9MT<`J{n}?UN2qWJn3Y{l_?->6 -+13J)v!&h{9|NuL(TOS-{*DZ=)PDKDKV#0v(i{bQ1U_esWSggFN6_Xgz1eFAtVqaAA5TI#il-+ZZe|5)n(&Q!o -d?$(z2Y%x_cez%qW&{*ja>M{ztInjv|p}-S6qoSdip#qPD@n?uRnhz>3Rq~RcBy`S(1hzoc;#g&=A;AH;*qDSk7>Z#mgTAQt4ZC52TC=AQ7{8ia{U-Ep+9O9t -LSh4%v83lN%3ZKH$pI*_mhRFBMJ!AO9KWnM`+#&pMVVEPjF<-GHDM6gW3VK{yqPc8h8bhC?&PRn<$%2 -AK!h -ilf=rGAU5urW*A&8>f8f65*jLnJs3dCf%D?H#&m;+RRfp=vd^VRmE>j?^o|8yMv74;|n@Ylv7cp;eUc2iAO}V+aWkb$gFich5VO7P4wD`{ -y3&!OuDhs?VfRrn_g>-#|ymD;z^FkR*i3H)zk6+rv_{t=+lJL0;RR7H~F&e>zeRUBC&r+O^SAFf@Ml% -}h5Q!`}P!0bBPr-m$IP40MR6E(vnWe?@1@hNf+C2lm=DzGTx>a?xyAB9l228?;r#m|TW;YU%Mw{(%?h -?h;eD2{h{ac@a&KowGNhQQB_Y94IUgi*jmf?;Zo+#?An@*zUA!3&-)uHjBQFoA|q1{{bkfE6xz|`9q^GojbMDz#0htW>CD5&)4 -Io!pp|}X&A37-NPU29A`-NwFA5r-%-l{T*d^E<@Y@Z{<=z4N;>0LxU~N`^!@&az6#sxbbKFWy8k%$|N -D^u5Bb;Hx&QtBXZ#vnF_$9%fvjJPWQi7E$O4I+)tPOY1MtiBC1uhM`%2xi7<_3@g6DW8XSwS -vb-EE*wD<#0R65?GB6BPU=Osd*`H38U5PXcvICV2hu9?Rf7$GbZ7k7XE0Iwo+7H`M02Ad#BQmxmZKw+ -$^Nz9`uZA!4M@JaL0WHcK8ppP?SyGm$Y2~Prg$`ojWDVEV8?8r68FDgix*otBB;%-z921Y8jmDsbeQR -};%?GAte$?u=>g9@TRK%k+bMjv_G}8#z3&?fxMC5p5h#RC<$gr$tC$Zv6C7MxHW{uV)iYb)wR%i8+Ig -zELM^3gVQGcIFrMjOFevL?)EJ!~^t_;fRN*Nex=%eWZjd#gRZ(h0ka4UZI3^}9|r}x#krg3x=S9vy95 -AP*M`r^T1f==>ZhvD6704l&pWm<;;gw(1jiVu)E-qB0%BYHgR4s6NVZ7vqe=v(~FlZ~r&T2}l2C4?BZ=^7s6Gyrk4#| -aRI4szZHNrbXNq=hE-S`uR*{akNOS@HB&kgiMVoe1^dFkm$OR>_^+d%ivSO6>NsLAuli%a%S55 -xvyo6Oj4W}eQ-%9TKjMG*Hcdzk)oCiR}|ygkl1LIkZpdt~t9Yqf|Z`l_(WWZf&>8l@^cR=`pJZQsBoD -krdZ7u>+U7D@t=s{1K(Yw6UAIuV90rqNI0@k8CEhmXayxc+I}?&x?$SfqVkZ&bzv2u3I6avHy203WTv -P_+5^CMJqC$+$r<)|}te#@4|p(N`6BrCxP$$RhJ5$+F!N%2iADLlvv``HG68>Ce!G$7PS0#nv@d?FNiG~p#>?NAT|;5o=5DC1* -3a-9ixoO5;Q$Pk0VEfR`G22DpA>}1wTD?U_3LZ0ImJ1>eo&PbU;iEw -W5oW=jild4?CgBNSfH{qnEsQEM$`WsoBrZMn*O}j^cMz -|oK~l&;wrmM*=s(cFqz}Uh;8;v8JHQ0if7psBarU0ne&((1uIUZf^tc(CqtEBZWzO!c$-VfQ-<$0oro -;w(&6xS47{R}wL;lThXX-DP7ElXVp%+yK2ykjnm!AjB4(b2PXRH{IxWMT3Vn4DAw5Jeom}W8nt+dTF@J6~9LR5j_FQFq>i&>O*(Z-M1G9BKfu -dab5-6Tgo#~bs)z#7Fm(;d}ZJdTQlgQ#L$;2dQcSVY9glw=c{RH9pI?`~ -NKrLX(%JwLf7lK7pTBt7>-BK5{JT0#749UyU{tPv(zv;=+OAh_zhbS#rFP^E&T)eQh@3v{p{YPY6kBT -Mc)qF*$HOXOD;c8^XRB7v4f5qZ%)vx>o29rjzxIrsR>LnkDDM@^S8Mb00BM(7IoJhen(b661nRO$;k()p~(h -?VZN7D`bn^Mm6j}WR_hDT;?D?&z&q*}0|97p=G6-ZG8M&^P@g5X?a6*noX;L=n8b*ylhKox6F?%K#OM -$@dQ6aXr?x_3zRARvev8A*lG6+5`@5Dd$-}{WPPZ`NPw+|%4hfXb*|hZYf;l3Ze$lVm;rVV#0dvM>P>S{EaaC!7(IBj -GP)6g<-d@e+CykqsBY~k7fsGLNq)D!I8w3ZVt9mwCSr=ah$(Y~TH<`_oV&YgeX;uBOE-Pd*!z=;&CvH -@K3S#YNl$^Vbc>2$a1nDs53?9VU2m(lJm#A;V>r{NJw3*_YOxC2ZC>8N0>68?3$tcgT0y$F@iwkRm;Z -rb%(HP51g(-#rlX1>-<2d`)NY0`uqic*5e`MS>)l<6jFjzkJGGbJjFcgNItS)?2hG|_;YC_<+-I|WgR --9VW)8-3~(n|wgdln~0A@fviy~SI*yre>Ut+e{v+YR?p{$$W5TV)BS!dS;3jyjJuD9;jW8hNjG(Xue7 -$rSK&il{N@v~WmN>w)*$5856T5Qe&cxtPsmVLHvrJ2v?U^YekELJhHi0L8L`gQ=~$)?FtrVDO1NVYeV --4PY2(IGo_T$B{u=SR|}~Rmq6hSRpqX!aidhPFheP+cPN8VA5-WbU%cWpeC>1<_GC%+bVEttWeo&vO^>mB8 -v4ijGM-?m5y8u@a-1zJQ0B68K&enD3imjOi8K*l(j!9wrL93f2>@0L@s0ge>)2_5T^Ku6pcXtTW1c|X -nsojaxp*W(zgCw=QQ@F)I7x|94y@!j16i*#l=2=Mpy=2&e61C6Anr7*-gNC=lxCHj2FDoua`7kh+N7)fij5sEw*&mt(iTf!y -r0=sUnQlcha=ZJ9f$5BCdW*;XKWdJAc{+a76rk)qm1Uddm2Jgr~{^;FXyK~2@V{(6&X7RflR#RyXu!O -?Jpq8eFG)GB<@+un(Ho_GK$CHuyp`f<0vQ+owA` -;h;io@%qC;N*pHV8p-Ul^rYAStk?hiD<9Gvseu;AN5G^1u3-(8x}QO*0Zh;#vO>)N4RJ7@X^kb8sIw-bDfaS=#c|eV%}|P6~+0e&5rW_YX9)HKaWp!QSijQC-|% -u5%5m*Tc_QXeflMjVLOw)(@h8!zY4S1ufis;->T7U*KR%P@eP|6QR4!-J5qg@SgWU-va=XcrgpPr!JM -NjBE+7Z`AwY(^&XAeXEBd37=ttp(QVLn7fQXnI_OT5>zIy`zT=x>h(X>`3Bl9ML~7Kb;$VbnB*svCxRC+leWxju=P^76fd -Mc!Ry?mUTN(e$64 -_&|Gw?o);`x5`AdGe180f@^xVd?pmM_A&y=f6Q5)6J3Wx2&G_ds%sZOz1yrD;tf78hz|t9?IH^h02V3 -3~?H?DDcrvL=1&FSr*R@FLWpBy^4%Iy#$yzw7X<5p(S`|4>iVzr74^L?U9u@c0dC}8sMbqk=qBv80sZ -~S7>w{CH;j+d^Q|c4^%;y7@I9`LqG4m*zvuj`%RMoXT@L&m5R|-HwGIgn$vM&QRium37W&1aIWZD(K^ -nZhYc7AL1IQn~_$JrYU@B}^>$WR4w$9UrQYULfp+|#c~RKgnC6RqIY{^|bfPRn7T^H^%}Utz&2bGwv2 -TfSMxbwa$(j|Kw;bjLZ5dz^@`0mDXlOf3bxWvc3woo>IwnW^Ak8p~b$;2p>ebR9Tz23hF9*pNgiJ{s{ -ao|OwnFY|fqo7~m+PQEU75B~Pz;O*(*@ln-TsQ8h4tFMaGhd6Jg>G4KEP;6)Y1hwnEmHEc>u0wI^?LJ -hyw*qAF4Wq2S?vZ+ts@~St7H8W&#Te`MRgjb>K;qfIz%#+9Y%uM|I|zCak|@9z)@b2TX0wFT=`Do>4ZsiBY1`DV@}SIOQZ&G6s?gH1%0>NcoWcdZOuVv@E!bckdRp<95rjj -HHWhU_(^axwxN2OV(Y{ORvQP6gk9Py>zjx%{kOSk1{d}str}9j3M!t#+k+-YTS32vXu=7DocN?p;|@a -Jf9V4)zbPtrNNN8m9bwG9!6j;>$3z&F>g6h2?Ymq28@qJs~%9QuA)*r6 -h;5W+^d!?3tiE1zzh!f=0O&_90Z0A|}xSMModI4KsMQ+>)yWxzcMk#e~`NWG($8f!yU_$stas0hU%it -<~n}8+*&j2sJcYgMmsn?Bz`D)~7|QEj~4D(-@JRCMHu6v5bGqR&dT#IE>B1wi=i?zJDOz#yLsGls|ld -cIvk?Wm^O3WimtBa!S}l8feIZRriQ8 -6vHp*ej_fE(4myuEwrtq^shQ@mQ&|PF;9NM?mI=~xc%fqY$ua8#g0{Yr$_tg_&A*|5 -Aj{Ef~s(1L4{NE*EllzL3g{gb}ZQ39Df(@_xf#2_(vgJ;X$z61K!kD@kIAWIPrxjZ!_Z-HA~s@6Yu?H -k_)h9eAO48sA#HJ7D7l>>tePt|Y;0?vJIR0x$>wY+^dXb8n -%=FD$$~c(woi>(jw^2Y>(J_}$CFi*NVeoxn0yI4&Nw2LHZu?E3A0-m;X{J#VVqR3|-0PSCf9!GtWG!R~}MOiOHHtt@=?b%ig7C; -UX@B>Vazre_#2-8bs}yBQWF>N_1Qk6vVmex|Urmlyqvc3w;90o$RCw@7j;${Zq=;i>09AvMY|Xy -)rH>euZQRfW_l<2$s0NIegYtk<=#S|7upBU$em_l)kOSm6L4QO2-YRn8?-)hti4C1dadt7(o#tm>)m6 -Mk%N<3+P@Tdi$CI&Xu412ltnU!gejwR_~LW;!*YCQh_?Qi94mXP!*57&-O+F;)qqEEZxYx;j<$fC6y< -_M3o}j!$$|%7f$v(X4`rHW>OLty8i#d}K(r%IrM}fI9vz?7%5o?Tv`A={;41fGcigQPZ(g=Kj!-t5jR -iaxFJ|NZc1s6VfJYcs!T2N1T7nl@TIQJJfOE%i2dscnHQ}uDVX7Qw95wB62qcW2`rq2 -ffN&iPjktxa`RaIZEkZF%o!72@huFJIW9rXYaiG)=01JbOQGd^1gh`UZCpuApceil>Vwx0(eFtGe|t%uqPqxy7FROZ -@!G}Nvo1yOS`)AjgJ&L^2swn$6X_wde7#ZL|6W%9I(>Zabbb12JZb8A8NPf)0)8>XpJKa$1>pCE(LJC -cPQd#IK9H2HUA1^dI&1liHYOsqX0>>IvKwKzsq$-hxa<|V;d+j@@K -h<|BUqiFAnv$LNkpzQew!W9XHmEt#-()?mEPYy>r%2hzQ~_115_ -#`ELO*dx*RXf%}VG70!PVZBByksBU2&d=-Pk+sh%7Iwatj;wkHOT?NUZe3MTCl~FNW|(Jvn8nEtjTe5 -J5J?zFf5^rnXI@~M3XGt|7y))uchl92u`}m859I@IFv#Z$;MRbF=melHY*0I)J3W9wG8 -@6@gNUJ^%2H3^p)|dvyS2{OmbQorQOp+tKtlYG9UU>r9&~{+-N#}Zw!Szbyrh{HCxNK=K4<5Mg^C)fSY9-3-b5pK+ccBuW;GJ7JC*uj&ef%MJ*R6e+isyy>V&`8;!&N`%`RIkISV+(xPnVP$cD%Z8_0fU$vE{PbGy~kxPj&uk4bRl_>e_?;JP= -SS(2?PSf;Pwz0@vU@#Z}gTY{qhV5gwcyIh}s2Mx$sE*l7cj898TrY~hl;Y6s^2t)|`Hh=g5a0roZC`0G2!1>pLYC}nxyyb3pFUoU -TruR%3-uRyLx(*gavqL?-q(7zpm+SUUW4d$h4$^2eWRJCS)FOA~pH&X6SWh0_XC9TF=bCXC)4LHVa_! -(kRzV&WksuHBKAcGcwT0&L=D}Z2Q8Iw?y7F)fJZ6FtHs)EGo2I$C@v-lsEkRFWLJ_x?}ngT>WKs$J&s --z#5(b<&kyx99k=iuex9d}`&=&_^~E3StT=l4NXl?;~YyuY!L&ob4J;X7z|roTIVt-=2sy8^kO)&rB0 -vL7Rx+iBBxWOX|mD#R-U&2V5r;m{%w1@FbhkKJM|D~!D`4x)-oVEG;SFxje8XP`8c0- -aR8nriiX5#a9PSo~#XZF0xKah;ev&+EF~XsSmjr7!pGAFk$Xjo$lHWE++?#i8^^y49`>E%ene59uoyW -&#@w)SLot`;0gKoX55(3FuD1Mr-tG0olUu#9!Hy0+wy!{ATTuqa_6d6)_VM7n-{AIOKCB>j}rssMUK| -gP4Mx;Ni4^&RwsHqHw)Dyb3)_FdePZL+2?Ane6*;{C@yFKb5ML8)lcZ4Q$spcGKcGqm_a;jG=*Ttq(E -(B~kQNJ3tdD|cdkR;8!u0)yt9P%l#tXrm<>7jW#yT~V(*00y!laTX5ouf- -Anx25)7P7HXVo?1>JCe%mYJ8n_q;BP^-ymiV}HUarM}5`KkvNw((KU|jU1ETR3MX!i-JMDtL>$PmSG+~>EI@EAIn;L_hOa(!2adKLf{@Z`waRe?7G|@j$|dLXBy` -sK#OD$8G<1C=yAFH&cU#HbqH$N@=mIT9r;jJ7XkvuUw)|9)@MEm~75(3<4u_aEGc8hM&u-3O9f%tpi -A(+*FU17Vhn$YdXE&N{ZFBDtraFrL&IzSuZDO}=`)P5DSLo5ksAUE8~5+M4Su<2XY3droW0;GD>w)h0 -+7Cv7~(NSHgp7ONpzS6Q0x9`}BJ_)EQszemuc3wUtc`-&g*(kt~-1j -$%~M*CZlrXl&#Ox|aCe>l0sd368BImX)t$@l)|r=LCe;*0wilgnmr(!83?n=~Ps=t%7xoU*nW`ZX#shBQl`jpRUdOAqP)Z#)_0TkpP- -IOMrNC?34z%taNqG79ysQ9)rrTZ0f|M3YK@qmHf~MshfJCE%ZPutF3erwVhJNNK=G}2Lun+9xOd#toEA3lvPh^|ZP -`u>^+;->S^jEeWBbB8U{$y~rxQg5XVNGz6G;&XF3HX$5r8i}{%vd<=am$5@Je%-DImRr -}ExvqYxk-DXqb?>YCR$M29@_75Wy?ea5eINdKIcPa1p#fA1@fu&Ww?^a@G?)Pbu@{7KO=rG{w=deew&3=C -_-X0y#aLdv2YS+*x{jVx>dZ5cifR0~yYetZYkYCQhLvSFUf5imWt@6>uIp`{A|JyP%xguQ6tZ7Qq>M|__bBp`2k*BF~I{cdmhFs -D<(U)Z^C_FFsK&~GRW~>{+_{zQ$AwhD~P_DCF*^Mwlt2qkQOo0!Y!XAokZP~m`nC}_wrEr;p55dqFTI -@wDS<97fAygWUvua2rs*VK&8CX->7j%5<0%ZrT6UzseFq8J0!3-~%tzDfrZ -$n4{^Hy;xyn^kB*qd|vEMVSj72}%L%1=16_V>0gj?IX-Dov`2{bEle(I~E{#w6lv@w=y@CkeTihO%+D -{J7WO2Ph(uzS8CLIku?&O!+m;MJDyQ2FZ?#9Z)BS)VzGy7hUizNDE$#n%nmoH#X_mcyX%idtH{z^yG1 -9pVevz+AH|0%%AX-(92LXf5B-|hWbvdt%szAi4gLIct>FykPVJXpN{w3pK_q_uSz-}08o&HfMx^+07( -yaO9Mm%3sm0~abG;P_z)UiZ^)ilQwc-S2?ikokvWcUkS_xe3gj?K5+Q?+LPu9yWIk%9bwjgSW -jt!grEEzx=h5n1mo=z-ea<+m*kBb)#6Rt@tS^Ucf$9_0@T1B5jMqlQwzuT`&GcZyg=Ta)8Dki_9P{v9 -U8XiRr`^1E?03$Jk(3Tqrocjp$%0g}(-|wA+2@+sP26w=pxeto4ucGyW1JGAmkUH3uZsLxqK%-BEVoq -6>9p}ND7BPYBxMB$yrPH=1{YxZtcAqLPeJO+xNm%@uBK^qL5qQW>gyJjXtbkOZs|3PH9KZ4y9K<>eaB -nUZsE$EZl`jEyQZ?5e}v-bDV;7z%`d)vet7Ww;N?E0L25mHb-4HZc}Q2Nb;)_{ZjpSob@ct+;%;$L3t -9>$k!SB{hc$FqS#+H&hXW=0Q2j&?jGuU>0$Rdu5UN%k -Y;@+N=k^;u7OsVpQ2W$Z|n?!wzc0YBLm-N*6HllAl%!9pOr}oz^k*d$PallqIQ=(gu>)$wi_FbX1h)) -KI-KxI<8xX;v7rpnG^l)7WEow$uyyK?Ya-Myi-(yY?WbBHv)G<>eU<0F7(>q7K_@{dJpcHCUYP`5qpG)-@m&&U<&j18J<X2Krx|Z?|`2y17~jwZP=|&_bZ0emI$N4sYWp1uF&*KJBaXkrqn2O8m5;jD#X%1)^0N?-nm7vxD)i!kP$mU5vNaTv;K<*9(9*gpo)pnxX?hpzkb$@>9nkjYe*OhOTS6aLL~#Kn5hxRgM65mkDFq7; -**_J1ZZNewZ -CIw$t;1XW^%kDQCC0qEYcYtV<=V#ISPXF4>zH;?60QF0d;Af^e^<6oTof>Z`AU)OKEiRJ}`N#<78!pHM5hnFf@ -HWLR$gtTxDgjf`i(#se}#Jbe^ZM<>y691*YN#ur$kYJp~A6e=!+3VjY_o&vO+KrvUgEb}JpvTH59!GK -tHK^|27oQ1}VPmvQ4Yf2k!T0z`?8;^_Ezc6^*4ACF@U-4*Q(i;0R1Euy!PK-Q4bRHGzLsccac8BDwQQ -1W$k+3toJqaUuL8T9~!mcls?W4H%6i*CPty(>9TexKI1^^qE_Be!Q`< -w?S`SKK2@&AGbgKoZr3r`kTEMowu*|p6tV}_~x&Exz9KDsoaZKFTZ~E{9x~8=kKq++kf79yZ?Ic&EDa -wH(rI!jSU98|FZM9Z}*;-U$^=7i;CBqx;Eide*ZvMuXz8E>G{o@{r%?a{Ws0(l8=~dufBb=q~NDi@a@ -4rmX!O90Umt)?VJ6oGM`hK*WbQ;a`^2Y=2NaJ_=W1nL1l?OD)G(U!JDcQkEz5z_ustge0T8l@SBQqo6 -mTf1m?-+#v^|D;zjA*13lCSPxoJa{buj=HwRD3E&NiJr&-FlEOubk&S1@s;|h_w9GMB1)+#wYsUWPsO -Yde6&W%>k<|_zTx20%ERF>8;%iJ<1lGlinYvNaaJIvDenQf;cZgQdpQ%_Po -+Z}_y+x$!!#IK^?VzMdRTo=k@G(b&T&&0_jMQtOkUs~A(lmpQ6Q-{%h14CLo -xT%BBcp{I-Ub8Ou-KmA6ciaT#VI0N?L1VjL_9SXj*HpoQa?SfY{b20%lL71Uq9>f^h*Yrl$J@^mY#Tb?aY4I|J7oXb -q_L@rzV*6F{_`&7;BLb>QwSC%ljfTYITCgz(181Y9EYBVp5EHf;J-;?{PNY(J$GJPQ>_Q$=-J!-XOpb -Xue1z?Wn&H}j2NCAG!)b)WwgqucO=Oz5^n}frB&Pr%5J!3rY#Btr%(gsFfb@XG7J;uFqcD0iFtYq4O2 -v>RlVVXENw_%wT6lA|qIOYhFoTqa^CtTFT=sl|XwKg=<~p4AMJEJTtQNmKq5RxMHQtdMAN-3TUb{cUs8bPu)R0F4V$~TdX;21f}%%**MdVB_z&a#X2{Q#4g^aF9gD2IqHZ>eFzF=vQ^;bIISf-&b;Vb&5H1|K)SD;MxfG|ZT(E-JRpx -f6oR_+#;PKa;o$!|8Qml9%{!waU%*^qQ@KKoRR1xT)$-kL)kU?6olbD!nc@Fv%Wj#DN(=JvRz<~?5pNeS)mto -7T-|@rQdMhJ!P7H1aSmi6KHBQR!K!HTltnbJBmUIY0NkOr=Ha@b&UrS*B#4vz5F;IW<3NRQ@}R*T{iuw!rvX} -2WICCjp;>dAJ@;sn#B*l4iBxxr6b%t7y7~88p -D;aTN$(9=-tvduxgk4m%CuxEsTwxB0%}BwjqpnnTqu=Spvb(W_gy5P^7I=$%H8(>ecVuWbuV7uA$O@m -`;K9j5G4D*cpf{gMp2y@}(nBvn3;)W8W4s!jH -lIBe~393X#08NI2ciANhirD8@d5z-;(~0XDx*68o3}T7!kLCf|*@-rN?!aqgM{X<|CqDm3Lj1;^8ByJ -ch3*HqPC_-K(FqgZM5A^RtIK^cpfGeRF!rv -wmdo!oA3B*Blo^`gk?IFf033VQ*+!-R#w&4 -YbgFs`50@fki@*GUQ^a*3giB7`OP>jz>+Jq0ngl4%=;C!akgurotwwIXt8M@lLlHl^Jsr7>*KYW2Wk`{k5&yf$9f-(-M$g!tpraO9!QOW$x -bgvPqF(fX&qtuL+J?N!ZQV0Y{e$?JNDO-pLomeAs*KxMX;# -@yE4?k~T(A|Xx0m-23pM!Ea?n2LBa9w-5f}hUL93MXupht6t}5~XnDw^4BkK4p$6K7v{*v~3W+z-xja -98w*C(D8wCTR)#|gOXYCxkkI>sM4$~ISm_2gSFNMoRopj;ac>pz3?Pq3a!!{L{fr_Y4ZG}TLd -V5KEw9kNHzgt0v1pr~rq%(C^X(-7ltk=@Q$!}Ch{fy_MI8werd{D}Q;y+4o@h|ae@jhOa4j=Y7U`_%Y -M;jws;0}oA*~$~apy0zmD>~p?-^=TT2fK-`CV -Fv^^+PiSla}3eZD=0RX0|Eec}(nJ4r|-$zgAR!|A}{BS+0wa_xzKJuemFeuktIc{%0h#s`s58IzcpMC -ztq5u|0H7Hv0nLydQ+tE)Zz1&>4uRtK!kWQjQ(b&itI*8k%kIvB_2I2oriK?nu+MrHnZ!egSfuv -}42DlF4P+$wkUWj$8ynLr{oZO)6r!vBg$4S)+d)MO;`R#jj}ypQlZD`Pv^^Ha@d-6)l;u=uxe$KsYU)=Jz%3oLAbuSZ#Mh!r+HMFvylO!8n -e3Kc&)%s!2OL4F9t=N;n!B#N&VNcmyVMlUXROeNsRhy|uqb(2qH!vBY_+~Xrvo<@H|^Nt45NjX -diFb>MC`=)&p(lfzW(=Q;)*)AJB09M>#f8!afd1&-%N`8@A2cd#}C02$(raKWJ>n`L#>|ViYg3PLkWU -L#cji&X*E+1YO@7?f1bl1!A#5Rd1blQr_U1E7C#H*+b}Y=(nphX5u{?we+DU6$Vq=TY4`fS(yo?v_tW -mh3UcmEO;8$Sb*SQApvx3nq1?ySgrm$szs~kQQ36a5K0>aPrcxEs70hnoszt063i#V^alxPz}oYnizAE4`f|ZYt*ET -$rVVH2~`o`h;RlT{UU($E#U`}FoT~2!tjF%n})0I#)fk+N_bfHP)0DaD(@ieo(OXQa|*rr#&$* -tNC{DbtWdEJWaOIj{OvW=1fcW@fCIhMaVLFxW5^}kE-dl?BB=V8$i!5(w5iL-h6XY;u7TXj=i@_Q)kT -7VRUBqT;~S}Y#H3cUkj61;Z)`N8_U1;YmYQ}%^61fqtqv2KYd_j(eC}4|GCcFC;^u||XJ#)|-P~wAbZ -h#kSKf}?yiZ3pu7janxEg-rn)r<>;}@!5qx0Lw20m!uKLAQ5C~P`yipSh~pswgw6BU+Fz_69~kmy()zdYLT$?@&JON~diL!VdC;@kZIDZGk4As&_J@Ogj?jIw;LI)2Av##@n?c#)ZT -kvsJwckUgDo>O&)Hk;G|OFj+CrO&4A=EE?32y%cxUQM4snK|kj=Nq< -_)0V_ -u{vQWJdD9=>^U~Mw2DljEt>4W0M$_jycAtC*$BCXkh-=`|TLOvz@{ulL#!Qx>L-Q+AG -}E29dGRjGrZ04ib&soXz(!fZQ&o+o`^unSqq(lJSr5*l^<{MGr_f~2y|<_5dKh(^H@NIHbPeC(tJf=D -bcUN?wDoB}WRe(Eh2Y1IjIJ&jR_i>Q5wk)*71li=TTqn2A*jA7RRvm{cR7S5V=4f`NG^m2?<>G5-5e9 -9u0s{+(F>R=dJ|E&Rx5D9{*4A4wgApejcWCTsv1hqT&V(tjVFGgpv#Q)X3;B)=_1mOmKqo5q?Y!2bnc -pub#5rlXbRltqAvPP!>Rl#xoe;Y=8N$p3Mz^!fo!4FK9yFBm|11c -GGoEf5%uT_NcJ4Fc6Bo^ka1y26VGiziD+5%)OBk>p1&o2BB^ne! -seM$Coavx0Rr7O0X5gDNV7DA9moT$lf{z!EcJl6Bf6Ahp0R@)%Xeo`K|GKmWJz5QuH$wi1YDPh#Xdge -mshSyX&ylBsnRQ7^*-r)SZ7^gzYld7tHj{y6$|EHs8WW(@k6qgG(WUz7@G`wB6bYejG@cKKEcTNnDcYXWAzq(x#}w)ZZ$sq)UB!yQzAZO*mV&E8Mt;kOMaVc=qp@X7Smc!%m>4vg7r8?Gj)MKwAQOD -75o#kA}tR$h9E3V6Y8JIwmC7^<=b=^}?U0w^w6$xM{s+8b7ShT!p$ZD3VP((-0&=^eV7S}AYZM-aX{4 -IS^r7pyBm1oS;Um=6F(>ZM)(W1C#&wF=X{3d=gnfRWskXW0fc&!SY{%Q=>b?tM#+C2%1ynq$F~!z?kA -YQE*5%slIkrD1??DRUx>&?`9?as_Q%H?jR;dP$ze3`BD(#gbq+00yQn)vKe)Q@2@mh{gN{%$vf!lP5} -;0;#niY?8}W20)rlBxu}8PfzRk6jo^6WQA8o&krI;Ir%i$4N}u%s_CzV3$2iDMX&JqfYId|rZf$~nM%1~T7 -=%?Xk%LR1@zN|qliKg#$7PTxO6isg!VE?G4``qu$TS)akH3R4Kt84^8rP~<-L`NM3!Pe^8Vn1$c6#q- -htAnMY2pHUL)HqlkgYK%15wn20cu`0i70_BG@j<_5WvS{b~j-)qjfcJ2+9xCnwXO%^h9M&HaOZQeT#W -^Va$HymoOu`melO1=e-W^0G#p<{e-6l(m9R0}gh6sAO&-@z++pvO%SKg9#_|Mc%4W4rg!IY+YTQa0`^ -M^Anrva|uEpek(e`IQ`}3Hdbsz-6QL2>YFzOOnf^(X9gKk;;lq^zE&u&0^&zN`oR3SuKW?y{Xu_98YI -rQBD-}vqjS-7Z_?WArD%5~8gh!QA|w&0MarTzGoqGVTQ)6N>m~d%xx`HxO+Q`5EP5t)eD;B&xXIh&>6 -jFLonknkkuyQ?Im@Uli&3OB>|4^aPe~g3nEC-M_~ySH;OMMERVXPlJqv_Qsy(h<#K$bQ9mF8(frv>Eeo|K$Kjv9QS-U$7<=%InUlk -Ob70`H(pt*0P;j{P^5UEvC=y4^h@P+Zt2GQg^w+*i`Jc_AOV4WZ&*wkKIR03>m$32ChzHlnD&Si){I} -)bJY_{uq>%47Tf&Seyy!w@4xr*X(M{|rV+h-br^AQ|0gj0hd=-$+Qv`_%3zVWRZNEiI5ayJ53}?gV8O -wXDOSP=@WW^C7(_wq-wIYjvcqT4?ym{9agD89V>@;20qQF#&L$I}-M9lRa0K;?ExD>g@FZ$L?5n7o&w -H7!DrNd61$KZ#J0<~!(TB=#Fas(3ob9z_5ZpCIO{{kToj`}vD^4#n7=yeDgC|Zi0#(Hy9L(1vYjc*Ez -GDw$F^9;?H$b~m=b5ADiCZx}gWYlt%k3)a4=3r&5ur=&6VTePDDfmv*~ZLdez2;tf~V|aMa7EQ4~Hc142P!T$@Fg>6qryZ|m3Dn5{ -Osy{hvV7IMuvcWP0UwQ*=raT+}H!ZFeM*TyVzhRB~{onQ_BlBq*wJ7z>p@^pd@CD|Rg$AP`0hL#efJ^tt4U%Qezn;bw9ski>1Gy|$I^#|;DH9567@=5L@;dhf^2AZna}yG)sJSKh*}xpCntJV4DYFGg)}f-nH$bO%kl* -!!7X(V^^kPhrRi;K=FuI(~hp2XjQ$?C%K=qLcHj^822ynLfdga;R-{-b)rTall=xg17^(~-(@#kC%+B -{QBFBcKIy)#4(%#m_1Vz%-#tf8&|ai-;m&tble5i9O0ho1576d4~cm<~z0Jb#QoFXxZZXp+b8`^lh32 -;iLIHp&sYaS9+(A7><1zqh?DW!KzDJ;5v3&~t4cN`PIbG>!zW8(^Jlp~Y6H}M}{Hsh -17MpPil+|I%wp7(b$*^l>>Elmv20p4<)F&%1>dwpga7edG$>i*ZtUGfKy{LRrx0~f8miBV619J2j7a_ -&<)YVEf3xh$H+0p)iFDJ7X%1LTR;#Swfp4RUz)HfS86gCL?y_t^o;7UxO40uTHTq@FwvHVgDM3?i-3p -j%|Mm}6{eg5rRa#~3-d1eo_u46h=fUQ-K{W5QCr?8rhd6=Hv8%z%;i#K7~xJj%=HQ1DPVZ7?Zh-k2T1FbzgGyuJEy>qzXa&u@Eh$l*R9F<20Iw^2d+-tNaDg)r? -TS`7i(Z+DIsr=08nz!CEh>|k0;%qZ#w^en|ADy%JN&#qGO$S}N5&UsJ!7ZUs`QzOLpJ@DsuI+Ut_YBT -2W;#80)F(z{lATP#w9t5>O1kn4rtq`1#C;~2lS5wd0tcjoXrum4kOFy!#iz!Gb7=0Sh#Q6kY55{zQMlH%LDz1uIHj27=T3m!M) -t^tj?tk%+LRuHFya!#R#55ZYk%E*n4ULtbPtIY?liF}{em$<$13=pkJ)oa`0dHRn#+cj{3%+IK3baDG -yZ|l*A}YCo&nDcTlj~h(Otox$NA#J`Ix -vD{3oNPZe%58nNnB*_Z&m^6u(XE3st3y&1hi}%OZ_%dd-jeD=tOti(C0jl{hJj$*McEpM8P&6Q?2-_o{q~BI|ut)d|76Oea=_9PZ3#U-+FNoR^*&l`pv3y!k+5Ryc| -T4J9qmkMa>xF@}Z`qQx1~_nY?ajnSZ$eynl?^ouOBmRH@OV-s1<($59w*F|Ra-2Vl390X3uRI6BXaM7 -jl{tZO_;$m-&pI&NLLzb_Q2mL;lPh=)tzVfE}!)zQ?C3*5~o}Cvf+L15`I?~=s*Wp)=DV8~cDH4XwVV -nl+#O!Fp5Z!=%Wo$-lj6*x07uek3X9grM(T=Sp)T`|sL(8C+AV`FT!3WmZh?#_MrbO8*w@RfDYE5YM8 -RrV41CjI6hZ>^ul0ImQ;wc*BD6vYMPD(W@O;BhUs*Kd>r5>XyRLcYi!m2b?uWmX(vLLF$gv7^1u3g2) -%gU-?Vmx186;&#%@Uw$pCJvK--3>88Ml{GU=*Y%yK?KWSL`b`U~c!X5up=3W=RwsF63%YKkc;ng -k)eX}2ob1vk^O?P!a9YNd;Oc&EXU!?Z_p|w6*uztVQt5DLIa7dVA(PGWDa45xpK%4zJlS;#!IG?*^L2 -e1M!l@Al6z)ASvoTAQwsyhHI_{|f!jJ-v(HNEEhe8SW&ZA=v4lk}?IKV4MKw-iVY;TH -iHH$&`U0kd6j-&|C)@F?t$6X^yT1s7*T0&R`03*{U3Q7d6Ccpzlz2^D@x_gL^lgTpI6P=ngO!)}e6le -}%V-ePH}9g|EQ&cF9@bC7i#uglRvCjSQOwM+sOP{-eeZJ(ko7gPh241*0970$(WjZ`tjFbW;sFuU?S) -3-v#_tP3aFF=1%VxAM@^zwFTlxxEc_ucI^gPo?;yQ>(FuhcU@;9Z&*=)H(Mg5=Pwxf?{TNc16LQu-j* -(#_LA7p4rF-&R7q$AGAu3zeZQH1O%fR@8TS9BSKfId9Oo{0WU<0-IF?=bDCE=%1 -+!y30)gyo&0sXUuycpF(+h{QyUjIVATph;6tpT1Mwx;sWG04~7iC)pI+nun;{h}EKT71c8;9yrF|PG= -QRRB!n<4$yKLaa3b~dgUe{A&-UN;FyrGs~=SaD8K&$@l3&{enX-RdE%j!ymsDV^4$Jz~}lIX(5#LAaw$XHwr}-7Rd%Ad2SP<cw6Lqa?%#e*zZ;Xo^@$Jm0k`K9>4Lk}@@g|#FPjYSo;@Q&5ACPLO>tVYii>SmEG1Dl)|05TA>l3 -b#-RO<&|o&nS1u@5y!?!GJ*)1|JGCBmWAtaMC&m&fGYH`BvJ{MNlEgehAq@K21s*a+w?va|oCP#8EkKLz2qmMTUSUjt$5+~(rD5;PnObNkjS0fgN=+L! -m412=RcRBUbyPCp -mSdCR2vumBAm9n^^O?d4As=r&5h=_8x3J%4REK&ls_2Uev;F#sI%dFHQRJR%}Yu4}Ptuphj(%)98pIS -%4r!qRE&=opfA?0YTMlwZl<6c@_lC>fGZY$YnZ$5y{U{y0Q^Z?)%cH$V-IBE`slkh0ARjf5+8!aE>AEpcVmHDOZduS;aV@uI6=^);M?7biv;4CLoe1VKmtxo$w~BUf2UND -F0hyv?Sg8qm#o)f6`9{c?4$(`1?~umH&&Q7rV))My>z(4=PdmCrj+176JMCPk!C?5QssE3Xmw-|K3Om -fc00$Sde35)pOtnj1wa^T>Ai|IHAwy@Di`|mA#UY&Y^!2l69Ry>=|833mVF)Mnyubfbl8ZXR~oR{uxW -;h8NrpWv78kJ=i{z(n36b6Cy`GCbx}NNr*1v-DNS#v%S6LYUj0J-=646{uEPw-DHlZ#$(4#TyG{iZy+dI5Ey!niN$by@ -~al-=G2CJC|YTGEYJF|JAOupsBVh!U7M{D*3X5jx*&H2(_`04T6x}?XaxfXC -9AW5UHz2R_4q0XUi+DzRJ5KJ)RFoE+bQ2sRprw3+*EZ=Qv70PBK}g7k+ -?EVM?TH>9*p2RCRv#WjXtuOP&EBLd*cgrUUb#Ke3pYFq!>4Q#YijNd|ezA8KB -fionE=OU)Lzfw+bZybqd4SYxI&%YnucnYF?~yon{*Wz_!frL-6>cyY2s{)x(8{u9hY?EIHhD+s+cwJD -G*T{%eSI-(CMBwRJZZNxeMIit&fy=; -GAUe=DL#Z|qxAsXx!VCo~Tp0@muY^fRm5JQzz4CB^dg^EstvM$a4-(ab?aS2lhe#0Bl&OER6Sa|ZCZg -x&t=oAbl6hy(EsG+CtV9{xUZ6`$9DQ!q0FVURSade4IE6{cvl=yhjM9ZoEJY(xESFSiCF22FOOTo`(Q -T{Jo0c411F~H)ndhW&h*J=08&S8>vvSX6rNnpH>mcfw`1Z2rhOetNP{VcE^S4f2#o6Jxd3PV5^k--_u -Fp6!#GN`@_U5@(57W&Cy!iojoq&_~oZq_oCB02>&!fYK-shad<7q&P_nVGi!dYG`=*kyfj*iC!@)=& -eLeAniq61#vcJ?seRt6&&7B)%vx`aZ3Dod!WDyE!2Z3oo|3{ -q^opKUUpQ0>hvw}&rudqrc|m{nZUG60`jn5>r)r-b2@RgngX(mk%x|8NFO^EhN*hR|ab1rqy!7k -jf(=I}tL?_g=X^2y{$r*B8|Y1W;vxe1PEFFTu`pPRcLJ+g{l8S^H`{eaGr}uy*UQwowUV*qtDoo#AYqITdB=;$qUK6jP?~52rFLm37laEa^K7yU1YIVu>FMBw}?aA=6eAW*mQD(J;mj!0{uJ=O`6~i9>2mkbd7r{S2^y6yYySr$+p5{wNogzG*7o+c9zWiC@?`7j)2;n|+ot>6 -W7fUlOE$<-8Ng9Fx*kVI+S!Vl#wYrLD#4MT6c<)VmBemsn7}$G=P1K{f@iFbif9u?R1(IBS%!P2RZxT -A%+W{zt}g<8hwY>07*~5Q&(kZ-24GF0nUG`e8(#XVc4*6KpHR^kb%j|r971!H?tlb1RaG-17W`TYv(mk)PV9xCQ>2LQQ|RJVAAL0rL<@bP6j(wBeP -9iWw2EQq)Cc4{P+U+vI|?Ud(jxf*9!LAI_M3D0)r}N7_9HAA>h>78#Q>-Ls^T}E6~MFZH~`oHFiWyMF#X_LJBf-8(rII*GiJ? -Fdd!s(g?O@lvrn|aEdmC=vPS`yA<5kJfgKXmQYQy8tR2|l64IP&2oH(>TlTr{}7A*m@}zLv_R1tVNAO -pU-s;cd&v<_qLX`=RS8Zu>Ou*P%j+ePM1|Ku%`x}99N|X4keB?G6xRf=hd7yqq`paW5&cMWt(f}w9KG -_L_i4`|Rgi$}EccYuScmx)ZyQolN(?URf|izL))El0>ru_b@zEiCYQU6gij{WyLu6~?}+4I>k0Mn;qay|5P>XWospX#0b%YsW1jDX;eeofOJ+<%GPrAR)i}_Uots9I&>8uG)E~i5b5xM -9;60Uw1ugRnyU;GZH_557l9EjPiz=?dK$O4+A&IjD0`yHi5_jDDkF*>XWf*&f(9(Hn>4z%e?y&!&01A -jOG?FPwOWJQLi+NL4QhrGD&i=yiE}S2FperEO`(cfL+Ma}wx?F~bfU86Aetm1f?WMB=X{8TZko;cdal -wBhO2_NO|MARemHqUBbwzU&W0fx!?$8|ClV}eXOc(j<( -m-II&xV(b!IaT%`#&JIYL>yTnPd>`zT^%LB3WZ-Xg9x6|4(qREc+aoM9T^3^)`1%N8st{wSVscIBGV5 -=fa6OG;j*5w%GQhVZ3l1HNFEBiV*MU3#ozb+(ahD!*hY -8SsjM=bJZTEkvtB9Y=8C>ZYXtYlZx!;ha!pT(1OEO=$go6|MpN%&GFpj>Ig$-$M5VaopH27Y1U*OO6r -jL5OEWe>B(WWJNcfW^drg@Zk+6CuGk?tsY(b6_BG6OgM_HRcuAyH?3qv5eoA77@o!A#ssf%TF}lAt;D -;H&RGFF-o?5K?clzSkH>K%$A80bXY_U!JAF_tQAz>?Ir&vTK?M#Gx}ZdEI$p!P;2t`5_zq9~aX#q2Gd -vU3LK&T^g>$n`eO&N59i{J-*%#l+O)y#4Z~`POW=&>F7@|*_C*~RFQU(^)AEIT9>drZ=Iz-ovp#Th$J -Z{N)U#7#;vI9-9XV?;ZBA-EX5%dR-^eNp3Qia!nB-ThK_@mQ0W5euKAQg(bw-hhF3&;1YtK8l6D687K -sD`e|Ulmyr4)B!q6McbnU6GDJSJ&Y5=y~8+)rZhhI*wyp*U{jolusSVsWrg!Y)s}q&fRA`$X!CO&kS66g31E@k&11SXJBE!JpXbBssQ+3)n+ltZ_n -dK!U7N40PQamZh7sIV)O13DvNP*jPVqnSoQ{ik#F7xPOrO;DMD0HN+LYL570X>PVeTL>5^YgI4hr;@`Fexx8`t5gJ_%1V5) -k(DUM;?ImJBSH%9||2E)zZhX#8aIp&Y1?0S3aq-+A2=sA?AXb;dr-H-EtA958ouzpx?mo4i;X@02*nt -cgC*6vidY(TwkanO)t(D0nITq?PNCBjIS4~PSftt7|M>}@Cm=$*;d0)dIG+Ihmp&E2>W#n;M}DmromE -+uPSjri0GUntlUckCpRQ9J`)Xg;;2Ld?COMq{$g~d+q87H -4cdQmDMJ)Rg|NR_cp0&E+|3tb~YyT!Lsh>F6G58-sr!*SA;Y) -l4LY5oo`Ytc?`KE_B(EOmk;ibnwatIhP(5kcQbHA;b%D6Ry?mco!wz&Q{FwDeaPy*Kgx_065ciCsXHp -_>hZTq2WW3s(lfS7&VdUwxDHXLL8xE&VnZA}XzYzv!>~N*kwtMAYSdpGcBL9u;&bq!`*5TMCa+bmp@r -yv7SjEp3Z`Lm+%(7o^b3We!C2magX1xyk1BQ*KN^m3L^5G6@4%?t%0l?IX0R%aHE}bOSGkt^@!^AY~n}- --qbbSDI8Tj>Cx3?${ovHRWBPD+K>a$pw7^tJBNy70wYp72;ybRCr*kY1rrFcofMe^R~ca}aA(QUur$` -UjHqjjw$FAW5bS!<_Fxxjw0(cD8*Sf*r(@h7hD<%XdX^v3qiHq -qlJuecd>dN>iq2OW5;|L4{cXrNpz|e4iRNq`6#QYJIt1yBN*U_Az+KHsH`;PmFcnc_*@(NygaAB&BB*}4N)7KG=qQ9|fxX~!3cfB~xxS -*o)=!+sS7kAO>Zi0b*uPDfaXUPkWG;US>w=t;{k~Hz24;@ -#9B*kgM5KjRzhqHUL>1qM`5&3$@XIf}Pum2q)wgP;y|uq&aZ$)rVfea=2j3Kd;&+sGvGSD -NoSI9>v&3mo?S^xg4r2cCZ>pZKQ(c+;+Hh0tpPN(62!>Uzig7u03`FP{2qYwW$IofD`kv98#&1Wa;@n -Wd+@t}K=C)$d#HDss!ymq|tp;m9SKg9!(Zt+!jR&Eg*`|PI89JRMj8lMwrmWmZvhjiDG-&6ZUV{#pl> -h|Sib}&YyPimT+ZGer8i1fQAG>vRds9@qIEdcQrYUkNwU}NtxZ9=Neui~TF$(tL0&z*l`-N}=9oSg&f -p@Q79P?AIfv1{3=HllYRVOp)&By%J;+#IVK>xDd|zEmnp9my3d@WMpBE3ihKm8>PxZYOlud_2kX$tCQ -7q}1iZM~-7XjcP|HH3yzhS<$(Bsdx&Zn7V(`Pe;b= -UW{+JiD`TNTcS3iYo{!a(%F0T1Momg+tUIGU?)?fhnF-huVF9y9WjH!~96hw}SL7|UdDFuMH>Dcgugx -W0~cu#qB9Yko*p-q6&HM9YQTe&) -6;qY>_zsW8uaOD?f65@LP`M6hs`z~wl6ORxD%r_2$cGyCWV7K72No+wq~p9Y@4V^CO1>I_yF9|WJ?)^ -%?4+K;b3+ZLUhul%-M@j-SAM|c(@!@I|el8Slx1^4O!B&$$N@|$odm<`c0!A5gS9SHh%(W=JF()bz1` -UE9KQ=Vk{eoTsa#|=2x;lL)>fr6P8xzfAEa}silUFnU&_qGu?`&`g%{?I8VKBAC!DZJN7EJ-K`4~C|Y -#5r%h4rZtyqQm)6@#b?V&WnWXUg=1t*+S3Am#6~7^5m*KjR73wWygW8O&>aI&VO_GB_l#- --B$JCG~Cb#?XPxUKUwL!SLOALPROP3e15?O)T?vDlnr0jsU#s8D$HEFbi*5FcO$l>TIl0elMAL>b^E^ -a=~r(S*;t(hEEJ8;G&vcf@&5O~kmnJ-iGZJCdS7i%F-9(ohn|oP(IyU=j7u50cbRCEBSJnB0n@nlgqm -7h(HEMpBuncpzj-MiK3d5>lTR;P5*x@E(At#ake~lX=JjYW6`~$7fH}^cD)8s -g(h9fn`CwlbJKmBi*q0_ZUwS(`3Dd3zpPzM(WCiY}zhS!G$%Mg65Bp7Z^)9S%lLpEwu#y(W`+Oj!=y> -qJuBD0LT^sBv`T3R`~7WW_+K!KsxKYpKAC ->;kUmlE-tZ8e`v>Q)S4+KBF@HZnoj>(iNCXQ)Z%7|(qH=acD-B9q#xG%Ah1E13n{~1lsXn^VKb)?v(AN^QRz4 -peX2q;X{IuK~8&SI*ZEi+s8a;a!ZKTmgFKVYw8K@&}n(3l25dL&w#$l=?5VL(V;Of;#j;sP^Lj@Q(Pe2QR;V`sxLKefH`NnbG1u-@JPB -c3-+8|1RV>B5r(8&~a4p*H``MmBU}77YO!i4fZXAeSF1g=C=SAs{9{-^}`KNuGZ4Ug!aKjPKGmRteG+ -2k--BJVO7^1K_07gR8pDqY(}|ln4Q;j1d&?UKumv1wN!|hTHVATStj61BnkzJ>r7K8s);UlM{Y~g^v< -366ipkAGmTkA)`MHcsH_{4}7%OS -dGVr!gIACYR%tk*6$szX^HH(|0@MT~rnN=!b(BtNKzE_KrsMVKnq-jkY4|JU`sA8oKScURm&KS#US5T -iN13=gYV-LWWUz(XFq(7g~*bxy)Si35_EcLoOq&ao^Qx7=V5@f5;y&pI9$z$h;uB=b$=5k`Gl74 -5WcE489hM2OULG=j#zd(IB9g|2=zJtr-4;vaEd6!KDp;mpwa4j0``f8*7FB)vp@- -o47$ezw~U~Ts`-pCHtqj*;))lpe+?}!1j7f;)Fi(ORaC~m;bVAAUzUt(_qP<*lLTHOp>T@491q^?nh0 -Kn(jwu!ImXDS^58dSj+aS59P8h95DPF2_Q(F}Ix0#h$!qfQ6!%J5okJvKJ*gt>Kt+=?4<1e7P47AHKr -%hVf@PWDnSQB!|~aU1t;0b5+Dnf&vDb)|&LXFk;W%ggn7`wJT>+K ->_!JLSbNZEdGgJ7R${hjz?Hk%e(_wS!WEAum$CZqdCCK2B*2k!>)uKB%vKi!S+87zkLZ2LYmVUIy;4% -v;#VkmBsHSrgO7l6bNr~pr!&Dk6}YRaUIR2gtMV;%1aRy!Pw-)STA)LNNQ#X4Pazw02ih?me)5sm-{3 -<{7@gofjqLy%pxt7Bf1gQ`^9+k3k-Ns{5!IInSdUgD -F)}`oj6DP{J73e;ksU`e7-pgI;U(=fjsWr!(OWtdz(lcka(n^Oi7dYs%-<^)u(5Hz* -1C}BfOZ6(1*#_Yi{=j?{}RiZ(%%1$S9SIW>?c}CqB;yy?D1BJ&ZP@cC@j5zXZZ5oK7#GbmKv^3IDYl? -TYfdq!zrut#CqhL*@99c_uppZyNAlP-uYXv73KkY;vR$s=(1M*eNfiw#87WMSJ!(xV -0xpXxN9t|rBlP@+f+kDrC|P|z=rl6Q^wtow#96eSGboRn1PepvjzV()llY@|kGqXCqh*mYT*=zeySP) -wA%K_>)e^Ao*XF&3DHT?zta@%m&Zs+dY_;6~USX+S4f-c-H`k`^%x)=un=c?rjE*JgJ33r^TKQTIfNA -$JMghDFvrPEXT2Ro&iEZkmaZW7)x+cDOM$WOl%vTFr{GZ_%QKg6iUyS17A3xiea!jiehZ4w9q9nEc4! -N1P<3$rnexLBBufqDRG<3eslxX5*XY$UZoYSSI>?cR|8p(L&Bh>Vv-cK^Btgv?1AzcNV_)vjw~r8Mg8ZbYe -2yD~bs^2M{yKUTWCDj?}x>^ZjRsl1=I7Zw|ix=CH)S24gr$yi`_23E6t=lY{bP`ka#64&jV#FUe|24W -#X{bQ<{yRq -dA7!U_iMJ>`fltO?*IyF3e9l=?*A%T}!1kHztT8Pp{tiQ)L!uP;)}c(`CGlkEYVh=QcjB8t(4o9G$mG -&_iB5K}i7<4`J{?x;#~>A2QpD?J~3Tq{vLxNi?VMlbBbTab_D4?bOnR@djO -$#$)=|f@vP38}4Lw1(w%YR-MsdjYvlGvWY+rj}n9yA0}sUiXP|8nA9o@>0|g#}=Fg0h&`Bm96&VGG-H --MH?%itL9i(PIXWwAZ7UXc@CDj0H9+(7}Vc1?-N22Cq^CpcdpJquUNiQ!GXGL{C&G7{P)XA_=$|s-}) -nY<%P_jMGzxv!jLs#25P%_W_-pjBpq8#mtGa{#2tRO{nSPGHadA#UY}YScwnb0^(60Wi%v;Ur$DZ8Cs -cqsU1cAJa24nX@Qu@lUog?va&21Cbl^0UEv^+S@%)xgQH03$vF4=xRh*xB+TR7TGsIe_ez%;8Lv``1B -&~P;P<*68MV{dX@yTsz8Ey`Xe-06Gwdqye@z9?G20AM7r1lN8nWgvH-H@jPi5z4l?+LMcn@VLXQG<`+ -*+}gjDIl7Q`XaVuBHY6QU)uf8n96UpNAt=E@BZOYFheq#T(uBwT9^$1|2!Sl3Ej8Zjob&W#-uuC2YZ8 -yBFO@!D!Q##^qO0cs*(^FMLuDb*b9&^3nQ(d!M?^!K1qOthw22w%g7l00jJYj)9X$Q^#naEH1l^934G -sM74FOegurYb`QRMdU7JnAAJmtY>fvewuY_Xp$Fw@5H_(ee&L_(_KD}~yasD~N_uQ@vVNvgDLz)Z<=! -My*#;(_!wJf$P=B7gF-8h2Dsl5p^ib4ka(H}~kNkco!uZXK8PIWKon{ -vWHusXpi=kjo)lcPbl@;)_E(ltgjos$15R#|7B!sR(1I5P65bSMx(F$nFi8#6dI(N8=zY002Z^ZhE?hJBrnOm~Y?G0RVM@tvLMK}mmRr47m$Mf>hpiCE+v -wOOU6BDD}@u}gybrkG_Mk|%boT%*N^!2aY3Ii4{T*Kcb;7+v1$DQ;?hb{=DXqG?)}gz==6ogIhal$DK -|j)7bjGU^Jh1vA0cBTY@?uq@sQ-(^K0KaC-UJvA){hQk>}T)uA3pBo{Gu?p0)Rq?eoN~kmXRr$uNkXc -_916ytp#U9*ZtlF|y>t@Ee#5rE5W-TMWBIr_Qf?-enB^VnSQ!g+&;YUduHc~#{N6BWL1CycQF8+Q{7i -)~DR=pr-bHCAwSVJ>+dx8J_jZRmHawmq`p&QfCboLx+6+bnGg@LfN_)+t5#~L82g|~G4xm-&{L(*(SO -g}T#4U73>*JuF6C2Q0o{!!NGO>n4e`s1uq170pBiQMhi=|a$d+&V3#AzIRiI(=unx&vqH!A$Cw2Pm(V -R=RX-PaAN2#ofC>dv_>KbY+mOd((6k!d2Fn)y+^~N}0s1<8JyO+XeWm5CSzQBQPRJ{a)&#DHEHf?`x~ -t@{Up^?+}nk(7}ifYT{PQsdU=VilaNdd@`Nt{7U_~61|5Rnw_xIhwC~Z44+j5nOdBDwRQA;d^|qRkB? -8T;a42j@z3!wz4>r*{XxdFsn_fGYW4M6Tr0)japGw7CUZQsl9?$AX~p>xOyU}~R}+}jYRfQ*>+5kXUW -|zf+hH*I@%JLgbrlQws6BMhXJwb_A>Q_QRL1}klU`QpZ0C7Wn^WxIfRBS{Ox5>Nu*B-tgB89M-iw1T? -!-x~tf%37ow7`mA01_yg%h2LhPM-Hca``M+$M1pH*kw@`>Sm{MbhI0&?EI8pcZMTTcz2lS1ZU>V9BOw -!p1jYy}ZCFq%eY3PfzP#%G;1d8DKF6FbBeHnoiub#rlm~RQ`@7-5A+zkW8jD@p1q{ZR1D_jhh|v0Bn3 -mm-1!XTn$}=D54CZ4MKU7=kzk -x6yIxsGY;a9M2-5x38~hQdrLcstUK&TIGTUk -XTp<;^CQD%BuofMwd;BzuGc!XMr2(P;b$OuQ%OneWov@|o2YIcn(N%E1^WE;-kZi7_=n6wrp9Be5yeS -e+DhVHqg{2x=2H6^-NJvVIU7jg%(m;O`*wCU%%1RMlLjN*j?uU8L>{h5jQ@rm>Y_;ZB#FuMw7L{_P>z -I~mkYn>&@r>*c%z~Zp@5=yAGEu-tBhi -B@%~)SPu_R+J`_7#xPDVhq6DKDb`DqYSe=c4I14d>z=tYy_|8s1b%l6X>1L_QM)wDpkY?jn|M9DUw7y -Ukp+6$Kfg~e!aew7$NX0v169w}b^FMKyT9q|`SZ+|015x&2(qH$uEbG|hnP_rY97ntt|p^N0YK9=veqjhnRSH&WdSl(cEg)ESWOOfAi7u>0yAM^*MR9?!Hv -C<=~Q@9}WbeV3f!zi(%7yuu;kdkQY`7SpxqAK@%EAuWi1^5ps)(~cTb;s5o?j5B}CIXQ_wLQ+BWw4AB -V?6fi(l%{NL^f@l>s^^knK+(IL~h7v6fEJib)j}jJ-Z_7B=&S2rQ` -HGb4WwU@r=^KoIMRv7$WjOj$A223u#(e-=^UxdqjPjE-vsinQE_7fo&f-j_Z# -+19En7-tR}*U=M7DjX%9!V9vc#5?UsC*IAOO2dQv_cEHtDnN6k2j>2x9aDS&w<7_t;lhqNJ4!DYl7G> -(DIV^wgaY#-X<2aO@pRaM|o7KRLqLo;0$dRK6P<;>p+WWN%ZJcYZuDKOQ@+Jbs*{jk8AAY3lJ~*%lYu -OFU8W>@02j4>tV=w%I4<+fxStSiYm=L*vT75~0K<=jVk-1@%Eqgmd%|GQU_8JJFFyWLnHdE?ak117!8 -(MJckn0pUsjM~}Zg?6N`G9L+PDi~Sx*g0_(lYK_-EVDsJ4y`nYe~Rs5eC;*g8_#PbHw6L2$vniMK$UUIW -}deaxEb_?Fx#FCcXL4s9&s%h2TUnveG)tGo+oU;zT;d)m<;wXifQ;yC}yV%q=I59fkxHKaXk&o=bnif -9kapr{tDf@~F1gri^<|Ht&rMIL^|;ug$}~O@2mS==AWWWEvN9_~+MGqtBndV;(u)RzzV&($j3FxVq2v*`a+>H{(~g|Dk&z=-qnX{S* -9OsshHHl-pQCmD7+E+rYYTbyk7EI3=cdy#eDz0R_ncl=VYMpO%+j*2oM*SBO0ZT!HV`(%PVf?|a?1g} -Kh1;6~n#l6`+DQO;5$=$^T@l);hIRKI8JRNF9xs1Wo5xS`}-k^LBn#L7Y{3zobv%Wh -h2Wtvv6m=9S=VKKtr2}+fgR}@EGW`nk9cRQsy2ybBx~WUq1J>32VO!`{=+i&o8g&xE=`|29rWdP(c_j3M5`|_e00 -y8=(IivEbIZJtXk6bTD+)9BCsuYeZk?&wvFGaTqG>OmQ*ab{rG>yh*1;?|G(&?m#bws^JZFl=GQG8rOK -ztHKJQ$kEA65HH^406@j2`aRfY!BZm3YK$yY()+LRJv1$Mr9zEs8qhQr=qz1LP3-D{PxdMGAvlxJ{`_ -Q3>imNAH2N?jVm;x(aa}?FY?ru|Lmd33^n{C~3`|wP-M_6_}`r>`u=!ikDMl=AxRtZ09+)n&TC1lS0$ -ia`KC~Qut9CbaL~9V%cy=gN+48QTiSh0y^#7aW3ZqHc$7D?~&!ty_0MF_Q`#+_`#95cV8MMXgpVx_AHdG`@2O>0lezjc$L^Y#tpK$8S&WebsF4$^j*sFKq+?P%}`Q+QG!gull%BMK -dkvNjZs~Z3`=rP6Ddov^g8T#U)?H_x^n{kvbkswzHr!7NJm0an=3dI#xZ#C+CkiZfQjZI?{()+{1#0KVTzgt+yV$@N;*Fekna6j%OSVc53V*F -*Q)7GW(8@HP0_$eP~FQ}P#H+K)~Kzf+PAt00vJcf6rypZO9A~ccM5SMR(A|)Q;O=GG!BhtM%cT=V~^< -p^e<*6oW9j5s>n5Z$J34oR0Gy=n5s_F%!WvgW0ki~wCc1Jm&1_1&NJ;4D-^acLT#LLBaHNENKf%j(7o -%9n>)r!xy8t}?%X+K+kJV@(7Ry(bAr_|;5(@0J#F0~o7Od8yl5WF@lZKokyO(*mHiNfU~6IsHsyRqR< --a7wwO!Kf(wJjS&xhpF4<_ASQB@+qK}@~$#Mon7^!^=+HH~|HfW=zf-6!oS3YC>Fdt2uCf=di6?+I^G -98g%s`bX?Og8A!>ME>Pt@6h#w$+#2(}tle_ORH-e|K#PGySsY4p1Hd-%?6{)DT)tlhjh_zzdd-mJ)aMHPb|V7kyuuc>tjl=q-gkT1d~pBaO!TH~p@nTjlG7kH975oI8Ra(#zg?*K}X5FR19RuOsz -96!Dka5j|Mnd?3oW%kPMOp4_zaF2C@RZY}O_YhjODe?*@{yu(3k^N~zcC0Gc&dE|g9uS2=&jy77dxU< -}jnj5XpTwqm8TSRGS%YNRrC3oE)wS7FC1$U#xc7$s^sjX6{R=3wV^u-rpWb&kewiMS&94QXzz-L(7NX -I=L{e(h&sT1iy`CXLTB&kTYNOS(iZK_!%nzU=jH0mW6G?@kYWTxJh)0+77G02Hi6dfQ4mx9&*9Op$hs -h4%3G7lP*mgGES%y8LMV&|j>G}!?cV25p{y{tPJrNgE8x#4Q8=Am}9-aPs0xVP>&8ajRcD1_7va|CX6 -0yi0}vB65z^>U^JK2A3R*AdQiB=ymKRJq=;o}h(pJvN=xPtu`xs2APr4cH3`b7YSLgTu30uL~nIRcDt -u+BmsC!|N@z4Li~fQpQl}+8=9iqhP+&nl*X-gytKneyH!HtRU8^U^dHCao#%$s+xY-G>z066%(OEDTh -w3i02Wjn2+i@#!Na4%<$vZaqnKuQH`4Idchoj=J2t~#Yl(}Bb%T!pger=E;2Cayd;$lAb@IelGq^Qit+y`m#3n?zaV@O$;p8AshOzww21Sc{Ba&nSol5~%QJ@v%4Q7SVXnh50v}Ox|htMdM7B7>Zs;> -W{k=Tn(b`FbZ&5=VRNoQ;@wFb9g?TjA@ptor#>943{!!l;_=7WAm4Ka@<;8sQ&YVUt}jy{iPLWx|{M@l$@S|kd6NX1_sh=OZ<0wT31MSNJ$23WhQ5U^)iRXA3E -&{fk8Ff!MJ7}scgeJEdZ}aNo@;vGyAN5?=v}(06>H)JFi0>a)c~_HoL*HHj<6Tr)+JvwdI)QtyWP=7U -Yq+8j8r^pWuq~_CjFvNt<0nIm|po$?(s_7LArlQj^SJV~@6@&sB?RH}Qx9UF^e$`YC6k=mc+dflhd^^ -kqvD7}@J!`_~~lxRX`1S^2`u;!o`?MlaX~d&D;EevTWop29*+Trr0?e@TwETFsNX_wcK&ZS>GmF+}xA2QS7?O2=5jCx91w^6|ny6F!;Fhr6smZ26Be#q3IS8TQ<9YTe0Nm5a|29Tv&QW&zW4%8xy=V{ClY;G;e?+fhr|iiZN -N#p5j|+vPlDr1)8hTC(;t^i)9~Y@fz}^o=};Pm1m*Dtj$NJG_ng`|wX=05!X5ej>PaS|VS^Gszn9t06 -)xO`mFGTT>&*YdyWecxeX(`-ZR>8|TMM^Z0+zt4xh2a1zx@77!s+Eo%VW0E;-IEO3uJbSO~!PcWM;QuXnbmP@R&B_(ih&CTIqDNowfAC^sW8+`DivE!0Bga(=nqR%%zRJ>k_qYeUSRHn^CO(4 -En_a-O?q7oVfU=mZ~JOy)U1*`o4;@qC -u4KF|}+!A4IKI%Z-|>R;ij*-yLwyv73yzTEnXDpht8kqvc}7pUy);l;()XtV|5U6K6rdcC=^u?3S2NP -zZVFrY)y2N7B@lB2R#h_?CA&fX$Jn$A8~9z+p!Ma{Z8p{W{n)BdgeM37LVe^f?dG5PgaYfl;H_hwxg3J -^FYkB&1Qj=%dwwNM$u( -$nMjMn07}RBa_n$9HYTAA#xo=Uf&IWX>1+v<&eqS5^E$W%ln83$R2i}aIlfLaRXSifQ?~_ccU<6}tx@ -CrRU2Aix!e+Mf%(_^l6>!IrdHY=sy@88f -y!FW3Mgj0lhQF-4`Y%CFwMN_W@?3q#?zaOkPjU=xLgF?OSew02!y<3;~f+ln_wHX`NyE(-nQiD{QE8m -2hq%#Z8grb~=OcVAkoV!0P?6;ItGuy^nVo{jvM7)9FpRoesUxKl~DCDrbxEuREgM^UO92Xkl=`!galY -2jvhiG?9l$QHs(8HGQueOjL%sof0V4h-##<%Ez@jP9fNm@Nr8$q(BGRj7q}}mF53`Z&&x*MiIo{`&XO -{5;k=#Uu?%QQY9QysG2?iX{Dx7>YROdjY;evJAp>Lw56h=;)RDcLaKPEQYfXB3Tj2#^6?);=?h8UECn -Kj;D2CeXZGXn);V7qkw}TXo}Kya?Cy9!Zf3Z)v`RcU6W>Fqk9im$;8AaPm+JKy`;D-NjxOPt^@)lK1c -E5l0x4IiMr(v5qojlyzkz~gM5S599GV(kO`7V+F+*V;nUz=$4i;fvtK5g2P1Q3L08%|`k6C3Foz8_7W -|&7Xk!-6e!%g@U_-$?u4^tth&fFXvsNySmrVDQ|*NU>9BGXD$hlmf5q9K86D;YzNyJpDL=n<%R=I?Qr -VQ|RjO;D8_DB#oSD+q$QM3RbHkGjlTAg{ -X+v0(Wph@&ptKt!WgiWZOoJ`l|8MB_3wN5%8I{0dm8C0hejw>a6#zoI+ts=;8a;~988lSkJ$zGjxC{; -=aCocvJnNiy@z6)=LW=_=Okth7o`Zv0LYOt0p1WJK*m#466Hgg2WxSz|hg$KA2lG{#~Z{*m&5qtKi9o -==!0FHTPMR5Le@VzC-#gvB0!KgABp{J;&mFiL>IHaQ#czSo1IwLAzq#j0*4_%0U0cayDo0Zqd9S5_9^ -W^4fQXJd+b8cDGwXwT0V*kA#beyFo*!+_Q&rWkt$QoMC?WNIz;V`P0uF2dMTYVn}T+ZlllsgEs_>co1 -8ZsclK7&Ys>jC4YDce!YDJQtG!&?xkwen{6P_?U>j^ -3P;rK5G~)?iIQ57vZF^0|!F@ldoC6ta4N)~2qH1D9b{^&1WuyFwWb!AH%O6Miqs6fNce3q=2S|?gv=YrF5aP>OrEISMA -9W6$Ut*~apOE}JI07fHDULjs}2K5~$^}XHLSA7bbXkQX|qRv4O7T5?wJQX7zq2XleqFy-|Acp|?k@1C -#>|sY2QYRhpP7^!GEjz+O(6@(e%Q;{d5TiX#B~E3GmpGL&mAK^w@fl|347;m{G!iEW+u0au^BIClNHY -PMcvbKXiw5iTyfbK`M34Y&V)N$ZZEoJYf_I^$F@%&4~r406Jsn@P<|;oMc(p0g2;PLcj$goH4@{fkRIfqcg8)O2IKg36tnOIhTY&_VzdCkaz>_|M1t*2WX&o6ClY&~PY8_z%6dT8cHE1!6Vn>RL}vEQFIf7yJ -p`E>KXksV(G$Mf30{rjWsFSqZqzh7x=f*3wIWtCHVKi~fI!P>suaNH -;0xqIdN-7CMr-%qc{amK-#g!$zkcdvZDd-;pq%Vt$ZW>>sc|GjbR@5c}Rx%tS*kiPd~x%8i0?Qg90H* -Oobz&FwmJl4PI-?`Rbf81Zc+h6~+zrNOAf7ris$;eU}O9%nqfjJ1f{Mb)6=P=tNIrHWWXpbb)n}bJ@LgSc -)dg{GX0--i2=nk*r@{3K?a7`uL1w#yrqd`<*QShbHUb2M8C&ey?19-R-<*A3-4bOFXvYfVzIt(cu=>j -2$Sox0X7r(DS&SQA=1~KA&04z1#B}jjc5c%PjeqF_yY`u>6{8Q6YxwF&f&Q0sCaZMWPm?6$u>R73%O@T!AucWmH$Q$u=J?Pn4^}~p7Q9us6IJ}N1=VVHVj^3sQ -A1XHId{cb47eJKs|DyL%VrFzp3PI?DU@)f&6nHDR;`zgz$Rbr+Dj32fTq?m=m2&LWhzDBR1Yj|mlj+4Bxw@N@zg^ -s2-OUl?{nh;sH$UH#_ZPRf7uWY!mv`jmmb|^Wes^_$b#o0*-;;~$U&-IEuHVfG18V^v_EZYg0L0{INt -S4{-7)5fkQPQHS+ba?JO&qz`*ng2Ygmg>EfF=-+XoY=d(9}o3Ir8ti&!jPN;a0b8>u~eBRE^Cj>sz=~VxH$Kpa -z1;VFQ9;4=kclDSIjUr&is?^3^6_8ioY1PrM_19oVs3eax;|UlrSM*6Q<0;8l9%v0_WC=FZYhs#Zm=b2zusS0TjXAnXi9}_u^PAG8{@tmtD3M9+Y`9M%2RZ%XliySt9E#=C5^^--A -l@V2nZAum8)n>)SLGpxUbT>wY45O4kv1BiWsYlU<=a!)DD1F+y7>bQxm~CL52$EhX8^oDyANB%5iH2F -M9a*%gGR3h>3mep-7#C0HZB*ou**>AN9HfN30XU9|htc1GeNQ3e$9#k3aKBp)5q#nh38Gcd&La%9Fd7 -LNDCA#bT^gH)?G^EK!j2J*anjMIcZ!9>!i@Wo^;{3I3rqv1(X2rSsT=p9bioTy9ga0T1nVaEA=0P5aM -sK?XuUJ^K!<7Ki0hdiau^aFg(W -(^NvyU8wfkI4PayBk6iXcE@YqU(0VWD;31=+Jl}q($vabb>V{MuIdSKDOig(;g2ND5ATac32_qg?XZP -vQQ7x6cwnEtR2*w`+pQ(19-r3(H`6e1uW2#cOWdQVH&@Tug>UZl~7V^3GIRw=o}ikU62O7;h8=gqaCX(K-0Z?ZC%ep%4o;|T3x~HW%Gy_W>S-GHs2F*umu8A)Te_1#(4I8+$nVD)4i0LCK8o>lXK1ltt -ajwG#ZbGFNuLEwpSw@}n&LUS*QB-LIeUbf{-t`i7`>5x&+E3}7@W>PcPtxjUv*fNfjwPP2h9a)u;(w+o-a!$4ZG}&IsaI* -uz^Cgz&K`x$(V^8dFHALiIsM)hcrT_wK@mc;3^r6KL99(EpB9TwBy0P7L8}{i3^<{iqJljM?{LxlE2g -%LK@p?z+DPdWv470!B(^usmlxTfkICHc3Gk|{*9drYF_U`7=ebGa!P#%_Kfuj8y@z}B%W23!{tQ~=F{r)98)@#25!YjYZ}%KwM=UeG;AIVL@87j;4T)u}da1qu>sC4~ -&w-`)qOw-Xbx~!ByRtcS+Dma7bTE7^t!vtFO=Z^$^bMdF|7SVcaW%bY_(-#geK`HtMeeYD8HFFUdvSQKfm%7j;hh38=m0-t-%r4>_n62Kr9I0VakDlNQ138B(a#kSVIvyYc6#KI@p{xD#;0Q0uv?@g -^KF0$(561=z~;^+OXg%%Df69ts-$_rujAzJTG4zD+j;<7t*ewiD5UhrNq`Xx8> -ct+|PqGF>%$BW_xX;sjFU+H7`VqRkpCDajG@3VTvi4N0n(F^%rjd_Jdrg?eRP%r$VJ}F6PCx -cgzBl^8B<*oF-RzZbO0~+-Z0~@92iC_&}yW-5F6;W>Xg-m*E*{-Yw`C9xphQN7+#y`t2XFQ*LD9@#Bn -9?2M$Rka1J5Z6N@Wc6SfMp_1k?3XqXR+l9Nn!QAh6?ftO~jJ2fca`(D;KOn}yT?j&wX+1&e9YoxusHM -T`-IA+$rFX64H>$m^0zR;?()v|fm;$5XZ?s(sz1lrEUlg*1-gyxCnNNus|WNuDxD~4V(wI%eb(xl#=0 ->}H(dG?2XF+t2{RTBOb3Z|C_o%=s5KF+OZfF8toJUh^mbSFO(L{@kTR*E`2E#E%F2sP@oc7;4Azb$^B -6Rqv}zw+Nsf1idaW?sEB_G5lJ4L=n;589us)YOq$1+HqdXDHVf;}={E-w#RAahkdB^o`dpdr8?ACp)y -9@`Nb>C~6q;=9gl196sU$mHD{x9pnaV1<#Li4@rN -&d^*vdq=ex2-0W-jaEQY2(?OpzKsY-_jnzh6H95`0RQeRZx>L;~H7Mt7spco29cj-%B&_HP%du-t*zf -BWw38~E?9;-d`zaF%{3E@dj?Bno@4davLmUiwMmN1^Z&v5>Kxt;KEZgsJp~VjfE=qPcJvPJAneB8`L- -uEmP*MKnttKlH;};RqK>1#$qJE`U%H&C>@bmH_SvCrKjLcYvbsA~##gFm+Naaqb5)5mvg8qJO0@`U5J -)lTHBifL+Yhnc~4u7g3gqSSD%gyGUgSKyHwE$cN4j{H3qTKy(sE0_1>jmOwp_+o4!So4x)Sg+&*sqY$comq4*sYs;rJ -R~XDf$s!j6~$C&wYDQ>;`3NsU3|L!dNdu2$(6XAUi>;a8J~#$(G|S+hvMtx`t!w?YXK0`qx0+E#lxszbU$58#gVu?nqE(iznmUT#pRdj<;B$)SU3T~=achKQz&PAHa@=|LAj77#=p -XgxcYo_dWwYswWBXkhbeL?jxR2MpH6=Hd@Vj-oSuv!@#7e{JNkG!=E9(A$EQb=v!OUSIy?GhOjs8{2W -yCc%%k}Fd5noz<`MimzMfp1V`Yvn&abENI)u7TuXE(DldJJi98D)zD3(vti!-by3KnoKhzww!kC_e%y -{sDm!S^p$Y<}8 -FELPovI-}iw8a5mB;{cs+AdwU}e55+!YAGBv5VD|gQ{15v#;-^Dl9Sp_$0f=la0Q5soz#lrR@YW^?AZ -{8DDcuJjek~6s3$AXGgzXP5x)Bm|Z%LiT_X8lR+XIx -tckNM!E<7G6*wvAbU6Ya7pDn!99I7i=iccL -n1B3xCH{-8+6f+u&;vI8X2!)AG(mn9X5xC@8AkoJ!9B|+ -$zi4ie2*iIJ>i5gFo#3OL4vHd4I^s7gqHY2>&U5h3lXGZxfdp%|ptG7AHPU~vgfbaifgta$;IPyx)q}4+j-mo(#lq(11x6j_27Bd06OSh8 -Tk=iGY_n@~S}z#yISYusx$ALr_c@*+_+41pI2^?0{?tCbB?Up|g|)^$9yC&KoMJqyNNClv9N>2j4^qp -wtv7r+J~aCT=s`o}oHwbwnZghM70O51WO3>ilzkA`>^R*azDML~N-tjG-{t#Xn3OVH#8se@whvS)c)3 -XpJia69Td|2a9po{`X;&p$5naX6$WD*frDd -x$Cj)rakLN$zvYD22{F(tT4(Z#eeg -;+JTmwxb(Qa#Ix?kzuAFOwDG*E;x(?27Q4i06mU<3QT=&V>Ob<>rJ_#<&E`;Z4J$U+8aM$3YJ5ykJIz -l=Ej&8ymNcRk~`a^t=e99yF{oa>a3kM@&Kgk+zzDqAgBgL@UQL-8ZdQH^=fF+3U+HJ(^Tut70Mynq*~ ->7qbtk(PpdQ2kg64EKeRO3`G|c{?o+P($1?!CbkYUKAhH?^=osTjECCR@rF5YNXc&z|da#!Gk0WeE36 -1L@?!|cl6?cr75_QE~E+7RGLn-W-FUOY$Z}-LA4?Q4>=t1PbBMh-q-DGDtaj}HLF%%|h7>VbD$1vDzIGPX($Ba~DPrp~^-#@~?jzrD1?+sEwwUhT=6090R137zLu+ -)9L8?a+n5NEtUDLVD&GeKkCE(8W#qSSfarY25TjTG-$mKeOgIH8K~FhGKOSLRnG^_%dB_3*s=f&?y4L -k;c8^Msj{^Yvc2|2T{Wx<>;5L!4FO&3_=yzU$|&3FQ;T3@hj<>$C5%#mh3Lj^iqr^J5asDLp;=NF#@E -;)9HK^6~t3*kX(YU$Vu|FUeC^Zz{BP~RL8bPS4## -xN#!yz!*8RT#YAe_*n2?}rI=JJwixQO4YiG+$e2`{61}dB~x7;}M9-XzV=LIUGNK;LrMMIP{)+1j-=dgx^lx%iJci`I18$X0iz6qy1+VrG&onVSG-)!E}7!tQKsu -vsW5dP_JXiy3Of7(gdIEya1{v95 -t0%^XQwAJKHi4U`;O|Whh&i&gJt`(7!Jf`b -tI(?u*DatGD-GC&iFMVhXle~j*Y`G*rTgZP525neERRAg_UkgzcDv4Whmpe_R&m)BB-iwX3;hTtSm8R -a0YL<(JezCJs>%-;xo)vg$3KJcLg&2g#boYRCUmyRFUOCJITT>e57N*bL_&c+{0DF`$opbdneL%FR`n -v|1>6oYM`wambPq2_6s-dR1FXcpib=!Q|)LK#!l1IW_qRGwUK -IaCAdz4WETZ@Y$tX8N^o5SQ=fvDYyQ#bnA(Yz-VwO^(OB@>g#|q!?ITK9k)>Bnqe$%3aOg1&^^j{f>@ -*+g6XNE;qfNxl~!BskS@m#o= -N)h!=s?Hiu%ZxI8Dy>%`5IqWNsp$XsAxj6RzHP9*2040^chg;$*nKI#jrIJ;F%>-Bh<=de7ZRkOPOpx -4Y7X5n*6&cdC`&gYSGuf9E+y$Z7A>9|?AW1$N1dBxgkWYeC} -4hr~gFj+-xSA-04(*EhZk@{d16t8#0P4mX`RLrc@^F9fcHVy5dhy*+?Ht(hCyq|3GNFbDH5V<>}1BA2 -O$+Z!>sjH`B$GCgXzu(y0Z_3?#XD3qb^E-REhA5!ur8_a3`|VD?dM$nPhCX;hSUjkQ;3^Prj-ky|E#H -md0ENdd77lQ*T?z*%Y5Q>C%k*?yj^Ot@gLwlLCvbMfJ%+&-wAAY;x?1R!&Bj)rQ)#x_=Gty&w}iWs-4 -bS}-8S>}RJ&Ei(q^}15pS~Fe4y4uVx!&065LagzL@1IdS%;HiQ8K*;6*DLHXEQWqIDe<#wI~vBLUfB! -y8E8+KBfY0=O8C%H0R>M)Ti*4^aD>#xD4`GF`>dqu&y_Y`~tX>|JVpK|(w6aSKSB2iZUZ{m+S -|MA%gyV4^ztFV(8eLdO@Y{w)Bw#r -BaJ;r#74;Q2PW79T}H~T6I&~{`TZA*vf@j{Sc&;xeKB@6yL>t@tvSr4+kg@^Q&YVKVY(PGd-T3W7Csu -_l-O>GS0&%%;QXg#E>Y9CFiS`9GxNXiyh8}r*fXhGbah>>$ft@Z4k|zK!K5M%TMdhz)wd=#v1hS2Z& -a&Odeb(2%H&x(X1ak%GV(Hb#lF6CtO>obexX1`xqMBVZW4HIekrg$DbaDbUYBzf&670@mE@=o$AlovT -zn>a8@iO%R1`@+J*DtKKQW2i%D+#so!hFOe0DHO=Tn_;Ru*J7m1y -2fDxe~s#>R<(eo|B3@72G0;eOCfx$0%9m-kk+-F8cssO!pUkIjzBVsvh>*t2&=opUaKYNX9+cF!055S ->;EECKD|%n3Ot#RKG9WYKdrT5auC2mo29Ot1dx+PLr|xm(YO8pLf<3iZfjs-DQDG=!L>vTU4Y@l8qrM -0R>frB)`1296&%Cmwc}}^3U1*E+ffxvlLtVjbtl(}g`eoZzI$l$cR_rfA7l&td=P|wi&c=KrI0w{LMKmC31gcYd6 -GgH-O$IA)WO(>HnvrUhIo=fa+oJ5B?m#A+{bBw!(ef$J7kf^77!Qmxn)!ba%>(S$?C-G5$+Q;=`c$hD -5<(_qD7pV&bEuD1?=gQm|&df$D8Ssrk+Os8?%1XQAFJn&8&w0FB$R1Hmi^Omclph%t2e$h(QT>_Td5p -2Kb*6^a(C$oVk30o*$my?79QDHCF&+XHr^nEfrsF>|C%_Q7n#Pf|+Av-^TJznF`0-G@Gqz -nb?vzd#n95uESP(Q4SN$4B1(u-BoYY-N70H)RvDmVpt;*?F{AsgkQNkI3tQERWn1nrS(*zlO!jHk -xRoX5zHT?B!>=PGqm>y9~yYW(rlc*wN!EVY;)+?z#X1wmIE{kvB|=XG@dIih%{HOWc^e>QeI>IetNm;y$GLXo7{q -ds?2)56?B_vr;j9vKF<&hQ1J?-q!28h(`!DtWwOY-S;gY3 -k&6eZP4uL~1kx`ernK=t1&md>5YXgibO$OAt#E{3rBe-HcRhQ>P*3<%NhI(4!jiKH4S0fmOfRyQ|pu7 -uTKqIGySa>YQ=;eaCiq1J^AL94NolEjmGKjAkRGPxOGrYsju1}cX0p(J2q&>CL-Na4qUD%j@!^HBA?# -V}@LPi%Ih;Ilis(Rq+1i)ycnX#h_SvH)d<>Z3A4LQD<2_IZbs1oupUmN{LjV%s5a2;e4&{U$Abs>>t> -&7tYrLU`{7Ma1$DJFCRP|5td7CJZh8+faIk#Z1N5>CxrocxoSAT}^&D#~X~Us{1Cgm4|n4H6VStJUO} -^Um0@Oh2kOQ)kU*;X^NzUwV^I<0QhBe7(yy=+RUS#8^Rt@JMmYsWWpH+s0)Dr_OuN4sv%qr?g4 -^u@hi=WqVHrw0p%dpy|KGwd^xc*ODR*U9VGdaIjp2bMZ}`jat))gpK!{-L6ue~33fsnH!BNBs{d< -sStUz99rBSLq#ms6(2xXqw%i#_vSW$kGj_Vxhz0p0AE2v*s}sh2mvmhG5#3Ny@QbEuhAB1->7TM#cMs -@RqT??~*;-CCA%J27|IvaiqPQMw8dMF8+VCSRqg-4!vQm5JQ92ksmnST#aQV)aHMlC~8$8-o8f{Rctg -Jx+-rAyTJ?l>J*#phiS4#iI~(C?8ENl}I -jY+|o8~xv#d%_-ub(@#AY3OzqBBW+`e2jwnYz+nA6Wk`0R-2{5~-yc?rB|VsaS&%SVT81T@QVGKsCM4 -`C*<$#A}eOh(i%L%bDlUjR_z0y$LxLU`cs4`*ue8WkI!S$qL_{b!H^5;W9+@{|)IRf2LoME-a5=sdc$pBI89u-N{vBZuG9l$365z -!Sd?$uD_~8ff^HkE2g5D90P_bq>0#|EoASjw%0J%al$FscaF|*DaD7Kj;-fwLXgtk0~I`IgM_OqajpcG&b+}8s&dT6iIe2bo8fVS!`qxs{V_H(=YV$jTO|PgtAdS#14L`_T2Ayr$bR|i@ad{;F28X -Yc!Jc4cm4Z*nhVVPj}zV{dMBa&K%eUtei%X>?y-E^v8mk -3kB;Fc3xeImM6z1QlEgN^v3R8Oji+Hnh!zNow)-rZxo^-TwFf@JDN1p>3&RpM-mGLtsg8^NFNEOGc>& -b_6Z~Vf;YiRcV9=uyfaz?&MO-V}hRj3p@@KL%tA=(psy!#xY~5YdC?vinDM>iR@=Y1G;`8l*!q#7q*> -YdCmAu5_7Z&JF`ESqgLuSz)XT6kgTizpD6}DF{EwdvY;ZCKl*Jq$Lb4EO9KQH0000803{TdPD-13rvd -^101pKK03ZMW0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD9ZDcNRd4*F!Zrd;ryz3RLdZ7SAxf{?SO^ -W7_8b#xr3Bp>-L?x0TsRZroyIhj8+$4=IGIwWZhcmL8tZ{*jW*C$ns_N*>#H_Ndcm~}Y$5aA1c$&cn{ -~FOAP^x3HpKsfIfIhSRcu{Bt+FJz!&scAsg+Zhs4q5Aw2|R5)+{@9qw#Tw`n;aqSVtp9+tqvg+# -Y}4vtU?ozZs^IOst#r{!Bx!ygkdAq|!WA$j%ZSo>9?R>e}FosFNw5*?0L1m@MW;H3*}Ew?=!&V!TBHv -Jl&}w#CaVEc>X{=;i;MwqAVL1sX4lt$;-q&;z>k`w8Vjk;CJUHmlvRbdoO%`_8=3hI|hdsIHFxBkx7# -yCBbwQkG7|^yp*nKjna6^zaI@Ga+55XIoy!sBpCqT23GY>pE5o5rY$=PP3F^Q~d={O9KQH0000803{T -dPIwlb7KjA^0RIvI03!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gJCVQ_S1axQRrwOCPa+cpq>_pc -xv43i5(NYFhM@I#lT-GFT`ZK_kDLfTAUiCEwh&f%t -H8&eOs4SDH#U7NwHfj_FA1-BbvN;g1S;V*YH;h#+sa0ys@AS>*RmgZa=^GW8Jd6RJGMgO3=N~Jui=NA -BKB58tp|sh|)T-ZgMXqoHcKnu@)(JynOtKQ(yhmVzDSCHzwMlGbbCFwtBZ<_=x(6OHpwv>O*k?dsLNS -8}|3|^Ox;%&6Xb?etXzHEdN6gWa0>|7RHJ)wG-b-=$)C&zv22|MxSpU&+elOhugEoFlLGHt(~Wk@8#4P%ePfa7wx4DWxU8peASIs0OOSwyBAz% -g69$%Unq0XTIuiEh%k%9(3y$UT#W|X>e?H*YlR$SvzQ*k#F|n0EPPp_;xkGQdTtm_l#dJvz#KarWW1^ -{9eL&I`krBF)v7_F+Sukk`kiRrHdsm_n*~wTl^}9)S#+Wyk|T4-WP;$e0_2h+`0LBhViF?KHKfrbR&n -VbGAkLgk6aqKmUYwOIcE3Iw5iLw4)ooHo%kc3G(##9$y-B1A+Pemm+es)b{0}H%HOs@0Vzq?xO~Px@2 -ywaC=0d4Vj?ebhE>6Y|0@e?Wk(_FEc?#HykYl&fV{p8r+~qjaLZ2OaJ0-btLNlI!47aSP>Q=qsy>jD^ -okFhRCdK>Ac*G3e|gFJ`B?_JX=gk*)fUa!zzZ!r+)qJp}@Q0N~UWfcC8}<9@#Xr19 -o?N`vaC_4XZ1-YLLLYega{sp>*`8zT6Q4ha0?4%%KfwK;C5)l&V4)5m@B8uez(3*0^0szRnV$jR-RVZ -<@S>fIRby88tI+Z|{PJIDJ80OW?aX3zE%5;>aEfOT1NzS!gicbmEqau120cob^{EpVD-81h*2pMu9pX -!FPAYA|NMBdE@H^I$+upR4*V{?CIc6T*t1Z;jnI<&Yk`inm1h2nU+@cdXN*Rds5SCZpWN`W9Z9cTR%d -TPJP$H6n$kP$wESXK!7$Q=M(dDBGcpUoe62zXsyyFyl6%?_if~(k7y^pw?yyT>zlZZXa$0q@6aWAK2mmD%m`=uGyiGCz001Qe001EX003}la4%nWWo~3|axY_HV`yb# -Z*FvQZ)`7PVPj}zE^v9BQOj5JFiQBRt56k7-Lj`Y6^y03Y54d!#&~tygfwo(FI_L7IrL^R)f(iuySOAM -#=%$2oZgpVD^tR}GC83IFdwSszFGjM;MRYy2l}Y>a;`V%|Vi8E2@fE*6H5RPtu$-8@YimzH~l%}_6!S -d6qJ$)hVD_@Yne8=6Myf}1qT1RVMt4BXuIm!ZRCa{9k8SavPHFh8-xdXzZdb{W6Pn>v9x`m|^XSbAuE -n*tW%8&FFF1QY-O00;mj6qrthmShtW0RRBE0ssIa0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV{dJ -6VRSBVd7Y85P6IIvhW9*$CH7m`kQkB5f~uDfY96bN;Vr|I$|_#0xEyc9UBdsi6P6wwok1c!fCzX9d;ELAP+w?@;rD -I(wBZc#u|(8Q~FX3Xc4zMK5;1nTUC25jG!CO9KQH0000803{TdPTIDN+J+AR0D?6D044wc0B~t=FJE? -LZe(wAFJob2Xk}w>Zgg^QY%gPPZgg^QY;0w6E^v9ZTI+M$xDo%ZzXGKvW2%v8#ZKL;XMES3lgxOUTyB -zF?}O{pP$VSb%vTA}wyx9vy}Ni3;6qk&SIs2m1K7nru>0EugCLlE-cqs^qRQCnl*HMlteM#6oK$5kXi -C;)O&U(g13V=){dYsT;L#+2nJmXKBr7)?R&2~|P0dvjXS7J;+T074)5*Fnb3*f&Wl4rX%4M<)PR*+X!1sY -?I3m{x+q0tg^?Gi_vMlmOe~k7)fK1NdZy-G{!kWFUoWYMH~jK*-M|y; -MztQoMJyV=Ov;pU`ACw}i#1fWYhEgXxF+kKT6O+N#nOydcmA+;9Wctd0n)8w57LfT8C|-oMgs0FkO)r -~iy1jxoXyA?UY#voOqJ&TE=`nEaHh0XWm9KGS?6Jr@fm5|SnK=;c%`-;dhkyl-=Wcxn!@%6|K{AT%;uUE{J|DSrOhi -mb;yzCGdfr5AFoU)YG;0o|E9>*t58J -{*kdWJxkK%)C?ASt%4$^Kz1(vD@$7gclQIV}MOgw*M#VZR>&?klk(@_F}iA28B3lTRI~d7NY&-z?r_e04#wGIzyG!lo+L}{Uf@Ie3c*SkNR7<3C -k8YBrA#&REBi7Crc-a%z)I069ZndIftz(&gc~jQhy#QK!n0uNMRo>gVpq*%Faa_tkm&B!8+&={&80FwkbltKo4PLRK4FC^qm-_ -iO&DBnAckN_Z3@YOc=l?AxWGIzYwxEADoyJhq%qme$kbn%vbQ4`h;5;ZLlB4!=xa!cV^o1csBH4W+N3 -X$R^@e((#H{H>J^R4WPYC3M@Qi=c+a@R)v)S@Du4HE5|E%{mc8`s*zsYbqW=?@ut)U6qzbMJ8F5A>YP -Sl=_6(99Mo7s2`-M9|FtBrE3Z>yu(_WHR{?aB?71EbFuj^c@?|eXMuRkhEu>t##x2h6~Lv$4;K)DQxN -DN#SSI$TY*YyJ+yzY8rXpRQ?Sg0VuwngcP9rOYtxNfcMnd|snS>DN=U!l?iZ#~DemUufqNerVQlwnvJ -oZ&*h@1fKtWh3PFmGz=3iWt<(s0+YuGP@Hxiei0L{_^BFc(daeW!P -o?Ezd1VibRg8k6M4K8A2|NfuwaESSBNMB!%fRZBY}hOWf>9ILH+G^gwUv#?ap9a2I@UpfND!i2?Y^??|bkFtoee&guU9*USDQ*+oL`hs=gn-J>)Rn2Tb9 -iN>Xp2y&U*eP-H=Q}_@6}^SU{IKcxGq3z8o6j$+BK*eW(}gzbf(`j%&>q750mp++Grc!(>8oSnL9HRK -ysGnG-UwavRy=e1{IXWv2aKf6y`uFE6_R0rf$OzMqU|b3<@KwlSGo_&U}D+HSWs<9BW4cTb)a1m4nHT -6l%5t5YPx8#7@;f1Xo&ZC!3^>E}`K4ZX0+8fmgg4I;T3UqRnQdT>7SV869_M@bc9Wt_YsP`F -U7aVAm0Ae+~0i+o+N=(3*My^w!3M18y!2J#u@!ccm8*sRO3OrV+0J&*n1~8YrFYn>fYBAddt&xs4ZLa7@tp`u9dt!pKK8p=9- -uJ$M=2Zr3^v3hBDDbIao((rbxxv1ZzJ9Y6*pE%Uaja<=UclwSgdR;sgM+40Cl$*258>KfL~MK|VtWqZo(4%8)UeTsFkO5n`ctKW{PtTRzL -sw6PbJ@CPc-*y^nH7uCy+fHF|cJ`LC%xNWnTnL>ahEhlcBgDGEL7o -@r;M5~ySJA+<4C6nRV)$2vawgn97O$53Vb~D-O2OOeoE21|tb+13;M*t5jIAkJAE+<-xfd0yK@W%=Z} -QkfjKqL>#eWn+X$k!8J-7xv(t%ogcF9{qfmjL>2|{LV?_tLC%EsL}#)oMnFq~VvYc%LDH>jhGz*67%3iNTZ5S$7>&B^K^}Xcv-T7Gn7&Mz^pqE -Oa=$Ny?VJwD0dJQIP3h&^(Y^qXF4JEd4JZ>gdhg^Tn5Wj|&2qED^UIdmo{juUvVpMYGErOEEbWOLp{s -9=zSkPEDj{i6Hk+-hp8-RD>yqAA*?o3g2YCcaa|WyrB<2XbEppeueU0 -TR$K^GVWc_R^2lF?WeRRFF$-+3CC^%c_Vd4OJ2gI{5AKrITlRSHUVRI(Q(c^h0xE#$c+144k`w*cufC -nEQukZkCbMamE`#F=Ruk9Kvww8L^(i>9)@yi@BKRWy;nJD&a3;^b9LHoQZt)6ZKP_w+44vu-;ht1{h<9j1@ -;{a%?5S8R_HLqPkziXA9nrbMptTM9D*LYI$62e}-Pw-^r1=Q0=MwcOGQg`F2&E9Ojmw<#s|EPK -$ibs)KQAeuulP{+l_meAba3x^!j?>W@(da+Epx~|q?W_aSBsMAlUpA_cdT*91BPe92DX_hX6N|wX{mLX-Oq`20BoEVJ>%w@jF&w7e{%cc3HQ+0UEwN -<(eG8>%EjG_=%P_lhWE6!!=27Qg^^jm&$F#cnVoXgwx(+R=&0nzNe!uS&;ioE9m98?T{zA_*95GPg;evmj;DLP1@#r{y-&$k-ZH!-%p|4290>k9NeX8m-r@O -I~&p`r}>>YnH% -zE%JZSu;2haC*!2N3*uJLpxay8U+N#KjI9)Lb79sM=S3Oa(%zGrvy8z{#(%4`@E4@S7UlOg+>AA68c- -TikJhM=I*PcE8rXTuIaY%CP5+-sa_i1ale7MP$1^4jGwnRA*FgJ12J@W0FHH%L6nLudpR8I~(qK+EKf -Rjy82u{7DBqG9eXN3)}LvO}KB#q6f5}Jgoe-dsaDaJ3JebD$wWENX+5Azr#Ja1@QL=ZUg*v${Ewcvz? -Q~_UmStJ#rcs9PQ|SjSDY2M08sSN6VJE-@xnj`S#mU+olg0Y^U#lk1IT@l9>9S~mZ26b2io(ox)1+e&pN)R7?qm6@u+P_5?B6 -(DA}PSdV}pZF1Tq=aXqKb8HzI#u$W6D;3Rh%k<=j9Dd~M3tEb7AB$(Xo1{gXDo|H&YaUaUW++Co8zbz46#g${43s^sd(9h@NTc%<~5JientnIYBnjru++BHuS6iXvGxsZtnsnyRG0>3H -KMDddNruF3Cez;C%dIg*@nw%N)vEIgme@RT^w=*6Y6tMHuPIYo1G|6`IhDHy-4Z2NW2s27?FB~n)Pqf -d$@aW8O$cQbO|k0;nn!8dNGwbYrQIS>1jzx`KE4^T@31QY-O00;mj6qru)(f%6x0{{T!2><{m0001RX>c!Jc4cm4 -Z*nhVVPj}zV{dMBa&K%eW@&6?cXDBHaAk5XaCyB}!EWO=5WV{=2F_t^AeDTOX4BZ6Zk?~}@-iJg#923W%Ulxmnwkk$?Qr1>V@1Kq3&q4 -J)hn26svQF!V1>v<^F7y9S9U|#4hL8$=a5X7vdK$y&&>G#+!5}Iz6Tfmerq;L}1y(f~mprKqRSiwU;h -q!_4lO%MtxD8@0hvhJ`pAe+BNo509ugy!K2gQ@sl^%2VA{LHE=BUqh%=%Wi~RHv2r8vuDquv=X6l1~G -e`hBz#x>t!5)QYW-wNBI{rtS35ifc#QBc9ibEV3D60KX*%L(69^k98T$4q;g4YLb%o|129W$KsNzy8< -O%2Yd=SZRBFfQkhPH1cnAHIi({KEWK5i)h(yXB)G;C=6@)S%y{I`+$Qq -SpwvTkM59U=Ro`ZnfpWpulAnOm2toM6C82TJPVSuh3IO7CmauVfcFpuZJpF;3qv?^>_dyeiyf-_A7!| -aimynve>%4;xjGZf<*=^dlj0agw0)3#Xb8mAPpZSrUbLITxu~l`~fiCL+%zXcjJ&w<-1UVY8{dj -zy0-^sew>xB0k%CxPxXZ}<%cjS+o`MVmT%r;_i!%g!{7fukqP?3fda>n5z0ris@$JqCO6FVc+k{zHm8`poooh+-mXq*fY -Dho{hcSImd$<;Rx?daP?~kB;Hs-A-&H#wd#7R@rA|BhS>#Ja1Jr&F!RLGrf7Zx-63doy()LTCZ`;!=qYZXOc&0;b6qpV()B&d>PDua6!l_go=89lm(5g+Qo4W@>o3mmMtvjIKZ{|i%M~;Sg --f<^>NNR&eCb2fm`csUdf6k{|jFccf6zW?KK0!q#?L0YqnT566NcHK54O9avhzVM+GFvJ^?dQUbX#uM(@s`h+RDRO*K3v3Wq9G?9FD+$Tnp0ZL%^b1$(i*# -zPXyw^?U9ajW;vN$)JKb^Ji2Im)E?%MR^u~MI6lVnYLT{n3Wz6ZmC*+318gun&2G`!CF(De^A7+iTSs -Q{1otU?9tQjzdYlL$nV+JHyHUx1{&B7ZeP5&EH0J)pVIyfP)h>@6aWAK2mmD%m`;=>ZC001 -Tc003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasl~-GD+cp$__pjho7?nL+vSX*kjO -C$Q)1^SuZmol2C<=j=sF)2!Y9tlME%M)YNRhIoBu?W8S(kJD4$t{WT9iU+lwwABhGmb|&zcsb*UP0S5 -GgQaQKczU$bHR)EU?b7CL>g0sYvHG(chi2c`~-Vrhgt;4;f(^_j=2>=cmb=^Cdb#K_8D$KSTW$>i>)S -XN&&%qW=l~b-oOGyZa`Es{0CnQ^3@X{WVAAoS2hM&+^qQG2JWl96yQ7=Y1~VWrR?SdlYQNvbqWL$UfsQe(A_7~F2K-aeN=~RK2!t@t5njJd9T+5>YT1gV+3d4Dy0j;wTgPp+a -<_(?}#c?N^wmyk|8Yw!iO1$wjvVOkl)c9twkl_iDl8f7`a+KpH3%ejDnAQ7CvdHTJU@aepT9q -TVtmV*5Ja5S~#1aoF3Xxy+)XCA)AeVxd-k056ja90Bj;S`*88@HQ>3yTWBnvvMM7;3Fwv2?LunN=+{3 -*FFDP(5CPWhFg94#CC<=lTNj*BDDMbyp*vPU09+%HTe+slP0$Ar{c*bk4wog{K8#n5YvzH4t~8=i2ku -632Nlh`x{Fo(+ft>K1V!`S#nzvad<=`<0=R04*}ZXVC%p;TV4euEfFOUaPlzI5 -^0?sb-pd;N&&l{%MLGwkC@M-}WSF~=s?ZcB-xijlk+!;d1-?nt*n4uf?5ggUjKeZ;J -_Cy$<#(WJgXso(Loi`i{7Yb72VdJo^NF3bS)-wz5b{+g(}80UKlj6-x%;ws@paI)*EsXhe|0R=VGH;9 -0cG2u<5X}h1+ylCvRc8cyVGY*rK$O8ZTFSU;_;#nhcK;&L$LN=MU+;CwSY08fRvkYZg{yQl8Wq}5+@1 -eR40im?r?au*(gl?S4q>7dPO -p&Q*7(?4w^l0U_Xcb42bry#{rChnpGQa0kyQfj258cXnWn{%Fjj)&6(jYQ#L?j!2sRft5T_C-6A-xJK -D{>4*jGimlTj22YanE)zB^YL0nts2_ -ZW3Wk9+XU7ku9!|>#pp`ee)!R>o1@8O1eck)%+2M+2+hp9*a5n{G5CYQE3_umwqHk!cG!G7Qn|#bh#QA#jh0-%s}A -el+_Xfw|-4U6Y3x%)+L$%q?{OI9#8Rqszj+^^`U^NL+h;?EIMO_5KG?O9KQH0000803{TdPPkDG57`I -+04f^*03`qb0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%giZKk;ucko~oj#YSkFnGR?oeTn -YCtp}MC}TFLJDw^D3Zt6ifis70M^4qO(h0spnq_chBOX5X`h|F`AZ=uDfY%}v{I-R*ger@oh(OD&8z@ -HZki{(vl3Rn1Jd@L$*0KmUj8TH)dp(esBA{~G?;Y|N?VtJSLDJJ@W$z1$Q$R|Vf}PloGwn_R5`e+|cT -rPngUWo}ix&A7A=5!1O4QIae`q1>?^1IBbT7OWI`{SJm?(1gHS-~3(>m@tJ-LlLtOIAIC*jZo@8VGxUrl0+??oUDYu_E@W=1L -ka&H5cHH4gyk_X0lrbp7@UzW@I3pwY=-_K1)F6$k*dJ%jgW6)0JrpycczO7P34FJsphY3kiX`ox1HqyivMA9G*ZXD3@0Jb(y(hF>G)(FoSOn<1#t2>1a -gk(P~lH>6BP338W>mi3{z+0_`SLS;Wv3cmj-CLx2c>_YO|MECe`Nr!cgJO$$pxHasZ2wNs|a)Jn>56ufYrF2rt!`(%y*z|E1P1fgt}vFy{4&#-K&p^3ChvkuA#W(G7oq)K70j;LMJ8)b%7D -6T1eAEY`?1k2!^YH}Z@Xh%G%6Y(g}PusaW) -XORF&@v|T)i9@Yf>_J}|Y+GH#cy;)j2t}5Z4@t5)5KUTw25F@W~qirxiwGA9ta{_PCQ83(~9q?OpOHn -aEVM+8KLZ5Ucc3dHGncziGey7X(GcsM5!o*P;jonH9cWddiG2Ye8P=4h)@PvDnSliYMvEsgO4y8x -rT~hQ!M$|oe62>SYJ1I{%ta}UZrBito5ReL9g`!ehG^&ndQjO4n%~=g7<>BoeF+co0DZswX+amT#?=A --PmqUl`w$caKoEQNF+ewdY_tvNaUvblIXaOcP)A|*{Xb1}n#3=;-4i4I@li@vP2ttxBmOz -(wSkZ1gSSnini&iNSOwcaR9KTmh}qScEFYi20Lmj1E^ZLjuz}tz##PviI9 -U8Fb6oRve4uReRFkj3xD(SMPtdm?xet1V|P8N*FSwL*9k7$YKv=CYdR<4mJh2j4*tKl@7mh;=H;u~ep -c{f$0!bj#>pqQg^oa-$!xen#j(;BmOto|3qUW=;|}*}gIUiE%`!IRqm4~~&EfYyq6`5mW@1E2l6ag9t -7$y^fEWThr=^&9G4xu!nT~wi#M@(G*UH?`XFNIutthX`asu|L#eSdMOKlppu?#AqUF+hNB1U>Nu_(>! -hS%7f_5J5G<860Z1UVl?(ML?G-Dy@xu)!z4(CK+!ZJ2Eyp>0YWk1u+ZaANgMViq0|QcTTr%wd#-`XF@ -c+4&h}9iHph6!k{!E6$`QW9Cc}rF5AT02Muh2p^ADx4u4+Uo_Gf!_LyjkkEZ`2ooqew{_6%x8=f7bc! -`Id5*~5$|3nlijScQyU?AA=1hwg4}iR6{hOg|rrtD<%Gh;LV_8wNXG4_lyK`g)J@-U-X@`!LLDO0V0>Wz`_kTMAW5Pjq9}p&8lrsP$_HLdXt3LE1)XmXq -<&JQzFO?u(KMoV^ej20Hkmf2NWW -(~v|DxG3pH5*$$+R)I-5fn(kF3)%&7H_dp66sx+x2)9T%YkjJ-tvb-~GXdK%QQ9g#vBAQ)JeUj4@T@a -Cbh+`ft?lKRy$5J%Hllf)H#?T|Kk1zQdd%HvC9_s6q&d55ZHFdeUE=xijZq5c=krhsTC%Pref?}(MkB -In#J!MI8u>lTPc9f-N8@6p8$Y`l+YOKbijXcus1DIZMNjH9)}l8lK#*}Ir<;cRNzQ9aCqJjeoCKf{#WJ6#j`~ArnPrped+1SFY2R -lOX}_?>0(lAL46x8wl`j+5A|6A7XOS*A0IloaPBb{62FF -Gi2mCzaU4AiLbYuNMd1-H=HF3nt@1p+`3H}dIO9KQH0000803{TdP86=8UFQG*0G|Q?03 -!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrZIQjMgD?z*_dG?^2_#hZN(@)MbEoboH -<%JB5M-OBPk(9nNeE@Z_W4ds4lTM~UR9$;29%~B9kRSD-ND@rjL!Znl4w1sKgx#v8qFRRLNw4GY?+Yr -LqJsc${VYP8zAayVD+NviPJhIK%=aA14d{E6B=TpWBanj0@m6pqDWfra+>>%>d!*m19z_3wEQN5F01w -JFkCOo&j-)ov7Zg!VvCHaWr=8CT^!pro2U*z6jLaJ90J>`=2t487S@920O9KQH0000803{TdP8q+rFgE}I09F7104o3h0B~t=FJE?LZe(wAFJob2Xk -}w>Zgg^QY%gPBV`yb_FJE72ZfSI1UoLQYODoFHRnSYz%t?(;PE5{7RmjXO$S*2Ua07}sg9Q|n74q^66 -S>mBDvMH6GK*1_27!c7)dB!eO9KQH0000803{TdPV&hS!4U=k08tPC04)Fj0B~t=FJE?LZe(wAFJob2 -Xk}w>Zgg^QY%gPBV`yb_FJ@_MWnW`qV`ybAaCwziZExE)5dQ98!MPtMcZL#lTL%OPup~`@0I3b6+0vp -Y1X?;ptR+$)sW=|`<9A0=Z&uQ7{$hzo-pg~(9Z#aFmA0(lrYOZ`Cj6^1vs|l+S$MKL&1)9cGsr;NnHR -=!%F_Z`**Q0GK?|K!Nvl;^f^N4s@kO^hn_0a-nKArbi4s=IUa3ZAms%@5gQpZ~%T~Msx8V1^V)gz_{P -FoS?36{ksZ>F`LaY$XQ|_Z8RjR2AS-%un^^VUZVOX%PW<^qP1`jOv!T3c3fI!6?41k!4|?WI -<;g*G1A0@WkQA>?ht8mdh(J#81zV)c%9teu2(moX2F14y12bOyJO${%jL(58@3Z=$#O1ACUUd|&J^RN -2A=I1JPBisv%K@Rf;NB7dGlJr?zKB+;yxHtLn`vUcYgyZZw!!*Ha?IBkwG!H&MbvM@|qjN@CdF2Wlo} -c=i))6-%ekMtBv}dVp3U_W9rq8nSE6Xxi#cKt>F=Ag`riTB&sI%Z?_aQZe! -V)o{q(XuFK?}#L$0*Tf(uDCIuLJ=w+u=^+Ho1kL2x-&TqcDHsxVpFC$OtF`k_$`m3r*!VBut;?xuy*A -AQB{T6R{Au`aF7gO;os$~zbwm0UWJZO$_4;xcFg*I%5i4WM3OAd4|eT`@IQl;R)M!b+8HLmE(-DO6Kt!+P~ -zkee;vaT_uPs@kOx0m3()ZZYssV43eDgxj!d5r5j|HBGPv+h|GW^30#ikchj@d@&m&dYIKS8RAqa){} -;eQSYzGDay#zJL+}ZCthv7LTZO>N=s#sOxdFMfMCM@o0il`s9n1YAnI-k9IO~dwe`n(XRh7T*nk9C`%}Frz^}zFQTQy`9Bb}Zihl29;aMVI -nZXus9wQP)T7?v#Qx@GoI8hXO$+g=vxW(Ha#wf5tPs3ahjfC`@&*!7H)%x!8gk2-6b%tXFmI^^cb=wPBSi+xhH?^s-L>Ky_;1v1Efj79+?P@iRwj4UUcqYjMC?X&IAa#H=9$P(N*P%;8ejer;c;Rj$ivfEJo2)C@qYe^IYMMBEDe=){RL!-YN -Dsbq(g?;H#P--^X9kcDGpl~i@1QNOgwtVT)#iLv?k8cbUeRkKC9OrtBkOOatcV?XR60iVNuKaFB(d`iq`^ -HP_Zbh?jTd_kTY5{mX*=!an=gFVEa3HMd3lRS6G6PlqLY?Gz5M!u}Mn+QNPS6}i!RMtG9+^J2>2;AdXMG>b&T`tt2)^4)OIjs1Blk3J4FjAO|jsaO9foIyU{^DWNdenf%3X2MYaa^M -Iy&cT2OOwp5UDDM?P_dwl8um&FgA}XX#n~U_|@a?K1>^3CRQaBe?oXfxUh6MreQ>)1 -9-RGdR}%PhW;amj<5|5RIZDV@UPpO*rVh6P^Q4o9o>u^&U^0t)T(#?2oU0R@R{yE^Aq%oeDfiI0-)8{;09XS604@Lk0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPBV`yb -_FLGsMX>(s=VPj}zE^v8ulEH4nAPk1@JcZX&B4s?lq+YhmPCHE688L7=Gzt+WZTI#wNlH?w<&@a|ets -MGDIP(oe#~P+rNAABm@-&*a^zwVqAvwjXUy)1HNE`L*})A`oiNy#q|xRFO$<3jKmS~rS55d<0zwGmH4 -%KGbu@*VnrvT$06rFbw&jA$N;QPO?|@YUr(roIC`%0XQ)=Z7m>1+1|29NIZZfQ(EQO_HMQMw6aMFIn4 -)8L#gtY&N0XKTChY<5MyT)(aNt!QN#M)Ygp754ggt(vU*K?h;9J2}W+_aBx!OMJ)3%OYYWR6*TMdd{- -HEmm6)Q&BBM(@sRRbPs3XJtIWX4XQvwL0)_i+@l{0|X -QR000O8B@~!W5m;ebHUIzsGynhq9{>OVaA|NaUv_0~WN&gWV`Xx5X=Z6JUtei%X>?y-E^v8EE6UGR&` -ZuQN>#|rEyyn_Q7F$yElTC$ijOZ#Eh^5;&x?;&uvJhpGBC8%GceXOuvFp#08mQ<1QY-O00;mj6qrs4? --cJd0000r0000V0001RX>c!Jc4cm4Z*nhVWpZ?BW@#^9Uu|J&ZeL$6aCu8B%Fk6O$Slx{FH6l!$uH7N -PAw|QOv_Zr%q_?-Dp4rUNG(d`Dk#d#E71V6H8eH308mQ<1QY-O00;mj6qru^7Y3&2RssNKR|Eha0001 -RX>c!Jc4cm4Z*nhVWpZ?BW@#^DVPj=-bS`jZZOpw{vzy4iC;HB(aCE<%4&AfGJSgHkFbhc_ftX)zFb@ -I^%<$=NqUGhXUG}bB``nK13Ol?iCsGLVH~jyZ3;Lg5l(y}YX7`2H{!6YNVNhL*?Eb}gJi0GD`{n$7;e -GheHu!S3{_ATk^gq8``>;%+?%(Zx3c{q?efb}M?)pF0!IP#4Ks8Qd1O;O#MdJiR!4yd{FifB@4%(;!@ -kJ``S<*b4;tnQ)B|Dth5$Fyfb}+LekR5~W5@Z)rJ0jj;)Q(AaA+n>X9m?$JV7<(qMSdIu)Q8cIA$N4R -i}78G@0fT;qB}I$1@w*yb~Lg}KdykRmkRJ567Ohq$3!3Fp#=Hkh{<~(1m5BBF2Q$UxC8Tys2z^(B4(F -h>xeP7Ly~peb+}-M)4Pz|k@SvuPbHyt5vav>5onq2$Y>o916@EZ1O4avA1BI+_JtP>Q;`&&HN|%+q$- -LKn>^1}XvU5T$7afjW8eRAlGOzxp^t*@9gYuQ$%jZ|by4DUcC;7qq_Q^|Vi8N^a+TL_)+C#(%VnC)u@ -6%e<2FPOc_?X5AH}oq?sX9=PNKk`Kiae=ha3hd#Pm#u#YtXR|D!@R#oLdat(qBPo)dJFO{5Vf&H_uQf -;g!qJ3^|!1)y*Sg`gmN7p`Th6ixiX9zF*3O!jt=RO2>EqbJz9eiSEeAIeMtdCp`8PTVUpfu39~R}FR) -vUj7CIL6lyWne|rIMrxJS$~&@E^@4Hu`I4|!pN@mNA>} -3wk`xhANWuiktGgqj_EK=1+G@X=Bezr;;TK?wy0kjTD}-~9oNgW#LLtv#|^0!9vL)q&HBOcgr*t3&SV ->zdv^aY;iIa;c4=*KEWWB1XGIhu^b=2E+jDiLpAv)1n5~)o*}Z8CecL}F#A(X*aU<>WhKHj^7jhLIZ< -zE%u6U^2)p~oQ=iX(C)Vf{{2fXUSD3(dnkoQIjeuCP&bR@Rii7jl(w -%@T=VG#X+G=|OFp*?KbD8zEfSOa)J}TIH_5y7QybPZ%sN=Jm1NF3fddH7>io@>?M@Bg{eIJC<1X%!8MNMedh-Dl#anpj+znDu& -XOj=~X1FH?Kx$7ay$#G;tSeLalpDXjS8d4c8<$<0`k`B2@Aq)>W@71B*JH0C|msT=;-ctcTm6h(5nJ= -|q}fbk{LPmv^B6_JS$Mr&!MS@vug++8)|*wJkvWo-34%jK5VsCgzlI7DB=k`D5nIpqh%KQvjD@-;Qr7 -l;i-yVJ+`nG(;Fe7hwaxjd(7@_OnxACgu=(BnAd`@F_qljKcR%-svmYBtVXyH*fG!tuouhswZQ9zzk2 -@e<>O+l#{tID_5xDn}Bf)i9>D)f+NOnQlmU7k96^QHEKliqKxQ(x<`=(p5NM*{tw6=J=IcY{l|$y!ua -^{jdM}SkgpI`167W{SLK$fExfbzd)q_{9>TL$E|;TfZrq6yTxzei=+ -#*J;CEa20E{u0L048`Br7If5Fev;bd{M+Mfpihp&*eq -AKVDYMJCO;j1qJe7%l;f-eF0Y9fPw316llg4F^4fG>VhT?3s4ua;U1t?psLeOvPt9?q;%nZ$)PKB0~O -4xJzXPv2FlKU9Lcai2$;DtG{uL_`%bfK2S@tYxM6E`z=mmYk|y*>V4gJX8D)VSWOb>~!U>ptGrh+w$= -da`pJbNBCN~)&W%fsSez)tMcu>KwobR2X2f2py|R2pn?A2!Ot9f3@-!uJho8E)>IHRXl@x;64*N{y4}};WOYKTsv -s9l5Gv)D9)aG+%w+@Eo555*3>D{cv`{^Jb4dt}N5YM>&a=E__;dh5ehcT -m{7x<`U?*USdr^l1YHsJGT2i&WIy#YtUV>qGO9P-2+`uemj>(h3si7Muqd3_H~t}>r$&`4m@_f@Z|C= -0BUf!74jV%ML>WRxE=gjF?M7g&mMwR|dn1jp~OvGyc0pQcBJ2L^TKj=iX#Ubx&s2YBm@VHW9Fu?UBTC -X0~{YcVvf_R09Pw7-U2f35{qK1ki`rrfCdslu&SwrpO!e -=-pk+-}f*w7nhe5>ZzL&jv<_qyL}FZEA;3#SiuNv#@!+#V!QHO;-|oX?b}`ALi-}cL~rafA}8}rztsr -&AXALIiN};zHE)U`HXVd8ybp$q5Jo9&_K$wgHF#PQP|9nyI(LYu|{5GK3^lkS=OFHl}-M0S`{ -jVhYgnq(}25_!xId;xB!he0kif`6meezj>aYNWXSz|IImmPX|z#Bx#&vNR(o53dIl@C2*9Y -XbMJXm?23}h9kcu2T{E0L4fK3wTj0GUnSuO+5`QG18@b35}@o`^TNz8$pIh)XuN~tw@Su#c(@~(9Rmi -7cOigyVi#dM3`kORM-V#-2vB&(gsTRP$lq&QKq~+#0b~UzXCP65LQaFVGn($ua4kgPRoDU<8-=@oSpO -HuSU?@9c&#OXs3vwK@un2fS`MfK749e$e4M``2co=!-Kg-Q&WCB{A07))^s(FD#C$p?jQg`pr6O^2;2?Q)zhydV&#_$9furT%-vRI+E_RJah#j6#yuYnrMD>px+1< -Q%U9*SXeEoOrZ=mLMQCOfeBQwI{z3np8~DdZ_&0ChdjFvR&JBEj3;&%PxZXeL;|BgnyZ$NbQhV|)o#= -$4gMCehkcOR^jaoGor;O&7MUAbi-}DBN=%Vr>(a}YWDr#9LTrV39QBJ`s6uv@4wB+-qKs)GIOa4=iYE -uJj}lERcN;}}w)10z -C*St&H7RM){``t*S#fwWJwWcbj97a>m)8~xh7+j=L7`6OfpDKCOb~^}IFj$m|S0g(T`F+lin9RHF -0QMBbR*Z+5I`lYx>kLLN0FX8;9Nz#9O`Hu=b6kYqJDuVDI|LYG5@cnqFwMi2H#7h1zoZcrH`M&njBz4 -i(U*5xClc;Z!m23=2^OKLx;3P~kC=UOMTO`S9h+}W(8$(z70ibw7?h-&ah+RspPI`#%F#Ij5 -E+_T4GBP40DB0cb=vXU<)E+~4X@q<9IehfU=?lvq(5c{P=GwrKic@i$4klZE!sMR+1115g*?qh}AQ7hbVQm9!{pbu}aRO*ReL~^!_H#R}itfe}^6R -SfT;my{c&58H9LUTZxCWu{*{ljWel)*PhFLB3Nn5N@Go=r+-efW8T_}i%Y90V*kYON?Mlt*9&X1k+!{ --+yRu%A%8#w9f9m1ef{o~Y5u%=rG{l2;)15SZ5bHwAB2S7Ti?fO)(4*=dBnB}5?dj)xp(jQH+QhD|3$ -ZB+y)u$qeVA{9rr*A1UKRQ>wATEFfeV8xoq`rP`_*azRC@7;QWY6_M;*>vWW$`N*(d=5!XU8`%H5PJu -8ArM8U!}rEwp8mc=m-zSFm^}Nqq=M#R6Z5sy2>qjn?FXaGmi|C^!vcm{PRhEBDAWC_U*PhaC!o -@p8PCb6bGyOiQS64pv}$GVsGr8fvck&^L)J&?11E065A1W8!^fa>T8o5SGlr#7g8&3xI_i%XG^&~q4+ -hD(89X;+lYS*US0b0R=!iyBs)BQN^b4!bEtpsE&RpcNNt;tYc9_Hbh;e%3vnV1z3mKT$*kG-8m6rcRp -_rChq+aFDkfF*WbL&5t^vVJKZMw -CX9&q1G|MK_Ye!;kqKQI?Fv^Wz>bgZ^S^KPK=#gIoOcdp(_r(UX*HD=Lh!Y^e+1=BT{&?J)sYw5(z@} -9GkT}kx3A16%+a3F{8MAdsMMW_VA747bdB5ZGNDeI=WwGbBj-Pih+l9dO#K(uvvcgHVwey3TEht=$YI -yDn(JLa$`4>+z3oGU^y+6NYw7znyT}sSS77zl3ofeF5-&(Cgj*E$WL~UaxjU|Ay;ofhNq`D<6&gL -1lXey?e;T2Yu(FmP!7Y3UMp?*u36q@<-bTkjhD4ZM`Jj^62zm~)qQsec??$3cBvdAC+5q10gIKC2&4- -c24-BBAT^z;+2bel41+?wCZ^d_Q{E0f$cNtHY-r+5Wh4o`t6(kMIdT8k!O2xp39hnHb1Hc%>&LEKmVO -||K4u?*i9|8>H_1yxtn4*-z-945_&Iq>%F&)?Mn`2M5%Cr)tRU0T^#OEdL1| -l);Ix${|2QIaJjen5CD`XSK%MN;|~b>whsUS2;SyEuwFQQ$I(MR6`v_{WDDb6cXo9Mb -!slsX*u{?1%aVZ)e4O&IALw2y~~F=~z|x?!o%Ni;q}?%HghHu9DhX!veS_c%v#kTu3k#ed~BdvKwOgd=en^8gufSfQrOu^9&w~UALlyowN36OD7f=>ht65Q)W^abNVw1*S8^#ENbxaNzqXu -p@0FNQqmoX@-YbwGyWgWtX6VP%Skz}xUa_hi``Xfu4@*@a(~DkCf?vkPX13K;oVUEp*kg -3zFC%w4a%~^r@f|F*PYfB#woj#pAs!TwIkDsG+Cy$FY`T{xZBJ&*AvYe8ZeA^4kf(FWZtTRkp&}>4St -9$vVo4&&1tQ%}ZWn|L;1T`|#Sw#9H*A@Gw(U)1OA$xhoUO -%6corfv-&c$apZ|%Llvx5X?mRdv^@_w8z#g23F@KK|;@j%ou^FNDmFA%sHxZ_RKJ-$(-V7#7SM3HbZc -{)@WifD8%G9Q=u}QA1d#u8F_SqMbCL$i#)aY29pMXqmllm9z0am#cjJBwar=eFwxp}n3GLVd0VdSD8W -=iAZ`{b@|_vClON?ON9189ZQaerH{?>FS-!jES8ch8NN}5yyx2bY28P7v9ecolhAdOU_-N8aMUwKA@; -nfLQyZr+MaIx+1CK&(M83h6L749|Ny$_?TS~q_xAs)vQ=rwQ!oP6b!;+gWCd5Vydc9fjvD!Dfx}bMo- -y&OuOuUxa8~n(*VHHzG((ly?^{)tzq2e1l=IXD3 -2zeF?`UHxW&7(fI9B*d|GJd$3)2aE@BiDcH1fD#2LMucnC8WaZ&=-=s1ARp5;5eukZ48S3}4wR<56kb -In09hp6(eZkv_`@ZCN7u<@_0WMrO@dV`BLKp}9SzzrtJDQ>3*;;c20{N)cWQ6lNq!<4_e(EJ;D(>j%m -iR&LEno|-7#*TtGjL~)1hQ<-=v}?-TZH^tBuF9J%<1uAVo4Pi|5Y1YhVB;nop?vigcVW8=uG~C3~ZaY -VdBZxm(u{q=UYLx>ZB1GH5vir~^p%bJ-X!KO&t4TN5M+?DZSe!QW3);?=7+9@x(aI`YfeKwvtSEwPyi -Bx4LDVzB%KgWug3!_8p;m%ZnV@6h{-g3#ZB!BdLK<)x-GRy>*a%&dkE+EY_2&?vGg&gjySp=h4nCts< -le@+MMMc+2CAou6Xvavf$YMg4WE$6|HSGNgIPnUsu^|jTOtlO7BF9pbGx9Mmu+lTrj;JGby`+S$(k-_ -i&lfAHH>jlq5QZ`9WN-s-WT&TX00~em_$iGHWsOcWt>_q~`Io#u4=lT&`J@0nx)K;X+*YdpNTA41-Z5 -}uq3V}~96u{;1A*YDGh0rm9=TP&V^U@M$JE0 -L0QHaN#{0>HzCN0qUW&EK>z^bo{@oL3ONRb^3v@w_Q-X$5q@}Tp&x|ki4Sqbs>a -SM@oeL8&tt6nMTB|=k;S*fne@G~_*F>>UQG3^?o4~gQ#7N!+~!M?(oEr*6V5u%kO{U*dP(;6LGhcyWT -RtVIyBu8#-tscj+r)QPmEh*Bp`AedCSndvVk33-KWOgy&sNP%ZNuf_q9=!6Y{Qm$Tcs`Bi5*vbAif>g(5uL+Ic&j -xdM*#O|V4S`ToFrc_XW}ayjjn{bY!X%1@tOh7pev5A3?%)XSPrqTW^qWpbGNZI^P0xjoV -OUr+30O3<6qeY_yG_BoLMDv%KU~}Q129Oz!?B}z|%DWE+SVJ5yWds9AGDKveqWlnz9GvHx;c+BYD#dA -hbc>)s-jLG(jNO(Qwu3fO1ga6D2!5`b%nYTT{WY`kPoboKClYV`;a-kJt>^wmL~AYkgv~V109EzeRXg --}hV4cK@Tz4gKMBt6AWJzYb9XiZOz}IathY->hyROMOrWq;2{&S$ADE9q7ZlU1@~(opn2ASJ3!Wik-^ -0pCEtxqyAgAUj?nc_U~-%ue=3SO>x#1aFJ4l)#}Y#zLi0m`7Ru@ko^e(Y*RJ7QDQ$40Qtk-{u<<0fxL -&b@hf>*I4s7Z-v7~99(05=6}eiz+1p@t-s(v6T#;Nkp!c0Ma&3c3>&JL{@%H{_RbbKYtp9J{%$geZwl -Y^JIsDP!Tk<`?AUJURr-w@5U#16i>ob%NC*~i72>NSA6xiKO<2S9}9cxCx2tz&Fkwmo`AzIP{(t51jJ -|A33ium!eV4~>PryHEejTo41Xp9F(Y1R8y_1cAHdMv}*jiML{6&{@9F~uSLRI!nnN;4dttN97w{%Cu- -8yd_Vf%##Z-G)PBQi-YcdM2@3-g}Ac8Q@R}drLYn(6Oomg|OU{=p=iT5E2Jg-9x##9#ctyL4V$1>cPM^D%sTv>sdkfcj;x>mRTWqH_5TtuG~3GL4GZHqScAXHWqJ;~(0(J>c}Gp*)&_!6LM`;8DmEqFznzn4?ke5 -Av(;z3{wC}ZjO!}8TSKtJbT>D=2}LgE&Qp$BX>? -z;i==4kxj-jDz~c^SxGx{&4Kj$00N@I++y6uoh0pQ^owL4sM$7yfk5pB?E~~cJ?X>{%0w{?;k9ijRM7 -9*wIE;AbG~07#?d4Gh8e^0)!yeu-(t)by<@L7fyYB6i)d+H9jp-SevY(Ot?_)1`tU8jy?S-C8MaW;lh -XAS>)D0ByW-0_RkT!_(^XFdt&=Yo);g1S8;9Iq_fje|;AIf_MB&9lj;n|Ecj0L;%Ne>X#%SrPd6&AY7x{K#c=Ek0&dbQ`9@T -KHb5@4tpo01NcmdUpwZ>3d8`N1AOfPusCE^As+xJCw4Fp_{jP*0RDhlli(S0wYX`(F3{hQ05A$otnM} -%?@(f;AW^*f?lHFd@dWv%0`S{F2Q-CVv+KY|2;K%dpdl2qy8jfqc2Dp%q8$>eX^y>91F_&Q9dmnKtIP -S51PE+tIKRx36O}(<9P|^&?R|&&6yP5q_tPe-@9IByW4(p;*Ti{c)J$bk1^v6k`Jc*4j{n~2fW9W1IV -z`rIvtvU+QX-w`bq{umAieCf$R76&}Xvzd(YS32+yMJ=y{94Knxd^a^-IvhNeTIyhUM*-{LF%h;wyw% -!MwyJk6`P=an*Wc&0vIYld@+)7>l|To}Kg^e*3s*2tcXFl6WJ;mB^1LmYP5_S`+6`+coeyewGOJpj_| -sq`k@OgYf9($jWNwlF}&6=jnu>FAzF14d!X@Mdi|-PYneYrHfnY71kaEBi=edbI$}RGTVBlY;E-k0y} -x5aRYvIYMl#EnB$4acg5oCO&rCiY>Kas)@EgKf$uio)ViaYl9!D&6%f+z3v3e4cVuc1} -*DR;lJWHj+azgqI+*2J_U&topDrVy-vllY|Re2owj5Ym-~yEUZGBRY_F+n>~UkXdyB_# -;WkGvD`&Ev^@VSrmBgy)S+vDM>G_ImJp0O4H?krw@gZ#kJc~i(w}Z -yWsmmP#=-ArJ?>sZT^(I+!p|MLweCRSbZJV8t5>U!7=#ShZ^c*8ks0%m7}qyP0s^>r7&+Ck-%$U{;Bm2CEdtqt%KA+BSWsWv!kx -vc_F;bVW1lZNsN;(>;9aV<1xTckVX8J>)OlYbjXK1>yh7y_SA*uir~L^cQP-qH^Qsnr?qzZ#%>@UW1t -t`gL9Z5Oc69sG}wT61%1|f0)q3Pi3QF{vmXsRq6g&=*Crud>U_GQ<+OP`ZVUG@9H5%viraV8ttxq_~N -T{Dt_lBD<8@!Ta^>IS4Yo=?0_$)o=wXGoLgGT4Mi7r!8Lir)$E*LR)*)T7u~GAljZM6swgOJeyil_s+4}f~T=Xd#~6MIQK`A8sa%{&$&DyC0uQ{~$vSq|5 -&fl{3wgfPm7o?M|(57VQM50S1?k6l$J6DSAz5VqpbO=#^|g+m4)$2(J8UAJBy9;HK}i@ -QeXCX4rapIKdkc7bzVq3k?~V2!g4o) -NI=x<_a4M8TCBd!?3otEsCDs61M}IZsbq}lu0sBuI|6<>F{vD)4KVW($vZ`Cw6XmA;!C+^1FTMn~HFA -v4Q}y8}!N_mtb6eIILvk8lF(N1k?s{Ej^rp8`EwM!$=ZH!!ZasZX0jGf%lamWXZ>qo@m}TSV7Z@R0dY -ZcFHIS(bDPx(}5+yiUj=q9mi02LFoei76iWDl9(u{bw-{7-k{Oq$#C+bZ)RX_ZvqJx4vz?8Buw(Wvq7$Pm|gf+8cp;L5+wW(vW1%-RVF=Lwii;gp7aKBl -OaT>MU1e9LQ8T0xn0FSvn>jFI}mu&;&ldQ?; -=0-dyZ*#4bq9vAXG5&YS68dk^rC;^>r-bPX`j?am!`FPXkbZAqCs)n@~mTuJ$0^;nZriuW1DTgfgLTKOPI$2tR?YzB^!UB)a -+nfNaso>d*u31cqKS&f|COI{`gt9i({l7z*-rL~6QY -QDGQl`~d{}AOscrPn;vc41Lw;#*OKW6j&4zRxx<-eQ_^!;?cpADcyzdL7z|2StwSWi@)6Zag=N2rbj@2@n+m3vpaAmesc^=|dytq30z#2EtUuqO3eL05EQS%#H4PFkD6e -q6rm!rZn&(0srxXBy4%bLa`+sYY^H`KYn8#%pn0v|kYONpBRbs!}R^=bp!M!tx(^YqF%XvG!Ld&>)t`?klnb?I(%+dNX1Av9b|OLeDQvquD -gDobxIcotZ9OSc(#@UE{{H2c+a9Go-9;2}wI%#?EbL!_FfKuL6m3&`!ppK3Unap=?`e$&;tMlqHaPm6 -lns2m4AdRqaU&7)be_1P(y*Xe=spRNb0j^0<-1N!H-hk??Fn{Qq^y4munD<3AxTwr6#^yBj3dO+V<^# -82!pW_Ce_owjA*USO1BFP~)6_*7~*gmYbkA)=1mbbOzHlv(F#~y?@n90_;rke$d-P`iGGF`+)@GT|o> -0{g08#~EfmA#+05h96uaUff%#9J-$%dIx*CN?dh}B~c4C5xLlsO`^>zJ5v%ykMNRpIcHsiaf;}&I)SOVY%q3JT1; -%|SC0+aC<51T=qHJ8_M4l0=n4Wz0qzwng6DPsa;_|HN8bZb!ea=Tic=@fiO*%t~+M}9!v2t8snK{~2i -yW^>R&28TiN`ms!c>$C+KE!``r%+hXTH!Zhl(XRHp9IX9Ug`j+b=Y&Ip<}e-G*qBYO88!e01%78eEJc -hI7=wvq8J@oIOMar>MbjPkdY$JCC_jXFan!>NCO~je`5-#ESQ)?hvo$pqNE7+zIV!`4(;6&u9BKx{$8 -2hvWHr3U0ZHZWhh9-Dw)i=cAa^XD8M!Mh?zx3HD?-@A+xdWQqeLL`e -%65dWwj@ndB-zuqVKH@kiksIPTv?{7Vte{r{VYP;?J)>cr%RF*<&G2{|Pt$Dn%_IdBY#$z1zSYRK)H1w#9qd#soXaJFFm*d*cumHbs!06f7R7a!bU5T?nnNp(K-@g0$3$jz3ggV+-PI}|xUJpvm)1Ix8|>9 -Cj)yQysXe4R$nclix{2T$P;;&mW}lH|L|;$~tQzdxoCx~N#uQi`s{?(-(q?aHGEpD~?N-NlPu#e2?>* -;DMn^T2EadSJr7Y%SwdQ2HazHPrMqNkz8VNS_IMKIn83d!ibHh)edg#H4M`a-$T2EX2ML#M0Sfva*K2 -Q2@b`boSRtbIDJ<0g>RHD5;MkR|sgdo!tZ~p02qVnT?VM_11{tOS$`f~iZyVCySA)1LYs>e}#vG7AU% -Bq~h@t!45GqaYj2{RqEKB`|cjW{sak58oi$4mD0$fG~46VPY;hnGT{9r%#EY;K#*r>5JLU2a=(N*{1;+?O>~VJ(|68S+4M@Gj7`ne9uW;VY`y(6MB2!xp2(rreuI0~Zb}r6`YaRbZIa|u%)fP~N3iwSTVB~lVEDD=nPMJMwib -v3SdW@T7*mMs93Fl@wmB%F`c~3?H+;xWn>n_s^gWCF1Fpkn@o$+EtNvF+PxD)PEdj?+kcaAaA`-dIGM -f+D7ir?CO1=~LkoBef{pK$zt<7GZE|EEj*xILdHV3Z^o=2w^xuyj4Ik6d@@QRte$0K==%0l&jTDZYkl -kYr6x1iS$K&Bnjvy|Lnbk{|)U_t{}9O8}h!$fx9*(FoufrdHPjM%J-uW=%Vce(RdxYZApeZn&Ol3+BK -?Ypg0k*4Wp&XFuIV@cIKuuLJ{Ja*dL`(=Et!&3attOs)G1!By7-0^#+%L-L&q0o34Mxh60G4DM9?u|2 -=>^eI7DR(O0?X)2q-e*BX{fhel=W -o+lP#1O4-n;5Q%A$7}v=*v+`sXunwV%$wHDZTxJjZxOGp7a)@?0}5)vGl^%4aI#G=0mE{HF<$SA0Bu? -gW`_1Nv^{e{F!Dk}aTrmTfVhGE&)R(%vp4T}P*L-lU?(-Kx+u1{EQft@nhg0>9ZJdplpEAde@{RQuZj -KDzK>BNXjr-R%;xN88xnSusAJI7E0g2nkc%lu6})3IK7RHELvGpfrd*y}W*KySPMXG$yT}>`oHBw@V7 -C&ce%v1;o~FRGQe)bj&HwaqI)+@L&Ocb!qzCK9L*NX4v&Pp^HZq)iJ+5Wa&~_M0W{%Jvn(xbVV4U9YH -hQx|USbXOOg!CO^VszuaSSCi?Rp7MxRHUk$Vti|{dJ6N;a;dfq(aXA$;9G^K-++}Ue%ezZ>unnH=J3} -o8h9?v2JH{#}UPp(SBCDcapICfhiI-d{M;gXB`CeZuwtL=a*yajkO#NP1nqI=45^wzweJ-GWKc+v)yh -h=`vs9hm>VY$4J9`W87qh*C}fVddjN8s^>;`j5d4Sww}>v!#cVEJ#-5CP3I9v>kd_6mL$M+k5}?fu=a -)XP9X#_~Zd{Lt@|;5pF1D=gd|8?ypXb(H938kSn3A3WDgr -91_v;PH2EX8t2(?;8{_{H$?GHKRVa5k7;Xej=UsaNj5b<+=O$h$^V@TYv&LjbErIL9H^zG}*L`SN>5u -PtsNeoEIt*P` -*&6*=yPfMcULCpb7}g!D^r%~WLNR4kox68(!b3SDmvZjQVOo0$GaR~Z%}$yyppLNsifR6CmzmjBfct} -!K-34UEa&({X^bpPno688#vYAaK}w&b{xeQ+wUoMXVpuBRSmK=pxy -XZos$Up=1Vvf%T0brMgU03o)Q*pSycgO}6^czq5mK+qtkXi&EW!xHr01oR84;uA`g3bC}f6)ao6)`kAWzb -H?}EKEI=HKZUzc`j^~|cpra6h3gKKlwOZPSmR0P>WKu=%C$fV9KH9z!aFqlC3gc12@6(hB}&(^5&S)y9y` -XsjzRmh@#%VNda3~BA}%Kv1Z0b`0Cft{PZbbp&+o26Sr{8{gj`R1aIUm1;0G^;9ehtA7E94*E#1F -r1p!%+j^vACx$kg(KYH9DYnsq>{6zucNL(uKB>`lK^(fYQYL4S*C{g@E@ZUgC_K%}L#8Hf3IT!G0h%doCm0!vtu@{2*fmP|H1%+uZ&{1w%%3$ -08l -*+?hmpup%Y)wUb0HAMOv#aPHeO%w6KLn2?6BjA}^_x5_+e{#9*rBdlf7ceHfxD9DZ`vKoOBaSdhupV- -AsU;FNpU{Ri7P`N0+(V% -mi5L!&ek|H`(ksq7{{leT&OenqPE4pbmi92^Bxy7V*2$!qX5XP3OpW6bmqLH-5Ng*MD8iY0$n=!u{~abeJB|1RkJYIK*I##P*t9l#y9sGjqKw&k -LSlk@EAfQZaANXE#V0+kDfDVyPR`@dbE<^zAEZ+eKgL7e$383e_i&@eDlnN$nWX`dOG()W3rc_X2~&! -!{^;4tUdIYBZJC4J)tJ)dYflXJA$vxWdvz|w&aJRrnP})^Tn3{om*ZfMPT~UiI{U2Zc@8fpxLIVMczl -nqG2$s&zfEp+(B``hffZ0N}cC@xjDD7^Nn`OBVZNXr*j1Tyd#(YV2yw5-2EW}rU$uvq_5(*9CXv7Ist -`PTKA1kwt|KG##Q`#cCjqvPfvTy0YEt-$I -kcppF6EFK!Yoj^|JIpy|4zZj5dDL!_|5yuY7O^_dwv>1fuW<2&Y7W -6O-pS;>DvmhTAoV>t2OmJI{5MTS)-?)k+Ky}FCys&+`!wum!=E188Hzi}eN)vKE40ZWZxGDDQ0jqL)8 -6!Nbc~?TSadY>sC)kG`xoF7_Ip=xzxZE;KeiWGN`^jBRhXbl8_*3*- -Ra)~wpVZ>k2GWl-uJf}E+(6Y$;K -S9fupJ>^eifKR6GLuC$!T8@!%hbO?%LEm&Va2fzOI>Rh(@dxh6(y;@R7XF&Jfuekqa)(qT=Q~kGEqOm -{B@C=K|zf`%Q7KVrZhkI@L9)_30m3o$PXg+zaNX#rDVL;S*@m9q+?+m~?{d3kvd>CpGYq{ESKD-|%IUC_Y%Eey;(G*G7_al -hnpA<67Fd0F$irIb2Pg~3EjE^|@yB30}e!z|xD%RVl+5pZbURpm=3v{M$r7eDBfn|Z -^*$E`oT6tz$0Ky1CwwJrX_gQs;ai!p9*y-&+ov-9%Br2C0kJVyif7Nd01!2K>l$9@7ai_YgCE2A0 -jNY3v{Yg+T+u=3G|Jj2=yL@Ry%Mzs1I&i<+Pwv%ACQ0%%A1W{0p+If(xJ<(-*SylM(FN&qvXjH+W|88 --6t4m}3%T&$3Zgl)KE&1ab;M1GWq}Oe)JH38a4a<1i!r|=9ulRhCCkpoMeo;Yyct#yOXyN!^IXLF7Tf -j+>Fx%)5l--u3sE?i`6^~}ZnFaIbGPnz`QfwO-y&8p?)IbciC`25Fd|IEbr<2SO8ZkUvLi0MANH=tI; -w(>{Z*W*DUhw18LZP2;Tfk(VGwmD$hqDaN#~J1ERz*s=Q($7f=ucXvCa5c~S_5^qbDeC?mZjJBb0LcZ -{Yu*9#@)9_>~W1Gi6k`ZE`#$-~1bV2@i!i&sWh4d`o$(Q7%}R{(x($Z`~l)fDuF -4N2Ah<*52vE9mDeq^fLCgEK)XgX5)ko8$577ar=%e+wwNW;4$oUtj}V)#$N#EG5j15mbAv{6SYYNlb* -PUSH<=*qaoRZ3l#UwQ#@vm*gP&eWrk(gFl>0g462V2KuL<_;*`N9Vjfl@k3>IuRuo>Z5&ytT(##>^VZ -`}B`56o1oM(HjP#bm8im9Q>_yDY;`^=8c?A@D7cuEUPQw(;-Acc7b(-91=M^TB719681G%z#gni)yNw -viMU7c>O#fU`j0RX+RPtJES2>Lx)JC!GNm;`~TMj1dTzHU=k`hB37UzAZ=8dycnWIS)qhN;X`OtE@WB -_Z4cJ3PR6YdS_`blnAWw(fe2~?yQe?%TAi>A(_h(&Q6FyUWwH*)jD+*05$DgC1hVX$WLgE-7$kZer*3 -`nNk1$OrF)%4_BG*Qtxlc^}RF9wsrk%zPEq(Sd^uqA4A*!+3DY-+`n1)ODFm3LHM_{`xfHj!5$xOVPu -Hy6s`2FyP6RD@Z!$zigy`1^lM{O1b>^kgnQ7NQadM}O7`O6?&$WWb|K_{z;qY1!QO1Loh2Xb1y_^ZY#}ET_Z(T>o9tlJ5>gE>lBGf((Nxpm4#M?qCX8Dc=z5BZ+vy;R|Aa<}H -5NL-lgS%Sa2jkUQx71nXuDjSd_QApb`555bzrMA9duPD!ZtZt>_N(tH@O$G^b{&q`5rp9v@$yL}Iw2zrwDiWa5<5PKZ9UgX}&niJ(lY?IP-RA1R903FXN ->Qa7tiL;8W!;on3R2hqFpR@_-0F! -G?+viG{xqnBZ?&Qkg_8OU*|(fmtmE`fXlWP>}C)?i{smp!*!6*mFb -0QcYtTZax+hG*lb_5JFtyJ}tkYj5ti_PAAd;1!_1}S=h*C%8hSN(jSsSV@2X~o0m;?l+Gj8IcOpXvW* -Al_`7h_hU5q5BRnX+x`> -Zj(^?NLWsR^g2%g_8A$ByDhk{sRW^`8lD&boVbU(V2E7eD(0w{=p9>2%-1?om+P3$T`%)0u%QDehzI8 -hpd`rKO@%}OhwgU^X-_>4d*$q*lowWqMwaO7>=PQHQ-j&RtRHNRP)&te&rFOE+RHaFTrnQ;ny$6HvIUxa -ATC^i+lg#-{q6mVyZ3qs_n)5A#K=Fg6sD?`fin_7T+e@|FzMmOuOdYiI<7isv+hNxrZG2f|}d|eYS1{ ->Kt0Y$Lk~gdTDooTnx%)0_AEkDi3jT&tH$PNK6m%aL8Oig$?)kl+isPB#+tkSKqI(VFZl~-@X-h?%wB5fNZ=aED~;RE-S*^+flys@y&QJ0-Z&6A~vahXl43-@!ArN+Z-mDq!sg=NSxB -%DLx#M$%6wW9 -qZLIgTnoj6z8AIs2hz~SDFPy^T5u0?)g^(MDnK$b9kRs_1z3Yz!k{Tn8bv_>MkWXxu*7GP -wthzruk3xOoq{uWi-?RZ0ry*f6 -RC;5%XhvW+mhkiivKri>t6um|L!Y&hoGNdh5oB>I7mPsNr5B@A~*(NAca#fMS>8F!U#fae`W}!u&)g> -pndB{KgNrL9SLG`-{`mef{J(Oir*Q_?w1+-Cx*V(0DU7GiT~$gXlAFlzLiBcSo$!&M8G|xN|8Me!rtW -EkS=4R<>e_wAd#>xrh{&@bNoJNFAAAEsIGj$~xCBNqI2vx>ksQRB@A0ps1Vi+uZdY=9 -a3v%I*v@5--Fl)BzzV<4D&5BV<*^3y5y4%y>NbXp_iIx2H#wOnGdOh$O&mbTMD5H3 -*6Fb$319Eo`6(GtWN2jWy68Q=U`hHglo1a`5hpSx4~rU_d>=6$uE$;g#fJrfsw2+N$2g~3M>ncLq?B5 -$Q&d%7X-hvwZ`~keF!GT*x2*?zie;;kJi-of1-RGtO~m5Vf=>adTUZ%Pjc7edTs?xp0)nY7OP;alBz) -pm;gFeqeH(Zr!0-}G8VLn@UQ{pg)ku>`>e>a#he=V_$-h|1`GB;CyjYuviWD1vmG!H6P&CQ2Qa{kI$o -DTs0LZ4IY3#C4br$nAVih@hg9r1{J*9gd+c+0OJ*qd`ZzCbD`PlS@I~tyvA5~FKHM;;V(_?v=h;@vO> -U&a_`Mad}JoED>laL{`A8S}FG&o*M`*{}`c-8FI3>( -{#n_q&+qlyz_>9RXwSiE%v^x4ZgJq~-kLal6sK2@|af5SU3S$XNghlAWX62X4 -Wt;m(?Fud=3D~ptRbpV>BY0=Ea7hlxc(1l~+qZxq7+EiW$11aCtt)gUC!_(9#zvTss&Kkn6=5^N3CTgxA3M>De|g^F$QW>J7)M8)Eap=x2^ViMXw>nde2x<|If;kKZN!VE{Nmh58=^1yFazMKaYRU^Zvz1%>S_~eoBV?<&=LeTT;+IUjpL$SZWaNAep} -54kC8WWEj5XGl{p}=B~c|C4j@kF3B0b{Vb7mH~!f0e8W^?I}hK*&4Ray*7lzSxR(yeck4Y#K1IR*3gF -25<-$E9Mc)c0)H}Yw(Y>U)g#lo)S3$Rg7TO*}dyR9uE}HHT9Yj04$8SAxhL}0s -Ng-J&S)TTi(Br3(0}+bEq3YdG_8!vF~#8$&&=+L!B+3N7ufO2ap=PeE{^RzV=3&2d7zCZ(^((g0^obeI>&|nfJpNa&=PYkU{|p#oi|;?9FkuU$*K2!Sq6DywXyX;|~289F-H@sjYvS@MY1dB$|9gd;8+5<$E{evgiyjHPE2RS;>%A-ByK$9%&!R1e34fVc(9S$CXo>;xvk`?_ -zN~P59N{(?t-C4-+ULxIcbhX$q4yJhT@QRep>>kdx4!(Z9AGC&I~K+@N -DvsdmO~NxANg&zs@u&;+`&e0J?DQ$`7?x_el_RzzF?OKn%_kVS>k#|3zLo`y2RygFH}DTprdp*Fqjbh -=hOjIDVRgpv;`p(N@3<<4@K_6msg;t*)0y=W>gaO9aSPx~O@W-dw?zHohZfVtI=pX_;kSVaIw8?b{%U -p*H73$1wri229Se)S@U*wT5RjKD}TI+ycm3zM&B>1yc&|6mxd>z#xh9oy?#ZAAcF<0^IU-0^g4W_&$;vP5keEi087D~5u?;5Tq68^Gs(KEOmKPSIRbGa&<8YpoiPk-=l?+;tqIk!IA~I#-qz9x<&Cs4`Urp| -?7wJ2<YNFTD8`HmlEqj(%2$ex!3_jlYUD~!f;Y -$}hp@o136AtTdR@3_Vrsiiy1^GXT -UvO~8PBz-cv2;i{j~*obcxhhM=;GNBea7xf?gcU^|gepEK`0+NZc7oP&Swrvv2ExFHgWvLnpLz!2LBS -{L}TkwZxMKZb&L`UmAPxS?0E-w{2KcLkP#6@2Z~`DC(V_zgKb;d*^w5p2GqEHlF<*JOjVAf2N)If)+6 -tm4O`yLy%rpC+uvGb2%=!1Xx0sCK9f8UQ8(FJ?XBw9F`R^Pqj!^w?l -JQFSi#BOTrXmI0qz;XYo4Tz!OUN{EY*T?A%+1ee7U4J{PV<(?cfYPElsd!bEnD}I8|W0Tgj>#X1- -upr?}DDZq5g>2Nx4i}cD;@*d9jH2j5)5`VN_bid7_S0NI;RlyM=&hozcqn{p$eRls%fg^yo|G6nhj|4 -OXvCS26v)l7fyI&JZ8r!{$X)1iSMp5v(Lfm8WjyyaZ!3%qXM?7=3f(-%R=K{*X6SJ^W|shiE76K%a6?R}q7JXN;yf^ZCxBr6AD~>MNciM<0P-0PSY4{H(I*ce$g+f -GK$QYx -`^xO+KY?-5y5{|+wh&Qa!yW>rfTpu~&HS%ion+1jl&zH!d&wbN|dLX;T4%t31X5^5Fm9_C4GfzuFhm? -KI*nEsGkcD_c4+|Pfjky)}+s@fu%cwGi*QhMOlFxeLiO%RU1xxc!t0Z;E5T-sjR`uf;tx`P7PfND(Gf -_>AidvL)7hY=GjTTFf18_Qy&7vyf5W(~)r%}Am%_mh4;Z~mTsh*E6p{5sH4Nt!(#6ww ->*L$GN+`S<`+icCWhj*y9VxrjOdm%s5kVfIQ%woP71<)JQw68<#j12tQ@2D -t5k7oAXhIjl3DfeR_Ia{0^(_W6uu-kZ`PSy&i|oN3mVTQG1itx!sH=Wd6^AW#LNLesimSD9d -9XKIUpIjM@Duq{RFf+OMu>W5rg`9-)CEg#(c`u+oVE|0qw{v(EJP-=8)XYP={>~6rdi4_$I8rLkXn+N -I}@taE5OaU{eHraXK8b4>m|YxRf8`1w!JtP=Q*J2nkWVyGm#Hi&&nLbCSx0;=Bx{Oa?cO;dMEFRd~vfS1^RU|kBH+gxOMmE`w@$1XS`)hnlu%7G#7rW|-SnA~i)yHR0|fB>IXBD;z0]lq6VFL#+CYWJEp;zA!* -INc)3c@E9^90=H1sb-ettneU)rN4b!fQCC1>L4pGkM~rAar)Mp&ezBB$xsORI8=_p6qpvDOV`l~kM+_ -TIp07mc^reKLLC=)#+}VP%90pUL1(aSvyq4@IeCxEIn6aYtxZz1?Wxwa;dw#MohiBJ=Tcht7mC_pvjW -3#ooiFm-BgxZLsAh&xw1ZUE3YbP99(;G+-w9#ir`agn1{o|C$2F~>o@@!kBCcvv&wN>UNa%|vpJMu>S -@oYtEy{kYF&is%ORava0}O>2))uzw7E;x@xk9T9$Gl{NmoGUc|&@+{(I$2uE>f#Ec%1qjy;n24~hF6# -MA$L_6IINyd8_SV_y&s{?`}#9)|tRg?^$I5Dn(A*S3veFQG29 ->?#AQ43Cnic+?!Caod806a7LzY4qmk1+lMtd74MPOcIn+?6xs_VJJk)_Uznu!H7T^eBu?#g>}?qm@0F -b`^u+#|PyJSP=sr~)uAH7`n2~zMgkLa+BZVV9>t8E#R=J|Y6w*m-1ac+Lrwe#ZrquFF$ -nN>)7%$1??vw+9M!z;;yB+3bR!=)arZ7Uuneb^2lz0$bTqreiuPs`Ja#7nd&QNv -j6I~f4pnpe{$R3?|SC}{Dr#p8zR8S<*ttLI_;hXktE{m;PPe{5D_46yHY<{I%U$Ba>_IAQqXW;+La~e -m$UOyBvaW^o|MfN?u7K0QdtxXsVtWhcxCb~K+Q>TJgf;~Ep7Xx`okhFw^~e_g>%J&@`6*;^EJtIpd;o -m88q>!)>L_?eOgb@qqQliM~?t~+oJj+$Ck4gV5 -i7^iD<+3E*WRX{p9V;We9&y3J=R6g}__Bv6z@J_yU%He0qrDlxFvbbTm5Gwi=j_gpH -}BbWix87AB5~_qtT_L&7WiTDZ`s^!hLgzQJd(P$L`YXw=OYr;p{G6#7Kk0?nIEPFikrlK=;^AWH|1Pv -70g6@xy6Z^N@ZYma^wgKjJ`Dvo%3qy2S4Ub=2!X -i^wOQWy-PAVQ!N29XF%;m8J^D25^^{uO8v)LwrNsJDgoTY3ly_TKykdt3gGrh8W&ee>uxB!a)LW$ZXe -?xRK9srXxS=tFiWe4}TK?|gC;{ML+s)16L7z15YF-_h~*S0r~5z^+n_?ypXeJM9j}-;H~0=Z)`3`hGT -iD`9W9y507!-4yT3;x`Y0NcT0!+b49pW<=}|j6?qjnvXYVezp*&3u+>SB#5=z>}km7Eh<9zmMTH@t(K*NkUrmHo+jOW?$hv+mQUUO(iFMY}<}}ohQYY%;xDeCBV!`vRCt^ -k&TNToeD3HYtaksPMXiTkX7Dc4BFGfRuc_=mNmkPocG -c|A0Ic&^lggzKUK3Xl5(V0~S)9N18<=c9we;uWuh#y)fUiCy4euoWB`Jpy;v1eahl`ayG7C!FQfim0c -jSi$umS$~j9u|KS&RtX&rbo4lE!Lkb_2%Hy+;b0ueU|2eO)bGuIOhnnmWBZ!WSE(;|u_C{n*%pOva9m -LKpB}U+@c_hNH0Ma&_o{4#wP5X~VJ(F}uUIN_sdELrVv6R3!NXT$<`u7J;{gd{WP)6RG)_$Arm4&-B& -72ZPxQKuv(&ZU^O2!Z(t{Z*+*9pLgB{s{!y#-h-~@m~iu;x6GqEJg1Xkb+FVhPb(kL?lcq=RX*LQvR9 -547W0nAYlna_IfmB~V7EUL!NL?vP^SrEu|B;#YMM76Q6as$40KUYxu{_W`HmgN=>GsH#Ujf;61$*@l0 -SI+{{UwGFR%F*`26klene6P!w?h%K>|l1a7#ofh$3K=KtKXP5rTxar^qjP?J@c`cSv>>7%bXHVR!gL- -sE&_*W`<^9Z@%Y+_F;g>uFx>-TF@6>^cP5p%0x7QGn -kd%Khj8p}u}OHiz6VDrRp7Q;W7f9ZdNjF|m4j>kq0BFZH^?DgvDA_oDm0=o_E?p|YQ{5XDcQ!T$I&8~ -xDb01Vsv3=Do94*T2LFf~*$_fi7~$|Nuo9MwKdF^@kk5m=d_|5ApFU2#U!Zi(G+qPnhRU$1kr+$q-Ul -!|ezhlR+N16;Hb)D=Tnd9cc+Sm|ul)OBLr(#==tV)wCs)-I`+`6a)2m2fzy?f|caiOylg%Df7^*qpJ` ->Fl(noi<{tg_IU$B{kh!^mZB%)p%+H8I^|LHxB`%Pp6h2iPpj)Ua2?80HhMDJTGCcHd`n5A|rXF*wpQ -bRbX^mUWZx*111m3K)hVH55#hn(+h+;(vHW(*LeiUSH@xVn=!K6wmF?J-75+@Kan!Lr5)!OC5Kk&x#G -dr7CXUyTzMALnztl}z~Dv?8Nd%O<_V+cn^mADIeZ%q)9zdJ^@WAQU)krtm-O>9f0*HtJDe$zj!jR_TZ -w*Bcb}cOA00b)!%pCD7yov+jE;mXa1kwufM#7JKl3De5ku*gqDr0g(<@uzlD^ucppeMJ=N(7a(mpxz4 -%Cd5s@|SxndIDA!dD|GnmVXmQmn$+qYL?bodx%#Ag@cQ)EaNQ7->$;3C>=ae-QjGAWwwCGDlKYWZ#^oAV -(#N=#J47meVPUN+;V<N)&^p8vG=)9dKlp+ -Ek5!q3&%?SCK)k|2sv8!)0Ej6x_*5;%yGTY5=g6b8O)pMNdKlKW&7`7wY+?luERwD-qTVy~ux$X@sil -DAC~yc;rp1&G8)Hyqtt;RL*6>6SrK@Q2s-+slaDEt4Q{PY5IUt$zXUxEY4O0mOZ@jN0#HH$_O_Rhm6SD*klt)eZSy|Psa@JNFQLS -j!tZ$Xok7KZU-;xRIhB}pJ^T}?a+=b3**%`S16(nh|D^ -QKJdEi`=6?1&7(3wphjOC;qma{4Dtqg^j!J6oPjc;!`glNb_P$xsE`Jf-jiEJXj0k8l9deG -T{t{(utqAFN@0A^_me;q6IflIp~l7lpYhf`UTAMh?EYp-W^>ZLlas)U>L<1*avXJMp=CxN*x{5eHxluj`N&l#UD#);-hC5t5|_76qY21!;LhC!!nfl9627{_XSmrNPV;qRdoXaQHZ -yg6Ph%OksT%M0s|n2yW0sXS|})!?yYpmU*74Q0PF3jhL -ywY6Z?*wVA<9=Xiu9b$;ZC;xIrdj~e1`?}<2TuA28%T2xev@UELlQ!@xq*<1w6ze)=#VI6w1ZjlEWVK ->A9%xew-RK%gUKaAVI&lpYXGmUeRZ<*W}RDYO7)&%48k$i|T{lT`sIwJp}(6|DYYfHelOwuMJT)NW;J#Dxf#N8GKt5Z@7ZL<=G?bYxAFA_bL7u -Lc-o9%-!%OeJh_LZ?-eE3oXI;E_$&~G6nCEsOUe??^=!E8^hqY-|~iy0kN~bw#PBG&n~BL4UH{*q<)x -D-l<*jzHEER^sN)Mt7?F62g0{J)rYG5uF*mLBet14w%tFao34g(m@_T7%S11$TrHfZoDRNB_I3u?pY1 -i}dwVSwPJ?vPwgd>vW6@r=bnF&2_PXaX;ex(SD{X)3J#(dD**}yNrBn9Zvv14E%2nm0Ek~1Hy8T^-V? -W04ets{_{$POpG%EZ~tz2WTQ(D{IJU!Rg(yH5c*{19YlTX!%=F>Nn1^5}`Z_uCAu&c><>OWZQ{fKYdm -UNhKKfbb(=8o#C@YCR$Jy&syHy^6ng@o2{X%y45k==>|*Q$swD^K+(-D>N>qdM?dF=>I_=TTF04t7mt -ESEdFRuq!VeDj2=h?QHs#))kQO|n@~TfIoz_NJ?O!?YhCkej1(i>^ps(w#j|9B%a -!YoGF2D2min^n}w|`F=;;b56vPMuotu=#_rKsYpRi?5nLx(O6#Y*!QdDs8VypoXkp~>v_?FCvobdGDj -)@tgEl_a9nPu86X&cfy{8wPdDsJapcj+qw7U*amop56pWu^TRo%DLrC7H@BIU=iPxndAeSzpixzM|kX -*0ztL(?3a?!($s0FBL@x|C#?v>Z?$OC)I2-5DifV|XOkb)ixf!A2ajauFa_=D*$j*sTF+k>oQ`= -|kZc2{E(3K%(mi1{GhmE@@56&drW&RnOsV|%l7P#CU2gKdwWg}t#3cVK4L(=w*Ric{239?>`=V|+l2m -YR=p%Quu(ZQ@{-LC&$qG>LMVTX!8gmxdZq5t@Q{t$M1kw2fHgy+F@E4BoLLcT^AaxXe==s~_kn~)EP3g0z6bkALO -jxo0P$&fczQSYK6Oza)9uMuYF!^C?@Frju~?iAZaIyTTllDE$+xf58hXvZ1kO_kYTYZt{1_DP?8oQHf -*7NI+e?T?{-T6g!B#dgjP^^aQEr{|6^_$R{1^m(L3{sOt>Vg4%c`$CCYlYVJ#SutF#5wxQWx<#nZvj8vssU5)A&IL=j}jj(+vmedf9Xkn>!4-t4jK!*TWA?iKMvM2ZHJP}V9OlX@bS;)!Kf*^6An@~bW=K}%TdQixJAd$6hi2~v83`SFy(`3%s*3SwN6UG( -qm--VilacvZo3uku>%l>JtK-6$gng7-!v`1^gIkn139BjJdcm*#ZOUFq~|d^V0nf(MYkN{t|(>2Uh+c -(;Gs$?&J;YYq#AuFAzxZ=F@Cs*Jr5)`O>W_0svNc)CF7 -4_iBvZ!Jdet8G878Uyyn3F*l)-o*NEudQ7PF#i^;t^1}^+tn*xf|&63*I9Z8>@-B_}`F5t0`ZPA$Mm -DD^J6aa>dAa*?wn9i6>`zWQq=9Qu-5=_{Jl;Uq~qbmu$g-tqKN!lG=%rB=NZKp%f1esE=Lsrnf%u`d7IAH~mRxvA5i%H>#V9qk4Lw6Twe#?$MAs`j`IXzWA%Pz`oeXzN -v3>}5L;Ec#sBv9)XWp3a3@)>>n{@4BY|1S2MUr!jnNz8151 -1M&YWI)hJp4M1=w<+74v!h9@HhN0HLmE55bkTDsonA}AWgKjdg)p<&L9encW7dJ2_YiN~>51ODgTPXq -6MB>{@edT$d8|;xdxK;|rubf%CDb{46wLNLQl(e97LFPO7@$Myab8TzuEwr>uBSO1P+GqXC%i@xH703 -KPt`KPZ-oSkmW;D@(4_1Q?k(sH4=f9Wb5HO?A(~5M91L`PVd}9N$5gII6E<;$G%Uf8K)Vl<;}qky@Wh -|zbd=&(dUzg|2@o!~{+7~ME+=*t%bdI-KVGUE-pa48ZjS*#5X -yX!4`Rqj58tKj+no<&m6}vjyNc-Ra$hc7%%AS!$!Sj-ctB65>w4rv_2lX0V|xpETyV>>{d!p#m1FzXJ -~9FCVY6e+Z1w`k%(Z^|J3Uz_ux)kH>v8NyC0JmPm+~S;01EE2YdvpaFyY2Fy_CZ_RaUw%wQcLSvdRst -&h?K%CAwE51?LLXFQqalFVtT>zUzQxoc6?%^wj-GdsCNsR3*C&r^MhGqfcA?OdgP;5RROr)Vf+qSvv---whkP7?YeX -_bQlpC#ZW~m%>b(JyWm!68J%gu|+4Z$iKb8Ln;hI@gQ}Xz41GaxU>#rf(&u9D?v|$7YA|wK02m}!rMP -c}t74O{$1piL}?Rh;B?@9LdAdU7^I|BC#Gl9LSRpd@ng1(N~w&Xkr_J-|;_HvT!gy1OL*-JYOIoYGN- -6uHR)B6un;6_fxV=uEzNum9 -UZw!wgXBrP-^3O^ZZYK+zs3I?vrT)27ytAxk*wErJ3}UM28XYGOnw-|0^UX@VD@w0^z>&;wvQqkKPW= -bFV*`oiURiXK`8oFRQwPreRgr_MYCvBT_sSf-d)^ZkIjJb%UsxhdpE#OLETq(^AB;`{vop8ho9K&cEHB+jFtxik#ERR7 -CZHRD?o$9ts*%AO-S1ncMiNOBw7x`J~~;%B`vs}?p@J7F*gt+#IF=_^_wSnFEheJa4^FkGu7N*kqF?l -r4VrY$|;K;r}`GTW8c6or>wL=%%y<9^^#4R?hLoDySb -EYcsOdn+Nd9PgM|g^VJBZGd3KfowPmsayU@zR^H>Zz+;7do^WE_f+rs%(o9!0L$^AmyxwYmVFOi{M>n -%OaK1)i6&=3L9Vg^HRI}LTrKnTcey&sabe1Z@+i^nnX&Oz5rZF5b9P!P`xBaYR={h>RM>UW}vZV#yh| -`}8^?F013BZYsi%fft9rAW=|B=LzYdocxU2fIV>g-^6Xe3FovqF_`h*g*rK&nh=cU?vCeG_LsQrtF^% -Q#eWmGaeo)L0ej%~zlqxbTD%BZLN{OmUQqcqqg}_O5IwjMRd_)y1a;|gq9H>S%;V+B6a>n9*o-3y4`D -L%4sc{KDh(d$tu~&RzVc+k6A|iEI*p$`Ml>3Dfm9ksXUW69R*6V=Vi$vIii9|Hxv*oP0jsD+p?qc -vq_aCz2y_3R)h54Va;kvg6c*V#Tr2rH#IL{D6e+{HsJjhFr$qN -&i5k+8Tw7;L7270Y*W+ftlC)=)zGE(KA#L1UWHabWbSd`d}RzTZgWIS?u52%Lz&Q(S`XW6#Q1C_H*ej -obyW{_rJKzr?}m}yu?rRKbW9M7{)OS+5#yGM-UiAAcO>Q6u~JH+MeA0{Z;U{MM&^Fc={Of0?EDJwg*+ -n9zw<7w}@~%lHmUdzc#N!-W&-C+S^A^_-0CwZ_yk0Z4mNiHtf>r@!po%UXXgf!WIQmza!FbPsiB%9DJ -_@Lhze)5$*x#u8armU7_U7(xBe19mrenHYN7~x`f*ABY6w3C*d9%Lezdk@!JVxdq@Am%_H608@2h_5) -zaJ3MQx<^BeBL%LGpkzWsXo%=?P}=cvr}d$~+AV0-%BjQLe(ZVSCy;Kv0&k`De}XYNn#JfPmApUCrX* ->=lY)b)mGRu!nH>@Vbb)$ryM{ZU>7_!$y?hx*>N`c;sO+Xcyfc>cQG!RWa%_FdZm_^pE9FNFEu@#TS? -Fh4yqJ2@V2sR%U>Pb(8LXKxFVQtefe1o8i8?!C6$RM)P-bFN|?b`SOUiyZbCeLx0DfXIR~au7iQ3B=V -mFXbwSRbICD-u-ubILMNSCB5?r^O@6Mg0pKU0#9NF-G<&~ZpHC|EfLPRXCT&(_f+ZYF)5DS0WHgrbd9 -I(S1dctO#O&10gq;|P#*^*&hqO+a(&KjnMRH?VAF|PtbjZ-p;FhpgHoMhaMy%tE)K29wf7q4j|PD~MT3zk~rq3wL3(k}^z(KvD*Hk*)6h -ZH$eHG%oine*MJsKTNq5}R1;jveJ!-ATG%H$F@rvUXz!&kifeKpuv6OCuu{;etI1)&(OrnhLcB6KpOo -ahRj$IBf3l(=@q`n{@LFVIEdTQ~1dc8T-XD><9b$?*f~HzI+~^~tYXjZ+ -i#qiafO;_fWro!VjeiUUd<+N%QKuTDQs9Q;xVW##R;a_q$SnS --6jvm%zyYrZWKqgL?Y5V|2_wPD5G)6K0xLxNB!-Eud;C8!_S8#yHGu=`|`~8|49DNzfc$^|N3sj|M^S -mZ+}H^U^QpyUypnCSKl?S9{}_J!_#;N+|N(pTX-cI0%ec|Mi~^wz#oDnQ82THQ8Yy%D1*Zc{3*OH2$e -)D-694aQ%MGzPw{G01sH?~=v*zp8PTA;f_y&Q%^)kmVXdlQ8K_{qiRRHbKslTSZ8e5jC3IFF6*2)O4l -4c^{j+`;Fn2}4NZazh1?7|FG}h_~#eiDLf~^<{$}Y@00vDrTkIdRLV<_;3cvY-jPJTIRj<0<(9CYgF7 -_bSMU()Nv)!bzKDjTnhl;^z!kIJSU!*30px!>ZS$;Mxuze{+1SJ_akJ~*XtXn*L%^%@_%^V4(a6J0oG -fmU>-+rKz5I)#@6U7oK+{EHek*zmcRwTmjKBT$_MrjcceS8 -B~3REF=Zl`7EnLtbbr0qn})dYKbL`Ufk`Ec3W-Wl7n_gPMMSWb`TA#`EIh;NSBc8b2oUtxl>w`_;-R? -gi8&Dz;+ZSJagGei(($@+eGNy;5-W(CTma`24ms=x=&wTyep5w!AXw+}K$4F1(2$9{<@b2(WOuq5x>G -equ{An{$jMUI`onvq76t_o*JV&os|Jti&rFMpSSynP0}S;+)so1 -JSP*KoYZ7WxQ?6;%q!d_jeeEJ-DB%w@Qu%HtqaAxK`-`;!FP~;wJ=n9D6Z&u#}>at`JJ%sAmbyS&0uy -QH$_(_-6qJ94bi<$O6sTY(m7_$vCz--=Knq&Aj;p)rE{D``S9ro-Dv8NJ>ltGUarGamq{d5-Or>izl@ -q^mcrVUVGYlDB>mil1fP(e&8a^#2ZNor16ui`;^haWzM#E0-(4l{Lq*jt`)+!uPao-*Bz`_L=CY%dX= -fMwb4QMXYA@0v_77&wy#*TA_QM+yAN%Y0h?l(mmwE61{3R0$y1#G!72iL0_?Gz3e{zoBRRJ&zl;seVjsND1yCi`D{kEmdfV_z5LAJ#P54YIu6)zseR -~7{z@X>3TRyV;Q;$Gh%WBt0dN5!r$qyrKSubk85jK1CKzL(ShpOxCwx{Wq6jSBF70F+(m-BwEw-w>V* -#r&nW8U`6hC}i@1s~(ERlOi#3L$a=>{%Bhs;WoNbV#_{`<^ZB9`3E49yz)7%X6a6ke!x7u!I~ovp#h&o3$BEs!_I0Harb_{Y=_vS?pSMyI;YOD_mPvD6ve8 -^#p_(JX%nw1^&j`GQbT#v<2jP&s>wOsX#Ohc?^gq&a-`hpdd%r0D)&t%g#lYe6-a`w2=0Z(MM$Za%V9 -qH-T_AhiYW$K5%&Y=&g?keUjh744tv4q}?xTAh5Vw)uu+d;p~l}cIp~57+SX3oR&|@%$E&a$XA}bDA= -VVl6;s;msYzU=JNzkz9<4)V7bTW*LmO{KPmZc;q~#7}v5lnpWuC8+A=$!-QToGie;3oJr+oeT`|K0oi -9#liy=ORoG^CA=eVoY=y@Lu?D3N*2`lfyq -VO6p7mOC_#dSO0E81j*v@!!j3qQ@S^Jk42wh+iFsovJqQ3rBZl`x7rF@`M0i|F^VY1yz%E6=#ww8t#GPUu -CEYlspeH&QOx<)Cyzwc)bI9!dK6*|(1a&2D2DId31`p0;>9!7*cINal2a)wYWo_)%~+M4z9!i%kkYN0 -QJ+7k-!cx|DO_Gh^`$GJ0C(;5^<-UaLHA_Ydww=kQ!xv(5rvXTVAj*+9i4R$YGnxX6kcYdSx;iT^~a2 -l|mzVb*(8diLTrCsG@`3EMo?Ob&@mk{)$--9gR)1G{-Ouq&Wl@GUUvub3ykxYv2`+Xv{)z|KXiPYvv# -uMT#9^K<&z+z^Dpfp4WRT|M^XA9j-IrkU6YVQmC -nE4T4z<|u3W-2rJ?@=hI^Ergve&r_-;%yFYGc*b8%Z+acF`|eRZ26eh_F(r8%l)Q~6TJ_8uAyw4_NiM -ewdFiKf3kk&e!5@U@*6)t3)$i)e=(^W)r`Hy>JLtHxb59pGXq8)dcIz+?ideJ60NY(Ross{NPD-&oQ!0P}F4&Jw<VIbb0B4Dx0^DpeBPMf|L0)%RX=V)HR -%gh+20tfepj~#J@+%L)hfQ`xb+z{=7HeO8ClXyV2HE-(=&p8Jf+_`qd%#dKXsc5Zt~;;{Pa?vPXWbkhw@c!%4LFN;{bG`j;{9+rHwf=|b;#x -BBFS66t1im?AJTh~9+)!8#5r|r1>TnQ+Q6YOKYm&&c3@9kL=%y+GVLF4Zuw2#=X=Y3g4zqfTwzI@`+w -@=(#vWV!)@AjYVlFcJ4b4LV2mFoj!RFG>00yUNN%P^i%Q#q2% -Tld~cDv{h6K~K_~h_5`D(<$S&+nb(nQ4#-q5l?60wCPR;q`BfFKyn5ryU;Ii4hp5jX=Tl1V -d@h0hb;bO=ZOE@IXOJWy1bp49uuFoZ2_Cmo@AGwo&?A -Vr6hps{7s53|5t>8D)j>C*_zoR2&iX+Trmb5Hfk+k=d0)*LjNmgz*h8X77r63?L^jAJ1A+BzpP;^AR` -(-#u!Ye7ni%gYjF0ygj6`fp5x~DQ-}5+g?nK28+n}N)pPm^eF+XvYT@`mxvgvx%xaQaG~f9{A~$J@i% -R#fWnQ5mMjBVV}$zQz -f#~-nfn2K6|)v&jeEOXp3`g#+cm(U2h2U_Kv*x5mn=c{UYfVYkx-+MwxRW-V>R@C)@-o{r`I=;K&ts84(_s$Kt-ACf0jhFBl3CwnI}SBt!}$X=eW_GtqN&Zbl1o -3q@D!$rT|4TJGq-jqT&a&(a%>Ijn&UJT)$+H<}%ahR?UK_7}YSacG?fV#b>-VXPcc^8|-Wn=je9lmdB -n+M#|Q3YcwkQ3E+68?fc9*M)mT -I!q2RqI!k2!_FaL#C1Ngbe#QULW0(BCnzu1hv*bEM}{iu;`!v= -6<&4V}J53~bL@vW2WE)%v?CH$~^8TYP&ILk>gg$}4EvpvB}opF%_0->G|jKh&Jj2tK^ym_sIa5nZS_H -19n7yyccyyG>L%7pZ4^@K6OlcOi4cZQYCWo``0T&fUcNQ0}%vHbvKr*9SY4qXtRH5FaKrt%>$t3{TmR?zQfE!mFw99Dc*z3$b^?qoCfUzyV+ -jD&OHi=n#mjz|G?t3i^Gtx~1#obufCV11y3$3fe(e%6P^(ToLxCJ0UJn+d;LL!vT?F2+oC?7EUsKfyp -e=DHKLFmN?{iG=66p~tQkmChLF)0(%fr=Y8S!^6)lTcd>5_6rFV2b430bLOomMzJp&icJ0~lV7hj)GV -SNhRgRi$MuQoMEDNq)fXB|rV}VTHbW$OgbubNa3=yrj%)#{AJ1=Bgjh82Zyw{_%{VKRx9y*0H~vQVZv -&LfV>)$*79ocxnlt9&FbPRJO@`8=l7*N+?Y{P}5W!em+#Y;@B|hTy)!_7~{5)Ou347Sn8E0t4qX!9{B -4{I9a)=@6>|qjz`GgM|oE?Wb({OS2*C~<>*9_TF+;BnhnQO=Gdz08(z!DN|KrjWnxZ_KKloIY#j8~K& -`A_Y}Vf#p7cCC+LP~hcsR9>Gb;NQcXE;&yM4+Rh7!wdofx-kC*EAN;oR9q?uSl-xZ)<>#S>zB$fI&S> -ge3tdWk)W^kC(&Y9YrV(5ih@XkD^3=Sz;@LPO&e%h}2fV{zyj5RdySMO#TJxJ)ar)6FYwmEOmGB;9@X -dbFu%=8p$B;QO1XsSm;Vno=hqr8d9MhIw&(+du=wNq;4aUnYfwkb-*YX!@4gGa(gLJz=Vvz{`7I~=VOV06(!X)U-c1 -Q3p&>H2!tj(K*%E2iwu|D*^>nCf)JO6F*$l!*P;kt{U6WvxLW(KGb>(l?a;@3vlAXo_ -&(+!J=zH%Qj&+?^$O`%FLWDC!NUjJy{F{Jw|7i`bs#@v)P(2cO;E_QvZehVhIk!xI|!nMyZ0c1OAFcEx+NcJJ|QN$@K!vBwlUukXo*f2fB`tEfAi@;GC9xA8bzj3Uv7jWYxu2cQOUep -4V1o6Nz&jR?b?~2=_I+=Zazh-P$;UBH7GyrSk)+=}$B2H+6x3Bcldgun)~a^=n2gnXvYoChx_l0bSj< -toog}wLIyF__xHZ@;8bG(66rXSCKcD_iO`SNnAWVx70H($m&yUUO<|g>TIdzKz_^9opJ~$aQgEW -u%(ftDuy4VoLynDl;O+#+Dw`8-_U9u9bDXh6wLQFR#<@r{humPX6x7lc-a$!j?HRr_ha; -&fGQN#@`pJ7ueDUrFjp(XzMt2*(zf;t~;U4YExBk)E3rV762~JwN3$d%|=6R!8YD#oY_8a5s&^KhI?? -0-e-UA~&wia1x)Z^^>!ZP;q8t^*bQl2ca=l$j?v`}u=^0Lx1^1hs(cDxVRS2|zXd`8BjX2=^!P_Asvy -39_a?I@YE3nyEYUgwq(JGb-+$wJ1uTPjrz7HR9)nnsx*hB>9Tbb1ha-(y`h#cSO;}ilP!z^HB+1fzhf9QC6`^oK&9npea2Od23?aNP;JH6F)9)ecL9xfEu_+`K_;55DlZgR{+ -HY^SzRudg&aT@4WIxdbtFjhfTb1%#Ax$hs=o*{Sm1~DV}Umvx2&6IG*T&;Tj}vt@kxsS{^@>PH&)P -$^01aS#qlUeFJa#H*|+4v;StlrI@R%`CADU(m}b@5huN7XI-$~rikZ{=Lp@AKneB71}2aO{95^47Hj3 ->h|V{))k(8Wlo_+r?h>LUtny{Ox7pW%Du`yQqsj&X^hV)rj<%<}md(jA<~>6Bz3K}dGp_{o&YE3}yAO -vk=KcLAXnD}ss7L(Ww=3m7^X~ewoC++;zX_jsH)1-5++H!^ju&+3+5CGm!!u@HDu!QN|R?sk;1yx(bEwY{U~sO&g49_GuCqtM7;`g3m|h -Oj9gtX%bsr6bE~dX6xBV9P1oGb3$HxBM9kDFL4o?0FW{xkR0~Y=gT5wdQlM9C7!$t1P-rU;Qq+Ho>xL --!n8gX?og58pb`~fZXRfp*h-7E_ci`+`cBS+Q|iki?nj*%O&$J;s&;jD#Z#3rMmrNb2Q9;D%C?^a@Ow -9U6wQ?-{7dDjb1a^ud%!!0|Vh4W*vGt9+|RdDAbq9X}nv3%QHjqumKJBOF0!0M`!*!6$ttreU6FJ2R~kB!)-1mtL*Lb6>g683}+PJe8 -#Uc^Hf_+JDaZ(RX3O!D!3;-WA5(eXB5hZC*lYyX}U~o(c7MXq3Fc5X{ve3R1a5y99?vt;e>cyxRhow# -lknw0tuuuFHR*5J&%Ka=efb8hC)*=orcU(n=1IhY3yYC(5{!HIVp#b=g6B=&voI*IZMXWc*HN2bc&!- -_e_?Gt8#C&`n9)=LMdhO>05F&AM?gZReQEBlH3$LRxGE7XPSu*kBWFzM>Y&ANUCubpI(jLi$Q;$?DWo -BJxaC9U8?;Xj=HqFNrR0X*-hY5e)2#!`AKsFN{63#Snr_ify(&;{(T@{vznrdfM9xAwXc4t{$?8T`CG -pA3IQ*FSAL{HXAwpj3P)iEBTZnscLB%C?iPy11el(QKmqlasCWhJn+yL{$M#4i_$VGB?p`#v!rKotKasGAMVjPS3{CkKXKd_DIwC2ED;j>U -)?%+vG(-Rmcj!?*cQQVT?(Z|_;c(Ys@dlUWkV+=mU(7*dJE{Zd|9p)Nh&F#)U{%lHClzE?*ZB~{yBKU -Bv1xl8i|K>CLwOv=5T6XRf)VyxX9+fk4dt`;}zCrY>M-0&>5&|Y~@!U~wPuQeODE7$4ZI6cdte^Yg@+ -4=#=sYN|`My!xXB61P7Ex3NbA(bkPplk_M`Zap7Bfe+QkOt^5)lI5XuV@pB$|+6;5g0WFr;U1tSR@lg -d#O^ZXQR@My3mmD2-r_0dq}6lMn8X2c-BVcOfq)QZlX_qsq+Sx?J(FSj@f0${qv+1A!Ip%A&!nc -;s7bmYJ(n|(I!V|fX#N~WA=u)V^=>tz3M~mXeG*XdpsQSEqp{3lT$p=HYi(T%WGuzhaC1c2hP}Um&m| ->DYO`h@bj!ZGXg!O`R3Flyzled>jREYkBt)^{>Xqidkpua%>Ht+COh}-hnxiv^8DM2tPFBP=YPQe?JR -kB0m-@{yZz`P^55L?hr`HEclzB>Dg9|#aBW-R5fFJ_a1N$d`skW(;S`W}&tV|Bj;!TEnErfJg8+aCHi -ZHI6j`S-h!o_a%btMl)G8RY04N3nWTX>762Bbwv3J`sO&vLvL2jP|Rvu3r_I{rZ|JN)&iMh6B)`w#zRZuhy@^7KR2wCqYuAdTzaOI(g6dq}G2 -btEr2o9x{~e|X0Bs?wQ%DFJ~j%J+E04gIMBJW)uMKBgv`xLfOK^|JiDCxOvVcKYEw0!*&HwbcUi8>{E -?H?~^DTcvM#uKxRFK;Sz5lgog>b^Irn0j(v$V66ME; --S~tdm8}w%ubo6AAPKlgX1S45{t*ogqoz}RVP4c6v9sgV&7EWXUV(-wLgVvg`>j&M4?LM^#Ln^K={d- -h7uBgBBy`;0UyoFq*(3CciI?3${SwDj(L!R(NxoGx6$f;+BX;{O)*kA?}VGoYGu@qd7$eZCg -+qzv!k1qG=38kZgRrU!Y-El6Plt$@zS;Fg&V@C#}pU{&L<7L81?(m` -RriQs>L5*?OcVZXO+a(d^g5=-Fd^eDD`U-%;?*=gV7j4!5B)>IKhxKN>db0;~4pQ=L-d50Sm;@6zCa|%xW~e5;(F5O#CfR=Ii -L-f_2&F(}+Y4gbOkPU}U^HpHMWwu_e_5gj5PtHSyJ(F(CoipfO;nV)*jkpJ^hHU=A_O0o`QDD>G&-)U -F!cfNIJB(kSpci2$%Ju$D#u(-wG*Q!ps9oIJJScD6b{q8Jz^S(06h0R+|P*AUl(!f5|d7(FcCZ}5u~a -Q}L6i%+GojadvdF8C-49!;#N0KMXE>T3Mrg8ZFnh>-a^5I28;g0~VL^j^dJI(4W{`n#Bb^u-|S`{zE6 -zP8T(lcR%!L+jE1fQY%#D*9_A#w5}5n#UEe8bW`g7G>M(j%298k#A`VtD@td=%DouHcmqWYB=-* -@=A_b06+!8`{xvwVk89mHk45DS6-8F%q)&Jee{hJZprnHY7{oSC~*688sS5G*1Rv9b(KgTJ! -}ehoKn7@WAHY?$!}IegDS*Bn|9EfZL0G61M=zBD>QC_+0+5L4_#h2{WyKE+h -M`^8uBF5C;-6LNczMGv`2Mw7z1%H%P%4+3!KtDPiONT(sMueR -AW8tWwuQk;1ijvad#GO8?tw3LfD|~9~>t3>qCd_vmwTqSn$n8hAVK~~kQdwPktuGNLp?kT6Xzph#f^LNg>mz!*#{s~xdCfdb=X>eD$zWGzL)tJV -(ia3og>WeVDKdA6222~g++O~v?M@#p=+1*aC+f>-H5DgzXdSeHP;1mmn3n)Sz={qCOJ?hT6Vv{aR -OW`e*%+BN*R%0GcYuXfs!dGfv!@t#Tc1riNtN%r>OWP0|I2T)mw5|z$O?9 -d3@T}Z2zUPsHwhZ+VJ_q;qg~f6wo?GA&4)~e0*bIrf)64AD+`B{0AXn>!jJ*2&v|m${2SMBE@@zXo&? -jw`O@@Sp<{)hiX~r6zhDb#jD1D;dhK<8G76SvcD##Kb6M$G8FNt4F&YAf7rVX1#Y`Xs>k9=(2>^+qdLEq601P=D~x$pzpEi}ed(^i_}rzY=TUu_Ik8QzYAs_2?)1WsI2)ah+Y&v=gL -UIB@HD6$TS8T>yc*2j@s`>uJ8F+w`>Ju~i1f29zvs?46Y>LmdNx}JWzr0>OPBW*H1Nftcxu=Q62jimk -fRmk4T+>Fekb~w8F_gw5xo(r=hc{S_r&i{951-Gf{6|cmkrg}8hR=M6@eVCyN7vrn@qo?&WVHEv~ow7 -CO@3d26f$7oGxp^=5*BS6N26z#$4BX#y$zRbG*RW4$9}`x;drzj5vc2M`@3<#@Rh`NHgTp;hJB1_-w& -k_{3EFUWa#my9r?rHhlAXi}IX>?u8{~jmh3_gu~oU9iA6-KP&b%$4j?$q)VHRshP+PXLDW>bOb9OC0e ->BX|}Pq4;S(kWFtDpWIod>=4yW)oBr4_ccvtd!4+)+=Dxd3bY-5!EGF9hama}y%#m5lH*9#Yq0WI-DR -NELMrW;y`o=`(>~f>HiNi&ITh??&3NJTG`CFsxO0G@mvfNZ2*Y^86dQqUXJ)y>Za}3HP%*MW-t(#p;c -sadZ+vk%hqeI%s)POqyW`vv5c??KQMdPXqxh2o5E|6Y5_DifoblI#`HwE7XP2%5zXU#D~X4{?H)IveK%)VKGUNyP+p5n^kOU4>@^h36HMI()pOB?{d_IzEUq4CSa=r_}%h8c+ -At5;ao1d8M1!CY1+0epSmrG;EpV-uP4lO@JkqI%Af?%F|t_$H*OX26BriIAlucPZyU{Mq!#@FJo8hrDND__wC&_6-(}~)73XJ?$BFI6UdWxJ#}r|jr}zwg9bW|;l -=BYLe(xY$*bi&%#>f3`MNg>JbVQ=I`xqw>N^`DOzR%iO`cce?DpKzEHen_BeXjWy{lMW$4+7H^^6&sj -a$@(^%_0R>b&QedeiN04`B|Ua6@`@3WxeHPCNyB{>E>i;*w)zjggzjI9%<@HIO)k8xe?IFg)jLDWby7 -5XCoLOY2rV>ZeD1tD6gt?h2DWd6UhLDyVH2Ogth)6m5;6`pGF51!l}G!&D>qm;hI~TBSRE} -{d%$dNvfh#q@o4sB!|w%Dc9e%Y$eB7ef^VNp66HubEL280OVZ(R#?mr7*nFezCE`ZQw^6B|R+?AI$9iM^!D%0Zy2*goqvw5?4tkL$}mozQDij2q6H3N -6U=a|x?wDOqBuURLCT88jk+5rI!ucx@do7jzb^4LU>e1*vX5y5t9ThIwamB(W4fW3`r^6w0Vy_akX5W -w4i@b4YKCZn(D_CARM2j@vSZBSJotV7IesV38Tc*h}>^*N-0(8SxZu+-UtGymkgwbxvyt951RNj=hR= -XZl-on$3*>mAbi6)e~md@U1(-SH5U;vR8019DlQ@Vf^385>VNytb>s3~e{dn4e9)0>=gh>?Og$tPZ}8>qI&5WXM)x8S*A$L9C^a6imy|>FO%J&i -Me-*wyM4bh&ZBNL%)XXP|G614po5Rw@h-f>j^QYFT9iN$Obs^G5akhYnw}J8G8rMweU-SIZhiO)lIhP -A!HSm%LZ6%>cBFC4FbXc;TLzqqjs@kohr;3YymDq|ZPj`He`mN<)0}+>b{G2Z#QXqXQWv=y&bA*+Viv -PL#THuf~u*;63-adW6tJuzhgC!_7HwYWJpwr72$u4=vqNMCqt8c`o1PEzw_Z4Xi9*CSk8^pPSc{%yLD -!<*W(0FWaopcz0E++YPzatkG^B=lJ1cI(6VOzVL|Zuow9-Hkir2v-#bj*;zjc8CGrXL<(7HfX|MP-tU -UpsnY)XuwSe#yS<$uF+!eA$Y7~W4Nq|k$5%7=M_zFRSS{wEn@ -_2}O-fx7gw7>;+hg~}1%HkB{ZO}Qtqu>V9G}pxS55q(Hx1j1qeNjR?}>}X!F+U=!-l~zb^&JpRoC!kn -veBfY4^&`wYMkiI?i{P{=n{E+IN4)(@nk#@S(=N-{RaD4-d>3VsY1IHDR(a|85~jJgb0=|Jku-I6nX+HG&;mQ$ -k9I&J4>>H6TBDx`@TZ|^OubM=n4c-;|pV${_Fc!epmna|BK`Qsgu!q?C+})G|V6{L6HoD(gX>-j2Ie+ -X##~Ah9YR1Aec}67GeT`6NUpAOBgV9iLZTWoCYmiAS$>Lf>Rs}fWV)NKr9%?WUFH&y?TaIU~Cfu@$nl3Qz!LrC&nf7R-n~qOaA6XnHhU`^wybW2)>jPQ_7~e+=jEZ*1oF6VX1YX59}RUN ->!G$2#lO9|IIQemwFo}a`b!h?9Fm}J5u?N%${Z2>B47hLz{8*VBSC9j< -IT5n{?aS@m*HOsBN;sRw>STeZNw5n -z|i|#%i-I*Epaa(6`OSDUybk-&~ld*ZT`DF;!nc@eXdUJE>Il(WB?(@&Et6}@mGh4x0LJaYpCK=yLa( -3M+WnYsP|h=ev0<1iWGLwPP>Gcy$*HQ%SE%<)@`Bk9yL`ikO*!U$(}jNmt@PG9q*M5FHynHnq5Ui9o_H>%dKZCY+q(%udQZ8aM|ZWKwT=w>S)CfKIW5QMtJ@v+IcQs$ -GuNaqC07cDe_w**J~2$+OM25$kN2uryI&>4aBJyFKvK<7SznGz4{#dPOX;aB8VsM`sgzfP{AcNE?5__ -iS@KpE-9%gPp0PJE>0x{jnpvt{H9`b)+uZUX-@nlGN5q@WK>snr9&ol@Fsq+=TzP!U8iGq3`m4%_3es -SvrN5D*ALoXDMz3e5)z+@MBoOk8fcCw8RC&WF3!Q&rw-dF&&BD+bn;g!^S-o&E>L5ACdZEk{h91P4Xn -(%02Bnj*-%ht~(qwyCg@mv^eqhtnXs^a_vV9Ez5+-iMsc9)JSBFUGDc)b`(|ou>>q4d!ZshNgLs8>d^ -U#G50AzH>Id6!Dw)JbKQF}mOPzQ3MWkW!_#%r9aN<_Q#+l+DU6bPwq$&YnB8OnV*Qe-UAb(yn%j9ZO& ->{t?NeGXvE!jA6Z_2S$H$8cvfzx;w?e33m81uGff1W$1o6S9l`cCSt~EWYZVr;U-(+@SnObeerz$(fjBN22=l4i>3eC -vHsad>2I#o6tVy~hQcI;(kOu=FuXh_5pv0L7kpp9e#vxU@+YLTHxXbU%z&?XWeU3H3o2vT+BknJ -x_~)eT1zN$ZXR>zNF)$>WtW-8YfTnL!X&ljh -tGNI(eVXq6(i0?EkZo(%<}$pf~TInUq7EoY5a-{Y3}{T_Xb+n^-_tDTohSe6@r2l`@v6&?%{R0WM^u=smf>zaao-A7rPhSL= -P|8VG%B8~7{Nz;-BDjTO2G+eorO9)>%)hlFEc;qmh0DgyP(wTmD+i%fP53w2_349BHZ@yWd9?*_vJ{J -xo8UB=I}r-m4`*RJ4lvLOrb`;luBb=tCx!#}s%pm(Tn9+#bHw%#1)#AOaicPe~ka%UCMZ5-(*=oDi6+ -YNU1uBq>kM^B(tB0kgL_#$3xlhrjTx_?9m{`rE4{rd)Y^nV)!{`Z{AuR-Fw3=l!7B~C;L3MNRP3dAt$ -FzW&iKuMlq7Tmxo>eCc(Sy_=7@Q9c7m0k^El2z$FA^$~@|H@JDJRSp@@{-wMpYyhI1gz8`+e^XDG6ob -r!RQTWIj^l~4D_cF3art(EDKO1O`*V^ftjKb>>>ynS=>u7DhN(4sPN;PKI`s%7Z1hj)l@b_ -CQdO7?8Bk@}|ItDo+7-e1c=J8+31c`f)0#5r6ln7Y)G{8|u-fXxX!oy*knVX-bfVa=QZ2mV}?iK$w#C -!+|{uac{ZxFMf39PNy_GY6CeN4a#--!r5eg|T}SwkNX^L1eLAWnamX;UT8@dp3*W>vHpicQ}_6ZG$3(>KsGLw`biyWi;UaD2w7^h`759(P^ZLPc`lJeAjjCWEf6?K%>q$q@94IOr3$TYLp$0@Ikw__t(fD4+l|634KdLK{!_lrB;n439_^mhmtwPY%lrzLDkPAneR{5j7QIEpNed$!^uh -8o6VWuaCbL?4>=Sg8#2Q8Rp&iB`vzz1=@8qP(;FDG%`I9S_$bB?R&)~+#*6FIoe%9jD^8{y2dHf`5L4 -X(ikEh$-4o3o&DL|gO|xL=nb5iyv8TxE#E!cyzfpzbDYqg_BjEBHY+`nBUN_W+=JG5jk3c&K(plx#m^S8N!S>Vjo!2JtQLC2)o00cF&OUo9?|ogJI|$hj0Gt+Q@uDWzKd}7Zm;@zf1ZSE8yguCKcIoG4bW(t&<|2=f1$0!kvWPxC2e-w1{|W^gJ(Jh%$az~bT -W2bl2+|=zPtC3wX#YGm#=ebv2v@zdQBs2MBW3E{r%A5PfDxkKa_Q;{|#m3|JL#UowD+GnI{bc&NsQ_o -)|_WFbOn~kR^(MX^KFo|A)FaYjPB8q6FXh742ZQ(6JBvQZu101#lu-dQ$(A2i95qoP~0Ec=QbYZCt285rFJ0)- -7UL1%fZCN3()5Ac?7ZiSBz?CE3vc3cY=-@yem;~kPEyhQ`BDsM}ir!~{&#!T?I9)tO=9FtMF;xBZ>0^O^YNZ6{%dVvz5|$|{9Rjk+oxfNeX#gMb(*l@aDfuSpQ -UBC%(MA4^ZW-TWl&LuzLu1+e^XKh6=mqZDJg@BGL(L#Y+p*s*xLi={6k53Lo?zQ;r>`s{(U6+UzU_X< -cGGj^k0{hzrmt^TT%va2{K9!1)A{O`jj05XTSt2=ZqZ3vNsl0S&s7;@&pT#d#bzRsF;g%qnLwW)*54b -u?{&8gz|)*jB46rd(LWmy4Er5;OM2|%0_&+iE5@jP?Vi^uoFqXAkGK=^166vIqG2z4Vpeg{F;#rBHTi -icHo<>Y%6NR-Vb<^QU9XM3Vl{*{gGznWu}+dUe?$B6Bfd3=C+)ACwdppU>`EX^IzUO(CKB-m^EaJH)O -~6!|1^$q&`kU^xjskz%dGmQc+oX -)(oEAECC-Qma|`qAc^~`L#IRKXpc>|7!==| -1&P_52meu@3MY~L!gaGP&kF*FpU#5!fa89#3%wKaU8}F3MJ{!$=3ASMHN`6ARqz66Ci@LWs7wDE?2$< -m=GMWu|buQ`P>wS1mR%ISTO>yYPMiOp9mKu}G*Q4vK6<;*yvawO#Ub=9XTQY{z{#~ -qz>%=QBZ^@b{2;EePMJFkLAX|UUZKuzy)BnHlY2DJcf9ccudmgyuqRbB_r(V?5==SsLJ7uT8NB90Y;r -&Iv%Y2gWULb>WKN8-f*LZ8_y{#rc($Vis-utuk-3|Si^@UWCs1qgGE~#IRC5wNH^v-v^W9g5-iH~3h{ -aLgFgFD~)r^xrO?v3GP`}uDEK3euS2R9B#u2haEBTb0_WhuUg{qxMf?oAPQ>C9qjCBD+5_`)Z{lJ7eO(sc@DvV_M+e_x;n?J{#ZMqd&_@kF -B%N#!n$VchG98>n#HIS1lmz4jwv$wO62i3#mF!%l`ARYBm` -}<~&G)BmR9-l$LR6m4P^U2-Yh)-dKi$#W$6M4}3RxihHMWP-?9<)ghYz+ce;@u@w@>BtVUPp;EgyOrm -U+IH0b`k)MT6Tu$QM#d9#TI;{+YWNlI!z+Jp_JI>uAzmOBQHM&)ghHhZz^x;vq`vzJ`~l+^Og>q)(?@ -?p%ky?z}@gFa@`l6~7cVw$;&?#<&vG46o^Ut>l -7Y%BY!1L9024)yG*(dC39G#d-(Wjvp1M#!;v)hlG&J{Q6MQSF*lD8)26qNi6g)u_?>c7I9fPJ8a4KD8 -D#4!PR9hC-+Ch%PsN_*w#b#LpaZt;B6t<${NTJV)^~a;}gYk?~qi@d*ib#}|aJilzzoc5i!)Jz0^MaA -r)Jj6GEh6&6`AoR`zS%o8c@WDVs8!+M~tb7?O^*Kz0$;ud8_k|`mA*NmJGbH2M?@W*aHJ>}>0f|DV!a -B@iJi_o6Ja(9~L>y|)wEgD)rqbfF3+tx9QQO`8*PKj}^{4&N_hXz4XNCk1TmUNU2BS5CTu%8iM&EaX{ -uBseo2fWda7(^K;A7mmR02u1O##a9aUgsZx*1x#M?@S{LFajn -?lE4szp$P&;HWWtUFiaqyp)M>0b6^{^O5X){@=`zCvT-Ovy6PNq>HzV#{U+8#;XQ)J0onHWYv;a~ -%7^xGDQNdU%*GtjU=6JQ4rGeD(_1U>Cvpe~XDjq2n*jSgVbTd^#Di>M$N=zqj-eKOFph{0>)Z#LV8s{ -mz<0cDK%Et|YON)e#)fW8O#wu=CYDSvInSAf3r{QQQxbX?e}_7(cJY7PEnYW#sLHUhZK!H+2(8 -2ud;?uQ5y=QBkNj92$yq~oc|#5gfydY%`TG8?4H%!H1Q6 -v_;Vv$b^FaorhafI#n?d2gP+1fR1sR{9#Rq@omxhUqc-ZOb^ixg9AY&x-o1(VM6F|^E0J`C_Evj5D9M -}NfCZ)_Ld*WdoHFTqHD)XD$&P5NIWj1b5W-v8Hmuriu#5=Mg?kU-gE`bPYc9aroLmbE^ker`F^{r -k*)%ab(KJO8eI$pP)lyH^Dlu8uM5`}V#efaF|UrU3182ff02DPoWzxE~YSqbEz_Otr6>MBt=97SX-#L -SL$8%Is9W__W0hee}2wK)O>fJ`^~6VBm9>nKE2CE^eeTb=Zf6E=7zPxs5XYm9KKU_iZTo!>fLCDp-tC -++wLa9|d*!VkHEQ0l}EB$F?{MwXYvbKaS*nC*2rtTd9UzWof=%OxUnp;Mn?A?r{O3(tsj#dw=54Y#H- -nzF6dA-d?ZmBI=K1Odp3tiG+tw5FuI@SL65!SMYYeRMw%-`4AP*uX%k4Nb29+ee0rux0xSAvkxxj3sS -{oie#%*#Yn0ye|*({Byzp*b{bQJ9@%H%k)6w$;6|X5sg$qr%G4FkJ-2Q8F|UtPsTxYj2;CW~B|6NcVV -GXrso*p8zA)Nkgjc>5R$=e$E!@HaMAp-%H}91;cm-rc#ikso_IydY7sOuKaxdcZ^FkFGdb(4-ML+aXG -tkpcYK48TmkdH~=tHvwo{Bs_3{!7lD+S|-j_C==W05*ZD$lxFT!&CS^T3upiB$U=A0o)B+dqShm!0y4 -UA@l6se{ap#d>)>pLDh~whXCyGH0(>>X@VNQZbS2tPt;Gzfi)9zwRj6_NATNNX)glKQk3>$p&rn6CL3 -J<0%UYaoW)BTrOdSv!b^(a!-AgC0ldHo*e5Qu`=)sJlymLyuqLs>wMp_2NGw{SB*3A@37}yr}kd$d2} -@SdgiE?yGISkWp)BW1ixMH_)2_wmGbgHCm|ls7=5CT*K+z-<@&P$?8Od4v(be|@lJWGzLD -eb`RGsmaMUhE7IG0_XwYSH42!rA1UgL8?G$;@4c)E^twa|KLb?u#@8%MD+%&?@o6LU!FHXQ>v>!rTBB -9dc1Bit(uRhW@0o*nEL4@KL>`W|Zeukj(Ah0}x~``08VIfZFSZ)_K5@wIp}FmO&eakM@qC|PV|ih|t|bcGHfN-o!j4OOh74WZZ1nKOUNiGCqR^$3@xwHv%w5T -BK1`QmU{;YeCRd+z{Z=;);T$~WGku+cS8tcenYr53Ke44B!f^O4NxLmE-oDo1JxT9B6S6-&>1Uhz|7M -|Yw)KCx$dAsv;J-Hu`ZJTDkO1uh;9wVl{xy}nXM15lYuj>6;+-$!D2S8v=k4(=1Ok3E3YrrP0;q04!y -11Jn^C~lA%0IEZ#gaqkP!&o$vbOCekGL#nj7)k{sDh0eZK95sJ9Z#7GSq@ev7voWWe6Gd?^VobqoE;+ -k$9A91-@W{$X#&z6f+IfE_Rbcz6`DW&MAt0keYkIQ5NkC$iejFaIE#0NM~-_)}H=2%QBnHMsdh^Tl&9 -y9h2;ewDoy6wATCTjDfs|Bi;!&xfz#Wdg6Ax4>8cPI2{i*x6FCEwuE3PgGYQ|C!Xa{yq<7tmZpv=8K6 -ufZR4{25bkcx -A}!I;jvWVe|fRG|;QLN~cTa-XgS<#NwJ -u$Ys6yVbi{N`)G)`5(HwQKSJ$Nr1x;Yg%(-xMLcmR-^e20W9GsQ5~C}!#%fDN52V6mc(^{$&X(aScDJ -0dq(8JOe}>2HU7L{HT&@TF7Bq025J%M^%Wdz6_Q2&eH{ -wYa^skDdXVv39&ZbtB(Uegw%83~C)q(hHNH9I$sVFO_!EB#v#YqG9wIdL98W(N@NLf}Tta9{7-grK5m -_JCynJ49d&hsty5x120m$DI1>go#Q!7B20>1=;51=fRgFOxNw+1@!**Ew_}DzRO8UpWq};IH;VGZds= -o25;%TQFQ4HcLZ -lhbXKswZ4D~F0n_nB(Z0Iu}$vn#ZbvA~8>&&CTIbnU9fYgt1A)%Lucf2UAV%w8Znzxw>ShUCj2iQq5B?jh8Ach4brPPZeY$L -+1>1@8K=$mm!H=ybT2>e7yZ8F$pgohvQ+^_&79Mi>O@7#%}0&+d9|Sz_6XfLjlEY8JRnz_%oj7%k%2F -FXmNQi<3Xq%Okq=R<%3R-l{!3_2hX$8x7Ibw5Fr;Ob^%CiTlDh-@Px?U0%nmOfx-<@vc!y4}`pl=#E*uNE@3s1(lKads@xnk;X?h`gMdye7mL>a>r1VbcHbLr0R4KCINo~slx( -0Z3am?mO-D;y&)Z+Opo>yX@v}e9;R?Nx-Z)F3V7%T&y4C*W+R%tkbMvLb{su<{g_uyg3`Ahk<(w^hZy -WWQt7E`pvVv7-Y2;HPc>GSs*oA&86U?I_3qbMP;MK=2adJ?XEL1FrVEM|^OYriyyTpw>gIN>) -SWoy`P7t8a>Ius)G}FOvOsFF7bf9hpQ>S^*^H3v-YALQ8s+vY^8F>P2C5j96Gw$a!rOlJ~^vAv(qm+< -uz!&UB`u$S9NXp5cx{5(mdwbMWFb++8M-EqQZ?EU;B}}c`K31DGJnywoIyXz4#GRWKgQArz>U8iU&?q -FXIp}dSxI`$t+q@(6CcUYwg`w@N!%JM?>h6-B?WquRe*2q^h|(7CgfufMmlooQKO|ZYiN$#X>}W4)d| -F66MQhi|zU~e*-S+4G!#)u-)aPZT;hkI@~H+3^_ES=foKVXf^CfK!GAnK>?mgK?i?}Lde^~7z7*UO{ISi^MQazfhd@~`SL -IgL|X87Ai*;bDTxG>5kSEr1ThjJ!EpFrMU)6s>+5f1d5-;D{WbWh5^!(@v4cL+X1*|PP9x31mdOA4Ox -?FZytg3-^p)p+1_m3+MXSGde&39@EyV_X=PzS#XTSo?XH#%dQ+SKMuHYE-{Xs*@f7C0hTI;(S#6euOL -vY~=(A@nf{X?IPxBcFno@e=+hogDE`X&-L-dB^0q?#@wm%6g2-1+=w;y@#xsI`1#DbWb?n$7hv>3T7PFSw7B_*(?uFVpv^1cHXU -j?#a8ptBAp24Xu0$QFt!NyNe3Z+Mm|LdRq(WeDokA=~#KMk3rkW!E3k2uEsMb3v{%NY}m32>*1f&F&^ -dV;PH_v4X%AmNHL$n`+Ck>267J=!dZxPhOf)s$#?F)7f~L&Ty5ka@4M5HVwa}$##QZQc;;=owbZM-E+ -!kW>EnKbXd@Qgtn;r=jRk!7w -H>gOQsDrsr6GB!)SxInO;kD=58vZ1_4grrX4RnaYD08;F$~|^x9`B-iJ9kTP#AmJF!FnTWh=fWTTo9& -&*eS4{_pvE0y)SlDsTLM=A>4S{p`F@!b&vbxJ>TJ7>X92618>wZ -!F4zeQ6jhMN9r3j8caHF(p4f9RPZyKMy$&bm?uH*$qR=RN3`;OZWbqDX`EjzhnyJJQ`?WtXB+&&B8#W -IS*PU^~y*nLMyJGN9jA*YX0b7GA94K@iS6)KoS>O9pC+%YP-#)K><(X1nt5;s#kCTpP%A<6F5zaOHET -iiYRH2y99zn#|>9v;8DN5L?&g_&?-aM)3b8gobGm^K(Js9GO--~5$;}G~AS}-u~MZK*Uleb}3iU9up7Eb8 -&7r_eKQl1QO`?nPVBR>R`cr*r=vBk0Q9XZn&6wKqd8fW^pCE2c!CP5AszKuoF_naAUVou&XwfD3bh@^ -krTINBubvpcR^k`^1YqpQ}i@yG%z07|EF6e9I`t$bk?@7s)#2{^eX;Tc$pFZTvwHI4|bU>BryAx!0aI -qHH=}q6yZoe7z=P$NW(07-ov36jEKG8%lSL+v(1TiIAiAVB##6yj9umJZ+<6OKW9&`lu$1nEV!SCPS- -+6n`pS{1o^Y)-Wdw+lD?Lo=;A836Y?|8X4%Px7!=poCkX*xkwLN?lTySBbLch@cQl_s0{s2@GWqkW_b -kw9ImK7`Z7mlA$`2nBi`iW^pL-@o=l48_qsq)yZ$d+aNHLD#3^E2y3p#CbY3ZY#s8am`}B5R27|+zv* -Kv_7AWu{hUka=~3FQ`rsd2#V#W_(SCi?{MwU#Xi4VxI)GaY3#DyEV&PzJ+SR^NAAPox%2Uo&WXAw?i6 -I=k7|+bhRbnf`Fyr=$BXhKA}-XpxH4J6R%aj=X}7JmMSt%c-L!07rv_1$q#Gh0+A^7%vy?04Z4t>aiT -$ZlHTCGxl=pNk#Y&i{6`u+rKTcF$j6|tt=8y!h)MmfjS|ugbRI ->NMCQQhm4>JvQ&w{mkrV_)%XCan<+X>(byBA+K;@DUDW;2xKnu2r*Z`)$(ZA{<@V7dK7>}l6bJHAST6n&kyRA-!;Y1bI^z`SzV7sWMLF -K>qMqmMj%PhZ5zw%T_G`P--kraTnwrWlhf|(tEcb?ZI>LOA1SvO}+3}IBhrJ{fJD2H9Me%Tl2}vr3&{ -KoTs5bL27+qa`HHL%?(#Szy*oN=!TEn~|Up!x;*KNwM^86s-FxjqlK40l_AqGe>OvHZT2p2}^MSu&cj -^;H`Z~CQmpO_$Ij#lS)-v9dp;BSYkcVc$@;RpBopMG!V+Stz%-2Y~QZzI^BpYcntEs9`plmz0PpDS3$ -1c;!~I~H$|3ntza=C?C35TFi0q87hZzJM6@=LD~W1QX3)rqDpv2!pxiEh=tn;{+&e#t5iPqHhZiU@k( -u!#nw(@K>^(arCZTqVG9s3e*+Rw{ib(rd682iIb(P_xeHDRF+hr4BGn$eHW -PRjEtD%@vpa<%q`UU|!0_r`pKlpA#Je@ -_8{a}+SSP5Y6CCs9B2&ny!?~TWRkI~4r)zuMNBYX&Y~qR@0x!lo#d0y_oF7MG)mJj!F+4TxU4}hwL1T -C04%P$S365DwVd=aeY6}Wl*{_aU-Kk7WXXPKOUK=)ig&tmSV#>>WV3ym8dRqQ|CM`k$ikVG_DDjg%KZ%3DI8#V9^x-2>7qx9Tdy+ -BL`U#!xrR9_e4{Te23XTjs>Nhi5d! -qsbws6EVfgyhDjTnvE7JOM|fE*Mp -K@dt>^xWs;}9(HMi1NWGegfdwn;mRE%MoDr$XvvO7V^JwCms=Zd$qZp=q;1HU`AR110yVLkr8!mV)@| -U6x!=Fm&a?1Sb=fvn+PpXsRp>W_4%A7oJn^g&*pYc@UCqjmCXIW@SZMONUYw#5j>mPCQ==~Q#UZI-@F -Hd>Qn{<0Blv+T`VmGo>uOV7)uw`xG_N6U704Hu>~DuBb{rnvEeVs~lJxglV+?AI(yeR4wtHkLkP-{)- -*{E}jU`bM!(o#CDN6k}>wE;Of4#;J(?c*$p%jiX6bcl`Fq-~!K%2teB9!>sH7W*Orx5!O^A-+^-+q!n -$eDgy5d(kX&m}6~^rI{SH0ABw^lcp(;~<~I-yA3qUf!mWTjmGD@6bd6T2l6_Q6U%ybSWByPOuh|fp4~ -4a*J7X1{T`BNodehW8TWyKtlutYLr_v-JRkuL;s2z6$%K+6upZjj-ApzF`dGGSEWkweBV{_eVA_{iL*Fj0favt2R7d$`%K6&H4N^d{qD|Mvdy8m+v1kjfWm -ObWqYPfAz@kUtTPBFS(=5T*0-E>5szDG}XbVW+4jPj9Q|;3`8?HKA>{tGkPy>++Fo#?PJ|H)_`494E0 -s1c0%Hc&Dwsdig&};pcKHGxW7MC^q#&Kq;qQ=Xb%`%_!T)jcRurlVqSQ)Fp%6JQG!l7=)BRQ269jXYf -Fa|mbf;%J(G!%l$*5u1tJMoM@*R@!ZgVy4r-L}4$PJ_eogxa5oVasUpqoeO#n~?R3aTjsavJ5B=d&a% -sCyrrC&U>{JVNbKu@Uwmn-ALe0`Z$k)Rsl8Ar8S|6`xKA?~(iwH|1BB!&(hohAf0kiDonE -A*8iu*-wW>_^2rdpp>=3ws!}}(KPfcXQdz*bB#0@f8X68yfm!p9_^^8-6B!t<$!ym`H>tR -%bH5N^R#?Av5-23_B(v})`N=t9!@^yJVCi)xB{%E8!eWyNcL1d4@B7Ph+^F`A%9idT42J)(3z{@% -S&_WM>K*Oy0I8bG_a*&gcpvhbTyUp%VsA$@{;QjR$;n>cNM)Sr^8@K_e-Td;w?>zoOspv6}s-NKxz$g -FJ=LJx%q~@BMAYHpW{~tl)Mk`LyQK -KRgH)1|O;v`wzUH)+oiUv!2_nsky9rfTqr#+ -4&`bG-sOIwwVjol;8Oc&DlJ_|eP6mB~<*-r&^lk%4Nk0YC(;VBu8)SGJyfnDXNP36PubB~l)mpg8n7<2mbaDTS#v5^T2!`a&Q>RhPjkAJ^KrXBQ -lH(3umTxn40)*bsEX9EZJe@*lfvb-282{G6xxZQ5(7Kkb&lTX5hnDM9X)n5kc -C6R=*=gtntIG9(M$tSRggU%7ErHjWN?%JMNS;anE<_j@>+TU@)zrPl53uAN;wDJp;PN(ws -**z88(9p8~-Y)3rPGH?Hqf%uW#xUzd^KMx;+HJ`bC2U6zw*ZmL*SJGwELULPJ^-TAS`6x;?YBDyeHJh -YGj|arB3cUQJRcym)5BzpKkH#K-b>FVCgO)&ae1s^|pCStG0KKPvx#@?18VtBeW!WQy-P9a}-yHcCoFZ_uYq#$Z-n`HA!I~J8Vz0UV-Z}OZFw% -o>wc;sxuuc@~LXyrY6z6jBAZ)v(`-JQcc;jz=7`cki|<$OHHC1o1iE@d@aM9ixp6oU6u)NUPQ^0b4r& -h=UBf0A6BvbG} -C_^UGd3L>qTOe?EjVZ;$VI}LyKDv<=?~CG@9boyHP2y@oTxo`n$EB_WKM(5JKTksWm>z=MS$!OtfxZO -Ijg%gG!Fy>XwK?8S~QtwY7F+`--bi8If7hLcttg=h;B*V_)EVl(EE5mjV9?>XK!lAW#IicU -Tfoh#5CnItL)S<=%?qn-YOr_-~DxH@%)v-;RcgyQzTUgx9FatBMu9_Svu?`{H-oCMP_cT8pz7i|YAMu -F{-F%+nDDcIbxeUK_reKROS2xMen>&k1NfLf3|2fkI<+=jyjIPUvvendizjF*9J8QrXV+Li}srCwj#FDarp*r@bMWUozcoC_2dOox-V94mKU`C`2|?yCtw -WgIIBy~-jON!gMyq`t~Eye+l{K2b+2CxHcnEwj7&Vs4zR?F!g=TX2C4p7X;mXXS~t}|IncQhN_B9m3x47LsLW!GJIm^` -MHnC`wsbILfTsvkjhXx&ve;hp=U9w$%Abi*iX3GX!bjP((dMR{0>Yggqbg>qHymG6T-d)}&1%A=4Vp> -S@V%k4gfVtqGMwn|IUKYGKCw&xM^XRXWBWe&9C7)`{~(a++%XRU)l`q^@IUh@Oe%n_C@{wM@DQoo&4FE -mV$VZx9Ya&bdQmZ9<=-YX-&y0)1Ukq^42LWtP>HQGyQ%qo?LX6jLS`mO(y1Vb!XUGlC9ZS -njurn{(A1XFO0FQiI7TK*G%4J4S1q&b-X!i9%?ikH%MwDyk+I+ym@_F{W-gJR)A1Cotp3bSD3A791i7 -U@Ho|ilOaH8rapssXVz;+dl*_6;D?GpbJ<5S-tsaN$k8LRRxQ*agn74D6Tpt#EThZO{(vGQ}AxDZ-f5DLh -49>zQ&!)U(vM;TZAFYeAy>aUURSy9A!`jd(>HT3sD$JF5{y-M^-lW{dkBG^h&bZm15Xspsd+_vKHNSO -|9~3F7hw~nUH{u7`;C7zP1?ojmmbvr{YA?0_&-_xH$L1R$Ut%LGYI%^*Z9DPfA#zycqqtQbr{8IoQ5~ -VNFn&A5(h;3W=W<%AeadM1E&Dn!EcL!4V7i@ZW!`*tH*#m@24mcILf_?k74}oYeiq{bQ>nzj&E>pL!B -F-+g>E3|3jsKT*8F^iBq7l_>00J30`gkn%P@qcmsP$1`G$V_a(vaLgof*aTH)poCH^!(17a+_?;=JCg -Le*i*0CiJGi|hpoAu%AiDh+!+(VmmGg_|xpVqE59M&$b}6#zLn{2#$Mriw{%;t~J4=EgerXwTi$R`!s -RHFWl`mdb-^~NeTjRzX6P_!svb|m}8{Cs67*dt@$W$5lNF6s{s)=8f+rFK6IExO@zkM%m8=7?nXwiBZ -WsX6H-Ous|DRR*`YvqLR7yCeohckQsXtSxJ`Pk060TD+?m6>KcFh%btne|7jO#dp0`1|nYTPA2V$_n{ -ic^D}6|9)_bxA@PcOV4nP+4^#Yiuh{Hz_+)EY2^pStgjANLdh2WHqZ)hH>A2MS`Abfz|iKGVu)EpzPD -bRdX0SXYYpVvd97iqGbDZ~j7s8Ma~rhAOu<->8{C#(?DeDXC{~iNz0L0z%iWdW^ipiM&>DYq`*I5{wv -)Ei??xV>!S*vVfF}j0`*lo#9lkgc<=@aX^w;p3pIBp<&2?n`>On@z&CNn{FBf~%One4H>E5&zb*FU)% -kA3oxE4V~`mgBfG&F-$f^Cewj<;@)t}Jj^hAGs7gz<2F*rO~A&yeqWJ@8oBo#ZsbqJEwCmXc$q=FBpRVN0T -P>yhE~Kz5hsVu?z^Ty2QR&HWbk>a$-UW7^R73ctpgyE?=&1YD)>=ru`_b+7g4slsw1y_l(HQHRTMz{E -V$p{png?PN*7X-G%gPKGwya -lKi4PXfb`dW;Tv5?<)5BakUN_kQn$HrYcv1Z|gV*$&bWq#e#YDvJz|yUVYaREBp9Vae$$QCs9nUu3JD -rg^pCxz5n^crfFIfcy%+n#2KH40-7GHlb#7^OmmX+6WpcKbLZ+q?KMR*1{zXEdQn1 -aNOBi0M{td&rgAx%>w(C|>2$xxMO(sno((Emip*hm)R=@vrVEw3hUMHMqil)|W^Rj((T>KAr9j1R5|} -C%fd-48&tm>P+{`z)4T`8LCkQ`TKkOW*7pMcWQ||1p;Z>PFU(ePdm6mGG)3+E)qRtM7zIYB**>C4Ve| -$ny# -5F3i=~`_C-Cmdaeh`&`;<2HokBrD3DmMOR%uy0lN0%Py@V*Y;cac^nWZufzM3=)!Rby?d8eW2VaFJX?HM6Gct@+) -8RA_NJD^@DOx&{UTL%8u5JAlYQ%WnWl4jU{6 -bR9UK2ZY1!a4<{`Yr#6!@tD -+&Kcl-`8)pk-Gp~{FLO@EU*P`!|A)B$I~Mp^`JmVFoB)OLhEbaB^1dhS@$eTGxbV%P?CmaMl*VHI?tz -IJFL8lB4t{@Q{>goTKD#mh0;^>BvUXs#N+Uw7 -qOkuQMKLucxj{RehFGm#cy_V7;wSCOKtMn)kYq<#ZxAH)igLbolxkt6sJH}OW261S0m|7u;&GnWBay@ -g|Ik2sOr!)eBQa96Hsk4`DMO~@bIb1lu}7Jlq4r^pL1TXCN9aRmT4n~L86zv7LSeU>~*6lCq@poKf)o -{mxo3z0*SZ}wspK@V- -v>{KEHCb8-Q3@(kHgPTl5ecbN-kL3I&fy=9{9ia6bhe3$RUc6=y< -g`OQ|VIJ^w(Ca3rM>aYmF{>cc@F;qQ%g=&u7;}k`A_ -FVKRn?nbN$odx-B{AgdYVEY|nj{)W2#do{tq$Y-qiOt~~pQQLk2I6N&Fy9o?;b%LTTb$9u&qS8SWjhW -O*p@a_c8gT94c!;+I?UkHbfood$J8d9fxaX1PGnX0hvj6BHWR7%4%5OiUO@(gnMe+m&XgbAUj` -|Z~E+}r$+0U`S{YA#OJGrg}@Px9;NGQc!Q#ck4r0?HaS1I?y~Qb>jneu{Q_mnVHs1q%FxVL*A5t!wR49Sy(=NwYrm(28f$bhyX5Eg%Ie+=3Q;3xN=f2{>c}YE&QiGW#BiPUtl^WBPi%uAaq -DWOTa-&5lpb+7U&;$tX4QdN*8~cR7usE3Nn48P&?!pxaGTxJeh%9a!&Ii~m9Ezt!*E%4AK)>lg$s+GA -MJcaS646+$a&Ub+gAd$!(f6e##?7!isM+F7-4)qpNfy39@S3ko~DDx_o9<`FhNLLHcLJg#AS{Ud!nvk -OVfr$KiFJin&a)>AGGRzzvIqH^`7yoS;cd=rDIq6J}js5wKRuJk~wuxbo~P|V7;}imX5N6oH~0cFKUJ -lYPzp&^md@qIXfA+Pen!&p1ZcmsdZbExM}|DF^YJeLKDq9wO~c~nqs$wn5=1kC(mi*a`5n&DxT_xz!% -zOlFRbh%ag+A*<+Z?>v_kKPx1=EOg_IB!#pn+t16fPy*}f -jN^6)MIaZUIzj7%i-u6)ucxhme -9Dy_A+C(i -nZdi`1`(aMP+B&E)emO;>0mHPSzgQXvJ7K!)B%#S94m;tnWw*R4TE`fpZV9Y -rWn7`8EsUn^{oIJf8R(zmE$R)N3NhW(i34`;zeQX<#}P@VV!+rNoKEP(g;W?Qq1@vu=k|9T%j^^m$ce ->4I#zRuqKT$=iP_C{xxATO6)UBS#UY4YKO&Ov}gGLlr$;EwotAs(J~U$ZCku%h#mhf$0VmY2%) -mb>F%YGh9BNk^(#-F6JwyLR}4RiOQb)slcE+{;w&&OVxmWLpO6nb3p%(>e;f=V5m%yl2MX`b-5^iM<@ -i{`lZDi?Z+Y3JICPUT+)h_UplX%(kp&=e}6-K`2S~@jAi`B6AFWIE_P+83nzg*v=&#CunM0v%CV5D~B -ujwY7+##K@VVT`L3R7P#Gny<~W4GqFDAIkriy7y{wQ(d=4@A -(z$p7U*TT2x(L~^LsHTuH#Q^)7p+0hi@egS+x=C7Fun&Wj!Y_yPN;uKs{m?6XXZB$Q<;Uj;bPKi7%JzpHq+@nBNL534rcS$+`OrNC -!-8+Irs^|WA0o!;`r(=85*d{+Uj|OR<1_8E&!E_z&UK$4r6oDab&c(lsP7CC++1_)x@6SApD!jx=21{ -M!`k~%4N+H{jQv;6K*%Z)UD|J|%W -_iF3ZV|eNzD+NAky^_IuAYaClk<4?AuW>tV=V~AuHhyKV7c#pe%7^9+YFK!7uAGrA%-6-Az|`0YjhY0 -N=0YdTw4afDelBt{03f7UZ9(47XXie$;*g>;5>_N#mk<)Q`OUnVQi5+-3iyK>T}`{3VrrnXTk_^3*`s=YoU{4We`d+|+w -cnfh_8RZEB#yW3jBz#e}Pxq9p&)@UZ+iYc`H`c(b3AiqgMgpk$7*;DeLq6p?0(hE3+TrME%`KKf*2WE -4=*`+yYp9S9XC+zWr}st) -N?sEA{hYBwQq&-Y`VXgziaSx-OI(O=FFEz?h4z)_nX^kb@EEN?0Lcs>LbL}PD!jOk563LO#9q@%WiBN -vRNETS^(Xt*os64--R;qwj+X{1BG1sTFUSC-v9E^Zm4MJhuu4%RI(^S?Tt!pL92Pg@9=9&vTyz5(v@# -ZhbpgLLLuPeLP~a<&duVOB2H%c*~ys>`^gGg-GC0jNo=xdOHWGEpT4~~Dbd7o-6?kfpRga$fHXm1&Rjs -#o#t*hQ!HmdA$<6Q7x;Q1Q${sX&!rt1!KZ}Q@XY(v!GG0S~yZ*dZ4g8{>To9uUVKnDd2_+=R-630U-p -g(&S02p5Z{Ys`Za-A?{oPk_Aikbp|-lw)`XUA)u7FAKHkme@eTa2c%z5u?uWDfGekc{; -uU3ADoJM>A>LGvl5Ko7g?Fc%-N1(ox02bW%s}sqlimg+HVxbCCrC_?+qKq!V2uF6eFT@LHr^WIo6i4= -$14Ui@D?J(+4eO;Hus-x!UEoIhG1J@u_7_bY=9r{W_jt}9G9#t{?|xMZBh<>`b#9f^Z#EWvAM9s2NJJ -r_F=eq@Cg<$F{{y%|W>=Um^cf6Rz~PmRKGb+f -Zxpi7lZgazD+~)cSpBa$Ao?IPS+DTK6_vetMKyfaV>=>Aj<=MZY%U~Qx -lDAA;XBdg3#I~|8!JQ^K*!7P3GZ+g7Kk&DjFQTA}ss09#cadxL#`O$P(&)JC%1CdJ+6@(mewUB;B)W0 -pa=D1R2hX`{+35bDM)4mqVo{kg)&O4so5Z8Kl=7o3di%M|LU82&PL0BNg+hWhi8Lf3&5ieligY$E9Pmy_J6aT&ejX1Rg&wTt)vIlsXD -&*owQG;X<@L^zS8WqrqCh7}bLPo9Rz7{> -GS$<7rKgN3X@LB7^O3JOMp_~Pnmm7pox<3n1W>HeFPtf=e%wQ0*=q;ih`jCp;SAhUcOiwbBStpiwbgZ -n=gk3fL|!4UO0lRmhd|J8RVCkZcZbJ`D%|Mc|ghOtTj(mE#B;-Z+I8Jdzci;r-ifYg8_7QN&dbXMYeT -we6ghc+OWL>*w*av#}9rKp7^~}zG+N+diZxPcO*<>1i?@gL*mG$AMt4)IQ>O4H{4n^(p}z<4mV^AcNs -ro7ptZ5uPq$W=Y8PoAuE@Sc9C?P*dUXMH>#P&o3QOBEC~NQiMN(*GTrcXGulCS@ptNHec;$fL-{Ua7= -Kv?yu&%ZoxFlN{KZEn-P^o(>?d|r3XI(FIoz?I*>l{Rup+!GA!XZYLh6_B>1F%S!%<96M9=r(lfR$N7SArKU;aamF!21``ZwP|wHY`Y2=21*ux3QiByI$xTk|`X;7wtK46aBc?-pV8 -P+$kz8gncl7494Pwg2lVDt~BsXe`0b$Y^q#pF;n#9v(u1OmKX6Z?wuDWtwCWbov?vTbkcl`HRd%99Fj -{4nCh-!8&HD{*V4C9f~kMB1DSLvV}UM=8_da1IAl3YMcHJ->Drz(sk2>oyLaGT(Cbn!l&Uo-?X6MiCs -yZ1ggXf6NM3ij`?X#1E0pIW<#Wyi3Vxx}mijV*&{5C1aXnG`JpUuf)}gE8kqH|u_V1TOCBSd=&zQ}R7 -?LFW}kg8F>5auB;+Lh3L%DB?E%Z8($oqOMPIaWmv-QsjEE@3*0<1;!S -CKsu(MVBW}p@9n$mf072jpx(ZI2t$|kg?ty@|&Dk~Q%dzuHOQo;x$)sC%d9}(L9$%$vo=_9ahqJClK~ -+9=B#>zzj&vM0DxS#!gTS2mj)0qBdxI%xISpC-Mr^|sMfQ1pOPU(S@U7_FS~|Naycz5Wac$hYDd?H&0 -ch%{8AQI@7Vk`rSf7q)w#j2sL~VrA+-k)rwRVO}X41bum-J@<`09GTZlJ#nF@JN)XAtwp;om_FLr@rv -(kO*)W9k$|e5z5j*?JILPIQHYb<<{cDIt6>)Y0+3aby?aOZI8*mB?kE52Q2OzK-sx%*{G{r%v0T60wo -AP2LXOY)+Fs>$(!FFEz-`!{cWR4Gy>T?FLcdhJY*kqISu>^|bZ;Z3GG1u!BgpDW>&u>upw$+vJppjVZ -1Rj`l<;ynC6$={AeBo|3`4@5isj_I`wzOrQnxytsE8{@nTFe;Q)Gxo?L)(fk!+^7)JF$Dbi)f9-!BV! -mI=KY^HDc65D;hmbgTAu8GrbEp>V?mDLL=1QY^{#gjFOcSiTHI9s!on7B|+!mw~n}MqWk4`rWMJjj8M -5a&`wmKFgXCp`I;=ve0LGpd&ok{T(Uf%(vb!6MrA(AqPLjVqo=2_ -?xUqHz2r(V&ac*1$-5;Ck$=(N<@xT}XAQ6fdpa^%F+MIVRxh9P|UMu?|jZa0dkp+G>_!(g|Xm%yj$Ke75VioRgKXj^QZvf9&Fx2#kSSU50zuwb6|o9#$7t$O>$ -f@3PTx1<%~BL87Fbh-nuTfC@lUB#BdX26T}jZcd`U5%^uU5wOq*&W)1#tLCiPJbylt~T@jEkU1N~`9^ -Dt`&}h~y3TX2*pzi%jK~OkFHzzZJo|gw#bVI`>Pzw`siZC#z@J8*C@#7ikF?~Q3###dg(RP=o05>Oj; -yN+#p5^Vi41jfoClrifvc46FC6Wkg;{o3obBewxx8rR!&F|Kc#g2YuyolO&i&K7k%Rweyq|^%lEq_3f -QJtC8Rr=$!Qn5A{T~tbZ6!VoJ#C*(VRUW>>B{(kWZK$F=lT)#t9^RwJ2jEc;OgmM?P2`POY;Xl#2^gK -`-11~#drBhiMh30NK!Nzq+aq{TPLU{N)1%6ybAZ#pgr)C5EgcLBo;j}M^ljxVCK9ruElS)Kz2#F3zQX ->^bpIK|oZ9qW4)@>2m!BQ~8Mu5s_Rq*d(F{gym;zH6juGgJ>YvKE;@kcV@6zdOxKZ${JTA+0{PWoPIchHy6taYjTdtBUM!8R6&Qbu-+PTs3G`uzEWji%;D>i5^Vs0Rh6E_*d -wx1pN(3^bJ$lVIGtrvRHBr8)gHI7dTGz-xmqEu44L}`HjoP5=+U#csgYeM_QUZ{4Yf>36dyBd)5_90q^*up_Lbu{Uaqr3Tqz&}kPnG7A -rj;lOw7j*aYH?S%*RX^FDA)wtLOHRo#uSRKgBmC -cha=#DCW$;eJfWUEc`G2MFF_fF(>EiakyylZO5Tp16*AVzPKKzcG??xfL$*Op1|`r2UQ%#u1f@Q`taP -+u-oIV@LCKb$@n_GL-a|j>tddcp;x;-3JuEmm!g(2pcb2+0lnoFAjFZF2N!28Kx7+#)7%^5MWxnGU+- -L6OMUiwKw+O4_=iqr@kBeAKL@~*2mf>;;9FRuv9R=&CDG$9X0Y%m^ofkjgqu}jUeZeu{(^gMvTO1f!# -Sqc7QUULeZ$lG} -@DSE0=p0Vf?`XpVe+cM)pK;{bZ>E}y2gBC&hLeQ4yasN5>*Y!A;5u}J2?bOcAzpQI6qyU+zC-M6=JHv -iuZ1CNxsHj#8)iMrD+*YOd)rP=x^taR{n(TYUO)7efAs{-qc^8iJ;ZqC^0SMwR;Mc82(eR7k~G-CmQj -{@=HaIq@}AieJo19Af~k>g6D2> -D>xppMWiHkPfU`;*#(<9Ex=_bR`wUM?}7$2lJ#pJw*tNz;q-3K~9lo0Rw(N-oP@NEt-5{FZ_{l`1#$^ -#thZv!&xv07tm0AJPz~?&+i`B``$bVw|eMl=BbOo03r)%W9P(aF2w9as6b>E4yG_?5pTpBZKd92BdOc -#$`aR6LfIo#bQSavb9s77!1dwR3wML_Be=9&TQv|z*(&C-N!|3XdcJ{=K4|@UFfHb!Y43G+f01Jfy%v -A{SU50PL1YT3=>Z+s`f)suSL>f>fP5C%2#3Qz4 -u(EE=Wha{?fCELHVz{wiZd`plgRoPN`4v?ZJsUgCZR?UyZI!t1sDvoQP-7#BiNQ!T_c_~a7tGio_yY# -L~rh!Yvi&s=q(Go#Zcs?wYD<&O*$^#WbZ?K3vf2;muRbxZXHEG>-60w^N_6_INQBDSGv6!vt?V$@XFi -CUBEcm_2yPqzOH`_xhQ56zt8AhaxUFy^`>wfZpme0*DayxEqq#oC=~luP{cu7P;~YG$ml9@U3M{)*4B -8)ukscYEfu`(pZa)qzAuUbzYInGP@7*vk>tC8Xp2OEk5EJwJl -s*7dNCIfUG+!42|JPtuM@bI8vmEbUMm?zH|6omGhwWUGBPSq -+9h`NR=fgL_A|d6Uc=q(?0VU31`3=W5V@lvhXG*SORW8rJKKqJuqtUQDcVjE|a>z`n6uGda*EgtTqzm -MAK=_FA>5#w#UpUCIQj*G)hY9&fYXkus3gG1G|5A%t8>i! -NjSJQ2PR4#DYpC9YkHqbAs2B_kSDJ^d%fzgq*vx?}A7N1A-(>o%VZ^Z&X{xupH$yUvV#(0KFS_sna-Qmw0Axbe6{^@k{y3?h5TP6-~c{+st+LMWs8@;2M&2e$vao}v5My5XZ^;ntO -$^%!9w|+%;we$7VmCYf{wiT`7YqvMYFQ1|`(isJXJ=^)c!6m#M~KYX*6lAA29q2@d<|RI~Jho<_~-fNs -m9{H>$E_M&@D2AA`D<(c&rErtl4-oftW{+DStO_&HC*!mU{AO6fg^3OdC(@N3uk7kggyZ3r*yVO@ccl -2(uK-7tpyyJVfd3Ssj(#+S5RGzmUM`O{kuZAG|kn+cCfM0Ro4@1e8!waQ;U_Yk!0?#L&>D_~)`7iA%I -q+4vqtOpv#Q~@Ff9Li%(zd04*Ou~(P&~IT9vp63fR{6|y?=oG(SAAA{Kxz8Wk){O!JiVKn^DSV2~gl? -rjt0-GY?E9$2YHta)yMXXyQJ>a@4a|5Cme7uJ4dm0$dMlpS*g%UQ;y6!6RI;EAgx@p_dj%zD~mXnV51 -hX!&untAd7e$F}F{A&WG{k(v%Tms3QO#A!kz&wr(UnYGIcty~!o0)?g(g_^slQF)2yW(+)(WTF*``KIo7scrOt*r`0rzf-sXyTlxx8^OcKb7#zwE7J4y9?O)4JGt&)at;^RWRppQE -q(kMj>7YaXhV&8;JOvN#yQ>a%)0>2hujWH+az;Gj2hN$>I3z!`6BifQ?TbRtUX_z}X=3=Sy*K!UUJ}x -l&!_LOc;i^W?xfhYewWp8!35QM36GRlbt~x8$V5G!CL~Om{J;Xt3U&mV@gqAnoW0QAbDboO -%*`RRpHBfx=78bl(y2w2~;9mX%B3uksTM%zg$lXT7LT+m-Z!QTdzZtx_-qSk`D9l-^qK9!VCTyAPo21 -=udTht4Wbwv{UXFHHlNJK^3wfEE=%El{74%rqz7@`=Usu3;7)xy0$73%~R`htkOW5(7;Oz{BnOivIk9 -zswR4}OXv)y(4q**VuM12ut2~V430LHFOvr;_n6)6b6DADjsLSjp!n(x}e8_Pe@=@^wQSo5W)ZBFg|D&^Cq`OW>kNVjv -rvRt3~U4JR7{e0AFOI*{^8lBBtXKE7*Oy+|O1E{FCK=wp!q4%Uw6IpGi$~U$pRqO$%=Ww!@e;D*j|mm -w2rkm{XqZLSzdvp?%+SQ_4LH1_r*F3p*fDS=blYxX33^TqE{W6xK~$g(Y2|tRj#KM=z6BR-+NB6^}a= -*ARRY`5+wQ^j!#Ik^9ypHdZF(Rwr|D4@wfCVizq_z@bl$iM%A$lbH^W616$5x5mqWpNhBQ<+i3FYSf0 -cPsS3o{(UW$1Da>)1vqD8;4NJnfoF+PY7r{12~^UmwC@P57B|n3Wv&!JWrk3axFxI6tn ->C1+}la5~+!fJP0$i&~tu?G*W-B*sC&zb!>?VJiTQIX=l(ql}m0=c}qh%cx~2SKY;m@9b|VckMI&dPg -jyN$1GmLtY8(B -kP)>uXK3hJE~z`Yq)_O0G{xaSh|loxasj-(yo`Eajesx7c3COU~kd7v% -|hHqWhygHL=-ueeYP*U@p{fD`vKJ@NSi*=Q~t{)x{mu0 -6gYRjKsJ~i>@f*H{9;4T?uv=Aa1hezDZ*8(o{Wxh<=EdZ`7WeRNV0x!#vxRSF=Ps-AcBh+-JPVf|!$n -Nb-OYLtbugw2z3kOsG!l(Xa&nv0AcmFz=|MmZ94!<)qJB^1OgSIZhq4@xo4Qmc8`e!8jAGp@HF@V24@ -Ru$BWW1+@k}dzVg2GCvRx%c$8%ayZ4MDcj8oKpuBrDJQT*HdkJ*Mb*!@w0}Hr9phNhf+sG{t-KBC=1C -$Ls66B-IKyF|{(bpRqh-pQMlXEY*I+m9K4f$;6h}qIc&6B-{jTltHEEi{By|<;Gnv^Py_lw|DZy#3wyi+e-IQacd>foU;WDPcxT2tM?4EZvLV1ly-i -wi??&H63@_gBCvezNWhHHYnwxXy-2jVc7t?!O0N#;*d~v+|kchKu_Pap?Ni;+YW{j1K&cK$4lSPBrI9 -0T=HVdYQm4UkF@9d8|N2-l_lbqVf*;lPwWF@r~@WI~phWiZwe{|cm>39W#&#w7BsM{{^X7A`zJ9q`x-W(;RB$2vDiqL>%3GuGhxYk3P|gp=MY2qP?by04lX;;Idw&&2K -7{&4RQF~3F)sVuj#=*LKWbLhI-w68A7YoVi%`Q*5%sare%Toh^e~n4%$n(p -si{@{WN{h(v&YMXXxX)**ay&|Toe9_mZ@f4IhVHIzXa12+qP!Ol -`cga&aDKBVm6+Yg}WI~y!FiswJ4FJL9DL+d8@xv@=+YNdGp}1qS4 -k}zm0`82E3vY0_>pK=wE2o;fH*p%Z{h~V{R;w1ApoQpLky9bw}K!ihbk>tp6yY`!?R~ErBo2S2W+GS5 -_FW;bez7V)?@5&b+m2y9?9TW}Q843K*5J82k;*Ty_>e~?~IY~8g+>uX&K5SISarTx~*1 -fvGx#u~mG@pD90=kX8aWXwK#U3A=njP-q51C3yfP`2-{K5<(gZM^{M74hA8Y{Q0YOt3~K>zn8^!^b?~ -X8){L>!qB}VIKGt=hfO_O?`O2LleC7S1oWs@G!nSfii~cxv0hBR4u4R2&V-|u6M&t9o}G6wG^sJx6?Rt0{BzcDyiR$ -gE(l}E{A(E&vpnplbS<1CA7Mc!-@rQ<>#RGIU3cEDZgK9ki -BFP=@a2hPz9nW97Q&Vm|_4HzCo%IjwOf+%Dig~UN!Nnc9^%JAry<6h2$2_+NAi|VpJ&^l$p!IQ}@W+9 -cHGDbluVoeB>+F0+VfFfdtRGI4suxvquy1&5Or#OCE8xfVNyzD9WX(%adi^EQOEoOIM~-f7zVLDVSd$ -aI@b~Hry+&%~mP-K+PP|ws_@15ZeCUZ~1tbF0|ytfRI1tnSJG~m2Ar-@{;F^9TQ1i!zb2b>*6Td -g}LUhtVfl>WpXo*6Q-AgaotKL~iBjEk|n*GLCQZf2{`;LAaUa%Yw*ze2^nWIvU#gfN2iX7h{4e&uAb5?@X##~AlKQc -~q(6z9doi!S-nH-N-hR=+Du7C%h -{i-bU8RZ9W2}_jZeLC(GDglT7z|Xtc4|l@xELek(HnOx}5A=nT5CU3%}~V92d>O77UbO$2^ShO8Hbqs -=RZ+<%%y+p?p5UN8*z-Fmf+t7n@y+%_)%OKL3c1yJ%^npgJ5$GL_z0jED7=L?q~I$~|lS|fT^| -2qAyb1w3XRs`2=eU!fn4D;NRyJFike7$VK!tsINw2~eHebEtfWwtthLyhGR-pr0;x*`{R^{3|wN_+lv -b0+waHUoP$_5+>y+pKQ_YSjwJA2Wd8zxLho_x_dt&hod_1OJ`nZ>tCXNe}Lmj)bRuziB2^A9a6pRpSk -~&X67IRvB+Oe(2=*!4=Rg@}V4oMS8nDw_l5U=a*(q^gkJ+;n62=vJ4PF>PRk6H$!DTN7b@d3`iZFOJ!HIKIR{Fstmy -BZsBx5g$%7<{FPwJ56;xjT^OnJ^S1muT!@kbIX^C{t$Sf0_vPH%B}<}c!+k3-eNFDgoyAV;#RCzRg#U -7d$hbxK&|`fMYhogCRGCA~bq*WYSHKa?)Z!$gusr+qAUn|p!*OhFELW2}a2!1@uVr{e{EO!@k*T`hoE -BaRpUL=^$#?5(x(9xfheVGAyY5Mn^G|F>q5% -IB(ND7T#xh0{7=lXK*!VjNP92MPvt`^4K^&`u7lJflTRt2ir`4{jJVL?`;J0XVHlYI^xmyv3(Y{%qwq -S}&l7$=NTu$2g)86|YU)TPj6rYUBJd{lV?&q7l3E!u#Yg_~@)FTCLatq7guVqnir>@Ncq)Rc@`t870k@d44TxtBOkIdzx_+VYPFJ-eU -v-BACK$#hoDIMI|k`G4De%G-3vwq#L35_+7Wi=qhRB1dO?zTJ2zIjc`Q|typc}K-uK-C$QRvP#2n1T@%vBFa4ua^uffq}R^*)$<+7IlRV+L9LzJL@su%i=$M;LXj{NwAk7|r`*V0(ZElDUMw4HCJ_G~E61uu1$A*{hV^6>`Wm^qzC#k=qc9lM3IFf9(K=z;#gYPLAMEApuyEU7HP066b-%=y$*NfrQ(` -KodFfUFi*6Shg@hoe}bi`Sn4zzdOEIYmeW~H0sDN=q|=FY6}%o&R>rE}4lQX7N4*OKhec5+PrEfl4Ka -F;N45Euz?)?sE$for%{A0)1~Y??!JA9xSJIGBIE6V$T_i|RTtJ()UCeMPLjAV>kxmYv{(%G(!;tiBSkl5ZGrC -9JVVJqaEg}2F5lKNTu?iX)ljNX-Xu|59VqP6g3vI2tv+h`5#Tn!;?Yz!rkFi{leRTH6bP+61M}Fm&U$aF#@};3Ty -y&@eto!hCt^;0(0iAn%)LNWBE%)e(e+UFwKS^Y4c?{q$i45JdQUa%pgwG~avHP{Y_n@zOkI-q3g%+~5ek1h5sp4&8d6d`dEiPPwsTlvAE*CT_3kfJ -4DdwB{CJ~M8Q!SXG2dGWo&56&SVF}eYtM?#qdi#dk&k3Oi&GEz=v4G~;T`H;yc-yzb>-30mZy<8A;B0 -LS<15x&2e!y&qQ5*>!JXq2k>GLyhdH@X<-5Q?9w+_yuoP*%2Qmja-B-(P`5|2vGJvUVA -{P!4MW2(w#fUTb|ZDNQm-o=E^b!M0cPtIIHZxZep4SeDS4$jKjFD&PK$edI+q4L2f`ix2nC#V4c`sK0 -)Lu_&Gw{)tqa@lKj&-`Y=kWjKcSb5bsM&4YznzFxIB9p-=~HQA4U --cTkHR|tX;U=0W3qX4GeVW6wW=tA?Hqqig)L6FlzS|ppZ>_a-}Vgt^USy!*hiSwr7 -g{lY08sF;VjY@V0(7wzF4ZoCumcpD!}KyZVJ_>OGfEWN}#)osHID}>z%2M|u4L5t$MWSk4Z>LR*7^5F -AsSk`utaBjr?=?!_4)QpTB@bYMoyOOT9+JoS -q{fowFCnQ(tiC=8<)E6<>e~;en%NM%+Ijv{&lFgujrrB1s^|Q?f=8j7(!wg`eVxBAD{ezRX;iLyO!!t -g&WAd>lpp_m;C<9$I0C+c4g=Uv#TsbTfH2|w{OtTO9MEwp#!xm^d)=q*!oX=cWWi+O}%GDrg$HcT`?{ -ucMDo{>uYA1pFj~4Zt08l2$a}z5Y+B66*1dD3xn?>d3%?2oNQ)NTQ!2-?iZ0;1NPP=5O1Kjb%^c#11l -!M={CHA><@_3zf30h+cpay|0oUoh1TwMcJl|+F`Y$7)_uJD=)!WX#v|gRxVe#V?hF$quTLv|SoA8MWS -&jGHbd(otRU%yD>kP>z(S|}8@>Dyf`m=*ZZ;|w*Oz?Mk&iLk?_L`Lr}`d(oEtq!4jX;Uwur(Xce6abH -=TUNw(FuVGPcdR0Dl^EIV6{Qyl!qyg3;}N^YZs_RQ@!t{)0b~kx7?##&OIU17W>jP7V^L&YNE(NRS-ST7WF3LUcL=%J0ItteP&GsX`CTF0UthSx>)AcwCL%C3?2^*0w5}SwBx~R5$hNk`BA`;2m* -!s(Q8;mdvWn)MNN@=D9Sk-H2qB5HFpgSZk}}%iKR6ls9DQtAh>v*y23Ecw=h5#Ry4T{(vsECoYZ0bt#e^3r7aqrP-~Uq400C0p3(?aogL>Ct4ShahCDDQT94V;k`>>Nu}5U -oPE1*EbFb+t?V^4_Wr;@Z(b54|N)xQoJD56T)**Qi3B~J;#^CvYv<|kDO7)X3FK|EIyF9ZUMK$g!2Q6 -`|Nb}Fg+y$i{LcK!Ky0l#Zwoa=Q8W;6T$Uko2ez3y)p5AzJ~#$xS>`8;<;$J+Y>_k8F3xzA?N3^0K+@cM~1{7D_{6Y!@^%Tmpx}Dur5Lu0294Nvz7@>QOAho6 -^h1lYK-RkNj;y^8A^*4Um+g_CpS8g!+n&LM9{>EYNr!Uq8-4Z@DSVNdos=bLBYBZrZ5D*=5$&k7Bab5 -k;b-ftMijU669);J>jYA&%Ags$Jd1QfLRY?Z4d$u3-Y6rIw^@5hl>0&!@38$z0a*jB^bd;2+2=WsGC7 -Jo`{gMd?sJ%`2zs6u8fnK=@#Vprfi`l*qFy@JA6TJsvyWVSJbkI+vH7lo_xD$0uA-8+BlE-aSJjEP~( -8Q98h9LL$oK0NT`ouZ`I(nDMsj3zpmOf;hUQd#qCRxxp^dFh;Gu>nq_qY2Nd9C`=H5OYh54mXbyGAfP -v5rD&mprTPo#Bo};#YAx%y|pxNiOOd;P)%T#Z&o?*8GB-)l;lEC=>9wwc?h9YP+^p{S5QS9rrVDM%Ak -TI5o-zrRgkmFNfUdw}=yE_j*X3YX*aB%(R`NS*`vc$9tk=jB-Gr)ZctSpgGX5GV{YLc#RwLc`9&2!<= -ysA+eo^V5@0HSB;s5~Ah`b?&XmNl3Z_|mD9}7PKu8?M;}KS#jHldQvvUiNA)~3c(*j%(B=k-BjZfI^l|1jSqP5-XXIdm_vR!Tst+qqat)CDLx5NORY+tEpY -k9=?p|dsi+B^%;U5yyu?!9t&Jl+(D*MElTF2xw_?wsfrWkq}U#{W-(rN8j?KLtxwj+o*P!P1x4{?~&g -{XYzr)Ju4Hy1r|g9$k}3QVB=Bc}4V@LkIQ{_MVI`_F3u_`U(Wv95V0LOOw*N-o{d6aQu`+`OCb;n$hD -zdN)H+@Zv68bUeE~L|D6++=ZJTBNJl+U|{jXIhSXmg*^9-OxlG72|5zW;WVo38%~~OQR0c$RSyT!Vo+ -I9Qy$ERGq>-n)-gc8G(4Y+(%pk?hv|8+P75l#C+|X(l)7{7YM+RY*Jw=BrExD%sa(-F^;S8oe;4TK0> -HfTLTaSrPsb&ynlfC3!L-;$G;n-0#~^rIZBjvIu`q6Kmp+YYVe*Ra3ocI>m52cdV;$BUCdM&Hn+ZIS^ -$i=nk4&ULjCyn@QCu9q(`d(%&?zPmW_+aR8)+bY7+v}Ts0F_)dix+DqK!t7q!&J|eX5spl`(wLilERTd2i0=a-5=U$9Ejia>Qz7A;x`skY<%LcNV)aB -14{0j2$T!|LU?Q${9$ha$74Ud8@8^nE_}ZE;Ep1$zM?>NK17&KBs~?zOUaSMBV91eHTqR~^4&wm~pF~ -}ZjxcJs!TZEsp6gCdJMR&j+H!dk8D%KTf|X?e=DIM5LomCFbU$VO@I3qZ2~Zh+LW^bHCo9$Vm3}t3>e -?eYkCd;9Jkng~-5(ttC9Nt1ny8ze#_C!-Rzi2^v=IB}!IF^TO9s^uNa5Wuz5yqv2qik0r{kOdr@<0?U -@O3KT;ZlG?DfvS@ygSY1?=$3wgy#vC+~+ZzRt2SFVCB<&8JhYHcZJ8Q6HhD+pXa10kLh(OqXkPJH0@~ -?7BQVTnH#y^iqAb#47?tMbO6y!4K3xSJy{Q+&u7AGO_y9&lekzk8KAXWKPw=;~=x?D<02JXPL#;keY0 -<^MfSJ3@63Hv6vrva5zjoT_ac{KU{&aP(V_&k+7~9rbhRhvaTMP+9MnuEm+A;xgfd7ISDQpRyJmFug{ -@0*SvVh4uu6GrPPIhN!Xa=ADTW`8r82a{&R5Bn?4@L)8*O~?DN&qfq7ODLUh~ItjbL>M5f~3TbI~Aa -4~=SP|71k*as&DB6)Nja;-QyVu#7&(5dbp<{Spni8#r24M6FFsz=hKIc -+4{MF3LFREJYwgVg1I5&-p&rwWQOxPZ^Cvz{%|)hfh<@zJgPK*G-?u$AT${^Kte^zPZdg2Cuv5Wu{{n -C*rv_#+5Y(C7h`PUCeMmaez_ruzo{aMFgrp&e|G}){|8defwbS@tUp&LVge_lV7<2vc$H0cr^m}yBrG -I!Z9Pg2|mpr~5^;KCq-46b7obiA4PT%S)e{+{#4m-x-p38x^OclO+Co$;OzJlxy=XAOa^2hkzE4s#Lp -DT`T7EI)3H;(PiubTi{yvvkg+eG8$G7fL)CnovYzk(qDPO&X6OOT($Vp*~kKGqm7!FH=9d~4Fl_QDFb -i*LjG4K{TYauZ8|cQ?d@*~RP9t+qm?Tis{9F}2H+ZpD{m_dj3byIk5X_!X{r8Ogdfs{^V~m(_8CEaFPEs-=XW0X!Y -LF>jKZHx1QFo*16M1F!vEg{YeU7>*r)=({a%+!;$(|ot3SLWuK1x{P}+8@qoX3zTbH~;P0OA?;h`Cni -BZcI3;Txm?Suj*HU>aDwU^A*kutGD29*s&|(0zpyec1%3e)I_u5JvYgU>5bc#=ByH84oGmT@>h@4%%N -41q$WC_#6<_kYUz*(D}lYeZT4mRFzHdm0`JWI52e55r(TwUYITlTu;C0Q4Sm^pzu`8?Rm>@pW# -6l@$QUKg~SI|6;_i)S=sT(p>6xN)h7ZH7kmh`!kF;4By(h~)_mGR&8x37n4Ob5X>B0D_e5JiW+a^m;j -glJ4=waD{4A-FWbFvLEBl}LCOt^ -JL<=#(Ii(EX2fp9{A0O4a^@E#$IFu#64X( -}r_v#aXP9TPKAS@B5-b0nd&*4}6DwSHNP@uzOe2L#aP7{0^8CCG0tf!BI^6|DD}xUat>Fgw4oOXR)B{ -uJEaSHO|+sk*_Qgrz4s6lN>Cpk|_nS62_yft}o@dPxBlK{*nDZ7Y#j)S=fvL^8u?&%6&n!h?Tc&0Es- -WVM2>rtr&;Y8|M680e_UawUuZwkpMzU&KkrFdsmB9v -G#Oh(W02A*2#eY!R^kWfjX`GK%$*G9cSud0IsVWelYhVG2aq{YgdVv?h3Pd1G1NoZn$hPbG+&Z9^ev; -)jeV>@2AoPVMP#&JKj;2+45p}?E_^EB! -!IcD$QyyzT$RR665XV{*j2)*5K2l=D$CfzS5%71(4dkN&76!*c4+ -HLD5G8VJ8HK6c2V(DnK6qrm*8O`+0VXa8yQw#{=Ro%St)=0MzL_pz8LO#h#)zYBQs(&(=c`v3dN*Px@ -1o0R3E)z#HZdf;8Fe>$dXo0s4pnxW?u?_Iea2MDSSe|3g5uaZlyqeXGSxjXfIug^Iujd7{SpA=U7u`r -$_~k!Zt{B4O-wQSIf%u9eHxW4EK{V+T)G`Tp0*GfgS!?Wk-36f;_t&B9c(4ixd{h7g?B?;*CHS|yd+IDlGS<;177|HqM3KtVn(0x2;hIpABmAyrzBo>zMg?i4+b*j>UEFPAm-sK -+^0r4-r?<}u(NQv48rltV`gRNe_79DM`=XF?kBz8X75O|St30vKkmr=xZ{QXvg4Qis{g370RAYnc*B@ -NtFOEkM-XzKXMCIp{@$lT@1GDZkbpQPqe!rN!AlSg0V#QnMVHyHHhlQc9PS5oO^N5!+ugB -bR6D?M2H0~hAdMefnyS4^q;eglGikvwJVB+1g|VTj3w -f-5Ce;z)27AN>0$&HituVLi-${V6s*IwJqI10S_R>%PM$?mXhrpK$q~9{UZ6|NC)&?&Uym@R!AZhg`s -?umS%lfTP6GGf91v>yVEx#j!T<5xqg;@75MS2d?DD|0q0EG?7oWAA%g=F!?!p2RA4@!bX@n;?VTtd5E -Ql@>~l324~R^W(Vk}?=m_pF7~h)hd;#}AI&-p{RkIepPml>hq&IS!} -PFgg8m)-jb_XPXP56d%U(Qf`&E6j!ht_wkii3rVa?q9O)Ycbtg~5^V0n0y*{^eAx#e&xk?q0dx|a2+Q9H5(BP_>(YGq3 --d`&agLSbNhh&OkuX@;lv0A($gV(N5;@YSd3Jhb~mEDhm$F`14R?vK2GTP)SNMtwFSO{6`_0M>{0j9x -hS<~=E0WLcDj_syqotL-W*bq9qB5>>mq5&p6<7g2xppu!Ory%zqk2!jID{L8M@PH*1gxqFO_5}4Bc#- -^fiLN5rQ!Vy(U{cF@iQ0)l7E5VhS|Q6+w#`9dORu7#3ABi(U@$B*tO8^1i2o*c4Lsa)DeVILpLN9 --{A^j2GH?9<;(aqD9~@^W7Q}?3^i8R5X7Z*yWzCy|=0ostMe0^h+-c_@%rsWv-&ET*a$$73imkXX(|) -L&3-+_W71!ql+551Y&_&lLuDG?w7kwZm>GOP^?)(#~t{vZPk*@>-^;=vsUG64&vCRtUKG;H!zA;d!fKYmYw({vI}agTIE25F(`M-+M4xq>VV>+s(3~8MMH-h^3Wd4Y*2nlu0c;u_!{n**^IL$(&D~GzZc_UBEj+L?YW}mm>j$7dx$wqbk)1K64<64%_Rcd>S1 -=FT<8-E%0zu-$DJg*udz~Y$??=b(tfLis)T3L$DqYK3$9fYgmS*1H(kKn#C0j^Iy$W -SAV6*$G369OpgMiO?f}J{ktl1MT-Hd4DPXAUXNhh^-%pz5WTY!CxXaPychozLoUz8#Z38zk%3>?fnL| -tyyLLpHSPHfn(#ZhW2+y2K;VlzaQB@@$Qw{C1;I!Do%)UyWHRI%xwf#yrq`Py7ZA`T?^D@CQ&(auOHI -ZcssB>kd{ejKU!}{*=6*bovHrD4=2jUBx@Q;WvSq2cDjX`c8L`bKuittMls)vwj=UfGx=gdbHZWy!FI -+BpA_Bm8KP8(8&tUQot4jiEevK2laD><@qw3aDtxkJ0UM4NaYCr@WD<_IWauVD=0h~|^wp!2Q5uV*2W -X)}C_?6l4?aLuhHC@p2(0OzPyE&+qR@*uuU$^}9L6?iT7owY4wjca-$Qao*ms5HR4Lvaa&X_ddl_$!k -Oag`KZ!TiW6AN6!4gS4N3-@XosG*cPj|hOg>cfjoB9O7AV@?4{0HQI==0Guk^QZeYV~dv)lzWl)0cZqv#?I*U$)rD=?-9G$c0u -J2&z2Pwp67Cpiw}(~S$$)b$Q6{vLracqu5%&4n>i}e87fA7{OVTnMWQ8Nk`di+gm|AG~KpzQ0lHV)+l -&qbqls=-~^9q4(3m3&(GJqJ+4!5xsxty%KzNbjiteyApG;03ZU@$MtnNOU}VJRyQcu{v~_lFA@Ru{I!3p*rf$fM-@Ri8cV1E)l@1%wn8 -0o_n_NIrJ_~F|A$#=yGk{i=dYGOALvn_6lER++wvBb1+kQjEwj%7r5E;`~BpZ$=l9&3uR14sL+O(@=L -Mbx3ZBY`#n=DO0VLpUBX4?AJE@dpQr!D7DJJJ0aF7$Q1|mZ_#ean_*p~#FZTVe1pm{1f68Qo7y%;~h= -VXfAqYak&@b14Vf;u*@3HRzpq~UYM10IAu_I(XoWVZ1WALNg2mV?pa1U&8=*UVZA4R@6IbvJ*(=&&E1 -pN-3BkTxf(NAUG0sO?VYD@fX9XNrH=p79{USsj62oL-yE@2<^hdz?J-~soCARu)#0>(Rc2#;*_5nX?L -k8$K!m<~QUYbyRYB$J2Y1NfI#7<_Pm4fMSxPokyUKKo8{G4SQDLHha~34t%V@T#mB%FKO9UyIz_U805 -u_o-kH7ySH(*KYf3+`hf@S0sOILZl9c@<$j0-n%1U#snOeGkUw -vnt)G^2EpS-4jW)iD9hjF&T93&p+UJ+4^IZ>{orz{ -2%+;0pc$txV0;rL+*e=eT@KLbtER%9IioHh6VYlFn%u!1fF5PCQ0 -OUB_5~z2k4ErSc_SHx42C4{X&LhN~B3Onw)QHzR -k_rQI1r~U1`dC>yVtZl<-$3IYx)KKCN0r`ZDDRO09W>Q^j^(Mkld43W(%RKP^x*~}6DELeW+482lVFl -@yugjRiw_GD-&csYP7wYOn1OSeQdlDsAD4U9$dPd)QpYA2vdz;ypkLinUZIs-drHE=32oe(8y+#fgOO -eibGdqc&3jbeJzjQ3swSr|o2XB#(XobJ_IE%RaJx^>LVbg#8hzYT=advrT75XshPKl~9JFmtwO-EbH* -CB$74f)LHUf-E+LeM}K%{6tp0a@nHK%1wuO62?$2cD2^s7RO!KCLkbi-FQL;9&KaQ5zm?KG+W2>TlqN -PwPtT=jf*HwWtP`PRlRc!_jko9_v=E^XX8mvwIZZ0tFX7}_T9o4~IwPizs#%(7UZIQy-Wlnj##6cU|i -x}s`b%p(J0ug%FzGxuE?w>-@KzCh~UUd|P62)>N5l9k?#0cd6At{F)&l==f|@%6xP#8N-h#EikiP$wpUOdMfS>B`{v^dT`YqZM7mG -@i49Z^PR$)%J2lM&_{s+_jYA?OdNEdGpCE3om-q=XOO^d%H6v)yaJ3D{Z -X{gxKDLRE4w$WUlR$%6d@|Qx7*Xu=G{ZjUUyg&o(%$@TD44xWlHocYQ0wq2+z*!#)5!N+a3&&f9dx_3 -pX_oSuVEY$vta*{50x?K@FJvxU5OGyr&Fhsv;LA`2~*qkHXG^GfLmH)@??z5<{AJpSN;pM3Ea2^3KO}9qgwc04qVvOwQSV~y;W)v*>wa>si-42WU5JH;yI;Zf-ogk9!0RhXjXph8(XRpjx%folv9L{m@)RXhex;;pkF6xtR? -axEA4e7E)sP5v5#tAu#$bA4d>G`BwsaT;-66@k39o?G^ -EY^u!02y5eu1DVbr6g}ok`B45`Gv_@OWTP>WfLcV97J;T&&U=sBV@d^`jMwyr$+MMSD?CFY=ge~hcM* -v_$Y?cZr9`C&k9rjb_$`#TT4N$}_cO+ -M}f@rUAs$-%84>gZkAsn*VWV&Y>O{^`1a;e+Sx1PJ;J8~)+~^wF1!p+oiRXnNR(@|W~T1h>nD3BTtqu -I_M0x=KBFclwvc+nhvtDk$o?O4{K$l|u`i*FNtltm|nHrmRF>YGgjA%OAX3V=wryBfwA~U6Io*p2Mg$5 -e|$#EI%YD_s`OyFL01j03Eo$F;vIVO5O<}@DFOhHHxK1(O{1+!22VR+6H5a8meB_(JGEA@>W%N -06TsoO(g%WKv@aWiQJZe1=qSlTVgnQ`UjOi{0DM+3E}^;?Fy8hvN(9e8`%F&hMn8@i32+#P6S-`<;B) -!R*IpLl}P6SgQGXfWSj}Yl -B14A7&{9^?<`m%0u`PL#q+t -i8YN_O259G48G?U%~(Xt;1a#i5vj1mBP<7x&h`qit!^IT||e5UKh-H2 -(C0~wABMOg-rU2x?L-{mR7RQ?RzZLdK#9MY6K&>)V1$=yTF>l2u|s*|_ml!fpKx;-CQ#UW{ljn`3sf> -=?c7g5q)tUd_hX|%@MqYHq@?W$nhL0VAMeL|Bc4@|3TweshD(~0uoba%mv!#vjeSK|0^!BGo7>ot^hL -DFe8Fj<4E)2C(ZTL`Jn5h~w@`?5zLSL3F`xPMjXF4BA2|HgRs+j%`wmqRqCx_1S>FZt^n7n#gk;eMzk -*yvv*JowT>yvcW!x8KwQ;5&R3I`t%jhtz4_#SOK|KQ4+m#yeW6)pKgxbJQ{}xyeH$P+`c=g@CVDV)9) -5ex(prx9Ec99<0K0V{d=1FEk%HVV1}iwH4&TfIYn!%nX&1LCo~JMY&8s(YylbhtCMI -B~zJou-S{+tJEKk&7KNWphb;_9iad60_JKjDA@CB0@w)mhw7F7=W$!Q9}A2k)%%kcuw;1}AUX#9LXn%i~w4l>hnyF~PI{vc9Um(gD@Uuh4bhMz*p1w29{W&=^6Mdm+E87pegLIP7*>M72KmN}9e -*0gJqXB*1&%}HC8R_S-!JnC$7Es!oj}vk~UeP-KddGFMMxoeL<-6DEOYZO2v4;EQR^~X4-5IXFd=Auw@4vv`73u7-E=3F7o!hgew -vQe4uuCHn*8KFxi>Ah%>V@&G24M)s*o=9g_oZ!hvWq)_B|y%gniEV|9o)VB{?+(UtdNSNLHql9p6Ng} -H1o!HHmOicQQ#SJx}@Ia0fq#bS%9=&I-fJo^5{daW>LNUW_(zx7t(>`=tL#AlE(j(b6M1tJC}$=-lxif9+5jOnUB*V)k7QWw6q8ka?|s)t(yTDTYPLGeZFQIBer~Xepl$F^E -^bqTKz?nnS4$<5mwn4ZS|xW;oL!nix%JT(u4~~1c)TJ4GzBUwBVFW9olQr-L9%TR4O&}G<3b0GcE^TP ->7Rcdto|}$=;a*H5kenGL{2ZeCxW$L*cxO<-BgiWVMeu-i+=9F5F{Hgdm(y+s)^Dud$w4@kCOjH#e~# -mOu;}4dl>5!^3K8kejJdg61*~x)FqDGrtngv~d@B8a-E##&a|KeJ5s;*siam4<+1A3lGG|$&;|>>OT5 -1zY}~Tc<;KP_g_)TN>nnRQo>IoL~l`2=K0)c*ONSN*@#Sq20dXB=rr5Wm%x{`M`iaqI0+oGMv|8?Q&! -_5>3B%TrJ=!sqpfn@t3W;CpZS)3X`A_>n)vTJmHpiV|Kv^f=Y#&Fga+fk?3YeII`Kqu*jpxtdFG+aLL -gsTlqvAw@`rh6dUUr?zgakqjBnUgiw}FxC_dJ5N#Y1G20y-*w|DgYiBK}Yb9DNfOJNjk-n~#rt?AJb&`G=C ->uYpKO!%7*=YI#MKP5m(tSya=)fKMeb&;8^gYV7mXb>_aAh|aaO2PLjxmJ)3)w4W1zF|un -VoZjA3SdoWXD(?V|&v+SHYuqc1;bj(_4DU0fm`gPpN455Sh+K1(Wxip`&Mf9X(wFYlWZ?hV<;YA^X>h -@7S{d3n8L)D(H0kye|UVHHXB09GLeh3^vpy1mP9An;-@<@<=LsG&kqzh!B@Xe7GPK7ZUsZkzQ`$KJ6D -_1fclsSvk*i?s&f7x4Mz@r86vlbr*<>mO19gu~}fl&>-h_V^0(6zgDe_E>IaQ)d&OYZ75(@(Yn+K=x2 -2{F|^1gyoh<_rP)dw7|>9b*TJXh#)CQ7e5t~?QPi-)L+D=$pbq5wM!hcB9D#x#cGE?8-CVr6%lQ3fJ# -)XU(t*4~7bi`iQ5TK3@`5L?P+?ZiLQeyp^toFl`}~F+gK>LJGh8~PP-!PmEVSw2#$9SsE<&Gjyvm%~T -r6zqWds*3>tlImYz(`l6Z5#^>ZvQ8rL9UOp5^pGNb>caHD~!!@!>4>?Q|mF>x*>h>YSH)?M$+d*-j>wE<9*H&RoM*!gR8vMTe -{{B>pYk1BKDs;GhU_WOQlcY84LbaKSlt;e{!c&P5o0iH#?&{E(cs!=8b(3(+&EBdceW$;`N!^_USgyk -Z*cpBJ4rjMrr9D6R6Vz~_2=YF40ol|j*{(5w;p#|i;Q?u~IK_Z>>R(d*HuUI*;>l7LM<-*7&)}WQ-9fpe^czB6-7O -&Iz1NtL!?64i+YM_Oaz@#2H^_wYH$ml_V=j9Ce8n5!fgtWxPkalLHW@2L&rH*H$n3m(#$E)S1Giq$ji -|RHLl2F?kmh9N>3Y>Q{}XvKzUF=0*=<-sCs{z8NLA-%E8WjKt|2Wqf|ctqH{&XTZ~y9z*wPq|Gq7-O -v`CRwwH&Gy0V!_XkgG{(KaF{nkljJS>v9lD?ij{eNX!Ht6BFzJk%NGA5?&wNnHewXPflFcPjHfQmH?@ -@H6}Qdxw1IJ-^)jPs`L41)>mz;{*zU6bOL?g`@i>m?U6`AV{19Aq@Maj{o8O{mEZKpX?@vAIsJ-{*}Q -*@S)Z6wZ$3xH~MQe85B7J9gyXB=wi<=zgRW*2 -_0`WYCgx;$JKxSK*Ru%_VxjE;F3>4b&UN{lkzCE$ZdS5LTA4G@p>^RdvGsH$hajYh&b(G=Ja`?pQFPANi44)Ntla-MI52UE+` -#7E&)C)0$zmmnsDM&^7YxbFJ)M*SRED#^wn>4 -+9nNRY=@?_}C(sxb=^)AX=Q+;kx5l}nf1u5UsW)1vpGw0kD3t$ynd(>9v=UFqHBYtNYW>jrCcE};sgW -eqB^m&2-Ve`==}f67emhh|LRPj!z -1P@K9X8s4rtq~jUP#c$srP}N-8{>;|CBtIz}%C<&=%n~s5E{hsjt@PCC!t=Fp-s8fw%?mv8bM{+Fr0E -f5=lDrC^y+me8^Tnuo(pa~IPuHbTG&-)b2Zd@U?8e8BE{afSO!i=BoiM)7e3{-cf3RyEE?-yRzSgW!< -L(VI?-qPgA5-F-dTL>-o1ALk^Qkh|b*Gq_wGz+vZc0Phv#Qq=@*b=xCjxle?>=^s?sCNiWnHj%uDi}_ -$pN|OITC2#dL#4!r=oetq@vfG4VuNm7&b44Uq<2pBT1^&d%6p^#(TsZ!nub5o;u|Yga{g9);K8z2BM0`|S$l&lT+&LN& -95jufcEb1TmOkiMSU(&P$%7N_^a)RnL=*L?)5oHZigA1t6Yf0fXw3UG&|^E3`<;mLF_QG4gz%?NF#c3 -5?ql1}xNpbeW05`jbQuO80vCaw1_$)WWbNFPL=HcKB=|HYQXe}h?9>rLyL6e -Odxmv_+A!_kj^75)0kcNXUq>(~qII0vZa*yT`%=a}0_4+oukI)7e -Yfj=Zfcip0|NZdaQ@UB_3oe(@3qq8eHsVxo&E;15JEb3yWG -04Y9BnHQ+K+530DWlH@qffzUvS}DRQbdp4*6P^*Z4WNMBe%cW2o#w?texIJ~oB`v!gP3A~_F#?{w3TA -F)#+L;h8vlH0Qcuv}{J6dlyLpU)*K@iGaC!T{Om%PkxmZ;^iFC#2aLFlvF$d>fb1YA3v2~-=7-tFDi= -tja7Te!(m&myS@k(d%BekIvim9|4&sQx<=f%Jmzu?ih&)W}MTbIz+68;~lZpdRE-%Wz`Pg=3s-qPm`@ -0DdY@TdKkE^wQ-b7DEeUZNg%^;?NhepT|Xjn-e?sCOcNKEErAew8m?xR-*586pX6@+jFmrJiCYZyK -r&?;*Qx81zVStvlVM#Yx@P@=UYj;rsg7+MKWR*LWrt#5&1a3-o*!jXNg0ynDApy@>2FyqsALxiPtae{ -~R?-8?+aSo4(i)cpmv#M=tk#(Io)m0K=gkrU!)SYv7>7F(;1Ez-Pz*6&TFE<_0vk_1YNwR3hHkkDkSydaf^JOaC$m -hn3A8%yL)?ifH1om&H1-I0@Q4T=DQP%j -1v61JfT1KoyaM}zOr?AAEc360Ruf;(7T}g0E -^48tWlxtw!;|Lu`DEUb&{YeHJ?fDQ_)|+pUl1GkCvBOvw!6M7pk=X0i(^wGONSv_xLuLBvI -*!!MC>!=Blz#!gak1`!t`@vY4LyqeyTK7p_%%_c^!-041dP+G%d#{w&=gJe;1c!Pkq>C6O37@QEC$j$ -9xk&^mu#oUNR>Iz3Hhq%NB+wHZ3r~MlkI-N`qeuVCCHDe1$p$*9(q#5A?~z4J(ic_ -qo@@7xS5h4QN<`e8h}vjSgH-9j{(U?`x-<)$=8p@1-!Fc`2W8Gi`Sn877u4D@c%Oci`Rc7u=sMRXXu{ -ttxDX$)gA>_r8NoXwntkrK))Va1GSs@e7)5hLb8$UKbUq3yt8!G=KPgKJ`pleFSw$60xzjJlCtr3roN -%)ytn}T)5QIrzAm+1W{IgzR&}N-YEr@Md8g0(dy1ct24XdcJQl1ltXt0+vQnmIE#kIR08oB2-9B3C>d -K#xpcP*lG{3hl8SLTZ@)|yj=v%nF7mC;+Xga0ky$-tvOR^?@4c;%HY;T!{n~B1|-+2YSYI|gjTc-2IR -?~LMH=5WmMPa-OmLDOdv8?-gSp?g;i!_UbJ}_S)GE3DplCbwVf8Al5gqB`J< -!m}pP0zA`Gb$2*d@kZpY3)h>P9sp`>nr!21n@I>!azR>6kFuj-jdh)hrWAI?}iv$O`D{6RtB8NA$ZzW -qnyjo4)>XY$`rs#@z!OCZm4*Xm6?HRao&m+P7Ixh~5g}s}Mc^JDhpA@y2R+pz@sK{o~#K`kvQlJJ3Mh -4PB4S0Rqwh-b#2Dz_Pxpsx|?m|MlqnX345Au{;?IIlNbawMH=1cm)WJ+VUeW%R9=+;4LI1$X~DnPYQ( -I%rJo2^lkhFU5?Z@_CdRm$rNerW9Ler}m5R@8R@GS&1dx8=0mcM@l+y-{lb^GNO-&QJ5-Hg7!I9>(Wa -%u3=9Ccz-|X@S_c|J)(*-*^4qBJr!;{?smkqX2Q?NSOL05 -m?QpkaQy3oAOZ#K&*A+`gy5*BBK|aY6Fgp4bj^@pea^hjDKpZP`D1Kbw*a80-Cr1Bx -qmkK=<+%V>xkW5bXG;;2ur1c`rj?%v^!{76+GpE9On8SkScd|)+ss2->20pr1r?dV^EUVMOFefpzag4 -JZNSkhtpk9Dd~CP!nrL}BLd?Gm=`9wpFUCvw5AzN~m1o$1{2bDKmgP}`5fi2yfC`=GwJNg&6XoXT3Lv -N1naC;cH)$j*yc($RNqCEnt}5K*$Pri!)ywXjGj51{+0J>nSY&)(WQxcyRE@HgmT=jP;w>ywbnx7NLt -4p8?Wr*NB3udzkVfIbOTg1x0aCHG)VtI}uEg%|0HLe#BN&R3ZVBYyRYgu2(?z6UJr{Q3;@E|ai<96LP-;r>JPiu+2V^My+O8OPSw-fO2`Fsb*6Pqb73Vvn?eYIH|wS)IoW`h -7NK2%+twRHSUl*lNoi!qNye$dY%qI#7Mpb|0I0f$^)H<6*O!9ZY8lT8;SrUIsYNqFgE~_(Q6kOcBOmBAZLv_d%Ci^1J -bftA;$F1YOmp`oov@pxM!tM9|FK|ovQ#=j)Bx}&bn;F(zA>1kd=WmbCA4)3?Pt*}TI*0Ow?ts9x9ZvRnA-TyJ<7;#d~}O(60Ym7uV(x1qY@S>=Juy=4)EZk -%V-9#a>B$$-M4S4;9<@iLd%Ry_M9!$Ld2EKoN&9(jU<>hB!SxiFwhCGd%%t%Ss2uT3)D#7oOj_{j)5R -SuU35s-#CPpPUIlKcj4edKAc$cOcj8qAo{`wQ+d$a>ByW6&;Qf+z9ch9Z4>+Cf|l-^)9oe+h@g{rBx( --GYCDrGIePH;DS>A%E`ZBS7@19>HN8$0-;C2?U1;2t)`R#4!xTVH6}t0tP{3pDKR260y(c;m0fyNsj^ -!rg`@eu)>;QhET;=i -jYIpQ$DAlPTVi3sP}G#c9lF19KAZQ!H4GiuTT -9T#@f0qs6BSR-HxzjR%4srP=E32|W)vzMQk}B@isgHujYPOD6$(wVy4rZZ!2V(3u$Q@0fVelF;LNgr4 -)w5d(zEaGed^c_TOc6!{7k-S_GDrSkjF1;9x+on}0muds-s8JasOt_?|#GWUov3U9+SXz*{~`J$N{<# -H0(W^K8Km)kxCKAt&%YBTn#wIFqOEYE85&4WCnobt!>B*)LI`b^8mvKWYi(J+Gwp_YZXRb%B6c=Y+@c -7T<5AWFFPu&RCbEY;(s&Jsi7UpvjDB)aZINjzv%FU^xzfGE2?x!aZgfrUUkE$N|0&ZHG -_Je694MV*@mDiih%l+ed)LZ5GuNIuDS8|06&3xL#OY+NC9RbMTV%22_ZO&d0U+_cmm1-vJr91(@bN~6 -|@#(T^q?4Uq*VY@?fYZgqG>yw$FQl^o+@{c_{MY6%=v%o~R{?qyqo0)oog<=T$KK943V%tT)yrrmGJj -Q-bGa3i_sEvjeT+b!hW-)?GMHGpQbB34(zwP|se;-*8^7g?YqNX6O#}!}k?NT^l02-FM8?mp@}J6tUv0YgS%@id2XRTQ?L`+!#dSPuE~z{gj)@`m_L_v=g$&C! -x~%MyKzEkHH}CgRf88&DVg}bOX^Dk?IFIYVEGWoq(6BMx{++gZY@QHi>>H4EM8!i0S8fxf&ga(^&imY -sVIX1^^E~ldSEz`fJ%jRIP=3^E+S!zNYU>wbqnQgj8U@w)gA$f!V$eqIR?8H8DJ&Iuxx+=gwfY?*<@w -6tnq%f~JQ~d&QWrJrmg4GxiZevn?V{mN{JBTH^(Mv_L1Sa%fdSqn8y&dJ_*dOzg=$dAXu_-zCZ`5zt# -@BAp?0!Cw5Y1NJRu9dv|zkE7lDIXTbSQK2)h`(A;UFU5=wi>Ys1vG$}hfVV%_V`D4VxM>7`0|>fU=wj -+BN}Cb{2B$QsvA7$9>E>`%0`z}zd;(yR?|BCnp$a3!WuY}Ja@*Z~P~DrJUN7xYty>r}U_8<+<3a;^aN -!I)%i?mSpvyG$-5b3ea%9o_b>TQzi96qI_LL`?AX7z!kPvs^ -I@QR`vVCe#@%hpI8+_fe?m+#9@3uVLPiLP!#{90H~d2?b~;{1;RK9qXdloMnoa_`1X*Wl8o?64m&;)1 -3QP>V|)ny*fs{ogM(Q8Ix7HDNAnZ@X&xfO<6j&dnQ9C>VsZjI#0x<9tJrb^9qH&4`*%eC8^M3as?v`H -b9nHv!*wz^3ObGw5#rEG06%Wq;m6zPFr*}oO!t26{k;2ycaj*#NBJ(89EBz5r(f6Tui&@q6AG4~wFPxP&%E(5uvoXD~{v` -KTL@b(-&;5c=f!B*{t;C*$CA4H0(g$8e-fo6_cd6RLLo)B)j_}0C^FrDw<=A2_%UJ&47)4CgUU7gH?a -MWuyq!#W$`U<|_u8&0`xsSQy||KeN^c^Hw?P{4R6tyDDX2%QdJHESn@-f)01+nWUf{9(g{RL%Zt*WfdvU{I)vSphFNrS-@is -%v1qetQPwQ~Vk6^Bn#v!h3o&uGFX`-$RgK2Gg3Eex=ypp`GV8$hOpFs<1q@XjlDsM -eXo(UJkEJk6_m3g4L}6t*4%dpd#)i$J4wr(hU$?aLvtw_Gcs@ry$&17^Ss;K1sWZ|YQ0DPovdc9rmq( -uW>IFaXBYaPLRCbXyp!g6_Vq=+lVOt((<*eAXyL#=KvlAs;7K&@AgV$(@UA=i*3(6ht~J9DO8I-KZ=X^yo -pMioJN>PuwI^BE;>yeU=6y;HC79d7UGN~;EV34!}L2rhn=x -_*v0#)NwGBYl8ZYQbQMBe^xDrP`JCcj>3n>O5&N9gL{Lifa`Tnt^se^M+cDn~ELEEkd)1Ok>Kl*!%oI -D+KCMW0Y^n{b`HLb@%_+TlCJdxZbYC<&udHnFmhpY4RJVZX3lXT(Nt2xTnATx44L*gVJLW;Dcszkax(ojuIKIB9 -dMO$m@hl6E&zL9kQ|dW+f9@^4UGi6icpl&vE7e%}`I!Y_>bK2yFENSX}heJ3U3O}lG3ps?3!4DQ_K-& -@2YZy20d(J;OXZ-cDv)-5(czb$?TZ)b9vHJNVSlAK1R%T-Y7rz#-2`g#OSOjU{3TZN9IqRFX?IB$a!` -LcC{lO%D>i+sr3bA!D?-vRe3GWJZC?IT2iyEVY(1_mXIJc{&^5|Sf@gD`4poe+FJ=twmMqot?!mP5Le -`p;1n^3PD!k6-pfRE2zls&>ExQXqjt5CQIR>PSuD2({xY42CcQfe9FeA%p-)3Pvc5{4T-ZfIZ1kZV8j -4SdV|HOh5-5B0rNOK;$QiIK(?Y?A7o0KamIO`a){m;Z;a}YBwMHY)brufS)NCpEOqb=^c-=Puo(upZQ -0qiaf?N9y1=(L!onj>VEbE5Mjs9`(`ro$fgnS!O1<6WZ7|gDEkO%f8;#D&s?fQr;|F$J_&i`%y8;xfk -OXu;MDI>)%AUk=(6l!WH>{i-V+1JJyg;Pi{Bf<{|l&U{T-@0h6KRhqN-mG{x72{^>3r9ZJkjgK#8Xyr -=40p6t@b_A-{w&IF@O*ycp@-N+D?+c~)~O -neNNBM7j?-I0^N5hNy*@4{287-NN${qrn}8tFmufj>Cn@PigLuzq9pI-&>}LxeNka_f>a{CFoSzWK<= -R1hsvF+j8Ms6=4&0+-niAha5Jw@#33SieK`s@evqKoHSMqD)R>Zx$lH6T|voIU2ZlX;d2Qva|N{pJf8 -A#XHvflvx3^L`_o}@6Ds~cYp>D*w?I}$!Q*56QOrO~pzgW)Ug8j_{eA_#E=HP;3ht!JqwSj*fpI?;;- -Idm7}^)466wFq4A@|=dmnE0E?KW^ewOef_Qfaiwb7S)%S9&oojrQMh2rj>}0oSLjEXn8J4^|^_!NJ=> -TOQ0P#J8>sTA0ceHjM9jCw}g<@3upi|>S<(lQiZ`|#tN6B3v;gdlS`fbX)t(t#sS?nqhu0jlE60(L`)ebsBEC5pfOBYdX_0Ciy+767TSGGbW2wg!?7T9-%*}9hZ_vfo1zs< -XV}>N{RSS3_oUCLUBY$^lA?u6Hen^aVS7!B;{!!W;39UkGbCFYEZS~S+~R%Bg4#=#i!bEB>&*DOm5kY -QdXpNboB5H6>{q}gM$*Dsccr)&7x(R3HgEkCna(;^4MKblEblfx!W#h6)%hj*PBamXd|HR}>e{c!KjS -QifzR@^KcW=q%9H1Ad0fg!DsV>LKX!~PEHmwA0HSdA%MCje%cl(069k=yj#G5Cw`ba(OQol{xg@xjt3 -_RWlU~lS`yH{$UCR}>r~yb-F!_?F}mrA}6ah`2Fa; -CFHYxFVK7u=GIjVv#h7-KyOtiHJ{@%IgJpph{S+C3q%xWT^EOW>>f?Y)?D8ozzjH2HcuQuU%`ZQ1K;5 -%%Bd0dt!-9f)QBy67nw5Cx)rOOrO#krEIH|`qK`UZZ&)vgy{^d`|WzabN>BucPqy>DTF%7JLDK19K?V -teCwCRm22KQL;fkKz`s78q|D2s73e?oer!mS|47^y*mL=!TmJK-QWqbb%XyyvPqH72_hbJjeze~XEBU -vJ{W7}b#|!<2xrrephM**bgCq*>kc&b{97R9`!QmZzp%jRr5cNIubpWQ%sLlh=AV(^QgpVTJ(E>yqB54|Jc#U6h;TgJZ6FK7lQpM)1^6t -?mGOJai1)v#`@%A!D$aMh%+}}1899ua)V=>Z6fccdYsq4!Z6*2mwA -5k&Y+bKTmr3Fg2;xA;a|*2TgosP&6Rb7h)IvjG0$Q2PRd_c;HzDBjOAs -$tRE+yZFO3LTqEju2&>F0|BF-%X>Z)4H;8!Ap|90O4)yXyV!y%W^~3#=rm_cIb$^@bX1GoFxjzU6BR7 -Xm*=Wr9rfm9aAAWJXsW*wW=Op?Wo(`MX%0e+?LHdRJ -UVd!$>LH3~WN~8SDT$lJEWyJ-j%xXl&>uo^KEi&ufy89usYwXLXI~zDSHh+(ydHD@P6JQuypTQ^Ay59 -QIru>aJr}qvbnl0?0KVWFCPuH#Vn*&RV=nTy69KZ7?cTwS0vK#9UsKJ*&9>RGm~aCh -bFo>yp9m=2UNWJ`3|DXJDkS?&k8;luRI5iDwD)bkaqJt=HR}CV^pj%I-4n6T{3@eJpIEMmbCYZ2^a+2 ->JatE^Or4R_lVMW=L{ikBMlX}+2Ot&N7O7-Q`Hvp^J0q}v?0%5{NvHT17yEOki2T+mqS&EIPLU7@k{E -^%2t>goLZTG5<4z2Paf15p3~b`V_uRc80(~kzUy>2YQQSe&W6pH?3H!t3)13Q#`b>r$4F%z67}zm~gg -p9sp4>$iw08P6`1Jag-l8#V-|{PtgdC4`J-x3xZ!>h93naDEgVvxx3crsNEcyl -zsK1CWU`gV6dZN6+xf=4d}Q=^rPvG9BGR`bBe5aIK>$LuT#W@@Khk#hTJe{Dc4GxHUf- -TNAu!M+iu(Mx0g1$X>YQiAY|7!dnS!UK0$sXXF$-Q8J5hE>DAXw4Q#fDHP5*2u~?VV%>XynL$B;YDeL -a?R((#Vlgv%}6MHAh3?dA`wCLO2^9^W^9Z42RwYNMfcKer|1n@mCu{((?c!hg3$OR`9G!0j{G{!a28t -USk8w#Ljt=nN%O;>c&OM*bRqh%p3Xp?z`BHWsI*EEy5dBcR&53rP%<-i?UZdtfa*Bc*@tAK)111zeVR -mB;0&h(7k5;SjQ0P(gy9PA*#0`hE6!j4>zz_C4fq!0vA0v(l`$YL>JwFjzZg(@8y -4&to6nFXl#8{9Mu%hHZ6srg|E;Kkp2c6RQSxhR^sO?ec;s}yBz!j-{V?_`dN-C|$oF3is`JY+_42JUs -B8ab+9N+NzdoBBwd$|Z)1%FcAD!y@c+N*Xn#C$0g26@N==7KLG-&n#+;GRxI*Cul2$qY8{hAn#*F%C_ -`n?d)&$0o=M>c@@$Oi0?^R;D~rY%HBwreP}lht`=b9fYNUTT!tIBWKj0QjuG$m%KA_JU*2@p5V3w}C| --US8McwJ+O_xIggXgbF4k(f850rm?^DqpEG8xU>rZEkt@wvV6rXPQ!^&1T`J;#t|IAS8tu`XH-u5WCi -`zZ}4Cm=sgPZZ`4h4YM+8r19-yxrIXI<>(zpIAgv+cZSJW^E+njq;mc)YS0*=SYF?TgB@lw1C)pyb(K -XV(!tNU|u{vR2Ac4Gv{n$J6bc0mapF69GolH`a&C@M#33jWys*ZNKiFtbxaIux*fyz&g0lX!>VMnu5Z -owun24!{;S1gt+*`_wkl)x#0{D_`Jr|ys(Rr}(bv?cIY^OnUoX-m759f>Jj0DEaKEI;F?p|%La_o}V_ -Zr<`ULi56Oifq2Qx~T9?Oz<}Lf!!NYH}!tCx^w@Y#zCM?vxjJiQc1S%3!U*WDzbJvEnTJexx9@RUey% -qCGqR-wBIP8r2-5mr`8zWqDhyRYzshH7{Z7Kox6Rf$hu3W;w+CdBq|jgT!|@u5uPLIm%xLx3m_!Zqdj -w*syQb$RkT7Ts&X2_ra~becQf+V%#O&2hADU#hoCDQy)3e03o9APy8{Er;i9*p@a74Di8EYM#^T1aj0 ->Gr$4tH4yxGqJbJlt$P7WC1R~b2%tAbfnEt{d80{wN5nKUrUTqUcThAX8@-Ib9W;Yh;8K9Z&2{x^F!$ -qt%{YSk72y5I3@5VZKF*;xaq!{5*(`o6dMH&MhtS?G^_-*2LaPtg)ZcfSWB;O+-u3L@}5jzEqfgd~dK -D1?4DcsS&7k|WuLeH0tB=rax{JsP!kEDk1zucGiHyN2xn!S@@ciBC`R?t)0_a58()vHLze`EbJUL%MP -IRLE!MPC^|64G;b6?}CToe=B(S>wfR3a{ -~Xy?;UOr_&0v0Z>q$r&)>fbDBrOEO?<$ls%8vY!xl?il5@Mx_Rc4) -bt@;`WFex9!#p6!4iFOhlC4|_2|@{aNVD0kD!y8ickEtW_MVfpN%_642fO~LJg-f$QdWp;NfLOp19QG -!Z0~E9SEqoI?rnSI7z3!Tf;hh0q|>QFjAA$-`ZkH%9mD)Du35{zidg1^k+8rrJt{zKi-#+rsu$r7Jyb -@l5FQQUk~Qh?l?AYz4&ZN+GCYu;@y@KWE5diodR@4+R*0CqBoz8pQ1z9OirDM#+bQ&4Sj~U5((laXH>>={Zl -V~3fgpyF6hR;aNDu^t>~`~*P6k3a4xupe{iF-|>GO$?NvDT~e|DtnBlJk}A6-XZgdLC%X#@L_dRmek_ -VyTSo*cRV-8Ahl-Q$EKUF$4A~9}pj!ZuS{b7G{U7#N)#f6CZPVAU2kow?(AmxAUW-vxBhU=1jEp;QMdL)57?%SA -QK4OOQe=BC-zsL)HY-jOnYxYZH@2`?B#@|W0l>b{vm%qN{W5<7oNOHz{W(#*Hj|q@+Du#O`hNX0Mm&j=ak1fgNQt_yc%;vl$;B!7M=KOJ#DWgwa3yvu|m;q_Q1qJN -(f{4*5C3*!lTAB+358x(PfgQ6s-%TnJbh!z_BmH#^V`wqu1I^35p}K4H1o&#>+}QZEsrj3gyD7zxamC -U^7yQ(;)KG{o(7hY5-MIIT~)f7!Q^xUpn!!Fh8L?YuHy0p3O~Zag+Au!qzNuC`K-EAvBn3Ty?Ba1=%y -eYDs8?Hj6#mJfPrOCf35YSa&<6c&nf>2a?|gWa@v3B-g2cJ-CmqsJF;`G~<_&mXIpAbo)XAx^n+D-rV};SX`3M7+3-SJmojTd~gJP^W8^Z8AG(e4wg4MADQWFrbfEfk+2Fjl^k=Fuu&YngXBkG)>d(tGj}E -U-#?ueMOijU+R>iyh!)Sd@$H*-X1Sys+GCN&{k6zi|8z=gC!7dyD6cTyB=-HtX0RiN*}RXiQ^RK{6eN -)eBdhu*FL1hX64eHeeb6diN1j2f~O7t`7%$o?YHvXSh9GakRdp5~PhxOLeYCT_$HfM`aPFR%G=`Q8tv -60_Y1;N@9-APNHxL)dd~C-a*mOPd2EZjr|?!-g9HnPRJ_C*y*Xdx%eaIFV~wsfUN`!XWeR}aKl>u20k -1bgXj=rUT$Z$#Vc5smf&gebv8JVVk5Oy-a5ves($I?LX)2k1f2aQc}s37+E?qrP7V?D-kiK~UL}JGos -S( -_aQ{tgh;u{vXq#|3K^Z=O?lB56HUzc#*GA?avqZO{oloD3IDg8io)U34;`Z9JCP#!4V8b$)j+FK%X(L -zk_X1bil0WQ&8Gr5Asn+Ib^l)gX(ciF!)GpWyw$Jew_S1fh0RJvB^i(BqR@@bj*H*k7`(!9cfr9`!ub -S2N5`m4s>^np^bNV_#@Z`e;VDPJo-$3I>gAxBSgnO^JQV;Gb; -f(U?&}a|oKm)tBK^e0#tgO*wYjt>vzil0H0X@HbwgXZl+p8XZ~_p5Rja0HoBt -=(*g+6@C^IUt`KznbBnZz?65hC}ASpN+3=mXMWz=7w!!FlK*9QIW=?9VO{__J&Lvr7d2>>B^< -5`phs=L;iG+d)3gr?(Yu@Tb7l|s2$2x+(joW-Jo_}*EzX3_)t4XH- -jEQmL0He?1C6{?&nEItLdRuhLnxV*dWstXTE#*-(t)LJ&44FvBl8;%ex3s8)CIzh{j -boiak8C^uPQBy7-MqOVPgbrtu|yCL>r!1N%3HY;iMt5j;*`*)N_8(S@bzr&x0rfA-;{j65;O3;oxzua -^xFA_zi!4=e|HZ9l+rRO`E|K1aP%(9JBwCqaUU2X>FA-0)Ax;=K0NU;<&U)}vi-K1apiesFHe(19~~VC$#7 -yXYzjgl4z3W_hG$bPI)28(C>uoQhs)pSYKf -gTBYuJ}hARZRan&fL2jmG)Ps7C5dq79{r49DB`v^mMMGf#K^n`Zc5pdN5wy%$cM=nBF6H%}H4J`q*v6 -I#8h(~lHn|62|Qep3(r4lw-SLV8#rC*&s_Ghgt!+79o~vZi+Gy8&jwzCGBxPQN>9R3weESpUYT(;$T9 -s0AlJxc1lKnO^&T9V0L>FH50?N;omT6}nFqK$G~?GsELL-@u{e6P_8Ly)@xVh6?>_cS&P)>Yn&bAs$q -lRen4-zS-h!ce6d2(p>mUrCj$IL`qAYm}0xphow>vLIr2J(WVmc%{xC8HT@YOSdkn7Hh)=`RCA$J!tND75}Dth0;sKc -DBCj%EKxOQ-oU)ZgI4f4kOKnE030`EAD+itX@_z)^yPK#U|v0;3?3fcE1!juGVkY4LJhb>TPK{0gGj8f%i3Q36li0<^ -Z%)}$80eMS)cx6w-B7uN|dPVTyz;54SSe|IE)UrbEiaXT*8iXMN#iL&e3rYnC{XZ>4P@k^iBpJ2s5x= -i4&T<0HMCh%9T^N%hQ_@nFmD|iw388Fg(>v&pDaPVAipt5+J7fqX$*|q{1IV_gXlF?WTs@Y`I%iyfu! -fvF-GXo$u(H@h4(AL~kz%10`kkpG7^ze|%0=V))1y0^dudgrjq|0wmpYM`P%eU9{k*Ku~OtR?stsP~! -dLjMX4|}@2UAGf|W<^1K!x(eYA>A~WLg>uAFjv%f+#P(WXY3To+Zhmg(0{uZT?@l57>hNa#v&L*r$us -Zzgcly-Dc#vruGegGl36@P!dk(vwpH+S8jLl66KSojwdKOQ^fvh#OF$1LHfP9ZbCOQ%s2j}J6YN*FzcMy -vGnS6qZQ5)$K5JHyG(%xCz#cO~ -r<-CUJW(8ZN_UK{IB_ik5cLUyr%44`nI$u9zfTyYO|DP||v`XXO3Vo2zR*F46^ZQ??F>hMYZqta*12) -#U!=m5+hg-^&g;BLHoejv%``zUc^G>0Y8TT9v|v-ZS;XrkTo(lul%2njz^6cgx^&YExK3Kuc3U3)Kja -H&Zy5%7(8e9h@4$H$0|+PmiQiZY4Uy13_v`j4f3fw$Vb3eJ7MlQW-fSspLI2fznuG9$Z#UJCTqlX3tJ -c(5M+JZnnI;7rx!tn)VRyeDYHJ?wigYQ4X)!n|8ce`&$ZF8Ifq-r4+2x5ml-{*N}*Ct&=Sw!6qsE9(gRT6tS{g414y3nhVNE57XucRHToRM)0#wz)g$3MQG>p2L(c-^5rB*8HAK*ovW&g+U;y+v -K_jvIS*7;3l5k^1=Az_4oL5QMI654ShhEw~mD2h-Nfe|o-px-6Zga?29kSL-)LXp{lWhCL1*YoXBx1m -Yi{nH^irK5cUle9%hK&!ny|I+n=iQS?JmjgkXo?yuUPgNH|9Ie`x)=kUmC{wa~BI*2sIe~C1n^a>XD= -`4x7xD%n3KBvmRBhq|9QNX`JiwBAV{ta3@P!#YDj1mk`{p*><9W4H7X7SHJG4OBD;&GY4KR}DWxlG_k -*ZGy_{{xzTI0$C=%$f%voe~_f%(p`Z;SM&2WxB&)8fF>k<};YI^ -)7~>3wdFY|8=V47fzv7=G|^kfBlQ|>)#Ih`Bhfs|ND=Leq*rz@giR>^&dRzH})AtZ~{U}m_jKSrf?J` -K@y`t7=}JNcoad96oC@owa_qlSWcKY>~!*FmJ9e3m3#tl{6i89kIpIVOQ4*7*Fx`>c>j;#A6XUf;Pvn -3bvNiCbV#@C@ivtm<)kP)NQ!BCsMCefVK<}bM*|Pj!$qK{yl!d&Ot;!@HdZr89BJ__ -VZvier&2LJUoE2)ep^4x9Lr_jah>ppRN7XodG}E+F#unpbGWTC-7_f;@3aa9&W^(k<J0889q~4p|OgG;B_Q;aPc$4XDuxr$*`k9Oi%q;8Y)GRl=a$Yg6ilN4;`+EW -WSw8zWqt<>st4*-x6o&-hrOR}79+l|*I;mt$K2Y0L>Bog-pBGC-sgErLb6VvcRx-G_eqM4Ok8U)qeg8nhgz~&B@LRd2uUX1vycFc^9=T&!k#%NGFdET0?LFJH6#_9m_4Wv)^Be6@Bsr9!Q2fKBj*f@I@CRlK`jok&Pw{-; -50V^dO)&eE#nZzaBIsfKcDQ>;VPyvuF~dIi6FRz{lFz8t5IeG$8Gf)Pk9s@!>0hPxz5Xe%6pvJ7X#HZ -ge4&w1)_=Vq4`aJjiL*w5FY~wL+J9uWp#OKx*6+6V*Ui>omE9*h{ -!2)G-b6eXEl7e{z%FlV4zlF+v!}q$Ses9U|Cqq68lYg{GOQhiAW^_>fxi5h4v94*|?fJ2J!KA;u@ -`gc!3_YFU5bZ!~O(8PSZdb;-U)`zA0Sv+tJAZMVFu_Vl%W^3^{al*kM1d-3d+H})zbWsJB#?+z*eFXU -wS-k3tS-M6r_+IDUdbL7dNPX%)EcfQ>%9d%jr?UhXiZ@_{U=F>J^bCjHer{f-LDMMr`P1WPx{6d{;P$ -)+QUCzArDDF3_0v*3LUkgkA -%x%9JAzTQ`vFcZWfQu`0OAZ?PmDM6ny&N;XmhBCkIgnTEAL7o|el}|9%f<_zgK(2kc)BIAZhJbr7@gJ -tGe;?s`Oq$M@(Wy!P)e)f#8zXVby4vYlLn0@w{t{b9JY?*3gK{X13%cl5XB@@VMzIv;wsdfKN2B?r~! -WA!BTiz$@0pH1O>|7IqiUH^Iz(nA$o4fO8=za&x;`4?2E?~<^n`ARRI7Hiwh1E)y+KJ{`S5M!_aexP6iH<{KaE>@L+zom^R1@)RXRVQjSUtx5mrEvufcuQreJU<2 -D}b^b<^wVO;hbsr7EJ>6%1jn5|I%~V2zoN7e8ggQ9L)6%sW>TpjHd_#XM|pnapS4eYTy@6}`7X-I}2$ -bPRcOON|wd^BUUPy*^Bec{_zIctXvh;Raw9e%hW!G+QnI7`!XXYOt|NwYbDQbiw20y_^-;4+&{#ppnw -3yDCqMgF)SE#7`Ot;0{41&Q&7Z(&gxYee@fGiR^|T^7~#TbeWVwuVo8MVcaD#l{>qtW!0u{)DlV4Cjc -$qdXTV{h-nxnZwoPEo^SN}js?C@r&&lI+m(XtnugeSB@5k?^j4y&d}JUHY!h!lq}D_ni*9*!o43k6ge -4aF!HvP^nAe2e<_~SwMo)X7@Km1GYIbxHt8b-t#ocoACV<(x@X0`Uw}mM`&}v{RhH&Qsxn_723i96Mo -Uqy`BboJkox%i`6p3>V&SScYi9G?H({9iEa19=Y4Y_NMXw>TvONc#Ba^cgPLz3w0_ -+k24ou9kGwx$OS}r}12ZsEbkdqy=TqT=3rt-og}u``xh0 -M2)s8mcP|zHqI7bKNA#Bs=c7z-#H#4O6M@&R_h;a+-$#LQWB>C}Bvdg7tzJpD|_t3?HV^61Fr;JWB=* -l0a5MJ(-YD9;ci~UqSR#+NEpI*6D_=a5b+EyXtKX;LuhO4P;|PCyD$z!TC(+>$S@oSqmQFRcp7#?p(3 -IB73abTu%-a*}Y`bRgAH@rCc#ebGIjeGQo*orYE!!UiY4-B)T$!<{Y9$Q8bUIlqEH!(lud7Bn;KV+@O -fr(X`#Ucsk#k0OYo1>DhKips7V=mncdl`9kG&Xt9Mm-Hm87Ol5lV1Yur<65%V&AFHH7m>bkE;2AIk5w -gz?PQ;aflTs?0p_`7$$>=V2RFCeoaoKYZ4GO0m#ru%x_pV0027QmHaImle3S|iC9(Q{%|JP&C@1q^w{ -RQy+8|3wumic4c_1`7FMO{1SLcUwXh>uD|_-P?a$)g!8gAS32qp^)VVmso~>b8TXJ(!Dr&<%_qd=w%* -kk1iQMn}B2|Gd9w$2r77mpRf`QF;I`nEI@p98ddUiVXb>eW0KN$D#2-%%QMPH3UDR#zW%b1EF?AwPUX -xa-|;@%pO_7AB8{okODl8P#@w={9(HsP0z`(E$mN=7()C(UFEM)*S-2a>hk|3>Z)gX{))PoKSo`q>;D -&deVsIUOqD#QA=^BrR?X4$y8>$U%fVT#icl54RX4`eUzZLz#{Hc6>xqGH&b%l#-F=-?DGC3DXTL*dd( -i5Zj0Jp^K0X3>>32G6KMP#sAAt+@BXF@h50p$!WmebLHdw$OEJN2zHzIUfqtN9cTNC!8a|)F&cp-V0B -D583tX~dp%Q8by?mbvMYZLrS&QDaw0#50prDET8kZtD?Ja0j1kC5Tq<-mnp?o>SC+DE9kIEOk`rdF_| -*6utOaA)Z;lIfz^^!Y-ZDk_(KGQ@?|JW9+lVI31@+Mv-!M_@zEzfpVtlyP3`HbhVe2?AhO3u+UCw`|j`SWPbeG%@Ktjo(CFnuJ#-AY-5N!A+JMP -kvD2}A8s$90r|RH1q>pJb%E34?;LB`s6T5JU7R1aoJ8GP4D^D4bLrJ4jm{UBCk0)Y(pbNXTm?(D>2WV=pdV|u{Tf}Lc%y^U#WIHCo-(Xz=vj~uRLGuf(|k2b-a -gC}O)d2f!C+4r$y!usaL#8s754#Gq9%nrAfj~v!!f%#@Hmy9-*C~PjY5<#%0#?m4_W{vZ%O=3Q2Ejm* -{H4sUMT)F%D&MM)pW5#lcWMu`|r>45R{0#Uf{>Y_Ma~04m}lzU3iB@tt-xxmOTIMBtFCkElSPDr!Vj0NC$VC7J!w7J)}Vkbv{_7vaXk(Mus$@?G7 -Wt;o@EMlANea7sc0J8dema!_2RoLrW11cENg;}NEAPb4qLtK@OFDhA#iDM32!*`o+_MK)>jlXV>GzKV -ZesM<>U))BdE$y)83!#I3v~4=XrT5{5torBEC}VT1 -xP_(*S&hoS&ZA`}XLS4SX1j(#)ZQ?uK#QTi!LCdf}IazH4QIvTq6uNd{|B>O?0EBojprUy|2{fMlfpQ -0j${Y0Wi=RW?K{dGtlr=QUe@lgmx!k=L5M-6GoQH9*kOGU@HuH?fIA)^Cg9Ys>`lk!iG;sfy+ABKU)e -V89?82DJ18(=`gi9^7;G-EIlcdLoNDDQ==hQTo**m7DBsf&u=YszYqOPX -?GPnu%r)^eP_=ef{xwCuVDf>&fG;Drjog6u0OszlKHU6Du;eps^kVZstYZRxNd9%cvB<9c$_|lYZup#BAPJ+ds?pj3T&sD!6vY{F1n8MqsAaCdqaMp6X -Xux@!!+R898-1xUorz55w^15wozuHY?8to$uLANWRDwh<~fjVZZ@O}wh~jMa%p3|E{X)|boVGbh?WeD -dD!CpW3{v;#XjUoOc=(m9tlcRB+Dy?JJ!SP=y^yn%*T?e^Wqe9xfigB67&S -r778B9_bRCA?zV!fkvMTx`%M=!Ri->7OMBP#7+*Rs8chG0RAZ -P)}M?ZDgD>#lkk6XlHwRCM#f(|E0jSv@V}Yo36s`Bn+#8IE|L=fybbq|V ->mRA~x4PNHguP*BcFx&fk?Lpo493lKbEekl -X!Cq@!coqUhi3ko40St*dew9RxVdzH#c@AgBaUNqV>~wmyFn?{;WR3eBswZC$_G8rP>`2r}67`GW1}& -5_`<7MgVR6wIA38qit@wOI4IQ71`^(>%H7^*5_lWpBHR~bFZ4_Q*i;%G6+o3Nn!6UJ27Y!GF15L|IgfeExT>5+k*Fa3SV -{?dvD~ls`>(%APA5Ek?)WL5r|Ci=?}oEDND9w%dWHgbk*|mG=%UIQ~ba2g)zn$AN;5=J;K8$4Wz4y>< -3i2wPNpP^UF#^NI6u86OsBrZB>_p;xNc+U5}Dh6vO@HBLgMKSE-MQ_GJW@GG&e$Dy396Q+n#M#bIGI7 -&_q=!2l%KJzYMN9>%C(@q(SrSJXWZx-{BKb0LjLda2}WxCgc%a)~(p3t)Af!m5ZiWD|{T{|~X%uU-3R -c=eO({vKh$G`WFWg2GT5MG2bv5yC>rcTEf5+ji-DynuddWAAgZ;oeV#-%j&UywAw~q^7l2Xg4^#Y3WV4vGHCeC;>Y&^t{C1cZQD -T@+UsT%@vdM6Z?DzpKjeFegT{BBS&Y3~kkmewf&8tytLX3Z6AMszM_74$OyC|QQSgZIw!m -^Hb5lU4li(2KO#vB!Yg|Z@8eW~k?vVa|CeRr^AwSTfI;77~))m80C>t~h^e?(e{{4lA9P|So7_uQ7p$ -CJ5Uv6cjqdpoGNPAx<3vAo2-JH|-P1xPQ89IuzXZ5L!R7nJX!Ybzn=PDmeK<0V3ZZ3~lDz+gj&7#$%Q*#b)3^-7C%IzTHSy!9*%2!fE|$IDF{5C16S^&$(9x -Usfe-XOgBx!yS~XFmCD-JW!s;*M>J8ehEA3t0-$G}wSwC+LnH_hSiVU|#nfmM3h3J`+|q8P`wTtLvBw -8&xgoHq3_Qx$Ucs|gBh&!Uk~j){m`{O0kO->}!>l~2Fw=-budynAN;2G^ZeG&0xBB$-{nk75skChSwZ -xuE!Hd*D7V^SE#22*dsrLFNADDI^yP7F<%&$c(~_zzM{o&E2PL&C}xsk~>s(8787~&fRJL&zI -|U{5qE;!ubNkTSM;qV`eoU=1QyxgB&PrR4{fIBbN7%ACpS#SYg5u3M-Ck#mcxn1{VcbMZp)@25COBm@ -U#B{?D0C;b@$*o1Ni?52yEJ6_dK3=udUEM_aJ2|w{C)GXGPwpOlWfoOR<*PU;N3MaVuyg{(E -uoxvUJlBV4R`YVkB@o{|} -X3jsF$;i4sEgF_oP!WvBPy57OkQ*0U>j-ujSP&&gS$sMJl$F4#yA15***2kZGFTpp?nC5XQVOpp9d#- -?NFm1V9JD_N<4Cm!COJgEjI@Mi{9v%ZQO-}OP5R?TVMl#~=K6lZ;@MWI^ ->`W75|H_PDgN@hzUOjb8zQ7p9QhF{#K -OHz7}0NsFJgC3fubEiLCG7Dq5HJhK4%~7?Zy!KAu6QaS0LouBH(Rqf(AQcBZxQOD}J|7lbvF`|#~9lKgk5P`K`>aQ#Z~7jD%>RsN*cIlKw|^B)GcfStP}mW=i3*~(k?6n{XfK^CgXTe0VMv-(p -!_y}v2fBPbW>EICXK|jJL-__?(vbSx18RNY@>Z<#oEc$t&%H^eUV^)=Ca9Q~MA;6cX?9*L!h|1ZP?m~ -e?uYvohe2#@9#L7YhACi3}m;XS9%u{_B+tc@l@4ePfq*q0av4xka^jzZ+B3Pz>y_tc_9Q3%0IubAH6T&pS-Xiy)WROys#g=FW{fNuphlI;ICfT?w0mpdK!6?Y@r3)P`ke*DREv;dO2b;%x8ED??b`42rz3RwG=9G&#TqZIk3eNaXf -(nc!fzuuhqy=2~<{a|c)=#Tvj%UV6Pc97eskr{Id^DJIx@=mh`p;A&jHAYcfyg0IiXl_f -zKu;4>`7_^x@5jQrsPGAhCFeAW$iO~Yp^T(=_EdK-MgxB4mX`QbTnzz|m{d`Es -hKaT;7O0ZE^xnaRihWK25nqHpfvCOa#d&(<<#y5b|R&p?GtH9c;Kn8we20HV2(lWIMu}F@Zou`gwii& -VKj1NX??)Br!NAG%f(_uU2$(Cc!TRQ06Q;73dXQmZi;f03bfbra1N{h(QYSq=;)q@2Sh?<08TYzOO42 -a&x*!b&3e%38IwcbJk&glbl}BV#i)b(D4?z}ClHrbih5SNm?vz0VFu7J)4lQAoC3L!d$AZo9itq&9%k -thtb@xP)#g~H6e(1hjQ1W*9^1j3C%zgm^(xiJEmOYSBT6wrSkQacwwSo2*ibsP?griQ#|fsNmjrvrAv -TKiKWU}?VoVh{_}>S682O(CBLCkl?jItNZDHR+5gf*`H@}C1X%r$b8ip|#CSY_gTK%vqNW485;y2Zs+ -6~$FPT-q5j)r?s-@-ply-7Urf5Pa;@B&*6ZLke-_A_%oz%F -kFa2AeQ|_=+72B^el^UZ2=j3*Om#Qp{GY;mTiRAO^Bj^Hu6?K0l=mLKgb^ki(3hN$p{}|eT1*N>Ui$8 -;I2mDpk{b|s()aNG)2~bV>dEo_EEv=VUwc9}z{XDjzl>OL}h13r`A-qLocE-({Wdw_1^HD}Se|SPn>M -dJN*{7~KZTgOt#T!mJ*I!@m6xJKKI3v%>N5tXm?qg!`OEov}^eKq`Vp?y#XK$6Ig8kD&_KySX>Y4JE^ -2Sm=M|DN`j-G8NRkB1+;qkt+te&5=cIE!{>Aw@Fb{C4k@gE){ZvUnyS@?Q0D0veYY+f~4WUm~u>j(dF -pNM8}6T1b?0$>oCVP)N1V~z+dk;LkkPQZ5RXL4}58e!p7M~p1FG(E1&;H2%<4`FYRB+tKEPj&>@Rd3p -W$6zb+J?lxY549m0T_ur&!=-ph9@$vy;3g)>Q{z5ugYOCt7E(IV3RtO*0Q(|US@|+!^e?!dz~WbAUlpQD0qrk@V-|5zXhPWI_5xj+2{K1UDsy!X -$K#Gc&v77=tQ!Cqb}l>c=844&JyxZbs7R4l#TOxk -E|?BnDpz~#v;eOhhQ%ka~B}aize82w4ixUa{Ofb{-d_>zrD#fZ(%!cSzl?$eZ#L8(P>{FRHL=H(AbRV4P;Yipx}Qd&KN|~ -)-g0qouL$fNpLVY~d^gS8mIq;9?0$9wptlj;o>ITPuD6sFj^5fQ$*zkGy*XIhn)X>-{GC4U{HVWeT9k -VLK)t8_1 -caso~|bR=^i2P?h%;Et9xSjeCLDZ{Ryb$wikaMEdRX3zgr>jcT4=c6$1Mbe_a)rcU@=J1fEJ+yRlgdL -V-aihnkx%qJa{3XmGPad~REbYdOXu4ktUXkc;Rb>AWoAGI6C(dup#zMc>h=%{|V5DL+iB>3OmslK~Z~ -C8^?TvZZ>&6;;aDNq)jz_uM`>czlt{wq2=|{X*sW=v-Xl)ZhT -%%(-pORpv-a@(~0HyZ|#Yy`W8_`MSUgS -#%hNpDxLzF_4m+=CGhXJD0Qa7`>x;9%m9{m`wI8kemm*ftvyu*@|Y2w^1^7#sL5=o6qd~qFADffnH5k{>4Vb*d~neQepVEX`LSpi!7lZ`_v8tbT#%$ -~ADEW^%-qVx=2Agbjr|jDOD-iO(oayN}TNY?HfoxI3?|9f3fhl+3Y+NR`6gf=63zyR$Wk5_w_ph81~d -Oth2*FJuwnjIk7kT;1tbsc)w&sI?3*8&9eQg3bsicI39oM+TjMWUAv{@SMvP&b!!RskN -!>=h;6@&Qs+pA7`wADFG0t8t9e-eqzL!5(E%`=D^2y>=hU2JW$j#3R(K$j5G~iFxsBJUV8QuVtS>xSB ->eS)(fdSO1p>{3TUv_!=q`x{MqbPMSZ;90tA(ZUuNohWK6Sn5dLTd3bVAq;gR>E|t_QQ* -eq}&;d5u=htq&&b%xQ*#XG0U96=0mz)#K}^n<2U$bus5_`x1NS3!yiMY}MdQUhD=UfmhXABl3~6Iu}2Kkz*8PH!Jy6cNvs=Afzk)GiTg%Zy53>*8O*li`g}e|IKF}7YM98Vdz3Z)X8}oi<;s`pv4&FeZ!}RO$Yll -WnTNlGFi1C%n^v&TdSBD@7`3*x+nx<$7{Ui4JS9kadynb-?cMXCc3jbnXJb$Tpm-$7gJtIb`w-oR@k= -^og;w`ib?WTr51YYzT&xGObwiV#J+C~8Fx%!rH@A!v&D|x^>ha5$A{DWd|K038M@F&0v3HCAGopTlKc -iFoG>08#1r+eN0xy>N -HO{$Ym4XSVtnfL5p?pyln?eMBL@&WrS?g2p;__yM7YwAnRQzIQ_y(1pN0SMGuSSAjpifxSW8kWL0{wL -^<9E*amT{X5uA0&FBED1H7x0IJf8v}QmHdtBT5EFm?;i97#1~_K=JovBJWHYT0 -G*A4w)Yhfei+r>(yewf+I;Tr*WpZ-*;>Mu7BrOE`QDf*jsbF_Z2_>T=Bduz@*|7!a+4vIFYQ?pJ2632l7_c7f@5g_PqU)`!ITx4|L{5z*L-mOj;Iem&rfU -_Yg$NlYcp{ihQ|w5Ja)y;0V^FDV<=Q(Pp@}=5%JReVNCDau2s%>Uwgzqwn9juCtI@W0WyJ601xdNoDX -Gn!h0%2JKXcei~X+RU@@-?6%Hvk60x)W3I~xkwpejnllo;^3Ygeh8nj -)zHbv?UoStz(OIdEK}Z9DI9Is -wZQ9mUzZ(_9p~V)R5sck0;fFN*RijOgjw*aNnoO*Yzve>1)3l~>u&@Re7Xbs2V(fEuhaD5uA}el~MkgX6k!&y{JJjwTFXo?(K -@AEtSlOdsd$Y8n+w5IG*kx04b7j-zM(t6(SO8;EVKC5i8{>@R+89(>8Z$7V?u=e}>dF>B -G4XodpmH?^bF?kz5{5Ff9sn=lLsRE!R6@jX14rzfk%FO$c~5FNgg8l4|6xkH`3>mNNYGZ$Ji7aCKI1w -u@HS{oLcH)#M^pb(W-mB9PIFj9YP+cGSBYPo9XyVTOyk1dnP4sq9q(T~0;lxybHons^5dlzoc8eUiXf -t&5Y%aV2Hj7V*X+gVTYPPb)&-oJCvninBTGrU5zT*+<;EBZ@KC195NsafJF4!nUDgXQfCiO`r{O=s?o -JyY*#s39!dpAkJ{3t~%u5(Zl@>iJPLEGyEkK@Vs0dP-kw;NrTS~FHnb9_<~*BYaT1ZRS7c@Ow6 -(dWdq?DEI8X_{Gyl)7q3rmHf)xTZ-d5EC~iNR7ppE?YHPqJS-PJk{}P8)R?rZm8rf0;9;o6_LnBs@La -TCo@<(sW2mPCJLyHy?j&@ypP-dNGY2OEqT8W97Xdw*h^FGcSSqE_Cg$~kzx_?jIc)0;>hUsKsP8#27+J~_N5IkSxc90St@V;z<#3V&je-RE~% -nk?bhTRa!}W(vPK@-0!4^?UPZ_5(?M{@DhjK28?fsfj;oSwa)H{qQHRum5c~{e)?MbHnct8%~l0g>Qf -uCUA$@EsJ<(2lZjc*9gb#C1@*m$N -YF?UPFFEUjIVF?b8>QhSGE1B~09=;U4aiudYV@UD6#Kbrz3-jcidMmOK_&$}qua -Ni;0`D!LJ}qcC}%>qYYK2Z;e%A3WdrspE%Dqx8t^8Wq?uBa9A6k>aybY^StZX`n=GpocG!INIx(5 -dc)g??=|qP@wHz3PJ`FpGfc^d6Aj -V{zi4(j$6i!m4FbnCtv#PB?)P*aQ -WRLVH&>lsZIxahyl`ayfW(DC4z&H4`hw2`yKZTyWye@1&PRcH)rBx7p(%B6Viz2{@C1!{vq%4x;%wRi -b+wuYI_JInQUNj|y&EW$cSJ{p9(_(v)OF`5KJcti(hoF=up( -}$y?Ti!)+kNR}GQmZGX<{Zx`c@TP6y8{y$b7kEi@X?FY2hvPpqF7G6!t|}3PPU~VRi2)Dhyby6+b_Z9 -riMfB(HW~BO%A^TG;JwjhS2_9Mbkp#lMPhov#ly|cd0jI{LpX5f+a-kP?@kl%f+IV$z{$Y>oH9$-2*C -Ocy|JR%or7t*hzkVPQb##V!oL3mkHR9=~wU1JR{&o)32Hi%37@@Sa%%`=2(jnZdlXBs7q*9-a9Fa$Fh -vXX-|s2Mervz>>B0Bt3ng;&5i_mzR^uOVPqU%Yn!)+%&*YQK1evm;_jZB9UMCtn%RFV^ -LyIm0z2SYWik&aF4>6dlw7MQn*u&=S9YW>~^R6r{l>ce^5>gQ)zX1MhU3Cg+6gVb5$nUxWzadw1#2jQ)d=|T%`&=fvvPf3A!$W2irsC))Niv@%{di1) -;3`&Tgi~xxn|@GN)LC-bBV!xc#e+2kw9mK9Il{M)emJN4Y$4ioQXMLyxHAVKas+4*tOkZ{Ne|9Lry+5 -v2l}L@%hl2z&FSGmoKB+8k*OLC?!DvDY$T#!)qkM);xnRbeDs1iW*>u8`k-u=;5Ydd23yp6RYmklnqo -h6`)}sI|0wnHFRuTp@$&t(-|36uB!r<5ijf2fQv?lT2uva*iDDQ|ktjuw7>bf4j#CItAoLFhB4PN=f` -NBV%5E?8b_v=|E8$&&k4)agndGgbmuzA3XC0^A$}-p~DQNmd)&+U%&xi3I;I_z{qI<~Og5nnAw&1n%p -VR-uKXW|Vg+$Svu!FwU^Wk7u{KJVo5aQ%J0;9WTJsj;7lr1=;?*h%Xej3{!iNA$McM<($Cn!VMZe<=P -d)$up$+dfN8#-?4fHVtjz$2!gFiwv&Sg=Z^c(ivlbuiD6&}_C-SSUX!QM=Ww%);`{1X567-!xWKzr#g^~J -se;OD{5W2z|pq0!H(--IoNXX!H#)nfNvflv`%E$q>j*r_o|ZBJXwL$~Fc=escNcv{RpyH2#}+(qeT%N -bzZ>8t%NeEiz*-c^I@s2M9;3CrNUKN;-KD1C -p3TptR|?9?S-7HUk04plk*o;Y!>cS%Glxg3WOlHWmKDuQPlw9a=jd4l?ib1c0Uj9Tr^GvI=Cn9R3>P^@7# -r1LK4v7oVbg4TG=AZib_}GRJ{n2!(ru%|HZ4JPvVy-7=aAVwdZ=8)CbQwyZT~vi^3%$NC0&M-g$x23c -iBTZ$s#b6+!>nHO=-T*>u*)Bsm%nU!C#vMT1k(uDh&BpmQ(O*nlLyGoJH?)i1Kx1C=tT`-Sv;7px!61%zMh*?;f^*mx9~GoaRI{n2$N)Y8tDm-e<8&u)XohJBeT>@c75fT?6YCCdR -*HQCIsva|v*g!2zCPxCs-uSo#8l7w8x`7o}f*k;KzM!izr+8c?d<5F_>_4XhRpr*;s$yZ;u3^>ougL{ -FNn;ftC2`r@Oloq3x9VhKIF8^ToZ!e8c^>1(XWfFfnr|jw59+Rx5cqL=|o0&v;(^hR(B*Qxz?J3=tOM -h{A;(zct-Qj);7=!wG!P80Nxhw(mq^0ufK)BEJy_McnAhM>Fc@ -}7NRy8#QF?0MG~?b07p1@=hwR^ULBJznjF_h@H~Zh2pj?t}VUHn+viEwM!2LT3B<(LU`#BR}&Ec)J9o -?~%MX*l$FV`xxGKCGqzEONqThuw{nvI{>5a)HlWU4?-Y&ZW#u9#<@tw>dCT~kz_DL@Fa- -8!czSIi>vKx)qhb$-HbG8;TKn4c51&?Ydpy@h^FKOV{!YqV -m}bxR@5=T?f^*de>@B!&VH65i*76;#4QqN!3FC+Fs+qOo? -70-0?ah3q&B@o5e(8b$Kb-)%>5Kd|_Z;8vBX*$dgWhWFGlm!6HP9`2J@p@)R{5WJMbihj#PHE!0A9Mq -c|JM56oGQtCb2GVx!)N1*z5EXpMB>a>&ZG-vM`0nVG5$O!c%f+xr}pjyX%^Gd8~;Hvxjjpt=?He&6yOD1um!AIJ`u#Jg_Mi3LuYR&duRnwuQVy(AI)7bP& -xOJ_dzGj~`XdnxgS2dUW4-Xe9vYeJoFMEuBjpRIKN%Si5GqD25`}_#)2uF>aa@fr53WxJ%^g_s77U&& -Xpk4WH`|0&ttb6znf4LDva(%1To4`}pZ~2(^xv=X%fSrxd}M@71|zA8vYfS4e#f7cb%2_665K3!{*9A ->`GAT;o>zYGZL~f;~<{-ZN7Gdv_buo^~K3#R=xg#4M795*T$BAa{k30vMj8&Q^U)Kdx6Bb$mMQB&m+E -fjl^1X-0Dr-|WeG;jT@>kYup&GY*oA&07~7lrIi&@oh4c*}!~i>vN20#eE1miJqKGoTBUN+~_$xt8C6@6Q;r=j5h#!PlwtnpA -SW_!46Tq7Q=0e!o|LRdN>M>-&0!u)PDf}+<>?tt*ztCaLKM1q0HCbIg{{zFcpTk*W}va0sJtuC^L+a -Z>4Qho)mNNua6imj(0N!IJysGHhGRgH9%qWXmw#p_Z7ap{~DC4RKmJ4x -TJac;2C>NC9kI5s``IKr&r3b%9F-fJtoB-{6IBF=#ssMx4J?j{I0JhhN2tAF97T#SdNyk>`aM_jaV6 -7=tp;bDv=-JI47KP7=Jit@BA9K@19!>q+N?or^>D(*+i0-f>!{)V4#2;CxmXtJmt0ifvgf!i3_geQJz -u;8D!l0dOkIr5171jU-J^zSMtSp!(#{wfbSiAE^gOfhLgvns*giWY7L(-^j|*zTZjt%2z~B#igf3yZs2l5X&VNO!oB0Ldq%&z1 -QhljpbhtyMD%0VD(LMH0}*>&CLrF-5qhU@Y&Q2&ntY -P1PEdaKCw>5$j#i@E4z#1mc6fz!-2Rmx}U%hfZYyFs!)w~9v-PbA+M#8@mN(rIj?+ISJ0yxxhl*I#>* -Ppn`(;uHIRwc2}te)5ggE#ZY*B)6eLe5>_u}|bXfR3;vA)fK^}IJmIp3BE>026v9@dDN6wtGNu{^FWqn?uyHZ8%rf}v -_i}q8lri~dJ2n@9*ifvx-2exL_;UdZ1skRl6n)Nr~XXKQuPVI!~L^jvX@-I3(3Z)*CWv%F2xc!njPfn -gx(zQ>MKY(fj(u6MtXzlRjPb1;fA2kIzY<>A*nc8ZEuG&{aoQVip6_+HxMtof;Zmn -kbUhWCOXR9REYiIN&Z(>gqSRr8jXt}Z&UXS@yoA!AgcEleCmJn67&}ur$N4v-MudCtJV3TBc6I3oYXq -!){i!Jk72h1JSr$A$2i@3U -`|semb7{sH%5+DK{DWu_OQwcJ#x52l}9YSJh;(U9Xnogo>elW77sj}dl6!+&qFSj< -NBZq4}3PYI@qcVsF<|a`Q?CDVuYLq#e}BFu2hb&K!kVr&a_T8aa=n%P8~`OH4bosY6hcAJ{CIiTYZiO1eF$E6xC}S)s6Z -r`^=bROE%GGT*ZX{(G`rKD^$<5X;L^pb6z`A|+XyO<6!ny{H#@cp7U8G9idSYu7W+ci0Ja8qF -^GV2vpt?@j4P?0A8)flB(p5rDh52Fg+z`Ksw$@|;(!Kq=SJOa --Dm78npdNGY;Q1^woOk{9(r(MA$4kC% -Zz&-A#NbBwE&B>AD25Md3Q6ONh>FxnqgFZoPA9{Jy6V(3*l>M~)`#%k5|97wB-$2?wtl@8AEd}pAybU -qJ8?@brcA}^HCN1lGv2~|Le;!-1pndl;f!~LD;+v|!xi@Ef@Qh^( -(4(?Pps*-ner{(_kN<|Ut$4A7JOoNY(}o3p3j*OD(_r_=2a>o-d2OZyt1oYiuSzI5jLigGr^*n&a$>q -TUdN2L5CXw-^I0T;s_UgSI$LhD0H1r1w6y*${1^^FVai -PIhi;{9#Iq?!|*7-o;9>cqhQ@TK3RBpn?6kJh5%9Vf>!bpm*n3=s -i@4!h0D3j^APx#6DLUy$c|8{Py&r-#7jlUxp_3jX!zUJdn4L{oX4>_ptCq!8O>sY{*+$BY4kS?wvUFZ -Bq1BSA~O}483jiNwW9pqW1(#obIi^=x@stVzBSy@YnK$!N{`yBKezs(R@R?W)pJZisgsXUJGEp{;U)A -yX8)6?%VTQaH6)M4~bIyL+;^A77l#u;qe-x_VO(qSXiDX3qBq9t#&s;biOLAT8maP&~6Z<@f(KwP_X* -`pi{EfA1JIoR4)3AF#8?`ZGmC}w$wAT5W9@sccl1kqchOc9J|a@G#T?VdhkMJTKDL4n9~E)f5MYd(Dr -n^LL#5OY8>nBHH(0pB%_h0u)F-6t{2~Jk0lyMN&(Jx7tS7Iu4RbUg%k=mbL_puhQQTz3JP0Qyp6VOA>!WXXcb*7NT4LhKOQNOxPKj?n!cGQA&7$(dNM~S$m`H)fJ-G#c{wGit29DpV@?7cEH -|^c<#H`!W@bbAkU(v8Lse0jUlK8~x`00UJ9>MqjoAQYPO;moT3~T}YQ27(h7C1{PkF>-vQ~WBle?l_Y -wmUK=xou$wpDpOI67=9gi9YTKzCfF3ly|Bu9MMY5X3!|2AxGq9@t;5+8rITp4ZzJ1k(`9Z4Tzn`Uyt! -E#P=K%E>@)ku~BC#B+oi%OSy8GGP_cuD>F}_2bt6q`CB!wP4_SGIj=R`%i1Qyqq1#)yF*c{AD -u?RDY0b|SCy=c6ap_w2OZ{VFHnDZ-#9tg)?9O8VQ(dRimn&rgJXm;*}fDpZe`U58eOova`eipk{f$Jg*YK19V<$PPO -Y=uL$+8aH4qjGcUlVlF)R%;{xEK)V(wi=j7YjKc(AitTyas6%YtlbADJ#F27 ->;PPv?r?%4sDk#$3m^PWAMM|vSkH(bw2p~W%fs>niH;7G2Jn1b|LK$3uAet`8Na@Ob=hRrJj)P^)Q){ -%`GN0_q{t5OnV;P&_Anz@F7xgARSP>J-PT$^b_c`C*$wo+6~!lC<}TI0dF -{tAor{`cr%H&e0HB&LUy(a^zQo*@IC^yvy;i4ShFF)@O_hAkN%zG({K6H^zY3UvmH7i(os$wS(#ii@33{YPrPXgzRG?9F3Y0pmYP|2@dP*p`^`!3Y1-woC -z|DbOTMi4bk9CatMbhAoq+C~<(>GvJ^c>}=s$n@{&3*;lm3Z2_2ZcxA8KCXAh5F9xTrpTWH`567gZ() -y}ok~sZWl@wFvFHC-G*w6u5GEtaj`e$51N>)H0&9)3X#{+34;lEqcq#6gL~o22ppptp?*Cw=bg3FJei ->P&$+^9MZ{d&}3M<9Q~&3c{zMBFTgp9(Rj7{aMW4roSA9;R9dJpWVV@Rm3c^#)1Wgsqk5;yNfh|_Y42 ->O=8L1Q`BMZ&mUjbTOBw~9z|qJ}ChuG#c6in5z#1ob_HpU;Li@XJamy)Kpr|Z)35)HwLOh2 -EE#L)vBsV}+q!UIy?T$;G+X2ygZzjCe_Rm2EqfzIoSbTvZ_@3pMsGrhPExX504Ru4i$57~4oMAKn?lgNTHBN^^8I83C)4Pq=iD46IFwHEUc?&HBYWg< -=pCPzZk_pv+U3%=>f60Qlva!8N9zDJl@BHjI&5LmNo;Iv -6yfR%5D2RG!T+K+>maiU>SNWl8m%6)%lBWV^TZ3%GO5pGu%a}ku9Iref(WyL$Xm`JAzAeb4EqdVO?Zy -ztT+waH4amoZxL+tE1xQkURk`4eRJEasGH(epI^-n|k&9WsDndK=rk>7(+P2-eP7;UI{N+q)MS-0o1< -`=h<2)T_i&b_D>qioX6W2<{Ldf2r9`D@99MaftNO-z28gnR|gLe{PzR6mKjbXg3fz-#Fh`I#IyoFpsA -jAs=&7yoM{32ilPB^-_82Fm|n&!(vWGVCcoLJ!!9%7G_pXCD}TGBABK%>n09t<6ESTAS|c0O~f0!M5| -3~a1W$Lc;3C+)nf2WAluwNoOm0nOI)1Axcps)BG#6&xLxONkUEx_t+F$1!bGq}R0Ish3y7cPZAqrUlI -oinq?9IS5QA>O+pb>3H8^@nr5t4d)gvKOQ%8YT!Fr*MKIsh#8mBPdKFCd;C^Ur}x7C4z`ka@&B!J3Z;AT -pGbE7)b#Bo9YuTPYS%MO{saH4$3P|fuuJk@0G94zuGAY^?Fud7UW3|@Uxe945%dvfy?E`)c^$>qgY5I^LsXqah$<}N7!fUW(S{$2Mthit6s`SJ42f}*5wrS!&r~+MgME0 -c$BdxAs=bv}wtqf!Td+4>_x1JIaxsN7@W;y7@53wY-u -W0k_c4d%?*MCig#NjrFFgi5d)L$V_i+0ez!E+Hmc9e5E#{n0Sav)riRP9-6wt>^WTDg{Js8Uo`c$ -miP2rYn^@XadW9vf%Fk1jnPNyoq4uMXsVgWuf7UU8ZJp>bimgX8jS`u-C{<@1dGcozWMn5*h+AhIA>= -vcr!6cg%4;BabX);jHARLm$PD;Q^8zc|R490#FDad3AHdJD -Yv2#ksF&G^Cz{;!5EXMTw*F2r8t~344hWbvx=TbKE|AT*l1@?WNa1nQf**?xjZt{-tK}XAl6`$8dkZ0 -Fr)NB^xA^S*>J!V);5+2uZiHR{AVn0QRXfT4!%$83(%0=EAUfNi)kXg{t+_t)1{5taRQGK{1%}D}m?5eVCS=Ov~m2e9~3eid>TkdT6-p3OmgBJ=p5Pe7IyBn@a5-c -r6GysRK(pb~dy%U9BAf|9t`FN2lZ3;aqy2y#@>y6Kg)1KaJiC<~-p-^=fzKz<9;Z~7ol$ixQXj9Pk&| -T~->;^~2C(O#QOv*e)quh(_UBBFu1DHBUhnH&Thx~N*mF-a_gv!rlehz`c5bMgJh8eY^&KJ01LUhk^xr -K%Jy}l{qH9wqs)N0tNBjMTR@k>t4aYcJ8hy-ID-lxVeR2I20&+tJ}fvqII-8DinOzFW`NZEr8$rUHYz -mZw_p895}pty)C3Ck^Mp-j_3wd6iKouk#BYGuzNe%LRp_LQ7=~`kc^I{(0bhzkl -$CXw|!UlLNW{T#j;Cw}2#)ke8*KX*BBj9_Fh*W=}Uc7VX$SZNiS=6U`0Jc4AIx=Z~07>Ok3vhW%2vK% -$q~1*0Gfov27gd5p?j#fss1sm4vW4S8qE}jWIL}l?QWZYJ?CLWo9GKJF@^F`oXTUm(hkX8FN8ynl@GpM0YV)?9rLhIs -Laa{b>VSwXlPCk*nu(*&&IS9hXrw2$|@PXI=T4VJ|=DV3R}iMLJHR`m;`vC80*m`x8zGX3T3F!0&%Fr5i -M%?_LM>B^|;Rp(t=mX6l7vLBR^YnK|Z|Aac{Z-MpWQP3M~LE8gcKq^vGevWI0mZk~TJ9QfAK1vu+q~( -?4^>P%c_2^!fO+1B!kYpGQ$RO3&9iWMH{hojj0gDWMXzYGZ@?jIz*bfVFFvdB&4GP?yH -un`RP$2yUU6b?ew(ZP@eq-9-N{>E0x3%p=iQPjBz`x6J9g>2L-yRj8h7K1d8K7T;3vLxW&cJ5<9NY?! -z)B+Hl;nsMq;^Ml&?Wgb~QL -Mpo_&zg}4lgkxR3tX|TMOGZJg$_Mx>G+IZfVifD72kg3fR#F4~I80pGHdT4!pam{6LF?+HSOHUSki5c -ZuaHY)o;@w-Vm#3~4FIc -Kr;HuOpGrwLNI6)WqAhkZ*Q0E?d!Vyj}t#iw91ZW798qE6XNe -Bfp7*kl(;T$Y(fc`=LMzByb$2P+|i=$QDj-!8J&2K{mPV#wg^|rjG#Jhl)20vtf#q*nvt+zPt6X9S7~ -9_PY+TtL;Ktbo=>CO1#6IINl)(5`ER--Tq_bJ|=>r`%AyfxWLK2>OQN2>?INWS6m_Q`Imk8Iel|trO; -ap?X5eKAUlW($-RRkdB^=bH!8GGJMTp -Y30vl?~iy1{2fY*PrOnOjN{W|Iuz+otiWLWykILQggiR`+=rQ6WctJibir+5q-(ZIf|TjK2bhOz^~~c -I2>k0X2|0KjqC{Y89c%bW)mcerBYHY6mHb+(XVWi5kB-H9&^p@Y$3z8gFGCV9d2#f^D&3GUbfkGe#@AhN=lO%}EVZbCx5}z{h?fgRTF4`D-YYq{6K(%+yzDL30w;aUw9Q -5738+~5(O!1vFfkgMRXN>RB&GsF}-@@Erv^NuPaoJ{F_Fuw1IR?EWE`0kw|H^o576Oa+hA{L^aI_l+a -Bn@^nfTt!fC#y#?e^G-+8@z(9Js|@(R*kv4fhP)-arQL(`>t4eCsW37ec&A9RA99kh}5liXV*!DG(et -clyEEK3~J|VtVHEv+-E}!^Q*r|IT<^PJhwedO7z+8E+s+y&MPOoPblCfWC4gm;#^*FofrPkz$F)1&yk -Ulps&ldc$avhentHNQ;;U);2=M<5sKRO4O0sbtzlhLYRv+C)gNU1=jxiEqnb*qY_i(}B?E` -j|D`_BAY%k#OK0rnng-daU>z1ZODX3|1y9Yk{|v78<@*NL*r1+ipYUL9IQ#bl`FIJp3He -klPw%3P(ceVpE(g+-2f2SaC<DMo26NxRd^CW%iY*kkpQZ4nh{f>MzwgNwFE -E(Y^3#vL6=c5gDBv?(BB14qIa!Q) -`Ap2HQ19^HQ45omWGMaC9)2!f%(o6b|Z9brI#}XO590Bo;7ZwW@M2*U$r)a$>tdLdFzd`_~nt41e4`g -r#1Pegt&aks^Hq|pX^1hjY1ud{H_6QTN9|^)Hubh)g&)Vu+YvqOp@VYz6L+~~8$n|O;t?Tj}ywh>Mat -jnb&o$&DfuhGHJ@_x&H%W`D9ShCP*X7v;Hw6XOlMzZ!R_M^0GU;ygTYh}0`TelH`;;aouusG=^t8|2z -2=P}v1F;sI>NcPf~kA74^X&O-NA{B;b=jOl~O(W!ee*!pwF0Kw%%wlixb<|zAE#pNrE+bNU5ga=k9_> -B~}9^HoKh5UYoXh`UH^~P)nTTt|>@LSRN?a9?#8F3*FouR#~JAlN_X)cuEIa>cnt!y(ca>251rvuddc -hM+nakyie;}a;S92(3dA621)|cy_?++aNWZqXQ`Us3}{RrZ`A=H?^lD1$)|5p_q8JJDHM)s2#X2d`Tn -hV9QpgpltR~1?wyHwR{XpmvJ0`|sW@3FTml|89+hChgc)O1KQ6oLv<1!fw%62E7T=;~W*j?ncuJ!NAt -!RN3e9J|+_GwY9cmHC`TU!tY!+m57TCY2<9r#s5lx!YHr%3~qRrP&3~-+J3GH@PPV{2~H$9VaJflY}Z -QPPTG{8tyapgt5e2;lXa0P~lj4Ac@^%uW<{ek_DU-Z!a%oKkV*c?9C8Lym$i8P1sOvn~+;6`%ziNE!@ -WNrMcB*uK@{gdm3*YvWFxsodCrzY*oe5}y=yar84#0@#6Um}t4sHT+J+0Yh6)b7aXFz^SwCMo9GR-sF%DxwI^?O8>%@RXp#G!m+VY$qpCK-CIT)i#XlEI8Is^F>QeXfNhynB -NG>bTEO9NICGLcI|Uon*7`0K2q}0rw|Fmun2fO>U+!DHq$)^3qeN~A>%mZR#-!{Np!|*HDNUaE+;3v= -`%UsLx~G0$bEJ$?YPMSfK~Ve8|9>A2SM@ANyJjqBZQZhu>YFJZzRzS8(#-pXGC(0Bhfz57xm7k99d -skLudh<1wX(I&~`I$@pg>_3pBJ=TNiDRk2+M47$T=@I0*#$kkIoForQb;q&K%~}`2nz=k}Svw+SAggUSUJ_SxUlXb0j}C#P;> -D;dY`K#h3j;?O=jw(7t*lW!O5ahsJ78q*yrzP8;u$_qf*r_L(Qjn#gwnZM&(-qM=xpx$-^O*8%}5q~{ -^K0f(;ue#hiNK*oZI`3w|1JodoUD#{MQER`l)_5d{|R|FJ8$XOi>l}kW_y>lRvEFzO((6#r+Su4~DVm ->)?;`{*q~X?Z*)``~UrNkZ&u$wvbd!`g^kO$M|{%KS9X|r|^yeS6beWW&d*DH50jPI$sB-jz_hG)0K?3Ba!J`%RAv!?@hF#A`ql) -LS)6rBD-sEB32pU|hnOAGK%dfmu6fpK+fx@uSNF=48_xy}$+{2u*%gw>cMIer#~wFQ@-$;cmZ78*yI1P86tqrO{V -cZc$5n)=m<1v7Ei}8C3U4-0!xj(&k&g1JA&Qo^8A2ZYuMIz@J&vs{uPjQopZP3E@lbZ#PS|rCF!HQth -vmz1@>O@Tv-sIJpajYK&lKkVLNLGvv@35w0Y&d}Vcvmjlk7cp@DCf{sy6ck8I%z{vd#W(tL%HkbLKl#}XQZiROrndS&5y<@hYLRHWRRm;1A2M611`wT_PHi^Qc8 -D_&*~D32?2IT&=AXH{~$K;rs5hUb!Bst_GD_-vfDKIB$Xj872(7u0$%AM2BGC|m*|>CyuiWRB)14$+6 -jTl*I{M&3x%ly!M^7m6d*>^KQ4`8<>yPUXkCDPFwSht>Rr+fH~YEB^=-rnD-DfMth(pUZkDBQ3u+ -aA%BdzB9&ulYss2C5h9RtAf6#|?4fAkga6CY_593!`g{Q{nVnq&Yx~$-z`J=phLyrewp*BemfoD;EfP -OtGzarAbku+RX>B=KbZs^4i&z5Z!#0=^S2DV2c?s^q}Gh`HHGbu36-z=ZO@FregF<4U!$LN3Xg1@DYm -4V7%`e|1tRe!PkiXF`+=U&L^SoPD>YHh9{u|p5#>t8wo1M*@a)3N=lBR%X(@f566iP@+AbbH -xE1dt{7a;ENnNFGpQ__f|BYf5R0YG27tLOs$2%LiuEhciN)=6sS1=*Z8JJhUret8BW#Qsg>5LAr5TyY -5NWxO&Xok%jk=u5I!+`c{P#OMjsWrfp07!@xc?oduh|2!EWk?cuv6{@9Y@;wZ_r^1mPCm`>#8u=!~NT~e?IKHp99dnl@M1MtBobCy(4NSz~TgMuC^J2t%)}IXa6g&7X0Ky- -QP*l3-w8C)5GrPz%yjKFh_9-E6#tnE+u0!#A#ON=XHTYsru^{XRFpyHc_Kr_R#GCfhDeT*K00Gz$f)1 -jaGo@F&(ZFO#8y@Vl}$s*d|Aro8#~|pLV$_#iBZ#KB>l6CH9>vpYcUwr! -M=N$9lhrWz38Dh1CCRE*=C_i`x_Ld(LXPIA4?Tmb7l$H#dBTG^hRHlz%>B;P0OD&u0w$_9;se`h|rtm;LZ{ezRfpqoU&c`mc5`7v9TE>r9abL-nezM#@52`>SYS8K<_Myj4MA31kYE{?Sm7fchV -6kdPPW-$!+Z%UTry^**^?E9)YB6gm$S -dP}&;a~pVfvGX<(~(QBE^XD(kM(X*>E-cK2tH}AQ^FK^?rAp%6z+t+M+{)K+KeRx -GN^N}Q6Z5CzIJI44EL3exe%1;Udb>W?8v_~3K*Zq4Z(^+f8lF^f=QvM?3;6HLeq5%u+9&&)7*jNBm -5&hd4c+b#e3qgouTs76^yonE_jLflrT6p}aM@J=~=@5J^@CXRB;yaXrv49Big+Ng#?{oS{Ra@C?NPuR -m<&#FJ7Bz!7B@&{Mim277(bYjVF$)ZAu9WgLP#xsW&hpf@_|dul@rJ~>H**IB(+pM|Jo7zY5UQ6V^1C -kJS9D7iQ_i+3l4CXC=XBZdcdaA6JMZ+(gwMz{p`1haVeXc>A1h5bVZJOky{HBH4wUJtjmmW2L!;R -bGCm~Po?g~1A-WS$rY<~qtiM#oj3)2TBbQK{R6Pb?hxHUC6ZpXsZ4ciSUce|R~zQ^$R;ZY=uWmD)$8? -)i~1(=P3AZV7ZO)T%&%Iqd8QbLJo4TrCV5N|HEgf#>0BVXJBvsNl6e=K6}OTjSP1^XnaSB8>HJM4BzRR4 -f$<=5Byc4Cr0;*CKc_k+}7QIUGnBwi=dre2dCacQE#z{fY^ay8vFx8_a~F+&cGI-d&|eJ1@&eT{-R8= -UEr=DwaZxiWuiyj@!ayQUqYrYkB|_>l_qHa)A4XgxPRm+fDcUu-TJOif}RCi;HNFX&s9U8xi1`E;)x# -hn~UY4%Vj$JML`1CB_zI<2E(ti3a1c}G8?JZSa8PZ#aK$g-2Dv{Dff9&&1gH^m)y>Y!E7LEoHgby -rOuVQ<_4-{)370-9Uv-*m-VCn^YsV#m{n%*@W6zhY_=QgWv+MW#@mK^-9c$W7K2&#)}MK5*Twv{Xcbb -pfI;J)kJ$W*4wyJzQ2L`w^Yg{kGB{6plk6XaQ@*Yeql*_^Rew+EZ}dYU4W0g%M-R2C;NKm68dw7uz&#UFwP$Fh+%W`IsiW(BV{;t57(tc=iJ(xg`Zy9BbJJuXS_ALkI2jfP{1=VfFq -cBb|9<5eFEO2Uxh=<||qY#+$1>fvT)Lux45gv}oaX92(C4d9p*30HNeK9JRLeS5W4L2h`OGK*_{m7BN -vzOclX$z3J_W*vaLp?RjbR4ZO@pdup+=RMpaB> -cvQ5A-d)x!~1_+|#%)Zj{}`F4YzxQ+c1pW4G;HAaCeUz7U7A)b^n8n2+M4Kol7}wPSVqNV~x5e6xN`y -Abs#U&ZzaoDywe!{q$hHM|jZwY6v#zmyL*Cz;KBOMiRvXU_$Gn`-X%Cy9nPuPyK;M`Pb0S-5fs{3_<4 -VN>mBuy?;@uwM1C%NBi%S7%{D%ajk2@v_LG0^LBQt4niiF -;&9kxFiKBfA=t8E&!YGLt&vk(4ZJ%>>DWdUBP8Wz-Jn2vJQ;vrY&(K4swAs(Mro?LE26XS6?4uAsD5k -@^>AGxR0?d;T9((vcQb&HvEe{M|Z4h14}k9I1&8Po4qOYTjCuoKxlJg!57yd+>UyDF03w`y0CUg2wRsy7N`iP_bod>d#w|W%x)~ -AvLquNe;ve+MFs#I}v;lMWs$$hKA>^e@>PdZgUv=@EvBZ04k_d7AgK6o~MlYK0A=2U(6^)I!&d{KSer -I6Qsj#`4%wc4er?mzd7{%srtd;p<;6$b$yK>e11ZiTofVav6Jnvk>HOg_FQ4Y -jt|KS)x-v73!Wr_*1Zyk;3Z!C7WaV(@iA702$+(Y$nF(m -}^5$f;vsD2j#)^?n~*>HoERf$+rbEJb;z9YjhdJ#1}tj9ugTNiiM -OOcHmYeT_-(lvq2#gY9}t#L_OCJ1Ys`gH_+`FI9=#qk{UKeD!}zS1+t -T_A({zqBlB(&K$l(aO&tkMw7l31yuWi__XG$p(ly>h?%<0;o8^tpx;^*n~xW0yCM3X|nMrC!pG096{S -lSo@8+s7H1rLy?^5Ad-8-&rg!=rIJcA8=yH@jlobVyc}LOSHIbhEe96YE!YC!pB0s)cRNJp!1?+~6FY -40s?*%{iiUa2@%gR8P+s5<2@%pn;WYR&`CuoF0xj%WNN*3%A6N@k#d#Ko4Ys`Ib+jSO|0L+$2lR6N9Z -*x=I(dC3a_lYK~6~llW8B#I>GH%JUJ?ykafxtpl(PVjE{&J4>8(i99%jty+&PMFukj;v+mVyr@0 -Gm7Koi2IYHp%V5&oTJVE>fK+`P$eYnc~pUhGHrxyPcJmr4QNl_R|!YE9k8y+Qb7^BEfiFIINPujr9UV -a0Ey_tMNf<*M@ea81>6!mT<-x>Xhf8d|D#AD=Jn>5|0XLiCuVt*a}W?)XiJ^KW`$pm+rg77`*6Ygm%V -gs}BuUg`Rol<85o+0#=#UOr*SVh=AQAi>C-u*G!d-ylt9KU5xp~kpGa9+6n9T)XSHmC9IyL`3wA%Ru$T7mJ;^ -0W{Id}HeaB2&iwiRLTK)(jQs)4wI86lVSh=*{l3)s=~^CWWAqPg+=SrlM -`@u@g$oP>m#uRm<*Xu^u|<5Om0RdRAb~oviDu(E!uRG_Ht62MLXMQ|kbKCWkyR&QvM%48An^oq_zM#x -odMcsrGm)nqRYEWYke4$>HaSUJymo?bs95LJ$s7ca%r2D?sSK`hw{M^NOt4R*R4l%oy)Xwc@PIoDAKz -GNQNCZL^-#BNzd%%zGm8t)`RlxiCcK2FbpS)W-<4~yUC^@@yoIqLFL8PfnZ4&P*cFGlg?HUyrpPBIj2ULZ -+pPF~VpQdoz?1hn+BF@U+fnS6HNZ@(MvbkVh8oSpVTm>W} -0j}(KRy>O(FIeq(NKY%Q+!T{7gI2QY?ZbAxE8uj>uKY9cM6Qt|rQYtl!tvJ)|G5P)%100TJGCd%RQ^} -g)?X)IKbIc=!!YU18SmY@n-A^U{=NSv-~Deb^x>y}caiTsI7t#1j)E|?Gv*->2%?{M50m&_quHG!xHs ->l(B6p~y#GgEN=wn6yx9rq_W82U6HCNDf^hHT0pG4X3HHVwg4nZE(B@9TH=|v!7ns8M9|5&@6rt4K=d -+o)Ur^&=dovLp?0G6U*(D{yWUoslZ{hU_+Cc^Ro}k;sB=NmiMI`(7T~adM+ljFBEnXSyC8wRwDBZ_+q -4&rePW@$*5VA8Fk?yy|Qu2C*;1bYkcmFi8l%9TS5_*rnmbCh^B_7-zG6Uw%xBuKv`JbKCt$KpqowA#Ml;`ayf2-$|+@iANhYx -LS=%On1BdV= --8ABtXK~(cfOBA6dRb6@R$6m5h2B>S@k&eDP0^zCG=Nb*$DmVoeX5%mM=sc;ruM60pLn>&2sn2i*{4s -P?NKmm{c^-793ZklASPal6+c;pRL0bv8R*mwU=c742Dfx -EXOQq6YYig-12x0F>^gsW~L(mesk~Y>q()b?_9*$@3^jAh;s`P>2{wq2`2^bDXo|o-;10zz-88{;BoK -n%9P -IVXsp=FPEnzpwLwjZ*IFr$25*WNY}+B#&sP_(nHFzt_fk(hZV>c9AsirIUi7);nb6k{FYP2}+vlXI@M -B8aQhk^50eiggK4n6+R*Wo-shtq^ -F5kJ6mGK5BD=v4vg+i=^;wXB@32~8PJ!?500#JN1e0 -;J#AHUrHiX=Pk(guiEfpLf>Mo0XhT1z+XzGIu2ZTOtH?xl=SHF7sgHmdx^CMz33S(OE=3q17J*}KNAQ -LWTB0vn{8YKjqndg@lgb#sWFqna(h_lLKM7V=*r$w2cuCu^*cG6t!;Puq(BDlsxbIAtanzi|h1=n6V@ -|k~MVwH!Y$UO`xT^gww2gljJVQ~4REkU4%YJxQRL};{q!Fb|s9DxUBpuSvMR8ht`mCwFs5vTrc;dpet -1@~7qtjTnMN{cCohkZg?-k2mQUt*(tB)tv-(L|Rr5=UcqdgO&eKMv%2BBwO#@j|*j;n4&GY&i3Sr(X| -bUeS-urQ2z|d4J|fl|2yP%K@2|Qe9j`nv3g_9WJ`l$K~K+<-y^vNEuF}6zYn2h-~nPN3X`MUvUDuv{Fm6_6X`K -g;-qkSdbT^ZZ_c!Ff<8d3v%mN{kQwGokTAbPi|6yqMp(kqs60vcr=TK?$-8T<6sG>6hwXR#v6r>HJTV -kQLq?93C5g7|AbGv&=^amUS&Sa`tqaY}*qb}Po(Zcft+Za_K1gp?iQj$uj5Dqt>rUfc9;K0Skulc}f& -IPy9Ix=8Lc(WIH*04aiJrt%1RrL4Qib_|1gGVwPmlfMPVb``|`2sHfFLVpVyZj1Z?4N(dsV1$Gam?B^ -ZN8!(tJIPKBkf3`Nk4WDwKIvZO+aTUfW%6zpf{49xhXns1f1&7w?C6V#_BCMiEux6NB_qN&VM4g0G78 -)Kyc77{W|Zt*-5|VSzh6K@nrleUW_Y;@Qk*H)#hTYYFaV@&{PBqe9@{frUFN1pXaZxT8Yg6 -IjUWp!yRm%$CcEUVnszU$z1N4lI0+X#YE~a7Tr}Z^6Pn1+{+8A_IJ*k>Q-_;heaxP~oN`+szLsRUzN6 -)Pk2eqOyusM5c+C_ZnlEQLL(>SA0(b2p^R$QP$vSt=dr8-`f5_^20S)dGiKxL=hnap#&EpRzZe(5liM -D=ez3=>Ueyx*9>5jnmIf#B8Xo~b-RT>@)s*c?x{1j+8l_Y?EU$yx{Jt3NqPC`9R_}$IQqGwlZ^r&t*7 -RqTUME!&BMXHgOQ%&D)|1O0e@~Z{*|EOvB9Cc(Fv#PEo9x~0P+Wuw19iOj##?r!NLnhuSSy26ca(5ut -Rxaum(HnV;q$P_sFDKBwjdskY@QhlHrYU*zSG+G8$YlHz)^OBf8jC%K1KY6?8zKw8#qi2sTR>R>u@`y -XtQnXU_TSh}(dF+eH5x%l&Mqe{ZSp%{30ABn%TMg(4WdJs{YpTztu!tQUdyoHZ2eZ55lT#oop=eH-d6 -oQA&0>BgJQ{nT77B0e}eaa_z_l<;a8XY*@WB&L(RkX+U$1q{&ODMu~dC0e*4HnJGSrTd9-r+*W}*b4k?-fwP$~K)AeoS6=1XZy4x;k&p$WJW^ -um+=39_GUp_h*S!|E?ryER-o7r+d$YS;;M&O?UEl9q9`N5?-|t)=@T)jh^rty4*}l3TVmoy4Zwpufck0CSsu4rqLe)e&Y}(CFaNzhk04 -M8!magj64N6wQ|R1>Cu;8(Gmb?C?er{PG7N36r9jD3ZguyaZKiW+TNGf{nGaAb-iABOY`SLyF#!l=uZ -wsl)jI73J}fod7lRT2|araKVGv7!hqe4bCK@Qo$sV32KQTwXPQGiVv>q!zP|d!d|>c%$(T0-2>kSsht -ajlM&-qwa$9MqVt67atSvC)5L}k)g}j4S@Dhz#oeT283)E)z8@0xFTKBm5e@$iyiHjEK6Y -5POvxtHf9ha0qLZzc^UM?b&7y%qJGt#_=D2U*XO}F->9;n3h?3R8@|J>yf|WjStFwNbi6~0XZG`EB)5<&ejG+^*XF9SjJ~#5{nXFv}xH4F7bYHAgkKjtHahZ&|%pmj{|ePZ;p -P54ogg^GB&<;v;KJWDx3!KXkWanI?%e2jQuIJrGy6ebfR_qx_^#+p<&26QCyCaTw!rr2Z0U7);DZ%Ni -ptTDq4CQ{k<9Ry5@(`?p@U$d(6WPPIPT)Wutxi}y*-5IsQ8OIl9H&vdDti=vv!+BvlcvL>i5DOAOeRd -WQ(k<9Mt&~01*0EoRf;P+092|n@Z@4hTkA^+`9ro1Ug=v2$!2eg*`n%Bar!XIZb~?lD{l*Cl#V`yevC -nWLM(rpOhTr@v$a}yV+M#0v?m_YPXGrbUn+@uv8z=-n#f@mR6SZK_9$v@L-tPgwp(BLufG)!K)(hm_D -6)4@K<~C?d|w;?RS(B@J^{Q}baq5HU@c5ukR|~%@8w#`C=?9Re1Rba_2&$M -cZ_+6y|M+&2(aZG6?XKvLRMa=DmK}b2gU(}qp8&UE0%n2_4 -)?z@%I1LQ=;f<6UvIJCGW{^b)bjuZcqBYUOrgbn%g!mhA$OHD6IeM4+H<1z2je5;2T@V=g;_&C>tUO9LFJoA`lcssa;`cGs++WLO4WW2=S?AUAmjpEhtXVJ>=f)^E( -r}GswP$=XTMdH-qe3_U&`cI&dH2z~2*^;oI^B&_3k>z5C*z_Yq=jPvw%(JL!tNHSV^+ANrM9j`pPOcH -A_1r-H#fuHOvxK7q3Nh%d$++^swkf917>sXdzzy>k)Uscg?d-`pNMvDjN3IEdfLf%JC@^FN6KYeo_fG -^(yM>Qtr{9u4PDEVJq!)>|ho+tBxyaGhOL?}M7vhN~w0r%Onnb)UWX5Cx{^FKn~=0{pPCWK`9pXEFOq^|i!eC{V@CU97;3zcFI(gxHG7n3s~XwoBkXSjWy -kT*9{VV;{Zzyzigoao{iYh-6#D#p~IBHUqDA#Pu3o*sA~<`Y>d@Apy%YhSxKGnz+q)Eap8#j@@}!g+a ->uB@ARR3SP&>(riP|39gR?s289%oh++$mbe;nwyOxIp1Kw^rHDGatIcLgQVxsQS)=Yq!1{sjSAJz;YDXH&!Tw^p|o -^5krisUx;e9l=0LQ^?W3GcFIKtaepWpO{f7J7zxhf-$EXR;5*To|c!MC1wr=dWDIWr(vk8ozTsdtb#z -z~#wHH`(o{vM|=CGt*|95lW(d8z(ZawE$oH+xLL$7rQ1d)S86q*r51_>d;um3=Hxovm(xci*D*8NtyZ -5M(Usx0kyKWT3$J7hX5;dxB0_G#O|{Ijb`ec;fB#vNOs_RnE3;rJ=@*HZ5T;BlQf>r#(=7hf-eJzt~n -P%5wZ2v$Z!-bPeR#w8f6XK;3l8*`0i1Fx>BwZ*#aYmHMtzh!|S>Xdq1UO$w_Ki7Z#OMf2lr4;^y^TQZ -1ep$_@q8qaUo>zZ9u!luVoR0rlK-M0Ce{=FLy^C(kgX0AFlyiqYbD6`z1S-)J-y7E1}C+9R11Bd#fX<&W_7G7#!&k{*g4+2x_09? -j~4!}*qXX?8rX39df~7{KvqaI~3MuZ^i2<{+nhDP@m&jx}wJ~?+WD=dwW(ikSS;3XNrdo_E9Yvl9mPBmy1WK6t2Drm4i$i^XYtIgagl`)C|*SxZ^~RZ)`fftuzTHUR~CZ -A$R9O7MjCTz>|i3ZH3~*PGqZk{6?xn%MPnrbXbYRwmKM06g#K=+1Ripmmmm5AaR9a81gy-b3kG=I_%n -Q?{MszkJzF)pYqmk6+|=c4Yp~$7>tE`f{?+jcxKJm_4>h_ZZUTCyMsJw&(|K`^|#i(>Dx*C=A7L0)Zi -v!Z8ZQh+U%t+796uO29aRmR+A|2 -Qs*GB0c>~4fDddIbUZHL%P@f#D|3*gxv5N|J`zoKw^ZzZ$`#c;fLVj|dHJ>SUNUWSL>VRgEfe3ED%<0 -Z1ab_2g_KgjNyvJ=W(yaV42BqMZJ?%1Mi9N#6`VEPX#`E6t!?gjJ|{Gf1W+3tN_B|~0)GFC)Ax&k7Iz -nGh_&pi?az6(WpoBy){v+*IxgKFpMKI_yu7F$H~LG`ZAc6?VgvlH8(ele7krSX -?BjxO3)<{gW;T6uNRiG9%b&mMqZ+%30AEd}bKbb9^+g}G{5a-r$Ba-Hp?Bd0_*QwT4Eei+fO?#gi|rY -;jd&YI$dk-`@WT4E9d|986(iIefvflt+k4}63xH$9t91J|DYp+p7y9FZZwr3!i}1C8p71;0)umuMGJ* -6ppTRNbKv1#ck>O-MxG_h^tk07koZ`HokdsIZSX%(8doP81^6)q(aSLraEM~WGK^j(&ITCL{wi7>e4gC$$9Y5G9 -kZT;UnR?b$bZ{%>^{sB-}dayd}eBqk`C|)7RVLf-@Bqt0n0KXXUs19Wnt#09FNY23^QHN@}vw&zs0d0 -fRkFgFpFO5rz8!gD4;Kj+gqlytryS4a@*e5O3dnh11qY}VnKtOVAXAzgWcK7UwC1i2{r7`o$NmCq);>2TcHON`|Mk^EC4Ib#I350_Y24 -2d@!!7cTNwQ36+ec)1Wu7KiPPI}1P*P#!5f&;Bu-K=gb;gH5~4qie<@^#oiy8n-vrq~W=}t6d)0UgEo -pM^|ADa`vPk3)>hp5;?u<_FdIKr3ue8O`8~S4Lo+HHY_jS>Gehu0YF?kzN?J+X?M@s!F{te%w9u -2A)xs_Ottxcm^GGno~w=g|NR!U2p7@XQj{Fq5cHQT)$cf{kkG^Eq`-c*|TnYz@)p8&GN -%yg%ZXFx4&p>@7D+dHFH+{c;TWF7}oFlcxc`f1KYv&1cj9z|Z6VU#I_(<5|_D(aaNkAW;o;Pmk2=A%^ -NQgaa?o!gk6`zd{|z4zCU&=eyRYmkygX(0(C9)|xqs%wX(a&=JI``>B7is&cufclZ9nt5nr=&XYq^|s7%Ve`QTSBksxS?iyB#nz=Ra_p0h-!T1Pb3sZ1t6NS^tZ`{qs3Z9}` -Bv*cFmPf?F4Z%Uo8pb^-LKDxt;}bVgG$~D%!*8DXuGNkoq%kK>N`_{^?0K~#d63_Ckk%x>RYp5(p}fu -i{F}K>oxYNuITPjBA2PNPm?w?6Z4FLR~Aac>J1MzKWCV8b9BUp7QWZX*=|B=dD_jY*mr2Ve8J+rqQQ_ -m%4pZds#=^n47hd=DmYXucq!==o>8z3C2(A`;f&+8mqIT)dcilzBIZCHF-&{L7on*A2Slv*${l)OWt& -RhD7E?$YRh1__5LvJ$ho)Z!VgE5#3A$1BTHGLh;qw%z0VF_Ih;%zt3|2B~Vy_xHXtH(3sACrd^9dFdxWI=%U9)?%0Rz3On0==H5JH|7AuszEd6^-}f>;X;DLno~leCPxgVYuMr -Jmg1v4~+RH0QLC?DeJ!uCUyJoc$(0j3*k{SKF9ZF2;RD==(N85vFCdt --%&@l0>$bd5yS#PT`C`|ZdOyPEWs$}JbxSqoXd#y(s+*$gQFS~RNbq9GjD}9sMGZ}}*UweY`0R>73FQ -*S*)Fn|O{ZA}rkpVlVaO~TP95AMdwpFd;tE_&K^9-o7l{t9Z0r!YPbO}@j4(X=VQJPFRAIc9(;$Wjy( -U~QFYAsaNKQA_@iAU4;I;_OoF74o!X>hwI%&Ct2V!pO1cG^ZeaYNh9Ihg9k5|g?7v~n}eGT=L->Q(Aa -43*aPyFClL{(qz)edLj5N_QMq9d@33U&SQR= -Ii%9W6uUt)B?Z>?#hwN)my)`4k1b-z-W_90VT1k0*_Hd|aJ>P1BF_+F1~P7h%(i1Z&4W=4sIubih+K) -gF$$fH3W~r7omoQ3+TTw~8Zxned^|5N9RO|Dzop0dLWpIShgHj7@AX{JNvqZzjwQwzygC~MW94|dn^6 -erwtW_-I%~(3OO^!?2!ydtY}W^%n`AWPk449{lg_1TZ%^YbKR=5x1vgOFNb+#CSh*euwT8NAxD4cl2J -ACUoy>(7IhJ>xzB4|~&|p!%kyAR}oN=LAW9)<_i&_^am%lHA3o#FSEP~r=B+~#K(Nmxtq;ovtu(@byB -j$~Nki-B=JW0FPoFKq`b^H5`gntqm@ni?#SE7*LD!ib|tEq+zSzVMdCd ->k5YSZn#F%$zpCf%`Tt~Z1>A4?R-q!uot7c*5;KbLQ7-h>rNYv;n;o^=e{SS#Hy6hDS^a(VKYR}tzHh -vRoEu}?NY^fE4*h4uslKoH!V9|69YR4{qV@lVILZHC5vR{(lYT**coTgg4G6A-z;9d6bPXe+MMdY5(3 -F^X;lo*-v8qt*1#qwa*=Es{2W-^2x!ta<@C32$VIH)kxw&HkJ{fl6)hylL=!3+jtt1s~}aO|&L;z)r=2qAWDv>VQE)+dY+vKCnK`j=<%`j5+30r9Tn}e=9)H1icKXcL#&wqkCd#e%cyu+s!E7r=d8L;6?eg~F0*j4NrZ< -DYC@^995zf1=Cuja6=9IZ5r{6A5jc(hEu*cRhXw7#gE}$_Q(}}{s7m;BUi&Up4kPSR$t@bgiqxy_HaX -Wj?MzR(>1-Hi)RPCIC)PuxL=~>^kszdUjCJ>1os%HfUowiP>*~tYEmNQCBP5^4As*J)QN#xUs{j?OUB -cf7eC~=E<8A#E*XJQF%yqCI*I=9n17V5o_FO&10~^~;b3|z6`MQjL*4;~B#w}ld(03cfSUHkQ{duUG% -6j_VGojDiO;TQBs-#AB0;5H}LyuXoOpm;RNcx1m!2()G4Mh_5#(J!mc&J0q@DzBxEoGz?qC`rM?7V=O -57K7i7=+y?PJtd=(KE2Ibw>!OR_=a_$wYk4Ry@I{*lg=(9^~SsS@5pX65mnbaHP2S701C)A24?Q_@nE1qEuAdJTEV&$a2ZQ6&IB4 -_?oo)vfJVJ<3nq;Xj8gFJZgCaOBUbEDxhj}^Bxl3D(9m-hlMr8q-+pZM6*Q1I^87D78~+8JB4&)Sjjp74+2{jR@D*YkUGz*YQ_I3 -Y_PFBVgrDc(yELvsF-u9tpJ*Z*VEw6hf8*EB`{Eos`n2L2n;v_B2-_ehgIB_(raZ}Hckfy}Zu_i;O)8 -9=@n1;d;(XEh~#Y1A%o(uIn1|0pU%9VRL?3UdzY3OOH?T38}b&EWe<-R|dF-S`AZbc@T(WzLGj;eHVl -QMLs3D0orvx+^V6R*Y2Ib3@>Q?OW$&hW*8|ROEQXh_GZ32H<%O!ML%78CDixMl<;t-@7qFA8+4bu9~P=H= -(NITbOFf3Zd$*N86C`yxPF`gS6_wVSyWDO$E7aJ59gx`nC{(p}LD2|J?#;X~`MEv$u6Opp6xTh|#YW69`#jbuu6?#}4YG77hmK5CoTl -lgW$A})uiB^pJ$wN*Hd>XtvrJR%Uukh7w@KrG-dv^r|0yy28Pz66HoYa+=F=k+h?q$G?B6;oPu=lzaR9Eb3RGC0H{gcME01+_UIms|QuP1eKk_c?# -!o6So0{bW93ogfebTf#^7l1MU$8C!@7X1WTzdQE>s{VT34~T_eBuNwW#e471ScsRf=Gf -uVTAnD(1d!ceP?gxf_)h~jsGB!eNuqV-o>G}d%K>^Gx?WH)$V4?&_8FYc&9vm7*6fenzHBP{ -TH3W^DM5+^<$vmSnraJtOR`YIasUwWvYPxCMmuTmwxSDWxupIe32CYc1-7?8Tetiv@%TH`a06~o^8mz -sHwk5GV;erXRD9Cf7^2ncJEREzP2ey`q!@9e=`0#r@;e=(DkL<+_uAx71A6uCTp(Ey;`P1l>%3^OzOp -l>>$qW(yNrv3X7bmAd0I&<8*C7164ELx(O+=;qDAXWR?8IOS0-h5413+9zjZ})5%o%xM3lKf*@@0Ppu -svR$)YkWo-aYy1NtCd6eE5TNF$xrgRBSc|I}0YCW#*F$`;MQCzjY8O&Lm!Q8X1$jX4v6cN#b1$f=JaALnJzX8PEBe~vCqcAA$gfCw-5RT|69OpYVjx>?0F$Z5rYSaO#k7pDbs -kK!oK9Djxg^yf*wV3P-27Xf0DL-y;DPR6;~8eA6R(=r|HK-L{Tn2gOs$Mn#ZfQCMv -#`C_tt5F2+$@&5pr)7kG|e7kLgN1#UlX08XupB_YpK5@;D7Plvn -{S1HVHQE{}~S}%RD*gjD@6q_zmIUGJ}chM{gX^DmLnbiP%Zw)l1kw%6Xet;tIW};=s27D18+}G%KL!V -yb*3XSQZd{~Q8Q4<-hO9y>=oV?X8y>U}{p529w+To{td|`Nd@RumD^Fwt8b^DO+r)8S7%K?MUAByFA| -7^&f#l1_G!HmE!)K~!(S=`EL`8{Fd>&>#=$<#(E9&#mYRo0Z$g@G{?nx;;hM9WS8&lhD<_ndTz(P^&H -NaqjOfC!0U(eo%3tH4oH_+9?)NSlk^nysH{H@5O>A=c!JFh -wSuL9#^Ro1W7&$zLS9VNuvpmTF=-o)`2+qq*RahnHLfz9wE>uQ3ST&gU4*gvj^V?F@j_8A20(xZ4+iF -BVAH~9n3lJ3I2H)JGHI8$k$}-D^*0Lz!Fq#EPn%!_P=yH1=X^}JS!a*Z*gf>#j;I@JFaC8A&7F5A0f~ -UNlAm$%(qT~Eb+ayi?<%MF6!OCun*L{5Dv?w=WJlmtA`0dlOt8{FN?k8u_J|l#^<5D= -?5ALxmvKRlhkPpHBac$3`8uwY`7Kn3TQ0`zvFTgg0XnfK;;TXxlNa9P0 -=E+<$A&{1RP#jq}`TV@m6fao+81#`f=Odw=U`fbSpYcTe+AnxcB{9Cyb_-Dm~7{p4_7X!~{8g6YH|I& -jo6MtTf|-)-=My@Wv-RtCO{b6tpVED9rZ5ZfbbEDv%FuOapbj#JYvHk%HDiuW?4<;bazWLbOJz;F^zh -&l__3%p+u4oXn`F0E6zvAE;u98>ujIYKOraIfSp81#az7Ue;>&p0?vgI0xImfJLE61q@P<;Vc6S^K0QB!q9W~GCoX-G-HeC=@w2mtH$B -TwmX$*i{A^T?WkL-f|_O=&8z@oXuIW9S|?DVINV;9l&1P;WH0wbPc=L3r -{LUgvUO0-o+O&yh=Q6qb~G%yI&16$*KoR^Jdn(DBaxAr;}&pta^JHDz!~}17Bou_ -T%SI3na{V&0_mM}Q$r&d02r)aDy^vO^+dG|{kR@LnR1CbbbH&FF84VP4QQ~hP#`}{vV)T>v0SfQ7bZ( -^?aTw&kF~uY8iA3^nZUOwiO*simGF?gQmLUlP|P}itM>u_sdwC$rl`;WYHH>L|J)n+&}c?PK60gm*I|w*_4<_9cKFscx-$<=8svTV?Fd9NPH=wT0$%iBZo?`&6fz~j{2e!(V^q(13RD7e7#E5N -qO9wRmOps81As&%BgZ}^b17|edQya=mjhY4i3TfA$l2p~ -hDuV_d^=;5_2K#ADwp|Gxy -0wk?MzM>eTwU$@c(MxiWE=Txz;c{l6gHiZaA;Wj45R&{n50( -4@C40>f#&*)Q+ugo%K^wz@;Jto`K<^|{y3aaO_J?d{2PW|?*Z>^h4*OCAH;7JFhqYh*E@bwPO}*O(Ti9+duQF~z$+WYP -T7xt8Ml6`r~!WYqa=n^%k%M_V*a88!MRo!`Y;}$Rv)j&SZ6!&s|~F4CGlM_kjWn*qtqvpf9IH1qdZ=9 -HvUK%oxduGwNZ2YrhxG=k^_86OdYq2cMrVe?Sc36F6ho`7wre~X^=T;FK4B8 -igdaX3$91P|^3C9PWz1mXb{n7DsoWaOqQhK(Z@IM(@d^abzZ>fQtvem?U7M95@^vlN%}g|BpYIk|Q9S -BKp9Is6V&0^D4?{1Ax|HV@3{t#Y<|IQZ5fA7bfjtz?@UO+S^^Oig-K^Pkxliz5yKVS@fsc@f(ZGl#=M6 -BIR*^?B@~+$7y6B|3yg-rVcQ1Nkq`%f6xfW)YVAx5-DS`wD40IY7dSNeCo+EcdaCagDXJs$42&>D15?@=#45v?%^2@8c$A9tf<68sXa32#z_*i+=PxH -SXIkfn$vg+g?JhTlXWo*t95;yDr%+%w*xMq9E|IJ$Ub`2dp~?1NJO+QF&UkI*S8(y5w`QT}t=h^yzm% -e=G>%}cZq0<1UX51HQh#tY;}|& -to9Z@Z(QP}4|+X!sv<2c)1QpgxG6V@03cS>K})!kcZ#0iEk1^+HFXy8E*U~4Pq$~Qtiob~EOMz+MK-o -ziy^RSqq*Raw=oOU3=-pGg_joCxWRJe`5MI{I|B2$^$_|Vc0{j2^Ci9X7kM}s7sL=tZ@!vcgy~gM038 -w=q9Vm0aedHkp2v%EEpKZ3Iy!gy*d&x^1)$Hpki4k0B^OZXekr8ArPo0rz3Eg70(!?L=Rr3u5b5z+D?ijG1EwPw)^VtjBA -?Z9<08k^T}$$^by+TjJ?-rB1qm2rC`e0`p@O3-12iP&{Gpkl@MFQ{3cCb&f%5mB6BL}QM9qqx=tpcS* -l$&*JDnt3vk^oT92FyAiQCuvS*hJZyEpX_w-mZ|nmV1ZPi8aQ?OC}FkKpueB|OPimxdBlCBG1bQ;e}w -;X(l~Fsy1Ny7gGSL5&otR-=+~=Gs{9jw{a;w_gUo)i)DL_X#c33#2!fy}6s9*iys=^k`&9auj`t?|eM -p?#({*vQcbbLd-ds<=^>rd*&l@K1p0Dt88$K%B8{KxP^mm(o81EUm_^q=>;yarR-{yYVJE0e6yB^&35 -|#cz#lIl1``N@U_70(Y=UPbbt#i8oQL;Cg;P}o@w|i_4AHP}lcKht@M!lU3y*cl;!rm$O)}`Bsa7^vL -lDE7NLH>@w@^1;ZcKIN%s-9h{;5HAwiTcRr>A?198$QMPPFRPVb@l4QU)6b7&32Bp&gmab81dDG;j5T -0fz7(W)i=7Rp@#@b`s+o%IU87q7i%9j|HgK=9mn}|!5`#)BtZYlWKEuVOR{aG_0P)d`r|QOjDI4swF& -5!J{`Xr`yHpgj=Z-*(ak+R72S3x`D<17IM20n@v2Z#HhyZ=0g{gqGQWT;QrGdq>KjqtcehHnrb+xZWN -!Sq;0O1%nWub==k15j?iE|$(~|A^U9x50CEN3nsi2W0{7@x(ID#G9f!HCPz%(7j^9p2$frXl5XsrOl_ -;8ymsDEkKE|4FneC>V1d#uT0BU#tSp@Oek?^R-V)gd*3d_(d~fa*kO#;@kXsyw%PfG3HCV;y;^#Naih -PTe1-b{}B=kX`Qa>F`|VBU$UXsppX+L(CmWNb_}KjzeT3S51Chou&zfS9&@}%#wVj)CHv}n*q5&8|io~0MwZ6C69N|W+4!QX8tPkh{Q!!tX9rM* -4@God+5HrT`f%QaTT;Fxz9QfVH;X}EOlhj5tfjF+!QG1n0Kz)r`JKi}`i -15?^_tP=?!8iCAAwMaJnEqg>q`)pa+g}uGh`*J|*CA|m9$)oO|{wNMkgIZ+!$ez?uCJsc)1QI}G&$7Z -;<{4iHt~_?@ZOK+rFO7g@OMg8Y=*Vgqm!FTSKqM7brbX^j5c@*f&c8(qV4cS^cqj80jxLWnruvXryqB -$AUA{j!BCDOwIG2=TNTg7oLtcL^(e1`TenD5)n`fXf2x4VHCab!Cy#4J8qu*^b=>NhN_}?!1(>D0?az -AW^6iHDKhCwg{<0K4G1dZV^PJFf%Zd=K=_mRk34kddlrKJ0ofxmZ+l-kQ&5w#Eg6XYM*=W3>3x(~B(m -pI9g_of=Z+lSD-XK~w?wtW?+-hJ5A?iss}#1VV9V*E?Z6=L7`(sxG_MD1JNE~lUDlX+3P=WkGKujj$< -RMYNolI#L6Xu7vaqHn=~y@{K8?~=)$tisI(vDvAB -MYo~9BW0Dw#R%s`5%oi*5-seZ+vjFF2FO%5b -!_pi#k@U2t%-$Diqux8HwMv-i6K@0d+`eQ`Bvo?9LOmB_G&f}`@Qmn;@|%sG$cmhwL -jC%EtVzud*jP^LLtA?FP`O_@7_ch54d}O(I-RD2GK?jFxyysVe(X$Oz-}zQ|4u^O~;#*zZ9B+W_y!}4b?+W~{){_*7 -BoMp1HL+3O_c3uxPF1A)CT`K$_ys%g%Z&j_KICsH4`E&)OKPp%@d|q2u1K7j$D*Y1cJFt&d%(jIW|`+cjuMG+1CDTthMb|DtJ*uAq3g!Bma-S7#b>;(1l?TXVHT%A2zc?K(i`? -u4F~GTU{WM-sLYG)sMlleMd*C&55&^}wHKQ*;Lr-@%Ol~gG}Ia8E3YUbzNsXTTQ!dvtRQ^p%&P!C-_5O++jt>GAUag1kbzjf64zj^q=op|8RwW%kH@!*gZ}m -G)8T-p1=?s+V(C8f-xNWR8etb#5lUQnQi2EBglJMl-$+-Giq1Vir)JMOupfNADjH#t@@pl+8gNJ9#`8 -k+md9m=c>|dr_{TlK(_zdtE>2~w!NpKwvB}N#oiUYr=xbU?P$LMrrw2EYA@ODDqzXpo0q+P2*};o@I7 -Uk>;VDsX7?ff9@Km%)3%ehtDtn>)}UnX=!?+bvU_#kyP|J1PHKvZ$gK{sW4pxnzq0%AXLi3&6a71S{B -3Y(qsQ8J^jL`+eFip=Nk7D}1?1a?w_6STymzhtXz%*DhWy{{U4JTVZ+lnrZSS&Ng9m=fz47`loCCi(3 -7n8R2ys%$nS_Yq0?<`Vq-Aj(TxG7EhJs+Nd=Lkm>SMSnuOi>2UKv%mKQ<&v^Wd_f@kx7n5oVU*>sbJU -EGkUP(zfoY7+4h^rx+FaH7%;{bgR{P%Wnj&ztIW+O+3|QYt?7;;gQ4>q$g-b5-bb5lglwK?Zp^(zs>IXA2k0;U3 -;sx|NnLBhUYg7+TrVmSAGJ$zkk&S(EZ|yAB1EHn1uFzUy7nh7^QHWq7Vw+n^p*fCTSESDH26V7@-h|` -V{|Qc&FPN*^QF777w&Hbx`3hm4jyQ)?jL<%kkS+HTyifv7NH<>IB-;5y;!=Z->C>?X`mLNV@w4yq)^? -0syk3()Q&(vWffx|F+-($#&WQT?{DRll2=C)6kv~*^?-5b;bSq_hi&Y*@^hA|4-~li6%QP?lOt#j@%o -T!|$0bGTYNMyZj^Z+y38m$3HUtz(1E`uUSzoHOcTw1@YOehvP;TWB-2sl&?(DPX;dbarmxVWqT*P`73 -JTn~l)pbv@cUHoVWBbp^1+?cl;{5rVh66-)y2q2~(A`>_ytzkZHT1NsSt-me4SpYS~rZ8-R$E{o{zEQ -gF6{Pja!_S-RFKd6h;PZfY%`)Fm^ef^G8{l1%geD2@Mci&#@06%?yzRsRM@ZNZTd&v8un=8`$+}017k -NtJvhZDH((jVI+{;ths?{WdYb{wyTk=@rDb#oqM1K*4%S+~?wXPN33`EA0$P)|Bvnd0C$D(7jzVb)*B -K`?2mOS$qSJ2isFcJ{)ja);B{;aYS3^p1>M6 -65+WOqq+SyJ?B;|k8oag@+C9$8=r-bjaG1o0=F*Vx`2;sn?*X*$SOG(Z<)3l --eNt^mxoU3L!Xjs`Bk9gs>Sf#-QscQlNc~y*di+Y}aPO!(+h0<#4#kkS*iel^J0o=yms}m8Wk9Rl8B)S>W;(@29vDm(e4v=F(5k>-oIJSWnP-0 -+Ep(l-tqj@}Rey0b+Z8IMONtB0U0?>yt8qCz>8TQZ*xOS(Q`qszT>=hzox0yWaHwQ5j4<|b-c5s+Z#kW4GO4DP$0E#L;7NSqv$L<7tI*R=H?) -#IY!1>a~Pzn@ufU79)Tnzg*vf#v=R$*KDhxkpvQA6rpzG*)v2wvSzyJZ8zQ?q}ZfM2#J3z3&1WFy}s` -`ix!d?qi~!icd0ahq|?Ca(6=CNvQsS%pdrPloEsZDRg0CenjG-X@Er0zR)C7PQERjy -9Ic64pqtBa6`=PQi&3@@(E&yEm!dp|D}fzTFd9g$LuEqq>tvzI&T?88tTguM&gkW;k>QIDEc5aJZdc; -fDb4eBuh{D_V3M3IS5VC-9MSz9T1%?dC2Gk+nXe5#PVa&Zpbg=a)~z{s{_qOG2pYf_js?RqQ%Xb_uY2IQF- -aTUlJNl5(&c0VLP{k6^>580+^bvz|FyR8NvLT=;!*dQJ<`L!+%_X|YK%)p%r2BHZEk1sDTc!Jc4 -cm4Z*nhVWpZ?BW@#^DZ*pZWaCt?I%?iRW5QOjh6iYp{6`QjNzJ>P?l8sr(A4!UM@!9PU)Hw|^!+a;4& -J*fnI6iMUH#=R|1fc6W&{P^*7Wo6;LjVuQ6+<$!CoI(F5-T=G$gwu%y=t5y`lNT0ENZnriA+IkzZ`NZ -4O0aGLl)nT3Jv28aFNCP(uk~@6NXDvfd(lpdy;a5ZL&j;)hlrv>;?Njryt=5P)h>@6aWAK2mmD%m`?D -|4^!j<000*T0018V003}la4%nWWo~3|axY_OVRB?;bT40DX>MtBUtcb8d6iR5bJ{Qvz4I$}!XYr@x*? -fflF7kIOyVgu3^vVh0%5O%T3d1@IfcEHe-qYK+t8Vx01y}xU5W*<9_QS}BtI_!SE4 -+j4cDfL+xrUst6jL?O&rBhLmYI2C3NN6R6(mf6!jx;H_^L7p+yE2lXQ_x^$dqTb-Ks>23d|b8pei)Tt -od^r&R~RE)7dQwR4j){waR%yHnQrH;2=sFcxdV+%0AEw;2 -8*M9C%WkX2;0a-6fTMe;o)!;yUnUKp-Z5=G20S=tG{7^e~rFIdCPlvCwZGaZgSMgOg8#vy%b9ETWzF7 -Wm=K2VX|F)9GYN7T_kbC~e=1QYr(J`Kd!6XYFAnxE&>yQ>vI4%DBbNwg)%uK}*<^vDCZ?ptbncHx!t4L#}c!Jc -4cm4Z*nhVXkl_>WppoMX=gQNa%FKYaCw!TU5_P2lBVzTSA^7BEiEMw{vFZ1GZN6yQ(79>qR^=K1{GCF -lbWKE$toJLzkcm`ENXkDVWeFylB|>Gc=(68*=w)8?&o*E`|ba>k3aqMlP|WGeDY6sf4_V6@YCJn_VE4o_BYy$_kVHs_RWjuKi&Ob&E7w}eiQ$E{ORG*e?-IER}YW*`i -sZA=Wp*`Zr}ZCi~sRa&mU>)r(feyKfK-E`{egqInN`S_|3O}uzmFE)%KM4zS*AMy}5h*``ybN$tMr5- -#*@d_j3&My*I!AL%gzWe|i4+Z`)V*um1LU|Ks-l7Cn5sy?xle`t|J(53jHB$5g$#|L*bmZx7+jAFF$;EjL-l0@bdoqUwP^0*Dqr@^!n}Hi$K1`1AW0cdy^vZO`9qKk?d|AO0~@pV5)8ua0b=Jw)@)?jN_i`}j -N0{`=kIn|NibACz}byIQ>6Vy)kM{+9m7YW~Cre;=Lxb$b=7@%ZkOAN=MN{9~jqxBJ&N`$Noq{1OeuKz -|9d+P=HnetvWJ{m-v%qlI|y_ODN#{mYl%Jlj6{;;-Ake)RO|M_)Yq>mTF2G1KwaSifxP{>Puf1Yd43s ->kQA-~JjMj|Tqo>C;dCB|h=d$4@?g^6anl{<9~~zWDU(ueZ;>e7b$Kef81PXHP!)=JSu9ZeM-#^s6tw -{`7-w`}*$g-4rvKzctDKXNtd%CVza0nS6Qo_WAv*H#zjb#`3<24!(N1{qX$ncd^Vb?(V~)w&$@$e){$ -QYYksLy#AZxjgS0eLjSnkf4{wccze73@^~M%6V~@1RySJt$NJue(ZBfMb{i$$^!)X|y^1CHIzIl{{rA -!IXRjU}9&fjgAKtv>t$+C_KD*aa_V-KM%eH;la~_&% -b*`U&BD3J-`3u`Ro50P9`?O^T+7oSC0=rKG6Tzhd;l5asMjb_}_kb`}U_leE8unzx?vS-OHapc>BvAj -`HD;@sY<5|JnI3_1L!e-~Z=r|De}8OT1LaeD~5=$Ka(=>bsX#&zH(x`}NXswxjdGy&u<0=Nd=z0Z(4u -;XdA3H2r(ZG;ja(uCWi_EAL;w{(k$X`hmXZY4q{o$KUwe>-b=F=fn3#-^=^)+wcEr|Dfz6H`1>^g+Kh -w$36d!T~Nn=!KAWN53ggJzIn@L`tj!%KWsmQQ`3QjyLtMjr#CkrKl$_c_Ss**dh*FfpMU$OCtp8%`sC -wpo;~^Ui*KKP6#vU1j992oet7yhr-qxe?i -L&2rxZyHy+EIFZsI}WxSNs->9sgYMgsu16uwedL;*)2OALUrLrSR7|&f9h_-dyKx>!aM(Ia;>c>P?|r -@rHPM8~bgiA6t(H*ILHy*7)Z*qaQ6ESkB2~wuAoi+c<8c#hrni@z++f-G0P8%oZ>Ew-QfpC3-aN<%)J -|jklKQTRgDc*3Mu1;hUo;BPOlwXW@OF$++5`{U+wf$!iREr{^s`nd3We>vG_2#E0gL9`)$?5pUUIdoy -#f7^OD4Q+d`k566BJ!-$#L2gBW24}RlW@vi7}=`~toMoMM&cV~LBBAx!m)aHyZL6hHT_nbHJ@#xIJ9? -n?j_`!-}6er`GeefgxI(O`$xJL2l)@XdO82JbOd89qW5N=|6;~%vhJa}MiCq@wiI$JEoepc2w`mv&Kr -N=zPYn{g9ExlufGv@1z`HJ-|*=~(>D=S{!&oCWlwb1=NCbS&g@$D@8&LAFH_A^==3_KPtjIA>+%xHwc7CsiwxBF>lv2kun>~xH?N0ZS|tUva{jt+ -37T`O?Oo6dnvoPY5@r9u@COP&Gb{?*EaU6NndV)y@`RIlV3HdH-)#fa-SHIhRKhf-z-ZRhZr#J5Rk -lk^UM0RXRx1V+-O@4J1BCmYokwegw -s`)*OcPM`lUqFhJP9AwaF_e7jT-%Jyi5R&T^eqnIxRXMeW%liI~+LoPLs>G#BZa!FN`o@Jo~keW4z3- -D;^7QteCP9PY6?pPM7c*;d%!>r(Mjn5MM{kNH`>dR;*zBv+=`cUF`-AW0vD_bnB=(9~>SJ?gzeL5}66 -&3wN;&p2c1XQ)Wg^!np1#I<}5%x9@xSb^SFx>M^S^BjSyT|KqKM_=AOFNMS&je|6^UCB}mXiYbk;*7W -NgTr#6uF(3gBz7|Vf%lG>u*6ob$mxC3oE-e-pgXOPyQGo($xz5}dJ#a}h$vhCr1DLZ@F^|QPEtYIzg) -C^(hw2S19XMK7UnQI;m*JM+wqg`hHfuGN&wEzBx4k90xTvg*y5=L!wygxo$k|pOuP~R?5 -_URZs3vv;EXK{h9*?t;S0b!mKYax5YDGthbTepHSE*rSTe$M7r!vzJ>%v8mjE5MQ@23`i^l`afD?r7e -GoJbCKSlWqhlc8@8yg*OuEX34O`511D8}=V?bd<45;ZE7=3g#o-lDk4m>_dEQ=8m?qaF}R$~vlud!<` -Ts^@hF)W}xy&SGCkbw6K{11|niiyY4FmU`sb>?ty%P|JjCYLVu6YPtQuSh|?>}_VYM6E6SqlsHc-n}uRM0`#J7_LV -1CV-#&V)gj4e9Y-KlypTq)^E49=_=S6Z0|cAok1?1>*%;F1j=Q;B$Wxo0&to{ss)_8a5|1j=d3%`~zv -j-~Tqa749c&zcH#s%8L^=+a^g4kY#2>_DU*tGMY6+bn$#Rp8ztzgCp_75x68igntOn5ae*U0Q#!K!!-aeXYMV>uvmMTA*SVIT3W{_+1st -V{TTJkeS8EiX;*(wRx27h+{Zj!uLms??~7U8g@)apv-UdcL-xn$Cm_A%A#h2rCV1@j15`FTO*TNCm^5 -SW!D{Ju81n)XPZqgj*wd$0W-0UI*nBr(NFCgzDHwAkmQHL{!hy&Pt3%u_yKNXj2~eaKWi`_naDC1Gp7 -14Lu_jfq0lb;+Dggunj4{&H2DL;M7L70lqNQY)$v^RRnD5T?4<~%dOn*YWz{hl!F$3iQ&mGMEffa(cm -hPAivJso~4UVJYLc%pAemKD;7;Gc#Rwge#4kYL{$?`DL%EX@o*C04LjWG1GX*Vz|hfzK4EK*q3Z9#X) -cH&Y^cw}BXFQg@hG*- -aG|zX9gT)!#w>7QKvQlF$wN0dVP69?uy84$F1mC!<}4ix0=WHE9lVo-z#r$(MwQRr(7>dir!9eDDM4O -W;Z93t7OUH#*oPoDUp1ux`We#AM*4`kCzpE(xQHg@qX}kTC%X$p6_}tvS==0StGNo^;*+bmh2?sz`FS8G?qDEkS0c9))LyFu7opiu|3x<9Lh~0JXTo2*oy=-d@Z}Z@xX5 -28Mt2f(E*uQAUYdqNx}bCaB5p}fEnlGO%dNVa$z0VArm|$=SU`b>%Pl#`2^+$=sKyLx#q;FtY8ry -&5zKFy=;(P@s61o@2a%DonJ~sN0d!6zRB$GJRSR-%=4wq!Qor#?Z3@h!d1TN{rc_HMyfa~pLP3Rj+$__85 -!!`!NDm@zVkWIRW`IDB6mkwYK`yaTYH6_K!(aqy9e!iS(O~Rkqt~U-9|lt>~&7b8;L`yL3%`LF#&|kQZ&TwWtZ=}M#-!utir^B$Vb)#Kzr~ -HoyX~&Shvn-nkaRT$gpmcM8IbwEQ){flHzd*xaJ8Wh^9HjUClo@ujnb`vN4vV@4 -;KRiGqZshQ=%C)C=m`3+oBx-Xlu@Zbe4f+KI__@kI!liB;)aG?nCnONmpK-h2xrC#j@E~%_rhr$~rHy -!;jECHzxX|jX@Y;Zgfh`E!yH~d2}d$o!;SFT$NTv80|SZx8r4wGtJRQN9GG$KB3NDBVgsci9ADoPy+a -TIMoyOaJmrY7=O0wDZ)hhrQt;sdI>W*xGSEdkXRbS2i+;9W}<0Tw(qWG$6}TCy$@&9iR0S?yQOWhV~+ -%)pma(@IKd#cDxuZ$qb%??%ElX;SPV;k>flNqp;!0FX9LV+maVp|CQ8S&gnzzQaWtBlU44BNa-clFAP -W+>1}8ghRWy>M9H){ljYUljXG2!;Jt^lW3Lr!C4o#iH;5&mHF|J`=WtMU}9q)KxJSi$eYrVlO=VllC^ -YyxbuMCQ({dfukcis#d2KoJFvdtCqY2M?d{Y9V3H)&V6nPfRcp%Rj}ZDDcA#YkyMNW6$wX%y>hdLUL~ -xhUknbYT!RY5s8_UTsGXWSc<{WQlX$YKAMHk{(=o8xwTvEY_BQh0ClB}tT=WHB+g(GLhW4LZ%!vg6&$ -y1rkF99cmz~vu0d`V$^&0>m)qn_A`q$P%`C9$dod!psc-3aS}i8n#}DIJpgA|8CxnEL^uDQ;KrStDc? -fa!3T*Gwj9vg;x-#YtRQc=IeLGs1Dr1ANJF3t8u#T7fyBsSq1%I9v+L6jLZ{1R!(momKO5k_M11NQQR -f73M)NG6~%-R0l9XLBnvAX$;Z5IS{PdWN%7%0Nil2hZWJDb~dQv6jxk=0=AwCMS%#bR#3NM4F)Hnor9 -FDP?Nz_Vn}ln?S|0{r$%ZTc!$&!Pv3SYl=w15?&L#DnvT?hP!WH{pDnq6O~KE)@J!IgU -CSWsO9?_z+wQ@B8$?TTAGHybVx#w_m2}@70%C-?jIIj0cwo2F>?!@zp^zloojdDxIC+rV`ZJQ$3F|80 -hLjI4h7o59O^KtKIgllQ8Fib7oAb>1oz!u=fFEc*N@c1HYo(E3=SQILUh5km&Fw$M -^1}^DHK>BWJQ(^%3w%GSm3&lHAkF7<5oQMRq-}K2q$ruQ=8WP66TV+> -#v*-l(p1<#^yDQ7hWky4R}%>5RY6!@1Ub*25{Cm~}fLk$aP4Q|A0=^)46tep)v5l?8kH$xTSG29#``y^SBUItfk!%ElJ~<=wdCQO!3a1r6F}Ee72;?!2F6kG!*q -E__LXHrx^Wy6PrYJ0`VII7_v2>xMsPtOR74dcnX09m=uZ4AW)7fQajxRSGx;-viJt^251(>w3@N+?2w -bZkby%>cN97eezdDySgZ)!GzLdRIek|RN_l)4r9~_AMX=DdtHW?AOj4<#2SUq246GSCY -3sGHAl0SFt7M_!k3U|wO!>wCnY1lx+ck_V01k;HT;G~pk`6)Ff!V>^8f>|%XMJ;!`+zn -d!jE{@Z0Kwib$W%Y`I$Ymtc#?1n;qtAT-O`%`zVmzp5i8nxSpl5Do_}>AMTS|2wH>+n20VDOuK0d?dT(#=r(s(Gb1!F>%a-zI6X$>8AJR}REdyK -_VI0e52JZGSfp@FkEO@geX%NtBjk5dqNAsTR~Bm?3x-V?S0%MX4*5TL1+CKuaDRX-Tvz8Dhf3R-<;`x -@Ey#B@b?XS-ErnDC_irILqDb2UvzLsr{M -G=XsQF)sU0;=uh!jNL4`<^sU^)F{UJP%eIc$ObcnEcX1jq)+S1$X?oS)XhZ|Zl!Ne0&=mI2l*B3sw?! -s)ULLk6lYK$4#F8UIb=kb1)j9Nt%ew_00)?nCv>_#}@Hq7U75&)cG&Y?V~X4ublL-*RN6d8P&GR(A#?iCqFpYpFwQ^yGc*QRn{$$Kynw9ARauru -g3Yu+2v6;WZp#WiStz!jbTIL)@4D@2e^o48>jq -!arO{70Tx1S{8PY$QU_q!V0s?BmF*jgMC&&%}R<-a+gy}QS2jH=88o;GB3tou^AbfQL(`B~~i6T#L*A -yb*qJ=K*B>t)nq>roJN_=a2EXIN>8T#wx#{q6`YuE|wq04pbdgtZ)nBV*?=9xS#O1s!^#1{+3Xrv1XN -Jn(pQBn@U0U)WtYe)Cl1H&;}4G~OHq&L548IRGu22yeX{E$sDJ{(@n*T_+ZM(kr4xK5aWb{NL>cG%vm -SG$2rhR(QA&BK*-$_^VYs-qApZm=#BfSWas?Q%24jDQ+3^=n;O&H7MP_e%a$@p>IC=)j9L@L82eR=~B -a_#*&TwG2Bp$S{zpwdic&NEg>}VXx1wbzls3-d1T|e`3w8$SLq$v2JgHDUqA_sRI?!WfyMa -pz#iF7Tpjd13FbL^#KU7$_M$iE`Vfe1Z>yu -E3swFP?c&6*~1X`boM<(WRP=9_rMrc&JmO01aNR`(+R4UbklL)gl5h3Xw-+*&E)mH7(gifib{^RA{nV -)PXc8KJZzoQA7U_Fq@-icFS^&-Jc5EDve>aGP_$- -pU=?=5Xem4Nq=|)P5^|%Oh$Hn}>ItrP(Y<@QmFSY?1ve+y4MNZe+y7~()X|8E;q~;Bcf8t?vuJj1 -4P$l}cq6BaV2+7|}H6>q9pMSMG;3rvjRcaPfG*ja@ym?z{1Pu^!?o@Bo!;q~M@`Vb*9!*~3S~qmBBNL -U=USeWoQk0HclPuMNV*ZSQQY-Z|&&k1SbQ6R|$3$=Gf6={`Lt$>wS>a0Ho=hQkYlwtm`Zk*9B;-{9Sg -;-g#co4H*~nGBMEGEk@SNupo3aj0iCt|$dm6>bzID3P_@u_k{;-97d(0xp%Xh -<=(5de5hWtI5lh#A5{;>YiFucu@M|Txf@8j>H32DS6MT?iDt9qqedwC7d3oBu!i>FJ;hA>w3e1um{;N -SX}cs6Y!vVq;6jJi|(~FtAD2lF+q{l^DTpUV^*sp<*A;>>~`NDJ`4H;n?BtBsrO`|A`Z!MrvC##3iqc -9Nk47}eT~?QHd>q7^$%I)HY+DxzIXz3uN^BN0IjN=&`$!P`t(G~?lA-`lwjYi^1z}twkff^rFk~JLE= -7iuXVRRqy6f`o4=8CvRCMIZTgsIYY+(3hse7JWzk`s?ogq5;j=?r0tQHSOHOI1_9xg|CV^0*%2Q?ZND -zj?DJ-rIeE_Sa=zo9LU+Orx?*YfSS-&-b?;g;@7c{xWiDR5DC|S)Am+*-!cChB8eeJRbbg$b?=W5^qG -m&1i03F=b^{_`uGPM!*n+Tgt$Ak{KmSwV+{8>f!I$D}F_8`qrndHtB*p;5$Z#FF -uFm`-d2r~Ki1Xle9L>O$4c4d&htXK|=8-STFS=3%XJ}kU7P_RghtrLTXWhS|du>n;MIO&{*v)kwMm3sQT(y4MnR~R?6j7_1Wl(~4jsCO?wtG8-_vyi2?{lqdNmmt*dlUP$_@~jNbnRD=o8h# ->Q)qT5M*6~rJcbihCf?u1Snc7o$^5nRg$vDIN6dz`WS9;kWds*Svx!gmv6=>vR>HKy(+=rm}Y}3D+HN ->3cFm6k#+N|J~WaFzHJ%=0F`7xm}jht=Ti4<7hD2n8PLK*+J6HxO-c6Deyg7ZeoT9AYEI_qO1r0Uo66 -QM-m|HDJ(M13k|w&8y5$Z$9!a8Kr@NuZQ%Dr~KAt5!Xcio?_|$VXbgz{xsN)|tNh~P^5}?BI-nR7SRE -1O~LVj*&B@6y{GgmyU#vBHyBijX+urCIPZR9BpK%ES)MMGRe^)R5d%#5Yv=PfJLbU#5Qtt5{Ks~vVm& -T1IpR6zGU0|C1nYA8&vJ*ny;ICl9GKz0wPur`N3pm)=sHFU2rQp}o7x2Yemnm?E+ALwfNNwy9&vxgt1 -^JM|p1Y3>Qe)Si=ghaPOrPg7N;9{dOKu^$yNr}EwTm-GyJQPHrJ~D+RH!(rD)(zcj&B}vV)A})LGA4O -65g-{sru?2`ZIT-&^9#hFhPf-qJ)EyxH+8QJs1lwUEOASfk9>(XEdYQRfQcQ{lw*Feb7N^jWJo;gPI; -d~L-#t!k2lY7sF=;n1R&6*&h!}sMdk0%I92C^2EXqf$5SJ&93$_mXy{%Wv$dg+sl^oikkIi&Ac3UH>a -({`qOigx4;hjcj6}!m_fs|{{R6t!Dw~^u-PGbVJ%RpPnkmaJt1st6LnRe?OtOq3=RZ8xVOfcGIVY^b) -{}`aUbUzUJnWm3O!iUz5IK^^y}SA>R`u{i7s3o!ftK~yhVHdMunjd~%JU@R%%W>*>4sz8jc -DFDcdXRYBeN6&g}L-$&7Zbj*>sp<4oA@ng;K9ExmR$gffQ*}z-b`T$ce| -=Hm623%OU6xr_f0L9xmY)MS@!}NuN5!^Wu_dvH_z2!9vovCDEb>^k3Q2fncsKq1}>?R{kA -J|`Z#GFV^2qJ-`6T3Bt96%Aj|IZ*$yYaZubu$d^THiFV@;Q=iG(pxA@oUIYkpq$A}C)y5quA*fh4RbC5s3u%&vQ=wV9CZ6ZX;GyB82v5c3Q3y!}K|P7G&VYT7Pr3vm -QH+f&jLJk=&LPkc&c9seB$%k!7v{K#8+MC(mIAs)?+k|NlKV6eZe!UyxzFfU2D;~>ykUq$DbI^Ebg#` -MW?23(S_y)iOYHbOiRL_@ydQRuQUs6_hIw>dI=;T=`R=CfwRu`b`Mb6atIi>wN@`Jb-$;L(Hz*+yZeD -qF$SNHw+`O&;taQzTx>rS)how-=Bv-uqPw+i41kSRM0oUD7kw;1li!6ZvR)#t6Q{X;G%aaHO3MnL2*~eCdzPoQw*n1>N2z6uXfRw0I#-FU`W2{VXI=a`> -db;w%n=eebiGe5elV3y{OlTOe2zGfOXhaxWR{A?N0A6;e6JvbrED%QbAa9^;w+U!$}Myt{aTnuLXIes -g2yadopq)e@5)RDQeJ%cMM2xnpqdu&3RzwA-;mN=*fS8OEymmq)OTm5@GT@dQ3Rdo6JgqFXK1KfLGpRo`q -KsClkxOY|ptV`n}W}HFd9f+khvUy!pi4gBv;&yJ)`%3R$wzJ)C-Iiuep;qn1f#G~3nRz$G14vYMPpAA -89VD_)Rd*Det0YWb{gzyxFGRtb;1xd==wU;VCKa0ygfrEJx7pJ?N%hw(r(y_hKF7(iLXE3BZ-yoiPU? -%5-&pBIio_u4#52qWDP?~Seu0IZ-&7?@p~GC~l7o7w7eQ{M-E05cB7x8usQ(7kSlLeuI*Nq3XzE>#^6 -P^O=dCRA^_G(J|)iWh2FIXr9Kg6UGsA;%xYq3&H=RxMH@M&%p*&>+k -01{hf{T}8+Dwf=S)OSDulbB^4(Eh_9e^b4Wgt4-TRG(o -yLro!3fI)vt8$AI6xcy1=cW@ingdx3N2^e&*Ig2)_FAm!d(vBe4cV3YJ;M(!7~HNd!o^fe8^dq_%Mu7 --(=^F;lWv*6+Y416SeaxxjcP~L&6~yYhf$fMPI^$8^@Q6I&Vb~BX3FL2)4y1Z-9aGIrL)i1l+PUI2GG -G(}Y~AUpl<5?sd10ZMG}JfgAEb3n-%(lP#~Z;piJVQsvy)CQSz!K8C>2D&>C7FLj*ZiEp@51bvmFK#} -6AE>G2mbFIMcHMl%FYfN?(hVXFa$Xjw>bak(KSZ{6e$O@gQQdiz5cIGhv516X=@6XES9midOD5rK5^blSCFU`R9U?V=B$R((6r=*#Y0T@mHb&p_gay2 -kD-I^+7$cK3H3%-b`6|mDft-RtYzwaSXHm>v5uedqN95qT&^&@=Ywk6P(WoN8kEyz<`pYQS_tGz{&1n -dVCMKFqATmB-TPjLXVMTzkd*X1X1sh>pfWG=*(?a*Pp$tAFIogq4M72oXV4he{HibUD2&+xyT^NHao= -^R{{=@Otm#x#YR`+B0776=wXmu=5K7jb^?7c@j6BOr0;+xU23jhvr`;!B6vv0dhi#?4I=q2Fysi=hBB -xBNAmwVea!;=jcL;DGth};rX$2TIu6oNRodO6F*TK5DCx%hVT6P|(Pvy>ln*uJOQp8&+NjFvYhJ6~+G -3vXJI(au{o?dkc(DT;3yn{fUc{k@L!>?!G;Ln;?PT*m`QEl4PqMk-(v_;BIV2}nhM~96Yq@P2{7exWv -MPH(JOL>!;7G)XB;z;qIP9t8lOY4yWkV~kpIr9=?0$I_j($3Jm)}HSo8+3w8m#u-Z?Ie@sbZYfLFp40m;YsM>eL-Gn>XHyi!LU^8d;@Vv_67b`dX=L<75;AIxr6Gogw^t~ZCV%wCFCa08vf -xnP4Io1^%WIs5BGv$=>MGZ|aZb1h)Mr;z^*L| -1>~Rv!y)tNMK>^-W9EG}TvHl;-7g)W3P8G8t2dL%O5!#XO>-*YT09chrYX`1KqVyQMwZ*#g?G@s0($5 -hb@$~NI*aMtu%q->3BMIK;hndhk!MW_1WuW@e7<-+?QD1+=hPHDW$I=0SdC{uIg|rMI;Oy1o2J-1y;7 -cyc$IybT6NIx<^jG03mvxWwI38+8pX@zT}m?Zkl|HPO0~*uX!Fh(Fs_`tH)mcte$Eiz405U=g$QvtVE -MX50c>?BEO+#t5+P7lkHf*|_T^zN3mbH&WWA7cdpF(h8(3Ka#D2WU^6-K|2m}Iz2zM$=cI)UYar54pO -VU}ry>?{1o3jqlU-BWdM~%pPsYd?hVlzI|IU*=FU3a$$&`_$x^EKo$=&iC{_!3LJ0K*QcS}7VfYJJr! ->pfLYQeP!Cb#J5q-Fte(zh3y3N1uE8b#$+rWCT4LAhn^Sg3~qKGxf^ch7r_j2qZ`-Re~uRcd#^XA37D -p=6N!z?Khjk8r>FmKotP*P|GbtM&-Mz!tsc55w#o&@4P|_gp}X4fit=Aq`KGBjqb5Hm=lRn-0TqGc%2 -^JqkG}c>1CjK5Y_a|xPok#wC}qA4C?i!c`>6Wnn+Lj@-8`WNw>!DJ)D3Omj}ss^E*5aPYRs&iMoil#3 -lbgn#8)<8SjSyi+L6E#gZuDwMUuk1@wp(#O5MuH```flC0R}Ce?n4*lX3J@a0@azK*zmfoG=J$F~v-jI`rVdH$ssm@@*Sh9` -@5e#IFlN3V)mL5~imR@=5;l1AlnSQkxpBX*V|h?g`z1$nH(v1q-D^$3q*#+ojv{?Kjfd0&mPG+?IrK` -D<^%CS6sIkOdp^M{R%hOa*U`N;X*~}Mclp#)`0SYdLKAHSfa82Y)T>?aO2U!cruV&g5B=3He910)@se -7P`?)+80Ay^f=omp$lM8-P&o@TiEY6q3 -l65bIi*>pnGi;2a4Z3pg5>|q>kDoxkR%nr2-|e!01USdo%wu9(s+Z!$lsL=#4n!hJgj^`1P^Uuk&pdH&yGB@d3yVzop2p>NvfVM{eB -Fc)@_=O7lQ2Tk`PvV2aZl7_R=pmn^UIKYat+)dTD9V^4NXd*rj&A=KMtESAi!hfbM{l5z9uFLfMTS%D -nuo;mUSuM#4~80Z(v^%X(-f1;`dtZr)rYDs7vSG)QfxMWB^j+{4$Q4c6jXAsMGvDHv`1(Nr8krH}wOB -VyN8@)ZT<@aiE3GPiH4s2der&w39fMPL^kb1yW=Gt$^@Jc{(%K@i0q{6)C@AT`F&Z}MSRr3g-$t=aSv -9cNr`(fJdSw;>7Kt)yXK!Il)3Q_@SL&4DSQn7dKdVh(tYR>AtW}embz!3E}-Gv0y$}d0T(ak$~z`v(o -zd(}X-6MIA_sIKR-K54L1sYHaL;e*4!Sfo27d6RL;s&5T#&Y&GBSV`9EfPm@WnJ`F<3#1Nyk{Tpzg%q -39pGL}lD)CqTi-pNcse*w4SAl}(n<2E+(Z_*k6-|6)v?QJ`X{+-V&(ma%FJZ#u&KuR(E(!a-kv41n@Z -&5`?#iwbAW!~kNXWHmX7cm54pY5ADEK~khHYRsQjq=R6HOd`%Hhvoj8$i4xi4Hb-!?pB_`WlF1CA{bJ -!)H5S>00hpLItD_HCEbbZzXxCn)FYPv(-m8C^*`|_l$3NvigN0W~kt*y**GH94Qk+rqy%_QrZ2hQU-z -ej#`79@`jTKv2FO&|80fs<#ESdFFYRR=;$$ivvMYb)nyJB -PIeC65l~&+|DXeOKUmk&EXmPw5DoTz)edqRU!FwWg?p_M*=|czZH^g+mSj%aF6l+ -d~H`n`w>~Hg&Fcn13uXiuw)EZAus$834;+_@_{J-OYZ@QvN=U4{Mg -xE~#6Up4>fs%~Y;bDWdO)|NBx#=Cc!Jc4cm4Z*nhVXkl_>WppoMX=gQXa&KZ~ -axQRrl~i4C+c*$>_peyQFAm_kaf<-g3kpTxtV%dXknq!`a! -@Hk+3p>h+(76B-TU{v_#BZ#0d6(3RX~qe+V`)6~k1)Iw2gGA8M0Y<^3n1ip)+)G`&`SW1;-?I}f0r*V -W1we%9mM}A>tc5KPy3 -a;grnViY}D}+5zWlBngCd-+0dwLk*N$BjOvA`E5lX(?FrOr@JQ0>_k?&#suWJx1-P)bj%*`k_RxmGd- -cqCKSj!8J$g_zr(of-ro$w3GW4CrfjABZK+!`&}z9U}Cp(>>mHU~Ch5-4Z_NM>lr?cni@LDRjdgk)4Y -coGZ;p>Y8>7@9_dc6#9y>qBT?LI4@Nj49KOQ!^QXMazWALnSMs|c{Eu(KOh%Q;}redGs$9y5zGixS)q -Le;UF0I=ka$SqTX;cTs#N$gW+P*PZAnT=M>Q_nlFa&aum&Jww%wVNxwssFdr=rW?nM+WN{A4!obOly^ -zZ7OMgat9R#Y3w&I1+=9DESiUfX^nqkf+W0oTT8Y`g^!?FYu$=qb#?YsoHr;oTB -=j$Z79@ZVWDe?qGRC&4XPghI;|SQhPu=d_hwkUQF3~bUV=qD$PbCx2B*@u}-(bI`%tj)~Fx- -3qR4gR9^Nf&oNFD_Otr*fWdZ=dgDAstq|!}YCgi^`XmV_mmx?d&Z)p+{YA2k|{R0-#5ioLwnW!2afSQQwIoK`D|jk8*{9IN~g505Lcds=6vHq{B8Q~vEa6$b -|gR*?4fLd~sz34I5B>%vNea(~12uUDOTf3?L@^a$3`Z|EA7`|4ETp_?l$3VvUuWnWrNH{q(AYXnN@O( -`~4!Evb2@lE3&P)h>@6aWAK2mmD%m`>nXC_Oz1006@z001Wd003}la4%nWWo~3|axY_OVRB?;bT4CQV -RB??b98cPVs&(BZ*DGddF5GcbJ|D}{_bDV7uVInEymzDw{c#!3fth2*x=)(QogN}N=O4tA|zHbgs{JU -pB@R2kidpqYWM1>RBUE?o}TG``enw)$N3++tlu2+b -D&(|r&|<4!1SEnFHb3}RN59WvH*0aas7g{vY}FD_mJB3HajHP53C%PQ&!CBm=5jZShE_&St>8ID;{#a -9?1y0gPCbT7S8C?|A6*r6sJ(EUP>13x}LOy$WzXom~7+AtJ?R4~+YZ0t2Hf*CosPoZ$7ir`@gO}6iz1 -|il@0#^*OqGVM!NAvs1X3( -SobvviFwxjRfGy7bXKk|wZ(`fg0Bm<=KaH)Q(joarWfSF8{u+gIoAa1le#2*13QN8@e2TP&^c&D13@z --hBL1O1jy3IX763Q-=kXVfj-tcom#8+@EWqPG-lzy2uV(+prA`QRcQNqfsF&;uHLzNhZVKU=54e0z`J -iWd#!r6OO1AiYII-g^qN=w+ggY2`8SesR?cWke@03gQq6#6~|Kh;~T`X_NA)p&x5 -QHVV43uWkyBgM3&Z^bQN%eW9O4RRSWZQ@8t?MTymE)tMVHixPEM|_LBPf1j&vEz^>iw(UM+@%iSiQE@ -=+yshwL91KPKlx!IPtb_b({aGmyT%5CzgD;Z(h}It?OpD*J)n%d(C#s>eTR~xYqt9+|>S|vrRi@o~WH -AAJsk@oIS6erPSYC@=&h+c3!eq=BnlK$F&-%9Xg -MW9M4v$B4azeUZx)eLk-1ep`!o-(`WGADMYq49T)2YLI0Wl<(ePN>jbSPaILPU8wAwJf -6`s(y_KA)E-QHxRz!qMq84A{l$RQlRG?fa5zlxGkRPt@1`s?KVoqP>Y8Q>1_wih9b}a< -qf|IH^o3f{%kUc+RcRcd>nAW-iRbFsVKqRh4?6rXS-})S=)FhglkM(GAg3~El>Dqld~Ad!g3c;A^+kB -b02E`ksc?lE{7`^di$2nUZv9BG0hQpzPCU`py5FLp#eHO87wp+YOMhg!_8Tem$A>KO5rU7-y9VABgzB -?Mp`Ef0oT0BU3OAU?mHU&1vW}cXTA9o66(geR-QnrkZx*n1^p(IlhTS}VR(>!*_!5lHUEFguFQ3~+3C -vTY@v1f$qg?(3;jfjqJhmR4E7h_;0?}S=*8@GoMF#!t1DgqA9~p*nwZRZloKj|qstJXhfAl+SiLVs5H -J{Oj&?p_o2)P1aA+aZWsd$PrbT`!OWQA2Y~Q$<{!VHZinZ#DDWNvOz(8BV4`!pW#XQQk -4o%HLgj)ev;2^2-#S6Mttit_@7xI`J+Ve!hE+T+Ntbi0!IGSZc~7~ANO>x -b%iK0A9cNJ{iqb3RHw*4co%AEy)0`A(+eM$0$n&eH;|o!+d}`og;c^JF=lxMKa`>7FQ=l=>QO(M3r$4YpgN!ywB2Xnz((PZXnImO=2XsQa8;KQXeQT{Hw}x#yX>Nq#=eS0)uk6i@!q#JjGxHF#gKCYZu;_4 -P~e_8Mr7{zoN=F=bTPX@N+0qvPyt{?uM*g&5`wks76LLz(;oh7BVBtxXh!6Lzm@@CFq0(ENaa7b!7!$ -Hf0JObCM(TX%gGrtHXz&Q -BQ_l(ek$UI*!hxjz(D^=64=VqAq`s^?oz$0={{pF_mzf{K>h0Kv(R%A+)Gl6Uo~iaA_M^{M2QWLrd@8 -f|AoicY>r$*VhvcOsF_VlhWGP=XxAa01%gofO#eJh8iE%(QT*}dl9}^4PkPnN5Ew7@x;$Y*wbdM-_9u3QR94$R`?;^&2L}K3JOz~vlmo%fD|-cB_ -kFYbV}frR@?pW3|EGanv6ud%!5*Qv`|k(`M4tMbxJDinc`xJexfq&g5_>dR>p(2g3Mu#t1!AT)y{yKy -DKWusQ{OHc8>MMUj_S*oIq?CUL@4BGs#msXs_&<%UO^x}ukLy%T}R#~Wb|`qAaCX(c4yAWpXZXdDT^IYvV=`{_bBf5R -P*=N42jMn&tv^96M*~*v2m$p%k%}M)q>+U9-DNP=Ec+>c#SlRN{Uq6@kdJGtWNr%!{tBsvmghKMlt)8 -ut3*c^@7|linXt<9pS(g2e`5qWPLjCZMN61a9D2{mq47^n1IFB@dWY8Un#lS_sI;YZReF$t|bIM|?%0 -cBnx`U@I`me~i`yY=;N1TuDPe^-k&Z2LZ!W>C7HzWEMkMB`M)*%%@XYjgm~ye!dU6Q^3F5y7a)z7e -rINK^~~lb|u=CW9v-EHD}Vq%_5ERmh{nnPM4II*zqPy)}h~Pva$w&=6C2LW!EPnZ_%@0}3AT0Hr}-26 -oP7Hl@7##8BCY6>15vb0Op8=#7@jAk@pfu1i4kDWQdk=VY1X -;sJw;5vnX-vy -OmPT>O{5%fSPrCaczjCHQhU5agg?sVEWouAtsfaRPlbr1B%kMCS6SB*xb)fPOIG4(Q4&5h1fs}+~)xu -qt`&w~xq2JMbcNS)lTN5(nYX=-dV8i8QO6xJuL;$3#sJaVL&rIDoqMd16KCg1m)21V4Orj=_y;(}WDe -yk+sp6)U6uEaTjZh;HE_V!4J7zgjyB@+32J_{^0fKOS&J+zMxvm^~2{Q1{O*b0sH*D>{opG$EMj%j0` -lBQ*4(|j&qp9Q^>qigY^4)Ta`d7*o#Av622**%&4?Anv#?0&j?p<_IAI^+219y%Av^*h-}7n|(G%e%~ -%Y>THFX7g1Ce4JzIv?icH$%uz213XFd5;XT{w6T^M`4d|WhIg1uUBa$IW48YPCtD;^4nl+&=5xJDEc* -1ZIY{t=CU(^8m{Q7?%aiUripjh9ouS69JZjQBHqBwrzEV>c@P1x7{{7L4^#+sW_|YFO&T;C;D0`_ZT^ -g5OcI1Jgmcw|m@Spp&t75+k227ZDEQ6cFWpF6KspA(~ZRfX^m_u}f -1N`HntmZ*~WdtF8Fx7na#$p+^(zvs|QI_jV>Ts^dVL{!$f4>(lS^Z^eozBdjPvZwrO9KQH0000803{T -dPT-eeTE7PX0QM6A03-ka0B~t=FJE?LZe(wAFJow7a%5$6FJow7a&u*LaB^>AWpXZXd6iddbJ|K0{qA -4U6@M^nKnuBbYj??Gmk@}li?IuErLu`v7Saf2Ek@drWLx*w@97zV1cp>XRZ?cAryr-gPdDf1$3OIO_< -1~~$#^iF&WH4Iay|HiPRO30ozr41=vvE_R9-}bI1nULx{CjlQRLCBl8-{CxbfGXPDMt6$b_H8ntX^lX -Il+pB{K=JPvTKTaUwLuA!SEYLw+i<)b|pBqs=B)()ThMs}x^#5^M7Xis>fS_T1OP%S1rS!f1SH%G0bX -DPU@yQDe}gH=RxwDvpXf)Q=*Xv202+kqZ4N0vpL7R+*N|9Pu^MW)CMsSDt>L8yT&%+)$g~VMbX@H$}F -Nm64dQ3;gqqcsZ<0=uNr>`SbLaCL%>B^jRpOVg4pxM$*UQiS&g^1$ikYe3q^&C`atbymW*{G1MFQ-;$8HXWN{9oX -{JmyR}woY#~-^cp3YTbSM0<38xE+kS@J_=^TZiiZmdpjM_DlgFm1Ufj*)9XelU9MVLn|Xn-tz880rcZ -x_^`ex)z{*{nZZe0>X9qyo1{u+=0tNhF~dQE5+Q1ssQhtKn>Li5LBkmOmAxO07t`Tf>$aO}E -==cYo`2iEigOIrX98^wUq0&-vLIGR6HA#Va(;YWo%5o`o9ixor63LP(p -+SGCv+oT{uk_o&OIY;%**T9VsN`~7nidkzDz#Rd+Ip<_}yLyA|%(9;0M=jq#_Dis9d#jLm8od-%n#Dp -oz*43pj4d#-W8T_pfSCabNp(Acjz_gpJu*iELud8m_Cnjd0y&<(>vTWyZIYp43rsJ`ESc!D2l9Y*qX# -(ad;Ru~S&mxUqDoSBosy%7(Uk5DF2L;4JgHbOQ8GSuwtyP+#-DvH}oXKUSd(gz`_l>^Pm$AitLWMxgJ -5%2R{3y9Tkl%OVqQtfHc^?=-#vGA*1mUpAH(jc?zdJDv9T=f92any)Vq;sssUKo5=M>?e#%h5wc5F)w -nTVjZLh9=v+>YWMdSW{OZMW*F|(tVo36bap?j-gr^6_Ld^+kx(mU@ZCvD-@Nvp{r11_cEWou^!C4+^m -{%|@bLTd-#PTrsCv7>tP{G&OsX;8P*x-&@XojYSSz(ByEi=jrAolR2sA`#^C(+#NO8{N7-WRZf)5o45 -9}swhz1*kAIS|UE2uJ5lwPEc9U5V-eD57DxW`uG+g@RoL_@!Lsah}4z -|K(hP#>LW)Dh-;+JBd8sPEdpcgd&Xc1VM=38kU) -^GUgnuA*&V+y*E|E6R&7AE8FGh)nX-{NjxWD6f@85JH(kYLQzqN(u^rDYwz%@X*-D|*8%GQY?$!Mk8< -pLjJ<`i60K**u4qC9RdCi1)1+vP03e}Jw^ja^TGhU;4que#KQCH4g-1T7!7B(cwvFdfS?j&Mw_AiA@t -nca28(>_wYzsU6*iW!o#YXtR)t%xH`YRmsiwuM-35$Xb~Av(=RYOr{D$U~7ra -RXKgQ>3V$;7}LZEb=t+?D;yz+~nfpA(eY8R3lbRlecV*CNSwQ9~`K`=4u)Q72I_8?l@?dgGTBMLhWwv -ZcoDQD3zciQ$u5orZHbBcn2EhR9^I6qa8uuK59{&y0bzw%py -{L;C*SwwC725Z9*VxGeSHc#BTuN!Df2A&f-QX=bWL1#m-an|Ui-jy%lBYA@2_k=M+9eqo2039xOiL?aT)lu)yG&|h=x`}idUtBex1B -D)IUWeNuZ1{qj_gDqp&AEETyo)#$HwMZU*W6M2b{xx;)4(tuq!hhh-d=eM1>Bk$M`DP}B`~yia+w&2u -UM{XCgoqEDy0XVT`Qb>{oVe7voC={t^dGN2t1?cQy -#D(-se>p4LuKd_kcGqd{~LRVTdsrg{bW^2ZV`%<-4|A!DseMR#^4%kc`6|44s$j9g4xsj|;sDL{ve#o -p`SM0EwC{QJd%NWy32ud4D4S8`2 -fxXUB|&a3F_Ss=GFfJP)h>@6aWAK2mmD%m`+^#H%O!f000IK001cf003}la4%nWWo~3|axY_OVRB?;b -T4CXWNB_^b97;JWo=<&XlZU`E^v93SMP7zHW2;pzv9q*h_kv{++x6*Ai$i|X^kaLU^^&+A~0y_WOJoN -kEEP>fBhaQ$-k3zMuFDHyT`kCcaQGT(cuqWc0c#}bkn=)_J>`%yt%vjlV0#WY8=sM#&l=oROUj_l}?z -XrA+@Ll@gIQQ;K1W8ntULmrla-6E9flIUCX`xdRyR@3XV9m@`aSR^&1kPU_s^tC?#Pz5tl+wJGhfVc| -HT$uc1BUnPvknlEwH%u(~|gxViJ{tk$P?h$pAqJj6dG+@hS!AV)kmCl`!lfr4!v?ph<5Zwy%o$jTY8k -x~MLWYiAb2R)F?SI!Yn;YsbMCoQ}>L-&S|L&ibYO_6KP9$5aCGV$*H2O!9lGxfM!lT)P%M8;RM$^zC&QDC_>VF!XWMqTkwZ68U$977P)7EmJ^WE3Hk7F12;u^|pi9)A#N6>AUua(>Bq=5 -SEud)a`%zNf9|}G|(x(E=o_K0nSBqc7CFa&G3Bm!?HfH6SID9jQbE(_0zUibDJ` -{8z#B*)_ycG_ab(13|QM~i3P?*OqAa#d<{{E7UX2cQP9urfOsbIDT5wcfZF;rWdu?LErgOucxE8F$mb+95!4tEjWwD<@+J&TkO}8brqZi;fV=J1X;pdUiGO6+m -Lr=`C}`mInct`<>j>OL;1$QJJ+QB7nEtO#F(sxlb&Z1L+M|S -7*CT3Qi=$l;x1gBaa7hECKbsk7D?4anPqr_eBHQ6`dNk5KI7uFT7m8CRy$D9+8qoaq+1Q&Aoev*akpC -ce!t~gYZ@qCujjg&L#6Cv<+x|3wvx0p2LVE$=Us)gdSVfT^jQt-=Dk(W)?ojVz)ScLY2{KV$Fs?-KRjjH^zi(hJ`1~<9{(mTLxk6 -U>AyA0vPa)O5K>HU^O9KQH0000803{TdPJD*tWk~`60B!^T0384T0B~t=FJE?LZe(wAFJow7a%5$6FJ -o_QaA9;VaCwzeO>f#j5WVv&p2USnE`>zBl;&WFNvsk;*eK!@t?hBW>avS=*QEaU9rF<)C6U^_*z@t;z -M0wSc0WECNB8j@vv?BClL+J4V)7H80gAU5gJn?XN;vnx+6b9dI(*7HJ0&PQ^>MuU9~RA!dC=OcI#lugKg%Ug(N2-m>Q-RUK%|DNshO7@5ws$;JQCN-*#dQU@UsVxB4y2t_5 -DP=mtu#x-+u>VGAym7LfWtTbUh~RWTtK`XZG=MyMT?wF;PlbMX|X4~un*aK6D)xLSqtbTi^yUm1?lo{ -mg%yHk>hxhgBPZ&)}JJVvX@10%w5Jd4v!t9}}%^C(F$U91pd8LrZJvYv%2EZ3{$B8mDyLUe9%+su!e{ -MzD@DYu3@S&$b}xnt=Y9rgL4E)5+)me9rrc(Ib-jyLb8%Pg1q -28eau5AbcsNkactJc5MbQ&}?gR2gFfjE(bc>SM^*!S!%B_%gg141smRp3e@V`Q1M*RJYUNNg3>GY$x93 -2I82Xm_!gb_+z3MG>)_8IO*m_UQ&dy&@O9KQH0000803{TdPQ5~!F=zt-06zx+03rYY0B~t=FJE?LZe -(wAFJow7a%5$6FJo{yG&yi`Z(?O~E^v93R84Q&I1s)2R}A8d1322ay9G843ap~osS$rcvQgw@&=O@6r -AULM5~#m^A0^pNS{vBqNt&7WIP+#W-R}8A55uSNj3(n~I7^1~FqucsbRo9e>C$q?X>P<;C?+Y=87E<> -&_9KgEYN04DQrRK5IR=E2}C~fS1$FQ8`3$sGaQJYac5Ju=P(sTsYJ@0(8}W1?6s+XKuim58hdIub3CI ->RWts66*Hb|U*W2qqh54PgS)%GL2))bpioMReXOOJTW(%?)>IN{<&4;rPMe;+{sIfpl$js25OQloK{t -d99XU;l%I&mj>xVQ_Yz#A%S1C7~lhwI5@{W$nZ?qh8{vVVk-MX8{i9_iM;ZrQe`N|XYIHt>_ -Nk)*@`CIB2#+eiW^k3C^u5108d29mF2`N?Y+(JPD+h@B1xMFjWpG*!z7{6Jf@HqVZ0nit4SEsVihmu$uJ; -FI6p}2#XKkSQQ{nwg@%$DcT7mzl>UPDS|lhl+Ob!THm6)*qKM&%?5qFPL#frat{0G#p!XzlQrh+D%?Q -j6rti1zg5}iTK88LG`t*5#Af|puv>*X|Byv!Xq}HZS5865(It_un{WKWd-VFY{9T2S&SS}qJ&L02c66 -tn2xzPm$>5iG>K=@%p1N|!+uA=Ao@tq^Yo~SH#M2o|_P+RLTZUswsLh%DKsy&JKOdC%NDK`Ex%iZ4S4 -Ww@4r=@h_p>jNeH{otkdruf^izD^o?ytLbGF?ySkHbl)(@7<>wlO!b-g!2x3v3I_Mo#Osz|vW-dzQ<* -wfkdBte@UHsy@{b!4YtMiiM+9V2$j)o~gO_G1n6oD|Wsderb~S&yh7(Ll-}e(Ea8)#@)>veP~TP$s7K -TtT`A!gyuOnT)E(5p6@Bv%y;o8#Q%D^!@m}4u!bFswe=q~581lvC}`W%wPFSTRaC=WX%t=6#a>-vkW6 -h$w!Mgc#=BUO9KQH0000803{TdPDBK($-n{t0DT4k02}}S0B~t=FJE?LZe(wAFJow7a%5$6FJ -*3ZZF4Sgd99R9Z{jczhVS_mqn_FeDzueWNGml!pe`XnB&^g^Fv$Sf8k>!sc9Htycj7=OtM;&~<^q208 -9(#kxwyD+Tp>WMz-$maS#CA`;|6$vP-@I*Rj6{kQKhj*(hV;%G_d38GhbuNak{)T8&z~+z$Nqqm-Yx; -W?Z(G$L0Nc%X866)%MD{pi3Pm6`4dxf)pdZr>P+<;Z*mPtSWw`uK#kI9%aP@)6&AD -vU0G}3P|ExT3(W-(Ah}Wnq=d9Y$Ytxy>vTTz5;y8I2H)Y@N?z1&l(tnK*ythYJ;fd=od($Fa$Qp3!(1 -3F{u^2x+`!8E(eR2EmhX0A4@LpEo)(MwF{r^Irp4ksmi_|^yvR!;HktZt$h<)n)9>r{*={^@2P|e`;Q -IA;$8JBmQ@7f$wOgx=!werm>K^P?c$FY^#b-G-?_R}7|zlNj_aNa(msLia?qw(7b=j}kzqB?p%z{zV9K&!P3=$SMy%B_QGC6OI2~Rh<#4jSWe_&ht{0uaT-C2C<;MpvkHH0jV -{w9p@SBWx3KYvD%Zc!Jc4cm4Z*nhVXkl_> -WppoPb7OFFZ(?O~E^v9RR&8(MMiBnauNWm#1rp~%s!GkJkxGcU^Br%piB4%%S&Kb}Rn0ElU6OLYzO#P -8IGDTKwf+Lk&OAHw%rk>8FPk5@bKiMW7<)r^8n|#bo((_38Q;s+B`nqmGsRb2uoQ+eM&KGY@-t6U=18 -@Ih-^-)boB%`oILOG2~)X61u_BCfI#yQizx2HL|8^sldfA&5qI2L@>hzV+4Mqek_FabC$#3ZwXPXQXQD&RenoOqlu$<~&^~zJWJD85%GW= -6kc2qNty!N%>MSwYMxK3K6tS%rhl+1ADoHhzU>_bDhHz5eAruf0T;iH!|kQ-kNqIrgCi72GvHF9KM@A -z!)`U3hz*$qH5;5Wy&K89`gu=MqnDY)~44LQzM&5P$U8)N$?rFH-MbZ?cGnPG+E%v>6f<^h+U8h+RWJ -eshe9H*rBBNkWx2P8R;}qP*oZO7a8oDxTh}!NQFL=j9`hd)0phiE+LRFeDW6WXAcV)OdsLX!1o8!#p4 -b664P`_{mYT~W}9*Xrm7SZW>1L|z{K^3?f0OkXK;SC?g10UuO{(Kg=4n -TldQf$d=BKbgZLXaCtOvY#!Pjz1UBehpkf@utE_Jq{t2stSV7>&qw|4ltirC4S4QbIe=p&~KKljOriN8{6K|tXno)GjXl~Q%#PHJOaCj*M@UG@9DH~pV_eSn96Eax6@r}wX1 -BA2aJqT~jgXw8&HvsH3Q)l>KE2o1>?pqXdJ(vb#1th6D0ZCJGC0uSEVNnlSV`AHFiVn=gQc#WA@?br% -OJSBy8!Gf1zRA?TU{VJn%q&H=B`~B}>FbOBKdv{C>2D7W))zxr%YWpy+Y%OSb3crv3!LQS5wW5@14X% -!ArMGLpXy;gfi;IiwGaIX#gPj;n(z>wg7j(474PF4-61h}fCQ(u+MuzGJ6a}Msn$I-yNUH&v=IP!FRj -vg8%$6wv<{O#9^_o-y8vou=xV=kRO=kl~d&0;JipMC7U0NhW67Jz5=a7E(CB_88kkbYZ!?wmW>C*BLt -1!tLbUT#-i;C@|ceI_`FA3^`4eU4voMVKe@0|*V{0l9G)ZSb8`zE -2VMH6yP`|CN>ONsU6c~raGWv>FT2#>NmTjoUBSq6-+MP=Mxgk^VYlU87l-_oxD>c(9uX9)DHUFo8GpF -{6=pBcP9k%MmLnkseskntY>+>?hGi^vwwClNc{@<=-e!tP`BRb9gzmpy+O -@arw~nv*%)abV#1?Z%nT7U9G_8+okMEdIok{^7sEl(z`zistOTklASVFuf1G#TVil)@6aWAK2mmD%m`=e8V4@TT000gt000~S003}la4%nWWo~3|axY -_OVRB?;bT4IdV{>gTaCz;SZByb%5Xay1DZ17dY87x0p4Yk;$fC0HR0-CW`^Fl=L{b|PY7*SyuI{^EHz -W&@j)KVQT?ty~bpLy1dLH^$;pm8e!Fltt)rEGe(d-&cIB)kF*O1_QlsbaJSVB+P_qHn>Xm}$Dwht5UF -WYfM)>HRjVp}#9xwc$8u+j62e2|Vel?pry0wxCfcV*z4Vk)s|GMTxyDFWMbef(EVJ+=4;14G|a%XU*q -5y%k?=ZlD&T?s|8rgQ9S9KcEA6!NuN6+^J@S*SY>=;Z5zE`6yUJY#~v!7=9DE%NeRAZ1wV0MXE66>UEd9U65Y)x?i-c-g&yw)AnNa4B7>a5nwf(6LPvw{26pz69aJl-m69DpMCU5F;E2TzD9Mk=-+pHr -lE02dR8)0WF)4dJ7|_!BcP|0vbQA=9Gk|IOsVzxEd-_X4w?1W;z1fU4$KD?(q){h!g#Z+X#jdX1=s$P -8uViFMMkau6j2EsCRGSTV2=d-NEe{`eLThitD$GWKX7!je&7iO1Qxs2aW+cO}%l2iu!r0-5T7|=r3A> -ZqqQ}qNhV0`gMKKYTUHzI`nV!e$QxT0Sqal6jL&}B>zgWg&`*%W^yD0VLSeE>bJPOJ`T_s!B{*M&?qysxIyxO;j%`;O0dAsH>gxMlqi -w*SaFWWWbFnu74l9QzE>}tAI9ru$7Hi9sE+6UgaU1FKyiOyX#`mX@PUCe2(iM1Jfpi64S0r7L*A+=u< -aH&|m3Uo=bR}L_CS94=l}T6TbrsT8B3%)GOKB~#k*;Fl`o-U5tCFr-;ccX=^12%7YP_ySx*D$&q!YYO -kWTQrA?b#^Zb-TzuQN$!@;Z}rCa)WjZp7BF7--k;Za -Il!E&Od6#Gc(qng3%G}$Ax#6Ob#*gmveMys%Wa0z|!9^9pgDndq!&JCi6e%Eex?~p&*O*%t(JH~#(^V -PZQ^u9FP=<)Zl=?LGy3&hZo$Dd(Y3)9P4u3n*+B}}AJbSrOq_%y8bIL3epGZyO3k#4NN*r+!(u9%SLr ->pOo%kzv@$ZMZAogCrb&%`}B9ycgUzC8XXm1-G1EvIRX?ym~3y{igeI8cQz{tqhrBU@PEwRHTwUg23= -Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN-0Ms=}`hWpbh -Cs`@VVXpb9}DfGLL!hxIEBLCYEV|x@?7X4R?yGx3m=Y+!{+up0Y1{tL%$mrm^Y{?bxI8lXMrf@(WfB7 -_`d!$g!6dv7o&jZ>zsjc0U$-ovPoDD8Yz_(hWW1QmFZ|daOkC`rMzKIbc!b4$(l$l0%6Y;hqy|4Y9Ni -V8UuSI$lhV%+d%za6(9CBWjCB0g@^g(*RY#*femZXP=@;^*^Zv}sQklt^6GBOGm&o0 -d3z%L+TV^yzly1NgrwK{n?HOktl3r%AB!6?U+3XtDQ5e4`1paO?+;1wP`(|KetgS#0JLI2bkEG~%Z7) -4+PMF>hYKE!9gD5LL|i*X&yv8h{%uPFo8K%x2?C3AyfX-FOmlk>xYoA=foo4m;SvU<{smA=0|XQR000 -O8B@~!WAUDL&Dg^)lr49f9A^-pYaA|NaUv_0~WN&gWV`yP=WMyR&UoP?pZ`X-`?HI!abh_yy#2kl8=1&|&7%p=aCQ@h3r(SYgCG#1fPi#1&mBD7=`jkk8CWR^dqiNs7Zy>%)rH0Na0!hS -(uH?&nTg-nv>b74|?2w{oI`R_`@ey!$Wv2{zaoFg3Lk^tAjTpO&=>qc|uEn}>c(o|*E#gA%koM8GhmY)vMuq5pUTER@DB>X$N!^(GP^Mpl|hyG7t2 -7<4D?2UxUjd;OmO=%T;t`NOW~(cNf5EgH8bey=_4w&>Ip9lFHWUix%h|bl*{R!LqM!9ZerL>hwnwASO -RYD1is_JFx)uU8Iz*)2%YrK?g0^UcGKMuP&Q!u9`$s4=d*$>JB?UI7BWgm4#MoYH%5&mr*r$bjDiEgj -{+SO$6sGTnWjOw+y|Wg)62Fw;Ld#R%SPdBP(vVmbbC%aXU_SGaJkza2m(5P8oM*?PMq6&wTAnK$CZ=I -{}$NciMhG?i_5iFub+~gDbWBXA?^MwSab0gMYOpAo4I~T>u8&AQ+4~-F~G~2_t4qx}2s`J)I$@5QY$1 -Zb3mHFw26VYIwBB*4<-bOttC(Rh<$v6gHPH4B(a`5TJ#?!0ct&J(qcY)dM -Z%`^tJ#bT~Ty6~e??99I#O3}&RXh5*pZSFE_%s{d=FMHP9##+(~_`ZBUesPW>VsaU?E40Suj|~4#j;F)j9~^vqHm?Q!M$M-mY2@Pb|C0PgL6jmX4&#FoUlmGx*?ihV(JTo%@6bZKce; -MJ?e~WF*X0>gJuUH4*?>zGFINFRomka<;Lgi=rM5{kE4dJJE<+CFUuh)X!)W5Sr+(l+OuBgKcgk~jpW -^q=X!$bOC%V53N>P+#7-tWP(^S&A(3HTzmUjHO=Su2ud8P)h>@6aWAK2mmD%m -`?OT19@Q>008PV001BW003}la4%nWWo~3|axY_OVRB?;bT4IfV{39|a%FKYaCw!QYmXI2l7_$cuSkh6 -MrxSKsH{t_wJQMzPiru+4QS;3f*LrOqiOoEryG0OU%&A@1@=m2q+KMJ`&4B{M#klhOXjUx-~LzbKm76 -RNqKzs;Ng?!56k_>PapiP{FAY_PHvSK?|0?tasSKy>f*9IIK17J{dM{2@ZbB(%ZvQ|;lrn^{hN!M!?C -=%-0!Y#%9|W>_vGu;v#b5hK4<>0`*nAD__#Zk!@F|x4VpRr$?oR*&Be#v|026TTwUkSQtxldcMoot+WVR$zB&AExp#S4&KY}M&Ue?ly3O0;-*|&z5UDKnDajz-tOOh=GCXGx49j-zS$i=Tz{3}k568f$Ghv~wEVcc+8uK -@&py4r+`q}mkN0nOSJ%68aa}(0?)v>7l6nLq&%ZEI9vzar(*3^d_W7N)f88Cg^G%7n_3LV1D4v$o^>- -IH@SocJ$i&;p^yhM!+BklldH0(l_+zJU%l=BT?^E{qM-t49{+4D{Uhm4M>)pFgm#0Y~$CkgJz4+_Xmo -Lh_CqI|J-#b6Q_vFRT-{;trbbd|!ZIt#OKBfu2ExD`X#nsK{WIPG{^zi(_UvtL2`)7~OUi=LAkIr5^d -HDQ!dGz$W+$+!SoxeDH@bdA!^YZNF`Ln0bAKoqH`EK`B#0c|SLjGOE?~>$)LrU`P?&e~DdA)7@=Tz@? -GI;s6yubK$muh~q+owg9i*%8XpZ{MvygXd};(l|=9|HZp?BA8E!_8^=?YK|dN$dNQc9Y5<`aMmfe{=V -=Of?5xT>axRRq#BgKia=b(vL0=hvR9vf4IJ3=uh`@?hv&Ocj`FQQeHmKH~;KkdHCdq|0Af}I!VIMFHl -zQ>fQ11pG?aR`Rnf<`FpDI`|ovT!VvB2i{4vf&d}CBUiGdn&))7X$`4;{7r!`1pygjTO4C^WQogHqz -WlhI@0amzK<+%*%?67be@qCx{KnjqlZP)K{O$bJi=UsJJ-GMy)emRS -U!0%afBE9<>62II_ws*9X}&xBKJMQA#}8jUKl_h|`94<*g!SP4#SxQ9bNSDwNAcz2_2sUdewma`lQW; -bdUXEq-(NjF|KZ_zPX6wslscZ~e?vZEIIUx!PfJ_tXnnp@n4%R$O~)xt`PI`Ul-oYd$7eJx~x^y1vkmRC$yJ?7@qL^KC1nMb -(q6;oPNf09A{xv}JH?aWx9x?L-RR$QfQdSJVF(-j{$+ByrmAXzDO_`>6 -qYJ<%W5EU^D}f=7bw8aI^H_gFlf)XGVvG4(SfTriXRMbX;#_-yObWE=SkYUjBv9U~bKw)FCBRSA2OyQ -tRL&?J%Dse>NVlxqX>=EId}U)%mMK+U=!i+TwBysUif1(D9TNr(bK50c{Ga4;>Rn69xB3EmxOE1i(@mu|CY9flZ -^*?t6EF%)pCk_$L0~L6#ENGYY;FZ*$5cvb1PE+1!6sOV?cs0({?P!8#>QIeD7 -Or{t)N@OQAeaXgd8G)wA!-iF&8eNbJ21EjC?1<*jN+m1_72mVm3sebT~E-p2Py&YiWSpI>{!WqAXVU0 -Qx3P0tpW*TVC;@b@G9APp}F8V#yggKw^Mq6%=R3u?Qg2dDjr`h#&DGx2&0>`pRR#uU0T~o#8Z%xuCiBtej*EpHSMyJ6IARr7jsvjEW1)0SUuoOVrqEhhw&}@j7;ZlCl&KG~OvS^7 -zuh>8$B_;w@Ww^Q=^xfDBV%JcaY-L5_`VdyMBEEtLj9?7lQ|9Ie3=hf86YhweW1IN_a3}>x*k~Ey-~j -^)B3vItOE?rG`JfAp;DU$^eq`1G!PIXm1+OqD7L29N;*Q47R+9fJERyk&{MRZj`*URxwG6DzP} -QM3#zIb!`^II_k!o!L>5d=?5R+?e?v7b*`%W!aSMI2_;{gM4*;Is(S&2$j-Lm=Wa%I$)l_CDU%3N-_S -G3%5k_M&$y{R)oGREFPjSjZPBCa^HAuPQ8N}Q^ZZQRK72@!jin{=NnHUk3m}fT -Gi2Gepg*FC$R6zue2-x^vZW)vk7i#)#SvN*x6D<%7I$8ka^Dndvtv;F^`4y?)^PPmV65}iJwi0|2Of| -*^a^Vo&uTo$#4$+%f2mhFAZ%Ad;Jyv}gwR`l-KXf3on;&)pe+ -M5spx7r37FDYr^26q)Tx2qHa0a5siaKFu0O5uiEl2nnb+NNyFtFe=qAYIKK!|R-*tI8Y6RH)A>}QvGk0XoPCBv{8D|wGhvd^qRiFW-7}L6HB|eRghA%Cx3F=r8UmIA* -PVzxzKsuM60~kReaDxf6+)Qgx%kafUof1u@kbj!Kn{~3=s%;9eGv+W5BP%FXnG*WDQ^*abS=3;;*|JE -6We(jEPWmFA!(kXYC1iG^TWAXpY^<96MkUS~nYL+h0)FlFMAFvhU -U88xNkU4uHxqs;Y0fj%A~QG#o} -)K66|S_|CJPe>3ScmTjDe>VB3uDNbIV{p`ACE)%ez$^1%|W^RthmbBS&mNNeEa?zJqFX0yai6ISPzAU -_f;>^r(RG(>w -AoiTH$fMnp<{(M9LTpeG&{G%#&eT9Jr$y(`0a-j16#@W|Kppn(9b`BO4eE0WdO4fnr{Z8BK)A>&3_}XtB -~L85UM$&3$eJnHNxPY=AET;#C|qy6^BFZ3iQsjgC6`V$g7|Ac)!6o~cx6)`om$dk{Zlju+VC%Kp3svYF88&ZJdX!6`JaAqQ8If6;H`0;+#+ta9miv+ij}8BP$&J3 -q<8nw|YQvTXK?*h_zU^VbgvE>OlrjN)RacsQP;XSgp*75A_F*GPAY*4>ll5$1 -A|%WSBBl>4hYd`t%aHp;or0$hY$8WW|0wsG9p22pi(q%u`L9a8G-<;WlYluz!M -?5ZsjK+ubpeZ)-x-*?Xb{cp(`_z=tfLw$!ApSWstZcIiREx+4BP;o!lsDwGP4}D_BwOwK&bJdqx69)yCPwNhU?Ki$we%NG)86sW -R$^45G12c396G~({-^XA*LAXns{g-?IPG5sX`DuqbeH3FcPE+`k~kkJ%1b^ZJb$|Cr+cDDa;D}3f5_s -i%|&IV=kpw%5atkVZ+hx$My6SV({p4KHz5Lt7+4=W$@7Yn4~>u;0EbRJ|Kwa7r<^@ERNVCLARowfb~K -`+h(VU@idieOCZA>W5*eZ*c8R4&G?(eiYeHvJyGgUE)1K^Mj63>G!n=Q{+C~ -NJs^GR*d9V|3jg6M3ahN*KqXfz9NFT?+FNg{Zs|phMs%~#%*mn>FpQ@|REG*>Y7Ly<$2Z#&eKvdC&G< -M$Ju}4{2ps+w;QHK77knE8eZpps#B_SCO7j4Pp6-N~fC<>#Rk&pg_^lG0AKC~=Suu1^q)`Vg<|AaR -qlFLQKHWg2pk-6=#g#1p2#)}GRSaDtMgbb$EOWWLAR{BsJIN=Wf@Wy^7IM_!1R!F|$iNt*HkmvA5%h+ -G9#&Wm&K6NbXmW7~vH%bi_DyZx5N8@>Xch%cv7qA>w1k32O;GvQwta;(s6;`T1OXoEv!I*`^5QT_}lag;Zn{i)Sa8+lVm+xM20;K@L6GLhC+g_UFSblYmV01l -nr0%JM)0p*%t$0HtUSW*B8Kng@IeU9faVQORkZNf|X3JyV-T3)Sp`yj$@#Ow~0lqU^VBzD8|iJx)=8k -7STqWCTmwdJg2RP4$rFxKZ$9Bq{}{0h9;XM1&0Eu^d9=1J?_JLm?$5{*}!pOh7Cs2?3&IOx91 -}CQ!{q76`IYodWqUTSbpyRF6NJXkfdSDT}=vrVylPQf85c_iU{MHwG>Jo2-*0@uZLu1o0}i<{)4i7Ew -^JhtgEFjcbi|Bg2}21N?{JFg1OdG>XPUgxsutMp3$+?PNWSe2U^RC=WuFm9W6Td?}j94>E(*X~=ESXh -N+WJdXxY@L)Mb$!PKlV2rfFfZrPS`AJkr@yZ6U=1s%q5U#8s(J1g$><*Y$>bII8>L&mdPw#ADyYOnKe -HBMLyTwHCun-yPPX^|kWgg;F_Evah;)6jD6kq&l$$;4y>sTcp3y+lt@WsB9MR?!?2se^sjn*tXk= -rUZqjEfC|G-%!GLi)1_$saRwDTxv3R08O$^7#v5pEN(GJkb=_H0Hr=ve@G1|@Y@Q@}6*>(}8XQE!dlm -~;<@>&UPx3v6c+NmhNCzQ+h2jvjBj6*U -6_VF@uRi>(f_&+H8N0-w0W5!^ONs%TjN;S@eNQ4Efr!jg-=MBze2aQGdzJ~{tO(Wv>x9-YQd1Tt|gAv -hEckD0=9y&6tPGiReJAF5lPd0;1Ir&aaanDHEp5|n0IrA1V|@j_gvfKjDmRBg_KNWpP%o!p5mp*&AqN -lY{JK)-ue#Qvcbw^w1@_m)|kAW(Nv5l>okOSK04ONCf+LC&mbV;K1ZNas{Iioq^FP3_pu-t%@b@U -SyD76Xuzr>9rR#N4-^fD3&j&G>$+w&C#~&vgNMgZAbNQ%$crX3C~FD{h84O4#al>=hyIhy+9V@~oJ1} -Kgd0pw#*!)IiU+GS#!KIt5z4~BDuL3>mg!`f1ORs1!juBsLJKpWnON%00&|qf9&h!~#v4Iipwi;uuyi -^0pnGMsQ=~BSSa|rsf(&Hz@Y~vp(>rTzj?`oFeA$+VU?)lmQ21Zrf>_`5ol#?FoM!=Cqsj!7gmX)4AwBAAkfH9i%gs&4;Lb$QPs#^W! -JH%hAtFo}h*8c=$~SDBen$J-MON=TXo^j#cdil+|bO*TiRmP -1V7CL%-;4LmgEvd*P*ThK9VS-L#*q!49pn8pp0zYhP(?1F#LJ~9+GBxz5!~BpyKWcb#xT;(5!_H6h-i -c(e2G2$Z&!#7@#}Hn;##k(EV1yV+ySmV%F00J~uZe`oq<-r-R85ExSO~_c6stK?GP{x%CP&{Jp!iQ -vLUPD24IMXWGj{9wD6#lyLmxPk}@)5@&L=b$`IuCS}}~y=Zcp6PWI+A#EPAFZvF%oy78|CSm20V -mqR8Y-(ot!CNTozz?3yyzg4Qu~q@|aLeB@VFX3LgLLH+^;;-~CgCbkSySyozR!b_tae(l!S-4B3iZtU -KkSr(piTGczm->(w3!P?fiYU8OB-BR!K=f44QF+8A9DTOJGD -5qiV*_Q68;nQ?UV|HLlPpsLZnt8QSGDGrMW~?2PaI|e~ZgW;@*bqq$L}+LLzf<>tSi;}j{mRzCLZ5=( -@wNkEmyD&3@C|=-bK4}|f^d#6oF!(Z4;CEVoJm7*$!JeGTFOm<;0RD>B0VXgpfHH0+0?#dMG)G@Qj0(mae8qi8t}W12 -7H`79X(L<#dz;zrC%BA+BK09hI+nX?yCxqay`Xs-i7mD5JNGTNN6#6*$66WP}PtB1Rqz`2Q=%F&kcByZiZ$c*_a_>L&diQs|Kks`)%LJBdh -X&Kf|F}fjtyW=8NkO^FHo`jgTWeORAN^|{(WFvd_G`}(yb1gH&U?tgc9DARJVvb)*+yzUrbRnX(s(9& -&oKosr@3op`j9YKM$hr%J4c9hR6DGq6Fuk3U!v1wl1^rigK?|X%9L ->9IN7BZ;q?5emd`D(!%f7OjZgAJ#b9{3RLJ7UD#QJLbGaj4JH?5ygO9KQH0000803{TdPR!d$)iXK(0EK%103 -ZMW0B~t=FJE?LZe(wAFJow7a%5$6FJ*OOba!TQWpOTWd6k{rjwZ#mrqAmtQbMD#r2=RCWklNJEj1XtT -N?w@G_pJ=sOc_D$xRo#x-nv|e%A9uBp%7$(hLVhSACh0krC_nUGIwTz4!k0f7^#2|MBT(+ow-I`uMXi -Ki)q4^z)DYWBV_zeedSI?fG|i+vkt>f4zV6;`R2?!>haP{_XashyQ*5`t^(W{rm5Kd~^Tu#k+^c?d9w -HyEpH)mvPMpH`lFC-`u~uk30Wx_xHQk4?o;JZV%sX@BYP@as6j^@7}(A@x$H!HSGPvo44`n;|~vy{t^ -RkUpzd{zrTFEd-3k>)%MNLj`+`ydhy6uKl~hz`tIHKtB-!YrSlvy#J{}!gYC)d*V{9$eY-uodwciz_q -$i~O+I>f^X~Efn;+vffA#j)zm30a+n-)M{%!l>{`FrU@4w&P-(rUEws#NP7eBxI?%~aP|5&Qm_uo9ec ->I}F`}XnfZhQOi?Yp01V!zvde)w^F`Qpv?c=zi5?HoQ9;@$S*&8y!$JjVUsKfJpC_GkX|?Fat$_Pc+q)F({j%QcbhlZP1 -I)&1RecOReg?7!bVzKy?Z`Ga&lZH;)l#a{pF#XII7yZHk*{yHZ8^Y%J+62&M7 -hgU5;`1**{$Sg_yt})Wn8o~8i~P$He;Y%7{}3zr>h9f(``2&htN$go_iaq@^{ef>7k|HtZGL%o9}=~_ -2o?F^=l`!geEsm|ufA{G@{a}m-FE-&_U7T;?e^2-eaKEo-#_hcjPj5Dy$zv%`N8ehQe5=n&EHj~~4I>9-^O=KHwg@i+g*vr``1_Wt|-w(TF(oR1WL%I&!R)cR=rsil1Vs -n_|ZwCB41G|nZ9}RjYe?KmPUW-|ru!y-f}K`G+u+um9EKUVMXk`DA@zC&XfKl<*)BQh8A_Me|WYM|J}?e-ev$%m -hQ{PmYl|JTRNzx3l8J=F2p*Uvxy`jclL|Ie>KfA)uupTz~gx(S<_ZqwNJ+tl{sHYVO~Q!VK>toFE#Pt -W)_Vk)>N-r&bE9JK28pFkw$FDsevDJDT5?|@m)vldK=ku0l$GgXB<o&N$u1D>A7gK0RC>2G04W^X|ExF|ji?C4O|?J$CzKWslnU5esIWtd%R~zmaoVpS_sM65#jhC<`s`n(t7+F7dM{6i~cg>zTa$Tj2Z9g0>mUjr(&bd!a|RD#f+rI -d&XwPvpcg$yg-X}&!w~Or!p7MDQ!u`7{^U4FIySwnR|?$N-WBDD6Yuy$?WzshHI>L>|Sh0VOP<{7TcJ -5VvTd+1@avD-1AKetw%`X3WdDJt+Cn;5{rTug&kugr92+7m4T$Nyog(@!ia|*@yac)8J}s~ge(@87Yk -84>fd=jYLVD?W^yp_2q{m>W#&#%&{J!YK -m68)WFWvabQzoyJOyK;I`kyyEAZRk8`YXh)TRWDul%gWyIj9TYKTt#1yekad9p!9#(kK&bsHk#O*wen -|PftY#6+_0kuFkQqvr<(4(;Lv4f#7F{ -7%5B(rnF!+;$Z{PO6ZWwI6~fQ*_Rv>f5)Y9Lyyf5`-6fU$Y+cc4`X5oBL+004s6QFUc}$x;*9tYc2KL -)*!bbVac#XR+N!KZ#r?7EiTgXZ#v?)m5SPTQ2lf@e(mvWwFMsv25 -76knMQHU@3ey@4h<-)&*y_hvUJ2BM`h#?`zz)gYP@1>??5UJUWIElr31~uyzefhW^-#S9$FG!DIRgGf%}LV7ypjV6ih;NnS7fA+!+19T>MkCZsHz|ZpA#aqFO@D~SXpEDy<-VuqZ*IKE`(_7cpGz9xzW6sUD4B=yMC(x8h~pna;lT!NV|?A<`_0&b?y0VrG3TsR+vvhMwONexrtN#iGO -wN0_)UhhB^KWVd*!SaJ0LJBfL3Dr{(T!H>p9?Q38HmLt3DjE?5wJYutux#Dic2PeWjupim|MexFS@+s -cS_#u2&sBT>YN5B$eq5?R0OhUXNLK4pj(Ne>CL?}qcZpXhe8xrr{=c0Cu6~kfY@Dy`k0v2plOj`v_I0 -~IU;m{0Im{@gAF`!_WSC>t76hxi4v!QuC79b^DB^#dz)JnZnIuo!&5DEXN5B%7xjjTJVK71?Vm*j4t3h^;-HQ9!Hymsq*pGyN3ab-A9TLT~k8U`!G%vI%R9d -x&ps?!dD-I3gUwDCn2g=09g%~jze4ZgQg~^r?YgBbtzGFF-ROAR)67gtgGm4D!$c3G0I8L107}$9I%k -W3Reh@L?AoqdO&IUFZ@8z0eiy~klq}WcaJt0ZWq$J2JCO={o0*S$`#DhFLUL^)L&SB%L+FZCKL~;!r0 -ZUfFPi9ikYcxO1#Ez|LJc5vwEn}g>be_cFxWHI)k{A-B!QTv}*5(xgmV6Kd4d&S}4w!s?q^wa+W(MPo@?L;SSq>|yQOhJJ`5>z3PdBd8i)|Fg)GGs37mIj?&R5IaShjifFJc*iU?R -D`e0KDDSFk|hNSoEZpRK9L`5nW!=VCLr;IYxVvN@?QO!FP!E4|_s?eM#wu(G}P%wmyaEK|kicxOrD;A -f}8-c3vrOm|1)tA&DVxt9V5NmcvNhj8U1v* -s{h0pGWMMu)?wUXe}le!Heu_8KKznn@}NkJEj;vIy=jf&saF2h&Wh{3(I2~O~kbsL!7&>*Gci%knvs?JgOe$H)9pgof -5XgnkYv2f2LS|7*Vu+T#maK^w;NW3HkBIxnM`S|%kQ5eQMZ$~|fF<#hb}TtQB48=g_NufRa2ExKvhy$ -ne2{xG*${B&&N~{Wu<;4o$0ge@GmeNY487h8SsX-cEq;XWP>)cnjF4oIF~qWB9YHQa8Dj3JN?0O-$AM -UlC2o;O-GtKO3W$}6gkm;WM+}a8+?6koprm}Drh74T(I#Q7i@6Sw|5&c+0Ab1OQBunr`Ditez$+oHjf -FNs*iC}EOF{nAU3}L~jskhQ*D$+#?1--n-_RDI!7z?-hz*8q7jnLE%Bbf --4A-0m`b_ij$bA_%C)9>B}tsX#i%l8b9)>A1zAHi3n@A*HVPhVDpHn$nJz>PQ5fC>)z02LQccOVqm5l -LP$)5CrC%u(++I;0-M5m#OBp0_$Vkj%mKtT=ZOdEr(?2|Cqb@B;rtaZeX>v|dr7i)Tt+B@%!oFtc9M9 -IwQnR1NJ^yPx;9f;&=8~NVkqeAk@0z**$6<{G1eM~3%$ucy2gsdkHimO0MLVIV%z+nuv+Y!sS|)NZWa -6h^XkCF`@bwj1T0-&6ybXecPby4$b^D`1eueGIc}$6?13p&BQhTdWqS$n{*~N>Ns2rVOGt8+#7hRx-& -tA0)0D)24*e~9F#YYxNO%QIF?8suTGax3lJ}?BB&7RC)bz$055fWS_@ -_`=(6`KP`#2E20)`a*xf!}ON=m(EV+F1on+5GJ=(d3emeYUrm_TfQVPsj5bV3sH -fUQnHn$aO}YGVa`^KQgO_8zwtqUX`0V*xN&=xYnj%>c`ta3}$g#=^!s;w3X -dNc;*$b-DjRz_O7ycYSWNsvxQ-^vjPO!xTDPL5(-e`-bOFM0Syx^25l#;3TeSGg7~B|1&-(cr6CWCLI -`hB$|be_aOjdOc358@=C5#$@$~WOd3w?_L7Pb0ZTQtKh+H#FK}`P{9~iLu?BE*=nH8lm3BiE>81P#RT*5=c6nyRas%snjLMCjmgYA -M!II)s4C3JRKSOQLyQiTyMfDski=3beFwAiU##cBx`|=nsjQ8RRaFSPR&O#MFdisEtW+Vc7E{>mv#S> -5y;%$uf4!4akqD4(*J2i!g!Y#`J|kd>K?n+ywpaKANjDH7bsHATHcTXu1Bpb;!qxT#I&Or}0}M4UTM< -V1z*aaMc?}BE@k)S{u`=$=U_*hJNyy17I)P&NbwC`#p-Ng$&fe>)j)hInH#yBs@e0?I=}hyCq*7#P$W -of3#q6eR<9Lh^NKVXvkA-c9V+hTw#%_SaT{{b)*DXUPVK}jKe0w%Qz@{K`)URrpcQ{#Art~#%1T0~?c -spaNhN=~=CC*B^<)n?*%%F6GMafhU2#iRByZ)L=R8GGvMQ8Iu%c>iVInDUoGFJ>dK4YlCgpxIfq?(f; -)LAwojc&#yiq$pafzPWxl`u&>ZTKro?t3=8yyUBi50j8rX-Xtj1lZriX>?_979!!?W=JXS| -9F)Uo+yS!J%BhNHfyKew>%MB?A`10?J$)vIxk>=paE&nRSh^8kA7b|1z~1EDgV&iC;Q<89$bSBuYZWd -3mAm*iPXBixk;Kbz<5dV9DZ3fufVe&6t@8l1dT@=^EI8d -jTW3b*I}a0=}f~NRI(-$6djs*BIy_|_yqK<;ERAO8`8UJ$*N`huIV79V8%s-?Q8RL1T5vWPG^h?YSb9 -BsoW&L%(GD6D5SSpjJ|=?8MpSN#l$y*V%1*Oz?6il<&wj{<1$dt38^FzYivbxWd%~$H)5xA7|~;=bgM -(a_8K?>maxKXxj`w*YZxo2zJ?>qn4glU5}O<4ckyg=fVppG?{)dSu>WixuXtM4A@GNakjc+8#gI({3f -5ANnRI~vW|F;ZIh)Nh4NfMSOO7)L3xc1BMk-a7UZ<8~lr1V!6Fb!x7A50CPplxj+JU!{I3l4`y%-^2+ -BcP|X0fi_jAhL|fpjSe)ufY}kP1tYeIn(kjME)R-;grkuWbz+0ZTpv^xQ3mBfw8cWvnMEKoQGY_aGE& -x^J^hH18a81XNgKwHXm-8GK+am1~Ek6mZZ-i`vRMS6(-a#6dBTaS+_#Kf?JO%N@~Eh5f650I;TOldvr30=3Pt1AbQ -k8d=Otkf)7n)4opd?PdP^L$zi6?H9f6X3(02%IIO~1eZVVaSrzQ+p=CY^moMuUY1++3m8gK)WZ`{s`3 -+UsPL~(JX19FI&M-)}YIKNV6WW3^W%J|x^3pYHHhD!f-`oN!LluWCCJm%Ct)Y2D-wjxx>S+$Kg~Ga%P -nw3-wG@?rr5|nz;kM?Gbpn}7RCx+scEg->YGRpUY$iB}T!mQ_Ow0+!u4v?I#snezwphinLNAr7`7 -8_#-a2O;fi4^{tH;Ko8~xh1S}o%5z|IU4`t4jo7}UK+43p`O9>IIAQDCT3dmM(mb0^@H!SnQ-6DKa^C -awm$Ga6+VZ^=5aU#ZytpslnU?9^rJ3B$F0Q4g!V*nIU_|kzX30c=_7P5KZd5Rf=+*%t}qY&3_QEt{UL -Du7vZoLJUo+z!Jx0P?AT>spADEJuMI^;x) -Bq=E?eBHGl)i1we!O+h|MzFFuj;EQ!DqK8eyiue}EFEZ?K^EJ)ITXK9*5>oKfHcg-mS9^NLQt6P?o17<6irrRtEE+RKD#xi?DJ675TmjVh!8__pP$c+7UBh%-YkYvPpr -G++h|^cqiFC7FY=De -Z{6CQKi*WF;CFx5Mksn;~MHUa0D!A5-Q|k5e1smHlc>14RFilZK`Ul2V@YyjgqF>B#YzXbY-THZZl-G -0ynMj?j19e@dq&pl2T0qD%}P7c0@@3(p7VUrQLK0R_K+ELAp&ydMy)qCFMTQK_m^NpyGEZKg1h@u|Y@ -9v&ayZsG9CqP^Fj#U3OGRf#5Bh5lBM%|ynRah36bYEI;De%!8sL0HmMI&e3uc#@(R9 -h4$b(~8$dT*!+6p)+7&nRInPhoUJx#0HkQLAtG!WfDcbL{L~@?q=caJ~=E#k)T+x9g-fI#CxVm*+)+)I)ME+gy%KL%k*#5$$PrsJ`2R%UpfYqV`*+p!8W@BHdk&8b=LN#j3^ct9(`Ac>Gzdhn7< -S3vgeOEvr-R89bTHRNKx&X~3*5<4+yLnX8gN`rrfde1T>yLvx?U-zC8E*}^{xZC^=2>+%+c~S@S)~u* -su#yjIh{JGwANI}5MRiXB|gYQQokngRf}OV3n#ts9!qT1a*&h%i=?-Xz^7p?KYkF~A^ -gY{E$tk^tJe04IvrMS>2wc345$Sb)b1$!Dk3G6&B1yi@DQvU8aX(oF6t?kAUB07|z=IF!5I3xktS`vT -BQ*Ju@38l>9<2Pb7+F#l?b42D1g6R=aIf?299!h)Ws|*K%t5?F=87RJ>%qggq&MR^yL6yIO_bDGa7i!M=FufYc -@dkB2!*kTDvjoLxKRBN3dc(i3}QrD+d8d#Z)x?>S)0J|=Su%;Eru66Q#&?Z~f+O@_JuvBSBRDKfPw?iE1z_(r2%x -QQC1PQQ{uqlN?W2IRuv=qJ0*dJiYwy@0x={6sBz{vg}ic5Na0R~?-i|XMKg*EY>r%0bjGLkl{&Q%i4Q -fWxHanpew0IwZpL&PfG0Fu9&97DQIG`eMQ)J*GDp;szbs|qL+Al(* -Hs(wszu>m!LmxMZi-3?f%8yK4>s~5%m3G-|@TSd@GTnYl|HUWjj&fqBl^(T7`JZtu{NRgh|2#(8)4VC -VS0fL8<>N0#U@V`O2?T7V%>a>wGj3otycoo;(P6l<5m`J=8n__PeDcVMpOeH)l>5>Xaw`qvsDwP<^WG --%NPBw~DeOYa=r_*Gy+Qq>vNK}h)Na^Q7bGR --xGd6qAV9gD9=_S_-;^j%jT5MOd<8PlYdl5h2VWX-PC96&znVDfF4g0}ynP@s6=OSL0uUblYt(INdyX -=h+un0`LAovG!@D-k>O6?3xmK0LEb*S1RLj3O1i2K%Nf~Y2><=FPYvFDU(rq1b22 ->uwk4yHAytu2d7r1o4yp+Hl7{WVtF+l9-KtTl^l6b(7Q&o1hLPw>mda`JEHRPXz(@#qjQQ~^;o0heY> -;mIVG)a+vAVW6Bidf_Cp-uY<07j{dbi+4)5$gU1pz1isH;7{LAvd>FgJxv1K!0Ui8hlIGUz}A^VO`YY -o0N{2(Hz-UAt|lf4P51w~5d?lL;1cS2VBNzSuQFHXK+NvTz}6)ct_G*FIw8c(!h?l2C(mTdSo+J8 -v&{^&IP13E*f65qTHZ2jq04*kKRat1yLk6biaVu2;2|!~SOH(u=@&%eUNVkQa<9--l3s|#dhwMZM&doQVfykmCAUpel -ez7w@ZkQwIp$bLUwj}ZOoEYK7Zvc@D{s?Rg?Hmd5&-fMp-GMcbDc#y0x$A&k}AYi -=>CKIdNJt9TOh2(X~3j(mY7FRm`AUbq5o&Um6#jIFO)_zEt;3Ru)-ghIo;sQVzFfI5RIC^~N+T3m2T`CRfwon7gIP*+dCe1D1@g>c>kO}}w3Q2WtC>E1 -n(`-l)FExkg*T9`T??43%!hq*@qY*{Wgo)VxFv(A{lXCM5Ibj36C|w*UffPFo6QEHw~HUGX -GcCW`lHFq{ZQ1v%ITmgis+Hob5uDE(&+LLVw#d#YrMAaRFwc*aCB2cm<@}Omvp%p{&s2x`2x_o+v394 -l^!QhA``Hzap-o&TPUWr}^=!{kPM$W+VXkq+ly@60<}b;n3A;7D{F*dCDGu-2}l%#;C<^eVuz>h91&w -A|Q`B`2(nSJ^~4t8g7UrnnA<1;Uzh4(h{Khc83#2_I??9NVggAF709)VuoU0zzVcgcRJC#P1jKJdRGx -;R`NtD4Y}F}>|QR6{(y8_SeSx)=!DkE0^TfaAui-;8{k_tM;(TDM0>FQ5=*{GLdH7PtEJ$8bX%)M8$D -__>{E`-j0wB=mry#GP_i0rOC)Zn?7C$MneOT`^v7;VNLxc14YRUSPD^0#c_x)oBT$g;;Wl$USWg>?gv -=~;bT8>^;0RbUab6d0Jglu?fQ?#!ZaRoWC*3Y~dN`7p}51UC9$xJNZD8pN^7VVOO?)`4l!U}dV?L+S)~8WIiG8dobhHwk~Bh+Pq6<6$M# -)pK(|y3J4wvghi^lEb$a$iW?6aEED8=r1k;q*MAlDa8W5;!k2G1bMY>9FT4ksd=Fg6?=pSBcBC6sgk; --XHxkslesSf$AJ?X;KLq7qMOxFvX%nUZOM}CQ4kV@JehODjb_R1gRZvM+BM}A2|2+wIYg&-^HzJE_G@ -5DLZ-=`L0IpPtnzKQ%SYR1z-~;NP2aTwz1kYo}@#wI1Tnx2mvv -fJMDi{cBo#vTME^0Fo`D$Q2Al()!m>Xs)c_fZ}J2lO%OB*um61mjurMWWKj426a^ -@y~yn>1*Ih-R%`3`Sn=@z={8#$HJd@)%aBir3p{Pd^282#<4LJw{6;|tAL#ph4NSx_$sG$aw-+Y<4V?XDF>w6-X#m1HicN0@vt#+GSe}X!3 -e`n;oXy(U_skXKI6{Qa)mp!))>-lvDjC2jmUzrBN$2sz{-}7Y{eI7^VBU2P9D>jSo{O*<^YYcV1=W24 -vP`n3?lof6@3=Ov7_cBl!oL( -rdpD%8EK9Pe%uGLs%pOWPS@|UF&Et}Uz5U=C_(bzG+X9#D!a2JpDC$k5z{jC+tXcIPJu$W@6Z{>hd598g -+X*sp7#W=vJ){8z{un^(8BTJRse6FxV=lEwjmk0$gK^OBqsp@cbmty&IS4vkXX0Zn`-U+5alW9(4vRE -Rj5Z59|^&MLx6P!|=Eh|HYO8JI!-8a7ffvd!LQJ=)k#RH%PZhow3D3d;sEE6~E3hfk5FWjJJEdne#OD -qISkR&IV&!kbhZY&tVZRu&Ylrm|xSJ35l|y3r<@zVFNq?#|9ZbopKTMAa+fz!$%HCw*}Ze3(0z901-; -|EP}~h!q`g0tMi9$RWJdLl#y!pUcJxSJV>{cy)hr+X#hT?6*LI+t^`nq1h^~{pgdhDN`3;%E)+F7;J& -mknD>BmyR~`ZAws6AXzk})==s4*CBEBwuG6>n=Fx6AxoS;ZR@GwY9guD}d|vWcJCVwHj?3vIj2skFq~ -eqo>uZy{32Ah@tH@gP1^rrM4~|2QwP{2+H5=!h1{XAoof-^3AaAx*B0tn-9Lc@*WoPARd1*+uoY2P}d -8irThoo#7=-{%$>MbweF%zcD*`7P=Y4d_3(1YWc?l16ezL1POf^mY<2ucZ&xYCQc?QHXY8hF^8isp9kqS$&nDxw=7d86sA- -uOPDT_8=~)SKnnPlc0q&P)6$#|pI+j2$YH_$=zJut$nUUUKt{gM4RKZ{0IT@7I+GKRG4V7!-3?kY)+t -j5q}x8k;|}?@CJlrSQ!422cDIPlg5fUTop61ZxC?VU!-g#m-e2!-@us?lV?jO=^MWAY)X -H$9J1MZf<>a?28LfdJ4THTl6AqEOuCt#zbPzuXqK{p4a+eC7cU?JsZZxHc9x6}(nmBe&(#;z9VcJ{S- -wlNW{0~t)ZTqnmIkZ!Ya3D`uRO-sChOn2DCeaM{EbOEzir>Fh8kkMDeE~>$_J>V*rt$=i!?TnL8HRd6 -2o+?QQKF@+9)X%P#oiZK+iA|f+c3>g|IwaeE4Gf3HaxLZbgp*62Pe7!dLF+RZS(O#x(GyLfAJ+5fo*{ -|SHxfeUdd0_(ZZ~<75;{a~?R5ZZO$M*Z+j|WKrZrx4#^ZtDuyK?LYnN6q`T3#rUQ-x)*wl08a^BFuK0SI*TGw$$Wra)h -FmExq}#&wB-J0xGVM0ccnImK?PN?1BV|b0JyTMqiPCmajIaT99ba`wx}{cDvwb4!ro?xTS8I;cn3%O{ -H;VOW9?K%m?B8(dT}8SE?!sfNZ1tUxepbvw&8lbFvRn3vfwp(4knoht5Xb6Wv-`H;K -7dTn+;J?Uh3-7!oa_y;~%r|sm>JdX$?!=cPvWTUiol*i#ox6OBwbxdVY@@LUMX$d8SRRaMJAK}eBCB_ -~^G4gEa;RkCePB|=!CWSF*X+;i9u@Aa<=z|BF5(;viMM2NO6mBHZEgo|-IVAZS7=)!s?U;+job2=yk? -;%|-klJ-h)9Y}4o{mVl3{-`1fV3~I@TF_2c+BW)CK#pvsz&7ZD%;vQ*Q(P#I|O;U~LeBvR$%uA$!-sN -?N-Hrc20*@UEoKR$7bB1_Hdr;RlX{KzJ-S9$)WvCfAPs@BQ+bgRg`JZagl)k7wcO+7N;E+uI^97cdURyx)p-Ddk -ghmE?vyFVlhq5|1ZhqD7RGq|ufQ4CheAO64|FK5~%-HH%5T>&X3QF#Z|tMe=Z#Q^_A;gm*be)VF39m` -DYesjsn8rXy5@S~F`PQiP+He;2!vgYibfrm%6NGb$LFg?rx++S7YNNeDOBO5*C!G>{S5D)zF_=lp9>D -%q(EY4WB459%3;=v{EfMuG?2z5xe8L3FrrIMuy&;H=-u?&J&ce$Xfv7J<&4hUk^JxEVpKY&`b*IH{z}ld>g*!`a&9ajn3+L%QvjfNjtodJ8TCim&rfka@HL -%(;1#A?r3n4^+iwb1HMQQFej&5B)Eu%LCkq#x;@oWwHqIHV=cYr -t?H)s5QI8h0gj7@yBF=`PyYZ7ziy#gXP30CEXpuW~YW9%BbH4^AV37m_q+3KONTa*G;-n2s}@dkKAR_rQqCrAg(fi=%l0} -~&D2{{Oc$%ElxVHfc54pg~O0?CA&Ww%q0b_h>+xTq!_(rxt&<4K#Yl8D%{(}T!yZ62A_eGYgj_55Ty1 -@(p|(C!hIyTZIqj_HtYi${3lyov`JfS2~ut{NJDNQo-t_D1bRfP=kx -R0Gp#@+i%UsB41+4WP##=>QH2zch1~pRi+#DKF6p+bN1jj6Jc=GJgr|Yd56CBxV~D&PU{S(BR}z6V^= -+<<7heO@)_l(U+4AC}*>ZTn)Svq4q0ma2eQRBWm87G%WttwlXH=x6d5~_aXq$(0%L>b;bHhA9sKIilr -!Rr4D!86WI;GsBzBL#`T#LBD8OAYV;$Dwyu@TZT1Qmo#t72V0coh8#jme~3kKTZj~lH+1YNV1~`X^{hwuOz=)fP}t!F2(NI3?d%{F&=W#Jw&v5{+2>dF1)&gIQ%UX1V`ba4J1 -cd=B}7B@K^^P%T|+!k1Lse86G4&`)1*%?~=KQ=T=7{=R-xRU_+iv_gU~}xWjnCkqn$Y5dneVSK~Q}*2 -DS&kKK0GwzxY92u(WGXu;iiPGzXNf?bM^O -gJl)GIfx>hDZTslHGqDW*~A4VC2PmVFxWK3z7vqOsyA1nJ*RY@RJ%L+8W_@TCdSNjvASD<{ZSFcCjB- -T!kK0#g$x_p3N5ut0;b0ADRt)}ZqOGVw!+qNzx;z*q|_|B@+zE-?!i$u%X^TX=QMkA1ElH%@jY`YK&R -;1FMb7WykRRmj>Cvi^*2;t-zCnQvI62{zo3AFj;i1PpbHi5la1>E9Az;==#32bKhHQqn)x8?I>{iAPx^DG>h6mBG1d_g5zt4RAMQ_d8rLVs?j}qQRbx>GzmWbe12c8)~+Wqq!bVV|$4j1|>J`= -~@a%x0I^86$e}lbjNS_EdeBunb5S@@6+owV>m3 -`vhqAI-Sb!rk3ff;4^zRIECHNnty^`n(+_UP5Q`Hn-;ZnH2v`Q$ZjoU_HdF1LwS3(~1Z-O+JDlgIhs+ -F;uu|sNw0Iq9-|5#ZEL#ETHk-tGT!QBwWvPd8*_a0=OTe}ma!6{zV&Px`-w54VSt?nlueUT0(rvbn(H -bF|Vb0h+$ -aC5X2iD>dBAE`Y?qk?N4D2Mll?Ak~pj%G_1e!14tuBh}Qx=NC2N>B9L!~r1_I%B_uzA9rpebHq*R>a45EH5UV5;-66m^Pe#24wj{KB{vgp=a}bx@N8s~3-K$EF1)~?q0Z5g|4<0o<+zQK -F^8)m!?Z%8f=L6?aJpIzqi$7TR!{nRic#5lV3`VHBTgKs@iSGGGS7r+7wn}&RfEWw6Ku6ir4{Yf^bf% -33^rRI`DTThV+fXM+sKv6K^D>)|Zi|Pyp6bRxctjP45=5bK-s(3hnHr0>yWLn9Nl9ixBHOFhMBRd=Km -yF~J)0A9-vk-8lLrs0W+=$Etaib74Xx*g>TawwtfNPPsi~RTHzTjuh6zuO!C+L!6gBp-zA@W45X^Ur2sOD=!^z;~89tPrF -;VO?^J4e2OwIAYUl=7++vLO}7CWyt`?4EQB^gKMMT5|F1%LH$w$WbNj4-aM+x!;ujAsTLI~|W_bpN^`~uCY<|-I__D0xVM`{8c>2 -9|tOv&k*qQH1`!cvW@M( -5MP+8x~L#5$kiRmh)en?GzTH05O7x?*jVeGN>&VkjwEXWm<7Wm(wwTx0i0`I-lAVJ1#TXB)L?*)O}ID -!J%9#EE=87+nT(dJMcfTRu@2&oy?&Y^|F-cnekEL)blsDf=yeesHZZZOz1F6{w?5NhRX5as%``JW1W7 -yR8oRyqaA)4f!{m*(MALZ!h -RK?MhNqCwfe63ZswMvj)HmcUY+=1;yER%ebBV^XE%gcSaj*1&w15UDxGSVJ5Ehp@#peCDvoAodODFg! -KX!)ZK49>Pqi^Q?3;*v=)_jA?5=rokaGY@Va*;iN=T*d#K};VGSY-s%rWXKRMvUR3!TkolhbMt=yP)h>@6aWAK2mmD%m`#xjbHVe`%Pte^}Q(fJ3yM6gX{lU{{O5;&9n8pL@k7v=pbfvc4YE!ahnpwG#S}2N4#v~mT=7&^D1jc -SCMJ#9?OGjFIiONTQWo1gXWODKsI8Z-j?^01RLPb$&nF=qBcKB&aV|PD5Omk!R@zk>LoYA`8G5-3Lun -kvPELxesBz2j>K#x5C49pM}Om}c1 -kZy~xSg=yF$GPr2LxzmiK-qCL1J-&btjlN-xXw6hP&MVag18V7clzf{l6AGs<^c*f0;WT-9KrNg`7W3 -OP$)Z#e#OTTj?P~}J!DO(Az5x;TN8?fQ(x@MflIb9hX*gR@Nb_)!jH2Z@T+n>En9t%tKom0{EpE)bWb -(=49F&EDlNoyCR2gl>D`U(lOKcPg{6)(8w`Qn}-t77X13r{FsE5iJ+ois7zA2rAz}|oA_3rO_f8O_qmN6pNJ~Ws<{?8-QZnbi23JQvK -x)s*3FRfXlf6TA>6HO}RWxw_uAse%w@3IFBu8Y(g=do&qNVih+5f<$-ag&+sGe-z$PJ7qv^Z_tfM#=N -zyF`d{R6CralRW2&pQ=~!WHp&R4#urks)Td<=w4vwvTj@p91E;QPOFu~%~`EFj#Yk$Hy>Bw`gGn=b!k -@-oB+4yS|ko8tRU{og|<6COZ|X-@5D+p9shv!U#`3H@o|gG=n>pSzhZO{@9R^Ohmo$dDEMQemVIS4-Q -cae@6aWAK2mmD%m`)i*($`}r008Sy001EX003}la4%nWWo~3|a -xY_OVRB?;bT4OOGBYtUW^!e5E^v93oNaGqRd%hv`&TRpT?r&Z@Ab0ZZYz-rC_1IkK&lEw+%L#fnJz1) -Ol;Gw%CEoUc~%i3HIWiN6t>SfYp<6%#~gFaxy}b4{QiIC)2DxW_Eq`v*=J9`dhxV;`sLT3{d4(m-uuD -D2j%6P>+<#e&0lWbUfq_@?p|M)n}_n}yZ^Yky}iosKmGK}+nZNck9YUw)$Pso+sE=M@A>57*N;AXd-H -gcPkw&=*X!H6pRe!B-H+w*cgD>7zq)>Wcy;yj^?w=m=I-r7e!c(s?%rQAaQWu$e*XQ{{q@!3_3QG(J4 -gKcM_t`B*3a+qs5g)0!_Ph{^*oOZ@w;#Tq&&I3Ezf!HLwSDvaDD&R>(_H7pWVHEyubP3mn`$chmZbm{ -!+@HukQb?d~f{Uw^jh_U4ECtNVBC+K>0w*X7~v$H%{AVt*{}?tUq+ -uHKgW>(@6AbNFn;W4U_!`VV*a`TS3JuWx>Q$De+A`#Q^E){ocsKRx`qhkyF&+w$f0LuOk3bp7`FKCAi -Wmmh9#Ugg7I-n_bg`*2;Z9?H-B?cvRDJM{$E@@OV}h?sR&{^%_VHaNo&o;+^!aE1lutbQ^x2osU -Vg{yzj*fYtEVqslrO%1UY?Y1o;-i~?6YsbeDb_}^X>C*zJBralTuz>U;nzrZ07H6@_%mej~Vi(yX@ra ->&L5`+lRUI?{d5knc(f~^5*KV*E!}_*Eg}KaupZ(`Q88O3~%q={>Am?Bfo9vAIr^;8I -D_jjk8QGPq$%NYHuPcF+^^QNn}|8|=rc#)5Par0w_{^IuT?*6iTdiU_iTmSqdpIut5%g41ZwUlpP+-*QgzE -&>t>ARoGoB!DMtuyeNQOn04|6^G`*-w7*hrCdiHr~H*w)Zd8o)_9Oj$dCm-oLPHc_Bm27wRX=^6LxD= -{$RV4Rri!&3MXlwz&L*kE?zC!-w_b_dkA=zxFwa=W*^#_wPUWHt%8Te<&aJeO&`6`RyZztLr{}>D|wP -#NU1D)eksATmKJMHRpEsHlF(Mh(G=G%d0o#O>j*NiK9LL{Q1SjJb~|De)r9@&z^kw{pZhKynO!b({Eo -s`}(WzpFhd}eE9j>8=rjo<-qODzyAJ<=THCT`>&sW{`7g?@!>_?_Ig?NabD -Ij`ep0exa?=kKgY7?*S_#;y{!9^zl|+#+0OjBR{vRJr+d5XHGgYuSuZa#LI!LZp{?t2S;n5B_q@BD`E -ajW%iqRwIhJj?tY<#b&TY#-W54X{v1ELHIx|W?M$3RX`pa@`=jCXbQaN|tvmcl1*8E(abgo9U$&!VC1W`+FG?G{kyrM-Qja~0TJq4k?}LwIWk>CoCDXaAc@JY{u1iL(Yvwf$p4mpm --!hr(Vc)W{nw1?#R@;s((_Aycnt8R}vL094GEA={d$BQoJ=RQV&x8Axg&k{NWttb+uWZX`2b<9{!jc* -8J^Q@m!z~Nvg(LII&h?W;^sK4$tf?<&KDKa1JxGVda#!%P|{ri^Sx!4Mxz6V9no -XwN8~==axbnQrCR^NUwhx<#4Gb(MvssQjZYD&vrH` -Zk4^qYz~IebTf2aax#M{<#;v>FHh!J+k3~%o2!P`Fl@FayOhu7NipmkN=|{(>v?=-zqXUj*zo|ob<4K -&Ge7mM#Tt5Eh(~1+2itIF`(m4UTx~c-&47*b$u42UCrjC!Toy3S>_x$d2T$^VcYezG^S+f~GS-SeEHR -+6IYUe`kdQg-Z1!>TtNxAOZXC)U>xe~SN_cwX1ecbn3u=N6v6ANYKpKC)>!lp`<42mlpNAsbYB4q#;1%XPuT*}e`q1UECUZDR`9Ie@e-0L>adi -p61v_2fKaOED^T?!cQexl+K$g{|6R6LpDq#+UHP%qEzEwE?gNi#+j}CDs;S#=&zSIQ`BH^UuJmS4^t| -rgit^vkhIytXPrb17rti!w$Dq_!^bn`W!p@nGl#1;fE5^t+u$+Xp1`Z4WHqRSJOsfM%jga4V{T86~jZ2O!=9InOfVs|-@<;4sBkuD)B4&k -(^c@J@Rt|tOBf7+kiTfZDI~>1a$s8u`A4mg9*w+QBb3$H#tDpwH4DBf3W7*?5)$@lyHNr`6IK<(31FM -yX;D3!ZjWbqSi7wR;u({-B{J=>D^8!`_;Kc6J{mL6%Sp%^Nf{79Xdp-u9Pr={dTt!gdC1y01r`O0$MX&_KTqQ1; -~zi{xJEF(Nazz1h{1U4NnG3XYE1kP6c5-D8;L_?=Kwq)GiHjNSXIwT1~vlQclBfCQ`w$IGxlM^AaJdM+WVS$;HGtx6J>du-b};1yf`y1~Pz*+0@fL#7@LD@oFEnpL;3@__|%1-3n2-po|DIK3|SU0<}=>Yfx#IZN%=%F!U*kOenT=0Eh;t6SD#X=M(G6 -GO7V+Bw_h}AbYM(BiA+_tjU2Ye^5#tyNiHI|U$*hx5801GAbb)6pUYh854N|S$J=X@-G%SQ53)|6AkY -&gQgRwW`ZLnDM)$1Y`M!Y4#~WAQP!e3pf7+8DHw@S%&sIxo6j4t5mQU8`)B!-U#aHYD>0LS<37?72Yu -Fb-0nIslfuCw6F_vI1-?INiXZc|5q|f;Y(kww!Wdz-E-#WW!L3;lAe3N0TmO!!IiTChlYRhanC2V%Ef -5H|#4Q01yy0Fq_=~As}JCV0Wg)sQ7XNLK_J|;f>)+gzc((0<|uRQ_#9M0=?nn*nlQN*h!|g5I!)I#AO -T*3KK`#G3*@h(J^O2xk!J?&32PV=1P!SSJn;FHGVH9LyKrbcG}rk*>>ds&cIjVAAxcKA#xNUd!&brjA -Atv!0Ymf#AO)eDs+I@!sRy15sBxJWm((FK`kBt|6tBJ88YB}Vr;CjLhcW?l#t)S$iP=M){$?5A{8FfP -5n+16MT&XCQg`N1r@zQnz3Mq`|i*_u9En$?ZAB_3ut_#>{8tYbB2!2aDtUC=IHEj0s;9GCc!kzCYj6( -2TU%g(cm%UXFC8+pqF#yM>xv@<6v@&N8JgBkOq12Cif#QH>2K3+Nv<15l@zYn}NxpitrdhGMTM*ZqC! -lK?q@;cofFU$wQVpn-&ko1c9ot8DQlGm3@_&2t#D84HH>CdD#T}Pv|?@3)o%okc_(%x%z~?mBa-5Juo -fF2CjYJYq0bNVUC$2U9cx>Lz+y- -|<9@{Djq_QX8%Yi)ybzx%6d%gh7sCnRc96nnJ)}+xY-J-K#~laOeE?ruB^nbF2-cMyh}|mk;|PU*Mpvp11LW`Zj3C&rX^kgK6-}q!9Wiq=(urjGWSLIN8ALCyB10OSXFSq -tGbv?6QKu6qA)aRMm%Ml3TIj${BW?^jaVd+KM}hYYYkDyJV0R -!v}tBFGe_W8M__Ak@}k8YT~-b*009Vi5YB~^4r|wH-L!e$;31-@DKGBQlzb=Tu=P9p+NQ>f0TEN$F5O -}&9S*Szg(z{IH~^c>$tz-jHazKAWvAKK6L*&q;ctb^BZf_y*GUg?je^~`Da@h%Er(*1JFo*<1OvQc?f -4dp*BGnh8*pfd)P?xbcR8d|6%+%kNa{VHfkqrQq?-VkdGtIEVz-&8A=vH%Rb1WUVvVw^-<}eJ13ctO$R4oyuHH=w8eayi -t5gKLUjXaF36ssO#G)NxnIJXLtSkIE@P2?hDpy8m;{f2mSWQ<%`mXS|I@L4TFp?=cSIC8FD!@#Gxp#e5_JkdSgI!$naN<+7nZnmp|Lbp_*DO(+CU52`WVO!!+MFMx -Sc*8VEPw?4zBc|F=Ktj+gv0->d=tISWe-KVK^AvbYN6%mJlmRvDXf$&e0{W4a4r4^;!i7ve8C_Xo@nu$-@CoJbz`t9pQvzzAyT -u3Y0KssfKbI4$we|i-z$uSV<-MN?fB@vMExtT1;t0J14siT9U^>A<0#PZHgoi+HOipfreO7DL^E2AiZ -(^`=*Z~1o=1I#o7;%q}Ex$B-}P-2@4_FIKo2mWrgt_hl8H7*|n)pZsxNHu~Y4Zyy6g~Evu%~XMztdVD ->{*WJMfoRM8Y_s025HbBs}$p2Y(`U{TjeK$}L*pcFt6avUHAGC`ZVm`vbin~{++7Ozxv%{Vln9Ip_sj -5vt+V`!xa$-4zhAZG4iwbIGa54NR{XRp?JmHQe_Z`FEM*LLv3BAQ`A{Sb~-Dely{WM`<9FFK?CLe4hT --ig!r2cd6+aa38tVnSv;Ry_|TpSaxRhciXxBg%LPtid^y@Qga}g(Q4rkf)UofdF4tlx`}H)_(M56c7S -gYcfogjAj`en`U|BXR&EGD)bi@O;n(L0WESCLJlh(47gyha^Q1HLhyWbD3g_@ITIu0pGy2NU2DRKJRP -^{C^519nFXv&gy4J{<26%LachJ`LIO6`iXr1bN9h)^o56;{!D@l2lc%tA35 -@B>ghNVY(iq7YPlnHoryfRI}T+Cd=H0sAOqT7!s#G}*?~#7#dkc(W{MODG-o0DNwnt`I55fx!ePp}t8JRiEfx;mSb{5 -h%QzFR>!N79_stBzG>eh}!bC$@neabA9VMvBTmQ?5$YfT9D6U*^iPM#F2cFV!6jLg7Nynl -;*ORmZlwfsiS1>Xc+UZXdbO^AXC)&}C;m -#VR}wZAZ|qHiZ*5vjxn?EE&7o7sdW&TLQrc<~}=PSlMwXRgt@r^Wce9!2)G0>5kzL^rr;2C|pt|Sti; -H+ZpH`uzx}2$|eKL?g+7DQU$fNAzU}OQ!$~W{FpqBMAstS0Uqv1SC&pIpjZyANL2(+X*N@!>cL6r9Vk -dP?Nq^mQ94c1r$KnS7~O(wA)X7NaMWs>2r|VWd&lgnRWpR9Cdnnc8qkN3iG?J}h||;$A$sJvo02>SN3 -;yZv*Q6(2V=K*f&DgJ50S5{ZCj9`BcyKf!_{5|9GZMNp2_EwGY-iBXJo~yYK(Slke8BW?EDSoHGpdG1 -MG`-gUS{UhUtJ&M;FTSWWMmXW^QCgPl)Mux!G-J4q{LuQMXNtE~`q8+xN-jA&HC9n5cn7j_yPwK&AU` -rJ<@pj@x2A%b;}HIJOF3c1z*giKVO6RZ1j<@@B7=N?~oQi3$3MKuIPTdgAJ0HpqLOXdiy4iA<~IFbz^ -8v3quJpSN>(^8;5~NPK2i+R*5ta61QR4?3l$b37V;J^#kPq}`MaE=KuqL -LU`Joc?Ii$UV{AsnAM5Ef~L-4vosO_eCR(UP;b8ZT8fB_7@9xkIo -@ldCwQ7xI1Iemj>*#`1v+{@^Ef%nvO;7|a9hHxWCq$BV%qB#M3)qAdW?j#k(NH-CZAexMGESpO^I}*` -BoJqOR5ANW5KUmd!xAV2q$nUEO%^o2bxe6oUDN(B^U|4CFcD9|q|?fQNjg1IHb)+o=1%i$%o0MVyV$C -CS_9c7J(NEvF;p_v0f+2Eb1+h!Hu=~|YkkX_6!3D|)u?5G*z??gWKy$ksbAWR8c{a8i)@O)5)}00%A2 -iWa1R=Ps?|FS8tP7`Jy8d)cUb$gqQBcGAmbn@pxQRf-cbSuhPT>=V);~7h@z$#NH1G8j8@2N4Bc|Aq7 -rHffw-G$9#;A7*Q75bZyweq?f(^@XmP0S3NeKC7}$#qbjDIcj6FG<#z>?B%I$$uG%o0-6d~$9D?aSC{ --3MpO2(sku|nrYu94XfzKuva3Rkq97_%4`oqaVi7iRomOuZYIK9yOgh_wpct?m8$k%IW48y+ -4#{E@6sgRj%B>owdV*n3hG|8EXfw;AQw=h7@B&FE!ay;5r*_gbaR_0RNLaL4(O{dY4L;O~T*G1|KXvp -M?%F`A5hKXQyGpns3}U%r2O?5Gm7Py}MJQ;U7P=SZ4cRu)m~|iaBo4c^PaF>JM@BSGYrA{?W(Q3(Gq> -n3D>QwBm#y}45UW?wKu_VQtu2W*(hLhUkc5VKR=WxQCb!uvs>wnjRHWvl8c8rrxr}fe3cPYChq}WwvY -0d(hskL}-wC6qR;4-)4y}{5$<-*l?3So(afeFJb}oabWodS9*mi5^w&-thZ)zfu_JeFPiC<4GYUm00da9_E -6iwWvit*HA@_T4L3X7^S8Ci@HthIckTt)z@^&Z^#x1nwxZeoK^4>aFUk@Y5@ckg750@it5_T!T~!SR* -iJ7t;MIn0Y^Ncxmea;QrJmK!R%!^sm)%9PgOs&}X-2owNWCe=~8|HwC?>3Mhisj74)`-o9 -7oct>vR6V=p`2Q+SRxLM&2pW6a$u{{E#aeESDl9>(7++cH?Fy&}71SAcU7ouNoxve9CAW}E$6=7~f{cxsh>(WF%DO&OCuu!ml00pc)`ddz|uHb= -ZL{@E-i`S!lWv;p~{9locoL02m#U%OsGVF&N&c4jMs@Zkn49EyF3X>T%b|qRA=s9j#Kop>D1dSJY-i$21M-i -==N7B{775D!#4SqnJ1P!i^oifJ+udoMwxrcKPV|4?FtFl134Gp#h~h8F|!UZ}D -y)?A6|4w1Iok~6gfDKO;^l5#{{cmTTTFu(#OUS!Z6n>uh;P{7g%TnJQ!zRSX8$iCP^rdDgmI3=rk+NG -%u1yT|wnw>sgzTHZ$4cM`%J|t0pk?**2;g7qx1?Mt0JXVzVlI2d>;`)NZ!!d -F!RkRs#0W1nIPpN||AiR?@T7r&fVn);ttTxF%^xEU^6U^CZ)(p$wM;RclovSXHP6A_55goYg! -%(+^cn=S5Gk&QCW5H?&7TSgb}*qMlW!G*R2tgj&v6@=MhUkh}uEjHF_JEsfv2AFn&6;->tpfS@GWGmj -}vOa_=jWi>@_?k!$KM6j9(GJCBy4GEoFnGyeKc#$)p8v@egf9F>NefQRGG;tFR+T=4*M=H1 -e3`E^|HXY4!=*1_qn}28VYGhh6uxtI8$@)oTO2i&99jt&Q-j25VK^N)-F*EhNmhql#2`*hM23FZKd@` -{PuXhwrZ5go4m|4VviKU_ND?o$OvKB<|b8Nruf1XNE$Yva>yX<_xpkg(ax8dvRrUZbCD5+q3m3aLs}x -g3i7y1}W(2VYd`{gqKcDxtgMkHAu*xrT10&81S^NV?#}&r?$C>)2k3($FMswMqd54W;UX$EyO93GyXHr&#lvSS5^&{J?M%aFOecVfp4X64K4Whl|o7ht#MJ_wHEMalIyIn=+XQ%5gWzp(I(~i!e;sdWzEht} -5NUGq1u8Y|9tywcq6)+%nyzEDF$GM^h|^eNm7*CbP0<$wrXfR$$U%4ED4it(u_%%vR1xnrSy4i=ATLz -Ovf@%e7&IURADavm?9B+}`n0w;`UR+br|Sorx~tkaOF-@M2%&@V*Et*es`2sfZdQ5NcrY=Jzav8=4dl -uyZcYEOwG`00=?t@Y3ES?cNX|NO4=LfD5hKU2ExDHN}+CW*SHdqjpT9?eprgh7B}%_sVlHrs$B}J%BVMEc%}|lRn%-uWQJZhhK0->&{O=%fx{ct^J@+WLsrf=g&L^sYC93>pwfs+`01@6ub2 ->ht)6eYjT03i6Ac1@vH}229{k!6vZ}a4<*poFt5;xyjFrtBC#ncosU71qtyC_o7h4-ChIVsFuV-Vr#a -o%D1ghW#1U$cp!M+2_<-5&(YG07vu9&*n!Lix*C;n1`p_2h^xNh_QFX!!5`$d#RqMN#wcO8H)8;iIVQ -4xabEVlX$2UG7M5_D60D-a_J`u!}aeVaV7dAiKS*EU$Wz3@AJVKw3Mxc@Q-a -c%3wkC@;pCWG==rI})hyP-@z|8n -$|;mgK9>qJ&+VmUHZau?mZTu-p3U&2L!kqQ}BIZP~V`adWx1XO~JzXyHI&q -&LLpWiJa3P;P4h!=`yiihYq@Q#O&K)ut~tmDozqL?E(cV3pLVR_~x1j{r&(V6HWRSK!H*G0gr}uku(d -feo8H3gA;}L#y4q5#nC^br@b>@LM}hos0Oi+fiyhi$k01nI3vk4T~gs>;$f2^d<2e>%98O{JGXt#N=5 -V8{QZPuUyn-f4_M!L3h}F?gb0)xGJtx>LS3`N=j|>iJ3H|v{Jo1yxFG34$!yZt>tbJO3o;~=D{HEm>0 -*iS5iypV(1(}o!UtOhYILcEMT7AHc)G65_GYTXzWdbX1$R_6yj^PfLC+jg<+~0F%3M;cbhI)ufea_FB -`9ly5lgV#vkC8XbipDrRO(J5S>f2$zVoyn~2y$%Dh(ocl)0dPphJpH;241&g7KG4jZBuuPB-=(m^iuR -GhFwdEQXvrY@*qr#v*X5t8dUdmkug``t2VcW4@90T#6AnXo2h*NETo0Hl#s_V*YDfV&9raCSU&i4d!s -v4ON=e#wJ1HWr}lRqa;ucxY{;*QxLGt}2P5{ZBagBGJZ0XG`a4<#FPP6=c6d#12M_5`K9N>oM}e57E0 -D*QJ}q(B>X`znj}u_Ow@9hZMnQ^_JDrm@~Y!<*m%aZ}K?gBi;ZrRl>x*`(-)MYDG5$*a6|!PH^L^L;r -$1yW`~`$HbMfmLrH#K?WfLTFT7C#hBc{ -L|Cbo=FSyozR!b_tae%h_EyB{E?sj>TbW?6X7X;tqS|9nc=z_qRM)W%aQxu(viPai>Xu{@$!DVl{^M> -BS8pE%!lk{Io+TvguKmb?Cp2+>H`A2gL}ZDmRC2ns!UL(|%Cj6U=aYm{7BVe8;hVVTL9!aqaU9o43yO -lY#4OSh+o5uSw3|1lQ$(&VzJL#Wa@+6k&X+tM99d>Aii$PP;Bfi+unGp$xiW&jUm#@aCnN81o{o3m5> -AS68qp}qnA&fPm=iF|nbiLFC~ZlliewF6_DjHQ;ZUI&3Hr;T`Gj5 -%Y8jUs`+$hQ7pGgL;ecl`o#HuR2ULE88>JzI(0!S?+zU9g)}9k&Q})wc -_JF~4k$UYsR;?7-MruC7l3gYZnbAITgn;I>cVVXwfQRnw`_AqCi%g7rR6E?FlRoFl-^-WjXgQkP_lAu -|ri62c@Lpr!0xd%U>*c{k+9}^a$>v|6+j9@9R^ahruqjDEW1-mVIS4UF{#cdW%8{y{^RiO?VRebbQtL1yD-^1Q -Y-O00;mj6qrs8Dbuo<5&!@WHUI!40001RX>c!Jc4cm4Z*nhVXkl_>WppoSWnyw=cW`oVVr6nJaCyC3? -{nL@(f;ng0<}L_o=U2nYuanB=~Z#;M02+6v7Kfzc{3h}ge2A!sUt`$>R;bycL5TVXeW2mc|FsfO#+Mk -z0WR~gM;oL_2%r|c%m-Gr)QJfGxg@;>hu@&#M*Z(ZQNv2bEn#V>ZR$b=*NzzoS4_WeP3X3< -jaY36{Mzk0#Amrcn7zl^vw9zW%vgZ16vw=1V-i&Wke1GpnM)=+eY$x?u -vllyzZ1ZM6aAMX7qHN9x7#@k@~CTs~BzG*vgW)~Xw0P4Q@AVf-}D$|9Lo5T|F4UNLKzx_D66Njfi*r5 -dOexKd@Vt~cc(&z!hWP?}5&U2I5Kv%(l<^I5qDV?U`)Ua3fDsxWb4g*@agmCoWntHBFNUn=g{cWY#Ec)ry|kMWd;6V&v8_qRw-W*QC;)lu7WO&L(5x -iFz?S@uxY8eFdBLbV>Zfcq`g?1g1ACg*6JlbJ(eZM$%X%8IxT=_xJ?_A?O;;q^3qy*37E34+>bTK929 -+Uwyb!qsb@raddMtn%sT*32UKgyoLRQQnFm72?#@~LTBX$jDx`C+0E&D>=?ZnUyScQ5%=fgyUE$@tvb -KDQ6qIdy15&lez+LjsOt|m*H^b^LwKAqUd5!$E+yA0o`K{thbH0jI!UdF{t4!_U@(o<;9jpp+Bi)rn0>3t96mUci??H)&-TuzI`}-H0-OFCs?GjhZH8b#rE@L2GZwgo)>-fC -buOmy&Pfh@r#p_4ub^&$Hw|&>`G2n^$^n$OE)bQ?Qj9m*kpSElf&T!_gwEk~-m -v-d69;v@mOmOOv`~c8_#Yn=Xlswp+`6LUg>4Arxm+u?>7j!wznhRpu*Vgn~o1Q?l6~-(C%V{PE@A20! -j2)%+{5kj}lQ*XtyU^R*qEymBxpWRAc7csw}%`nPjRpEh3_wM=Y;M4FLfu?3e%|CU~_4N{h0CaN0P -m5GuW$8enJ2+^5DmZb}hKm3&754$)-JkNDmK~QLKhaE5z5i{{$$X7$<)H2y*nWVaC$<`=>Qz$17-Dr` -@i(ah|NRq8aC{ILzxKv121qF&Td}+Qq0$Co)gP@7>EHXuA;y#j8ikPXWc+`GD#%o-GNfd^Z!=b*E%els%~>P^YszXU|52wEv;oTW{>5MYKBrYs>m^x~RxzD3W31s`9X0qQ&X;%tH} -k5B3<^@YHd18B$GmiqA5RjbodmHhiciW7nQ32QbbsrWT0%-IGDmP~WLESW4+^dP60j(jxJVB -(F3VYlM=(|Hb)ES5u-px$bYvCT2?K61xGuPs$t&aA1Ku_YKF$!=k(v?iTVoMts|8M!DY -RWOY3C2CV0J%Ftk_8Y;?NMXcbD?zEb-*pD4e1`UD9j(CT7Jn8Q9B<{-a5z+^j1JX4ogK4N?Iei4Lg}J1!Q7o?a{^ -+bW2pU6^yIvN>|E<^eTG>}=;a -%~8~rs#lopudok5bY -pCseK#C40a(?mKRH%_JauY!P0or7K&obXsfA1I4!h6+VfyEGvd`#r$P@7B$sk^oF&|8Zet%hf$~7Jhy -h1%5XF&q`*5$iqCJSv+ridF90W^F2rq$;-Z0P(`o>BAb@&H0DTCglQAHWQ -0#?3wu8=#EtP9yVVzg7vO2y#9{NZfb)AcYfe-xYba66&tlcd_EUZLNSb1iKrPRBj3mWosR0Pxj3QJ8JwtPWtXCtqfgm?!;YFNITz72T6Q4diC8QElO)?lkyQ1mFSF9}3%H8D!6+t~mx$-5d37Wcu^#P04gVF8jc-)H3aH(CPA -bO0G5u_#D&vh9FuQ)?z8{}(*A2}#tl`0C4V^pjt&Qc@fhE7rk+h&rajK((ayHW*76>3hp2%LIF?TX7h -AhbYaiwvG@r{a69*7*pDgWEd~;Oh>Zmr?Edm}HdZF6nPiSrFV7ZNd(MP~-^7=LDogHMyH>ZEvF_-DgB -qPYS~P+DA2pEhGTB1PS>ycdyebNgZr<&~TePp{6`#%`WwWh`Q2AG011mgF%L1F_i1n-Bv;fu{oDw)rx -GIz|7_=eu0eW|0){3v4?n6*&0?zh9&Z?GL^RL;?k+vDY_McRNc{q_*A{w;!}pF2xC$xEheETOekZ70b -9c+Tg~TGD;!@w$H)Y7n=^!)hy`-*eIZEfzo~gN4jVVdcmCD)h_y<~t)Yw?FCFk`%}8pM1~fGms&0v{) -3x4E`~w;QQ6CSFkIAiI@R`U0I#5f*)7uP~q-ZL(ZAML$#iX%9;AXZ2vK9`x1s3ouxq4giD{UPz-jR|0 -+fT0cClp1pZ=b^D4y4ux-G`(Z?zN1l>Bwu>MUZ^29@KYIAS!g6dh{{!3nup1-KCp -@`mDC`mMJfn+P&4`_K;cywsI$TEfkOK}GPa;AtPukG;oe?^p4GMl?zNKA(W^Z|IS1`j@F&$!X-$v76T -2s3mG_;GC!>q|UqF21G-*-MM@)IfBur2KAk5M<2K4}Q>M -OW%iL2u-n*J~FDiVkCMX?Gua2G{qoEb)2K_f8@wrTIwKAF=9xS@yw+jazuQi0|n7M0%oTdbrS> -pq?)ddf?RPAxpwc)t^MbCIJgM#7)PB<5T$~PTmp%MCgoj?ao4Mb=KY^RBaZhFag42ReG>aed4(M0Oy> -W~jTysV~3H4kAd5~4*bMYBbanRDAnig0&k%^BBxcMQJKAmnQT`T`{zQd5(eSyH-eVH=qN)3n54wYOcL1#vYqCU)^O-IV4Yp4tklR?KM -pzOjk)4KCFTT#H(x^kDOa>l>R!u^vO!Ur@M_#Z%p4K&|c@eb>0n%W)Oq*~CiFf#Pun6|!(fxV&n<4 -I@&!E2#9Ui>B*cLQ&nwfS<1)ei^7fkPsQqrSQ{%f6aaS>FX0=iz>vlKYB=(m)-S?PS(8QglD#7&`kJ8 -U8wHOZVK{Q8!klzVpv$8TE5?*+M~-SP*C0y`$QMuv(kacbPC4;5ZYwNk&`78a~UTAHHD?0PLcC(&w1- -_5pPh+bFZi{5w!b3c&xLPBe_*r>7Itmr~@Fa^uXCr65Y -;-eY?;GR6jy9Rhch!>F%0l3>Vlm)V}?7Fil#>yH^;wdBssnx%z3S$q4$0Zc})SNUk~MFUyLJ`__|q#q -$U2KG8`xL-qM`bnQw9`^`+silwi&)a%!+uenfc?ogm!wd#}m;Am^SqG^sRQ0AcMq5OU -xym&<{Fn3=*4^Cc%5%=XYRQpQaJxT2wee54!tCP;X=m{I{+YQBcOYovgg6$gmk|4dK&uJ*w@G%C6=h#eCyfFpo2LsAsD`(YBbD -mMZ>+WLDFyz?`W>Xf;npVGw7Nt?QA^?l~f=6kH!e?aq{ohe@*)Df%?Cf_Vb#*RhcIvPMnCWPd@qe|H>E7|M23Q^7V@^pMUe}dHLe&Z@>H>{a&vceTfV%1dtGiG%b)K5{pR-eDnI}7%lo^VH&;*h59Q76&Gp?=d6U2S{NiKR7k4*LH`(*|*M -Ggfy?=N8Q0{*!Prou|{{EZmr^h!}@2>x^VQ=p59`obFyZZ-y$brju_YeE~HxJiWPuFkDj~_JRKVItUf -wA6w$V>hFRDSd2r^VKqImEC2{PXhc_O`s_w~yuJ_2c!!U$5WpC;9UJ?&;y?$M^Y|zj^%hzvefk{ORi9 -U(0tlw|{xK`K5eT@(!QM(|!5w!_&|AcjxoxRNdbE_;B^`fm!?M;rhBf-v9LUx4g06l@Ist%bTma@^Jn -3=5Y_76Y*58?%w{>{X_Qu<^Ju>PapW|{oUJq9Paw*`r((yk8}8kZ@w>IUq9xZmOotIT|ea0eE0sx+nY -Dp`RkiE*LRQC+=5b`lt7|mpMZIw*1SB*Z=(O_ -pi&dZ~k2V<=M-Z&%Sy6=ilXTbEflObN%*6H^00~2)-@(R1a5oPapEebAUfRfBEGpye% -U%hz!>2U%2(gMEYHe!&tATM@#XhlKYLle`~Ky3-@bbOc`2{1uRl&Pllg0t{C}qSryTN^`<%(Q*H2e -Bw~zbL|D4PFm^XO)w)}kc*Xvy7H`h0bsB)ECyUOMBh -KGZjSQz^}S5czxn*KG|L}d-TmurF2Sqp{?*M-IrLYz_xBH%<%|2rCw}^;XW92~v*R<1!%F%7RetlI{a -2oU^ZWltqw>i`4*cqh#mcAp>EZsDa`ht%>BpZE-~aom`~r}2Z$2hQ-rT-V`*54jmloiCPI7LKoWNh+y -$5Vh*KdBlyT85v%LmQ*AFtkB-CeUJ57+py?@;>%}W|M2@4uU@}=@x}MAUwr$`4=yn6A!o@b95eeQvCo4)+v^|wEK_44`u{NdY|zkmKR|M@o;r -PSjx4X)Aj%VN{BX*4tc!B@L<^O1kec3EQDW$;~%qh7|*=Vk3jzYOc`GMZ%%the=x{9up5=Te$Z5!Mxz-SH1jf7Onv!SQc)9DGEL18xZaC!tif*wH+aKpGg*Uf^SLC>IP&@<> -6^sMx(^sMx(T&vQf(xcL&(gPS7@MPT4bKFMHM$cTRTr#>hx;MHvx;MHvx;MHvF4*bT>Bh#gPLE#qxGU -FeVOKwhB=p$75|1j(r$;TlpP#$<8xP_tHQ$=L<7i63)S7q&aX -*4i?b2UH3UJ0{f8WFs%X`vXn++vfR1bOU_^pf$fyj$aTmc%cV5FtNevMWnAWqanqMvV1@H*4Q~1iBb@ -jxu{3UAw7Ho=6I>9OcJ8e>-E#k=hma%NI14{6uo4W(*G+$MM}^VkeS%vpa)BB$|7wmO1Q~26!@L!+mr -rz#8)+w-ZZ(&^u*Vbc4QG@+Bk)_AH{+Sry=$s8mzoT&l`~?P`4YDA8_h2Y7AybM405Z^7^X?)AG8~m# -x?vgyMbBFTcI1<1lwt{aVH+&0Qn(%IyTg?p`JE0o1m#QjfR=lB+CU3#?1|uyM!6xE-_MtD`?!A>*ly= -S)#&n;^zyduZ+%JRt?EavzDFt%74iTVsNZ^J|K6l8JQbr^NyX|OY%zGQ4_#5nw~z{02HcVZ5#`mwyURo+Ph(b+W -Z)7`lDhGMqOk~eJfhDeRv+3?S*;wB8^im0+c<0R5^wwz2kbath+zX1+3;v -MVAsmvfLZ${X6u-K@ASa&I*!--dB5-yjB7UZ!~we=4F~KvV8;Ptr?R0ZZq#w3j^O~K+0bLsWA1fp@Dg -ZogFt3OPn?%S*RZ+`dYKJ9HLExcD0L$kXwcBc5;WKRuFXptyd*F=fyoIb4-(o49vUpU!7&@YzllKN0v -n6hnEl3_XG0G_5w`bRgO>!1Ex=`f%K(=FE^z_b&=aN>;4#2sfX4uj0UiT926&9qK4d(Sg!Fts>w){~dy2YOa|f|Y=&1sDl15@002NPv+5BLPMNj9}EVp$8a= -zSpfMFKL*_Z0HGA0+JSBB)~|3kpLqBMgoik7=iOQ*nGp;XG4#%*R40!4XhCF6;v}jkRk9fnor~0Ez(=11JVi#HeM%BdzT>GYZ -N31(E?I14zOevY{uC3^r*6iWMkUpjd$-TritP(`g3HwmTzvNq(RwkgPxw#+nU1fn>#I;2yJ~Cs3?BP3 -1u_)0>$c^?~LRn`GKB5vI5BpBrA}tK$3{I5!f{mJ!Ul_)0>ugxVbj^r11MIYSljmVBY8=FpeK;5K(YeK3M4C#teC9|6f01yK(PYF3KT0)tU!_A -wAGWZ4|quhk`+iop|YVTkgPzmVzw$!teCBe*{X2u3PvgzsbHjnkvh+Ho2(mHsbB>{pA9|1NChJmj8rg -E!AJ!oQ2N%uNCP7cj5ILPPQE^qm*j`WH=SnCOd5KE5mb+c644;?O}h@{;^OPq5O!O2ce5Fw($C10xNL5UpgxwZKRNBM_%-=mADr-|IHvB@L`Ju+qRv!)!G$( -!fXqBMpo+Fw($C10%>B+0X-wG%(W6_+r9K8dzyyg&-;$dV-M#Mqu;V&=ZU_Fw($C10xNLh&ssG_v2hQ -cu5B<9jtV)(y=EUjG&7(=x{^lYDhp$f(~j*Q+!T%))bG4WkFpSccGWSOB(c}$vVm~b}-VxNCzVwj1c) -{!?nOj2O}MfbTHDvNRPd43trN}N(U<)taR*22O}MfbTHDvNCzWW{cPv~MmiYjV5EZ)v@DGaFX>>VgOv -_eI`*W4kq$0qT}PdXUsV5EbQ4n{f{>0qRTkq$;W80 -lc7gOPs57Ykm}!Ab`!1SJh|E*pA+5ovI!TaD1X5j{5|-zHMo!AJ)q9gOrd9$N5{4pur?>0kvJG8?0Dn -xLsPji%EKnn^t@;SQ*%p0Y(NG8DM09kpV^q7(qSE%}5V0GQh|HBcs+mF1%!bl>t@;SQ*$8^pf1c^aLXVj0`X`z{mh -21B?tXGQh|HBcmUCTzJUfRO=41{fJ&WQ@MYO$7XhhjGno -cul_PQCoWP+6mRwh`P*pmrHCK#DuWP*_iMkW}UU<4s98+w3|2}b7TB^lu7x*-*3Lr<_Wu_ve*X;JA3M -kW}UU}S=k2}ULunP6mskqJiT<|StEk_lEOSeamDVoxR*A;!*zo?v8xkqJg77@1&Xf{_VECK#EUmzcpz -CRjm2%!Z!WlL6I9e}=m|#1OEi?i2Gega{075sV)zS;ps -cpFd5Jl^WPz0hRu))U*pmfD2pO`WCm2~^WPyb`%EF#3FtWhN0wW8IEHJXb$O0qeof;{phU(i8z>=1n>z2GEKN#OQP0&=DM$>5q&7`4cVx$wbWkV0 -6htb36v3ZGQIG*DgJ&m45Pp7BT)9LB-bb2~HoohKgoE}b(phwVS^AgK&JjV@s20eqGLC>IP&@<>+=~? -MnxmKk|rAMVlrAMX5<|UTlc#d1?+34Bm+34Bm+34Bm+34Bm*|=7tN2f=pN2f=p$L1wz&W;?n)3ejF)3 -ejF({s>s&~wmp&~tFDL61R?L61R?L66N#EW_~}chYmxbJBCtbJBCtbJBCtbJBBhtwoPTk429~k42Alu -G?bW7Cjd|!3r{DN9XEjS{*s7BWHE8XdR8SlSS)f(K?!RN2Kgz(Yl?yB;(|ZP9m+7NOP9LnYRj0Eju5I -L`#TgrrZPSH|8Y}96G7DPU@{7J(!*TE#u^iitOW%MTdg~R-}_X2^?R6wg&29AvQ2@7O=7)NOrblAUrv -GRJEOVvW$~23U0(PK2FS9kPV!;!3p3CF%t3aC7UxZow#wr&!W7kG9-$&p=(B{qH&X#6nLr=Od6!e(8` -QRF0?C2sTl!6!PA)(Cn7UrmI@(kA(Awn!BG)3Zt@btccR*=_NVUMj4Kh`5zy%i{aNUCPSojBrBREo+o%wESO9BJp>;XezHXMYbRCe-T!B(s2gN{UOXrYEZ -4W;ymOABeqLL^r(xf(ZArvMak3?~9Nw4A_B6#~Y>eHaeSu$YGRFkG7vDs~VvRI=D3AdBaB+9FIW=9re -9HWu4%~pe}_Fz}AVgk2aU)v^*d{sJMsAQQ0(1()Jr@?VETuijucCT5#F243c^pD+S9 -TT6&TvMCqclR(PDb6)jqFhNh)YAuD-o?L2^V^r4sK4nlbE`2GQ^HGHRQrV6yhX|4Ry=NMw@2Um2f+hg -VF9)o{qiBP9o^^y7OdtN91wHeUc}$s#*tB%tP6xybo{68STq-Y9g3q>;u7Uf&G^zMbni|-u5A%3f&X< -8~7#lg=peR2@^0HZq$%BttkP^;t}K+L7Yi?Et`tH< -?2U0<@V0yNSZR*DW{6g)5V*Y(JF52<^h9I9sjx8t6n59F`5P`gI{AQed;pmw#V -YW9pV73)Wt%7!HkO(&k?`)VMurCr)A-4p?a{oAjKq1+oag&!gKs4B_5e647;}jtn?#@|fCu9mlEQd7& -T+ETGYu_?Hh8EjB>p2g}OC0&DA|9E12}vzuu?=y<5xIlMb>fhaQDfa4R#u@CM!0Txn2P$Oag&!=m#xE -WAypXab0HonL}*SP(n$L{0YX86G%~(M%xtRcB7`-#euPx7+@ur(mO&IopSlBTGQROf8<^WjaehI?^#!-gKF;o$`pl!1)%r}m@khn2Yt4`w6(ZMT8mqJR!@Ek!tAdX$9klvkjV^(o3gG_x48fxyJ -rpGEGG&m+{2(|xbtp#GuOLckTzCngv>_}RbwSp}igvxmWPY*rO&b?_SLM!Ca3O1#JVX9!qi}40k#Ta` -btW4TqK52=O7=(u;`R#{0F#=_081SKSN|AuQjzfRU{SKQ|GwUm#B -sTJ<32*L6S3!Wg(|v+SXW#A`+omO$5deVL^H}0ySeXx}Eq{CDXq#M@|4z&_o^e&UT=p@2b`f28L%u -h%-_xmF%(;@0O6AW<}<%Q%HV796*();vuTkDz@1V`6iJsH3ycB#}xpp`0RjuDmECx9<*Z}dtB;XN$Lc -QA{14GiqIet6!uV(#2w)jMOHyF=?^EqDM&^I@8?}%-_CbaDShGEv+@n9c2d!t9I#j?TCqDbVoEX}IYsqZ)f$>RyRO1EcK-1I9ItoRJfGI!cdK)$UfD1_gbj>z%w_S49;BwjjxQ^mBfbm-zX642 ->YhGZR7@F>^uZH)N;a3JxI)w9q0dOF5+@Q55`@`*F^1@{*VeREQ`M!%e{s1jDJ$WHWK-L*a1K(tA>$HRs$#=jRv3`&^ -H@1W;%0#{>M8HP=!l_(y%1sPyq-b1XRl}4PY7ENU{=%ty4R&u)L?<7~HJv&`3zb@G_kz_X^Ib7zEFKB -Uvee+WhpMOMIc~>J4wZVckEcA%!8Ecp4ZgmE3@j|@>N_%mLa}EHB?nZb7=6vRzi{ea3tF!!OhPZQv7? -&`Ny5C)PzGSa6j?W?!lNL$Qjh=#!#CnhR29a!$xA#`Ud7`ozM%TUT@jC_k>D)060krm-Um40-Hob3Cl -y>o6voz-U3IUdoE&H5RPA_^XaX;o3f&GdyN(eg7$7{M3a55mA5uWsf~iGFv*&z}!ennp$Kk{SeGB(N22Jee+2c0Di`jRrw3<9D}FIz_qD^K#UZI;4nAKGMG4`NfQGl6vOI|)9z -6B>NrtTxiNwu#TM*Yb`)EJl(Z3DIRvY+VVwHz&RT}b+@^FZOas|OjSDXk352!<$sc1Hy(vF^g8GZ -_%4XbSXINT-4~$svcht2ofc8FjA(IQf$NB}p!%n(1VN&R-}Dmc@dI5Jph3P>|&-7QQGL5j@-JH+S7DP -fs#3P;guZ!9_Z-Y=@#;HYxgg846h-5tx2I6o4V`QlDzR&x_zUsMEy~5naKdom^&68B?fOC|v{{771DG -Qu*XksCqLd)S)_MZmz%gF?FxbzHk}R*p;|QOl((7stxUXZbmBDP+p|MOL8x8aH`KDEuRo4wn;Wf07n75;sW1JdM;J{Y0{i3Z#kima6yV!6jau_nW-Ls6{HUvN --glOQf>WG}s;${S?gWWC2;fAghUSVfLXZiv6nOvAy4@dv(f?3O_ZduaiRep?$A7YiRZn0c1V!bnt3N2 -XZFf5o?W%Z_zC>uJjT`6-&-YE(WXCq -$&f%V-4)x?grpkDEh0D)gCzP<{y(=0w(qxXy#$JQh{{#QAe_?HM8raPw=I@R^?;6UjZ@Hd!2>ddXFhf -u;MBdEtA3pcrOw7pELkU%2*A*3U8Ud{A4*49GPL|Ey<{<(E+a~``3`ljPOW;OPS;dsKvteg4xW!Gn^M -h0!xRup>SKZob=DQ*Ytq=Y>m0We2WU%F$Snr1>R^~jDi(9cX+ZfXS~FE^*M06xivJ6fYzFQl@N%f>f+NB*~h(Z{3J3$rB^e9-FELU5bwz#0{XxYy&a5XUb*WPCQWeYE%mv ->a$hFr@BkXj3NROj|In5mc$rW;414Z`5Nb~b80f6TSvqdUQiT+A_61lwj{4s9fjE;H*qY~0lVYM2Vj+ -)ooAsuk87y?$wy68awDi|0UL!07QvcpqH37uI?AoW!juN2~k51-4)bVyMH1#5useWX-iD1mcY|>Rx>bVj-162m0X9Q&|@1CAURIsngg{9!Yk3X~_m`L} -w`>X(z9y?zOn&*gdN}i|CSxF>*)PhpD42MAl6@Ee2l)C`g1jt6sr;g-Sf`?vV -%E@v50e(m_?ARyl&UH&((m5Vjpq^#t4N_uFHxKm@;(Kpv6RRoRA5$(=*R2M7dm -yXCWQfu97AbL>2fmP2Xcf&6GbK%P^CDkcppdKNPgLrL28IRr>;TWt4r>nBCaaHL?kqool}Ql)U7xgiX -GaGl6fVuZ3hfcL~jwL;>5$$Ibr#Wrc@n|hN5TMU>j^ajZ`RZhByn|4Mz!k+TI6<3zYj@hg0`js!lF5G -ohWzDLti}rWBm6?T3?L3D`QO$jD`S>7j$s+E`>RHE!qp+m1!yC9r>~hldtQ(RP=Klx&KP!&{$QLf%q} -ffR0{=QDnz?lrnXoK3z60nk#W4r8m{zDn?gDPfTILMh4=*XC9!t~0bZJ5Jq*y4O(MKZev?QRb4|A`XP -z(HT1CoD^A=TR;Id?S`q61BCRg`J8bqb+05Nu~S+Ze!68Rj%$H9Q9fbhP|Tr2VnjMaDMdMN=r}~I_&$ -&B)V-RrNXlh$e#bDbu8;+)jAn)7L5^ieSy-~sWhxXSh*S1vla03RFLkdbmI19WS5E5CEx;t0TIoi3Rp -Ypn6A|#3NKrf&aSNArl`5Zgj!xaH4XIY9L@=oiQ8@*I5J;sqDSahoE)XRMG-J2#Lh%NJQ?*81*^23A9Ctm3w32Cf6QM_g;|%Fxbs;u^N3O$9yFM+ -cLl^de~tacBk4S3-EnMC_v&58*-fF4cnm*43YtoUP=17h?^LsKVvdcV0Fy9=Op4T>v5zGldtCGq@}{N -(%AvEU;D_okCt9(-$Av%+2-c3a@zy|$)3c$J0m%lJRbpK95@JTv67QqDnun%x1WdKEAxZ|a5g`5n4GT -z`P01me>84ofykGJ-6zY|>a}atUrdDMvhZ0g!BJdKZKV1p=seBsbQ*jm#tY;l|jteg#g%apC$hJ62Rz -~T4PWNQ@sNjONMs>M}LML`RdduVlfcZ2Fc*uv~QW$Gyq(YTxwb}>u>Hq4goL#LRA -P@(|a6?z&uYMD}Q6}_bB7`gIJII_?oWX2_rgV8q1VGV~yjD+7pYiM#69VD@ZyUZIY4lys4DY2>)P8s? -`)s|#j^pdgPNP&xQ%Jw6-Xn8Q?vh^}Ka!@;?ZW0G+y4VH$MH=?5M~goJG&E$AG-tg2ap!-vcp#TbS?3BB$Dj~{Ra)8HXdOwsdH*}|S*>R -wG8nl~GC8b?ELlOhgk&a4pWPFG;1O{8%#e)vJ^Zo`#%spq)L<8*0(XcJN(LrS-*cF;Yi=sxa_XCPbZ% -GpR?ni9?TJm70~T*xW8#Dnal;`GhKWpKrWm8+KAqGXN^isSh78jr3Wg74P~PHB33eyMx)u5E?%AW>d5 -n?ox@EUr!x0$q5Nu8eYh$bCRI>MkI2NW^)+@Dk1l7I7g;`<$Gv@yy0S12b_29jUHj`Y`OF_bzA!p{QL -2Dq88-<0dcZ%HQGzgIc=6%DCVxqm9}coJn)ssB2rp#mptaRLwa~mYMd=t9cs=aksPyX-bPuT5;K0F;R -^0RyI}KMnU1Ok&*Le;`et1K06K|xX-wID#tHUsoewAUGAI%#8R9j-Zv#4RfGn6k_!T7Ook~GQ^gJAQe -VQ!4G*RF8_|_Ax$sop(cuvPD&I?8M-7RK`}Bpb?7eF-MSb{r7Yy%rq1t7p?ubS0tzqD%u<@U8;Ls>vWE#KM!VDs|_8NFnj|nzrAI!b@ei -Un$Mrbzf#r7lztHfS5FcEF0v|T$oj( -jWDD2MS?MJvo0m}cTG($!y|7U;RB>K@Y$;wD6*jIiKm-|~pjWvl(JG=>Qk#Ze9lm)~Q1@!|G#FSY;!z -c=UTUB^IOc(Kp82F~E8@o@Jq&UkZ5tm_{*naS+~ZRBsx$ge5Ejjj>W?XeV7$LaL~CL -(1?1QPwm$xEnvjky^G09WL>Bv3BmI}Q>^0n@F&jWR@HKbS$l~FICi`A9xN&Xm -R-VvOgEJR18t~^|Y=6A$b$F7Gw;@t0J0wx!3dK=ZyibGr&w~HhRQyag46O&GAHI_=g5VrL0C$u`(Td4 -Z!->7@F?brvgB?=C5L{PJDW0NnKu-mBq&XdW5lA3w6Zc}*D+u!QDBqC&~CuOR+axuftY}t%6rwMNyT-Q=n8fx9 -#r=#;ak*RGNg1Hs@X!X?2ziq$tQ1mF;CZg@kqP;Nx{FARg$vjexvTyI2Phl0j9Dy$`W=NTx|U=uvg_J -9A4!GdQVPMa!(~!YyekE{2Z4&&eBF7nj@ei0VtIGXWf7f;!$7~LcuATRxHWf9LLa$+&B?v?cB%Iz1mU -*pUjI0uL2vnI}9$~x+13q^s=DI8h+6CI!OJI?N;^oan5h@l9-$NYPHz2a&7W2lXnxjL<=n8P(?jzGGH -Hi<5ZQM)+?!`32&UK?$ssXiR1A`74YsVAEtDsswP6^eo{SjI)kvbh9ov^b?F2u5Ip@cb+4sqA48l(&? -y%1wkx9L*d=(#G_hAgqoMb?Buq@da-*8QGrmyW>ynIv*+M;Z1yK|eku3lU%DYRTrX-U?7{W9;=nBqFW -xGn~uAP4i)xB1|1F*>!fD8%hQ&9!G0S=^MPTMJb9Y`QZR>E540=kUSmvj3!>Rt^cHkRs91R_;-0d;tF -AZ1o=wG7q1xN7i;eY(I#fFKQrA=|Du3hG|VRB;(44SJs!L9(OKJNk~J!<41SNM*3%f=ydOmS| -;c0Ei`_iCi8V;d#~@W_=aRDqyZ)qzx*Qq7=5o}DVx8-BD+xojk%&Mo$Hom*U@Fn1Fh*qyT8F)lr}UDkQd$u`ZgnZGEwB-LVIN?uF4c|z-goW5l2y= -_Bv2C*-*pv1-K!s}qUGO|ciO2?<#eYCVlh5Viy|MbGX`S906_VcrMN|JfZY3diI<4ltALtVt_kp+(s=(FzuG-E!aYO@FjvvGj -z~!NR23oyY0IDl$yAxL{h})syw3ZDm!S6<%6!NVDSDK)r;tTQ5yb*Re#oTXsiIX3ltc^_SnRGYLFp4p -4>?DL5mddAYB0NkdZnmPC6&ITvY;SJ8RW!t)=gx2DG}q!rAn!cJubY2F)kZ)BVymdkO;?qiG9Ne -|l|x`Df(W&C%{fehc(b&1j+?y1b%;D<%~k0kpRQ7S`8=UOOdsWh15WM|mjydjRo_FNgI9zRl97+KU1}sYuY{DgNmUv_$F)?C4m>vBsnori=AIJLp!Too$d?K)NZh-Qv?+tC@>*ABR^ -uX)nv%W5$5bOlY@MJ|_iB{n7%^2>b(pf(h{i={Z(Q1!wERQJhqX*mU&$P*#S+9sv)3MXp({&GaAjpwp -QQ1P!ACm;yh1QO?jN1{J{da9J^j$DR3e -ZR$UOcpxSfP>?+-!Y)XEfXfU?@)9D0k0jH-_mtK}uOGXX;tteNe4BVJWsjTPyqL=6mzq{aI$gxTyg`KK4q>DC6n? -VRv^(g8rG}M|3Wwv5~>ayz}Ds``+v=#5`F?nI7C3SKREwm~WL5FtTs_>v1Z5^)=uh%XUMfQGwA5`glY^_)4 ->h#8I(I2fj^CgzG&T-)-obz!)P2UG2hDsU)0Pw>a4ar`3znwb4QId=d(>Wt0BXy2y*Tq-8?-fg52;i& -A`&BzjMU!!+$MHTs6q2ee5AmKvf2aai>|Z;{ww$-^j^6i5$w=sEloaWyFh)}Rj?+mzDm^RP)m72NtHG -sUDJYWW6xyqMTL70;}#sC($&7>C) -Gkp4uILIz|*yiBv_Q?aZMV*|E`~x@UMm6IMe%HsmU_LQdb2mfoq5jh@vVz%lRRL#deci*mXh3#?DPDh -*Lm*&I9!&_|!nl;q{KV1-TnVH&h@6aWAK2mmD%m`(hWqtfZ%<{Gq{jBmOvH`b4c$_`WMw -}2WL8Sz*|X_?;)mlGr)T2T>Cy4o)v@^D)%np+VoTd+JI}=RsubsKbz9ZNS{yZtQdFII-TZI0UKi^7-Q -A|H=0)GMV!p1*x)*cR=3ob1PwT3$RL|$-$8z1=m#t`)qMsO3wLdHSZeHA%Y}l%)JN31_Z(8$34JkB -3D@F98s26{2TGjuqSyanMeP~lJ)N-`cec9f1(BX@-H{w;&)j}T>ti(+zHeI>gtRppoYAb#|y?%NA=2{${y%j$nUS1xaUBCTKwN;u{XO;czNY&lFg -5W}^RkcOkKPti10I!cPk6x-Chd-RYI=z0Yr9U~nK0Cg;5+~=E;!s>1US6Lby?J$bDK6ezUYuVY9|&<( -mQb-)=9H4XikE80yGChpQT9c(?(EXvD)V+q!1Y3`ijSo-^SrDSqC}xw+dpx9_WUzR<=M^-kfHvssOv&@^HtG`uKd@gtmkSq#m!oQO|Pil+}$YsC~3=Lz7q3Nfut?(Tj -is*^3|$0zGeD7DwpcZ+opZo`Q<)2QX^{LEr0FB_hNTvH;(ixiQ?boC4XbT>Hcyr+SyH_Onubv)c?-RO -P@*2w^V($pX~3{oRjXnjB@h{@7#=(nxl#NB+bv%|CHuP#*So8S-O{fS*dK#Obhy3^zd8t__?pd3aVw# --P^7sHyX9N$&JRKFK7+AL%ZDT0^c(CTN?daJH<}N`llT=G3`mCcEsGg?NR;HYxMv9%L+=^#OK^;ZLB% -cY35!z({%21ksJKx429BTG4n@qH$xtAA0eArj7pBt-}?HaF&Yy_Nt?0PP-2jjm^DeSVY^=Gbb*!YpRf -bz-6BmI^x2<@`y8A0b_UEZy+&b+1nltpWAqQwEn$>APkIiO?l<@}jR?7tajNYh%`0;(8@pcC->to*Uk -2=um@z^gC)C>`dhrIM(l?|I+-YD?aweR^0zmkQCl(?ZJ6_@z6?@nueo+=4*3dC?NJwKKWi`qt`2F(Fguq=V-DWs^3t&%iK<|Na -S(Nl-5)Zq)ERJ!(w8$a_$o-%#TOz#OlVM5wfCyv3$OX)5BI!ViEl(KWFa{~BzsMj7$FiO>k2os;aj}O7(LR7fOXP%)bOu1lxJF4wvFAr%1lmj@q890fNIcFUE? -7hQ@g&124+-F2u2q5U-F$Mh6i4tMKU?^Q9Ge@N2L=GHsJaN?SS@aN5QiI$|EFo9EZ}F)WSMvgHTQctcDxo#NnJG6K(EN|2g%od1Okw*T-C=VQxfJ&fQCT -|Hax9W=iBoVa5sz@C{!QeCD)8BN2}PcxhPD;XImq9wk0a7#AQ)5kDYi(fQm(`_%u$Qizz~;bc{m$lx` -ScyyRJgLo4sob;n~&_laTM1D9B(iGxPzN?~ikC$ -|0gusE`DWf&a4At4$2l*&v;lntc_@g1_2!o`#*kemZ+t5j^60aKGb107_9vw1V>>^Sa4#J(4bZ~&kcH -2F4IL@TBH;_)Z)34DPDnRfez_0+pt80AA$Bj#lgt)>Zxb#%S>sUy6xHIuBIV8%4k%`tr8l?nQMq{GEo -{Fbw1P}_FTu%fkVpDDd3ag9;Q7MrFim>`Y1v8$|F5fy6=|CHtx)6v-pOn(%5i*0YN|XC>t;*7{q%+K5 -cz(l6HZ%!f%(6mzJ+LBI(Gr41y-`T^nd8h##VFCPe+c`b7yqT)gBkWT!{5lUN^kTH{BR5-5 -*0wLk&QS1%Fv-;SPejJhUct#Z_&QvnYqbwr)h8aGE%QT|>W*kvC$vl1?kA|DOaR{Y%!n6!sV4Fk#c@EG{UliKROhB8>8#V0d|p#7dayrPm#_$1w`ZLOp=e91uLu@G&AjQ)uv!jp%8dWy1(Otw -p9EN2pMN!V$YLA#y3&i-EQ{0FZ%()KOK@}$ppa0JmgXIX -X#*Q`rLb7?xTk7gluY976+OLZFHR}^&p_sgr|8jn&Q!%wLqGe4|$X*g5#628jeBmEYFt^NNJIL5fngN2PNOUX0`=a=Pvj77aNnxeL+WiT|YfN)pTzvn6w4V^{9N4HzPHGB`F&2!UAgRK79 -!zug0nddo7D!kNhPKpw+P2Q)=j^FZ{xuEH}Wq9nen<=G|-%efZY7Pw);ohjU04GX!%d-%!AlC=LOQ1E -IB_j3NWg7O$A+05kkZuD)J7%4LyA0K|FX-J6eDe+S#kC}!C=Qxk@B4cQJ4go6M%0P#33?h8EV9Z7iVP -N})#ZAi8$e9Ad=dKghN2%hBgpI06-0Ni|JurA;H`H$!tCCi^zwE{5P -Di5*oQZ1r8nni72!k>>7C|D8^^GV88+t=~HbH+TD5nTOeu&($pAJbHTA!k&&xZ -%bVxot8Cdv!LYZUxK81^)YH#EPD!*3|yyM7+ic>@$LCn2L~I$t^)up)Gu<9baM$rx>PtR5gvAs -Z)P0iD+ArM^vAlDvjf|%<+XxDs<2eE9H0TgnK5QY*5VMcRku^=s4ZWgWET78606Dyi0^OBvV@vr~~`@ -!F^9WjPYVt7;8W&Fx>bm2bCRY=Sf_UGELF_P+%Nhb|+#R?3u6~fjfjXd(te{p7@18ceJGgR1koPYe}! -Pi6rP@!-yCHA-f3crg+(>^H-ufsPWUMTA9)U1=1GmU^ -48pb|!=d^81`6N19k(oHagusA|}{;6FkPiKZ2Pev_RhL6YuoPcmBakCnhf&OucJC6|SfojTX?Raz`Q9JbrVuXq?d@sAYqN0_ -`*x1-32}Jm5w9PCGb!l++w!^yZh51MaqjDS6zl1Ve(aXR?_2@w!isawlalZXbLLmeYZv5XyzoOCKcaB -!JXypa!9aXR9#0o^!l=mWuZh#^pYeeKzFn5gq|yb)@EUUN)=miu-(r)?QRy6klr|`Fgu5W2J0$IP1}Z -?vPv71i#u>WuOSvWPjo^Wlwt!C;9(fK-Jev7&+1%5DPFGE)&ZWUbw9$q3;6U5dkPcK4vr+gf8D~%2CF -nlR@g+vOKOdAI2h5O0oF!yL{5!mtd3Y@}>)H9q?C9|N_{I6qgc -{Oo%6)7kmY>d3w{hmOzA-@JG^yF7k1yMB3jeD(7D)pK=L#<4m5`tX0I&bgDPXQ!{#RL>8u4}%ujjyb< -5mtr=n>Z+g3cDr)DbmHlM`s=~0Z~9_AYsx#Skbvb>$F3W`)W7d7B?q~XW!dbn!n{K -L<*V`sdtDml&Y_w2^CeP?+5BuFcT9!TV$u-47JQL;sJ?V%iLw&br{vk#&Z#K%TZ5P=`A1n3cRtakkcQ -iy*o2MZCvyV?`?Ops{{HHxJKn0t>S_-Wnar4-l!RMQ{)em>yY?e#?Bxa|dJ2lT{QnO~MA8l0%E#^w%h ->iA83T+tufa-_3c@Qi0zSB<(>wcX+tnH=esr8eZc9PGuZ2U>H?n^C$ei+>zQF7k5<;SYobVghz=;_iv -V7puww|bGvq*}V`c2h?B>0aef`k`q3AhQNWQ7@Dw>iK$Oo|Rq|9UJSWENivO#TH1N6zi@e_$<}(40mx=r7T0^&|&?rE&EMd?=TtkqMgZ<4Q`dml<3x2t$tX)TtsFO%x+5LN6{%t(dIBuHTN -s^g*(7AH)eMrP8BqYt|TPr#Wk(y9~zGxix3VR4)jLDvRCSTFpi*16vD$G$6^O8UY(XEaKS&`+y(l|EDOMfy(W`F8C(c -g2TN+-;OgFDk7W?Zw*ks<#^J(X8UWs&CmS2APAQTxzyXxCY{Fg}H?*;wUvG0BF@XS)3{KvL=$&TO{FtzXoXhA;LB>E9dI}@{g -r}WHjdjK6gz4vD%SIj{(BdKdMh^U#Y5A6=qz=ZKMTPK8;PVFC%4TmzQ4sczQL=Nw?&xZlou(!;NCI-H9c_$E -!hdIH!?Fv-&*r(vBjTguT9r{{l-geyu7;A7dIa#c!Jc4cm4Z*nhVXkl_>WppoWVQyz) -b!=y0a%o|1ZEs{{Y%Xwl?OI(=<46{L_pc~TYt`M7n{kzskkGpiGz&9mX+S`0)KADH1z2P3tnG9UyW0Q -0=h`XPEq{d2u+lyZmPuSy_ug~Q{ip)@&71xo@#*lF<5O{Rd~kSrc_==eoE`i_46J?Qy%AUUTAbzaU7S -XVILH=S#D(~r{VPtA2+t1>t2CZRWtNM166>@SbFA6%jOcM1moX&&uD|IdTk2e7x1#LPiS?(tEauTtGq -rJ+7I@5;SzbLru{h82dVHSisMHH_^H^!@nu>DLwS0uB`%=6+crWB^Hie4bEuum!X{@-nOdS!B%QX;jltF#P?nj|x%#-bJIxjFH)Q&XP)*5|*Sig%(!jEV!N$@>DKZ*p=$c^MqF9p -`qg^1Hi?LD~17bt|I-;q}0MvGOUZ&!&A4OlCFJHGn$?8}wdKm96x+rPNjKfU_;5o^ITW)Z(yQ~a<*3N -8e^%A>S=1aK($e0Xv2D_Y5|^Zkpf8JHms%T&i -OfEd8;WnC@*xA03tdKWQq-=0MR*GUOcvrk`lb=)xsH)hB0`BQAD -s8xM-rc)VAaRhEePeUwLYBu`N%!m3zBN%ANbnJ&mdq5nYMP{L4}mHLme(lCMsggTDy^v@T%T;*vs9PW -wY@!=72PCyuWB9$K}k=P(N&RB*4 -;#i6e{L>oJuv8pH|6T1Z*j3y2{RSR4`QeXaLZWrEo7@J>0;+Une6{RIHFe-=ZX5c-{#hr{n7Z9pZ1|o -d*K_?e0i~9dJG`mnkR-mR=47@0Cp@2vMi3;FYFu}cxdy0EjshP -qlaD(1}8_R)0Nh~KGfKo{;msk$2l)^fNbqebg)+wx0b>7SZkJwiVA_^i3A_^iQXeY}d=0b>t5DOs|(i -nId(I?i2(@ISQHCQUJRA7l1!BM$iKh)@Clg(TmB6iy3phvLBvwSvU)DeFirNDV9rQUei6J4H9X -D-wrFa3&OqP@Z6%3WFRPk=h!KhMEZt(+wIcPC)aBa)>@b{fL~P@1TB6xg)D=H+4p8ZUgVV=WXt6e|Du -myV4JLrFNHTw--rmWJ8NFU5UzK7rab}G7^(jo=dq~x0F^FYPX)ID^05|#5<6rs+&@zCQdhMI#Jb?W_3 -SUccoqUH$}80AsAJ~$t$s{LR4p6k=;scy3)&=+x(f$jpnJjA**?FTf9zl(?8hU2q|lBbyva(AAdn6?0 -lA$I7AovpDUftb+HE&!Cx?b8|OGgj-}#rv&qgZoGCkxsvEHd;Z87-Q<}~-X1OT+1UqV0OQ-q{hc=w^` -HEmC2o#JrE%PKw?`pWzEdxJ%;!+z&yr;y?6*R(X{aaSQp+FAUX^VD8k=Q<5=w7nAWzS4^UkXW$E2qg+}e~rXGS&ZmH%u6TXMkbUojk}jYt-Sbt3iorkK~Vv9)y`gzN -aXtF(SH2;?RX!XBGjaL~>H`^oWaRSSLoZk-1Pja+jtebW&XbFG6wI+lJg6YZ8!dumXGYZPkjy>y!HYu -1AGG;AzOHme#`wiX6CNI_g~E?!8VPY&s#xrXJnCu(2y|$N$=eb{FFPS2Fwd(B*!Rs3Dy=Et>5p=D; -0tc)bt=EeEHeJAW0^5zAtc7Rffk6=ZHvd#(i$|r0#O)(K5Cwkz;dO4TnT{~z#tRWN9N6=aWFGUH9NOq -#qZUlG`}SewATc`=-vD18g?1hU&7Q1$d+c<(5O?%-&j)7Lv8SZKH#@V_u%4}`6nb>0lKg@K?**tk6%PgCP%D3bOe!C|rX3Dd6Ia -%%^+sybMU276;9R_~DEL!qxf94dcwHZ$_YrKdJ4$g?18Om^APod^yraHFxi1cl2SQHeq*%ya)OKqaya -uBj4H5@30$xW;^2izVH9Z%Z6|0gtgV0*GT{kXf739YNLLD0=ace(ldNix9>2c{eJm5XwgTlfwK?bfN9 -1>H!<79!`AW*G?BGM)#agN)^Y+JJ!Dc9r)aaEWsJ!9X6k`EL*ezMFsTmfFe#Qwwgl<50s60<(j#Jm6i -~ZuLA096@hKvi-=Y44JidTd6-ievDFVncE|HP+M)?4w(H|b%gn|Vq*+}azumHA{Rps0vdCM*-3PgE?B##8 -@iVc@IEUSzi9wwQ_U!9Y)y?}2dBDq;Z>t_ok~OMJl;I}TPv?oR*y -~KW<=(5x~mK;S%p?!n1(B*X+J!nk)bbNXCVLBbpK8$~=<`dXlMRzp!wgM98QTo>R{^NPSwO(m^(*Gyk -?)|^;9~c+e_u>Nq9bkZ@6aWAK2mmD%m`=#?R+|D00010D001Ze003}la4%nWWo~3|axY_ -OVRB?;bT4dSZf9e8a%pUAX=80~WMynFaCz-qZBN`f7XF@JVO_LpE2XUMka=mfA1D`kQF#+kRsDp*On| -6EGMj|?Zm?{Wv(u&AaY5ZBffphke-nxPQbB_IGxV&UV>{gX5h~Y=P{Cx5 -3VDVs@M-*GU@9*iJT$SyHgW>_5qD7UBB#_AX5(QJLjzGE3sLWE042dTQu?nv@Af{vLmiXW2Z?S$4%rh -fc^J#bq&x=CPqR$<33n*qMSzh-~@;EBvDZ9L{H1?;8a?&-w$5b~Zd%g39iSc*@6;AO@wmqA% -Q<5#%XI@ -!amEf?q)tTK$d;kKmX(S^Eul-`pUj+pPp_Xo -qv4~SwtFlk-u6~aythErwm@@QCi-^a40z3J>B^OBep;6AMBrhCF}S0&yRM`&e-1ZDcfcz+o$LIJD(4> -Pua=m)05+~-A%^M;#h^4g6Rr!8{#Xdyv-2FXp2P_d#Uhl*{C=ez&a(8 -n@)tvNK;N_EiltfUvmbc^>;Qee>_UsquMf~qHhmTf2u10)8B%bD;d{vyRPW8QEce-mtSCwJa2sQ}6oS -7M0T+yYK10u9ZkZX!sCvh!LsT;+_cU62n3a3o$IjumOe*Fl+$z1E?Qh=pbBZO;}sQh8Qx$OarJJ;u=E) -W@SUVMi@y=bv{HNHK-qs&_Ax!47kSzuwsZy>V^t2f+Zt?b67Qk_=x(TX0+IvA)Fe+k}<@`5FbN)3`@q -Cc?|VqI5{5sl5;eHhEQ`1=fDkzT0W@MjNlX>;&OxraRG4waRG4waRG4waWO!HoPeBwoP?Z&oRpQCG1N -$iONdK~0mLMRNDPs5jv)bt1Q-%PbpY7_vH?^FkPC*Dnh0tFhzAhgg7_B1k$j2dOC(<+`4Y*ONWMh!C6 -X_Ze2L^MERmW^gjkYBT*62O3z(o=Fczw@jG~YHN7i69gTsuG3^_xEASyKzsDbZHkSHaORN`FFFf_!9A -tnql0pigh8_;i34^<8PrceX8G4c^kFu;$&F$M=184QOQmERU&3d0c(wng%|k9e`5Rue-_Kw>n6W`a0k -#0d02HVX)f5FgMreup$28jua>0$aRNbH%+kp7$e31)}ysNH2u+j0ow;RAiCRssu#L<1M3}irF5ZAFnO -*pegOP)CYB4K2+wg#_Jb%Q1b)v1{HGH6g3qz6+0C@6*_Uu7FnQZui~e%ras~<;;DydPml#&vI`o%Bpx -MVBcdacBRCWJ5eZhrH>}8#2nL(!Bn@Bq<%M5f_{HRx7ka2Uw&u~F+2Vy2zuZQXo%9J#NWzNie&ab9FD@5P0S0w{FR#+g8V8K?oo-aQsLFQ8#YJ>=hU@DEJyW4Oh+XVH -lL9Y+fkhn<59_w;Z%QAv<+2wCRZq`sA{Xi<5oqHUFxWcb-*hM@fLANRm~NTXfAP4iC2|8kuQ}!5ipfL -kuYnBnEdbXP4(#s#bk^2Ve~NyQ3R1S(F74TQ3a7U(M8yB4Y59P5UmCj%z>y#%OlpRc!L<62#J;k;*_x -A5t@n!)pL;8HhqqV?g!(t0$6Or{;pd-2{b -c-^D`gL0%R*%7=8CJ4DJS7XJ);c4?H<73E#M}Gz{3~X`6&tVbvpJ(QyshCY3^1>ZMAzL%7L&AMply1z -1>$iQD1^&i40IOMnW&ESRbw~${k*8Cn^)`PgMJN2M^B9djS5E$9Ff4eC_f89JzlEh;?T^$Hx(*EmYsi9ZR{`a}Fj!9`QM7eot -`qCpshSZ`tREQB*Xx2t)?jMI$xgXh;)Z^2Xf!E%X)g(wkR}eMCzTXS(zOR`kv -bXvm;={Ky{kCWNFRGTWl!X)NpB9zzs`Gi)2s2%!DTl{MExWBGlg4#)0rnJa{%?nejD4=E7kc1N(`$>^_M-;3WxQnHmcO4y5jn`kBO -`LT>ZijijPb?;#NMnXN2HoW8kT*CmtGtWMMcy|^6b2G`iv~Ljrh>rN(J-=LW6c~QI|{l?;VHJU*-%$M -x9n2*(=K{$4%EKe+lf9pJiGc`u;RWe#H|J0dUrv_j86BrCt6n4-fCYJGWulFX2D*l>@0Mxaj7vF$xfn -*ir$@?bL%M$B`)Ep%6FZe6vt&|QyAgJn;F<|1|9)3bCp_a-NGBVyn{uZcF>s2LU~uyMik%}iJ~+I -=-b;Xtp5N|g<58~+Xq`j~SgvOlzV?gG~(G8f_W{@Uk4#lukY`cEXQ9LBS=8wKu&m_6R=o7~pR#0>t8XOy*JJEe@0(h$-mwL5_R?2CUd`#P=_! -5T0bOOD{0aH)w;d|M@_wF7qS?hfD-!ym#6|W01wfi_j)(Luj7sWT9M3P}^qO9WznH~k8Rrn$i)KaaEA -xuDyhx+l7&m^a-%|dqx~E=MM*pkEgjc@zKhOJ8zY3_nO~2INg|7}i2ajRgH2YD!B@37MeNerj^k}yiz -0mX=yxu=Memfe4@6aWAK2mmD%m`?t?uPJH?0059N001Qb003}la4%nWWo~3|axY_OVRB?;bT4dSZf9q5Wo2t -^Z)9a`E^vA6T5WIJI1>J@UoqHX(H2m%B4x*Riu;gelWwqS5+o^#ehL(uNrWnrPm-JZ4)@>hq2Bl+$#o -hn?gfp&NG3VY%sew3(uQ8V=>DU3hwqP1>E!s}@bvPK-kqEs{7F4?UpO!5>R!-U8s3F*5Ya)h5EN$gA^ -ArbMFBoPJgnky9^^?%^C%Q?PIJuJaca@yILt#x{w}_XC|Qb>l3U6t}3Jo?);tU_tWs(*j0 -8HmeTK3OV5#(Y)H|qkittv<*)^ZJ1_c^^fcuj0Jn*yS9`VQ?!5naf+8C{4>q+i9N^yDCk^EA9!!Od6M ->pk=keF)MobRI@`Y4|{I2o~m)Cv?8f?~}OlA5=x*O&X+Y$=Yoy1ZBx>{s_a~(mGkuJcub3i!dwUK}1e -Ly!b6iA^(sp!rQg%TEz>vBdyLw`jFKezCZm)CnAHT^j^dwg*WG`n<$(^_#~W*I1?0Pw3L0>y<+M}8gf -|~LPrVU3wGa<2r({oe-&wl9^yN!)>a|9gjl}{a%n%Jxs-yhVf30JL?f*wcRDFho-Qbi3)p*bj|Tw4(M -O~e-3VG`;&v6eK)_u3bbR&4*~cr|KmAOf_Af5>Pp>||#au9rQN*uA3Lln8!3DvqG>G#x3>xnO!6|6yE~!Apw&Mkq2Rv -m9BqAcrzFnE$BY@DiG$m2$4|~V2Lc(Pl{ob#CL_i5K)A_rSO*GBzNgC4Us#@zE*UBqT=f!>E}BxjTt5 -d@s|i8xP^UbuiznC8^6R0kM7X(+z+oY#)?7{&}eKMT^&g7p7ikWe{>E=cv1p9N{4f`k({zR^YXc?n;(k{pNHO#FQ% -;41W#<2=V+61;U@w{R<6&Te;<)63X`Qw=!j>R2LYB+c6Gce3X(_fw -UI3j;J3F5obR9PuK_j%Va07yJszICzc?lq%c)p+s0>~Z`GiEF5QE8UF+N~hQS=hjoHM%myuN}Q)?>$1 -)93LRY>c-j-UdX!y_1<&As8<_1&&R~}A`oES314O~I^tSu-v6_{F1GcpVY?B2gYCTYEVm%f$09{dd%G -Jt5`!la{#53Z=8!LubjlO}b=cLX-J5#us2ZLC^D;DY~=sG>Oj=pC^YZwbWOOMi`#ynTm18zsb&aWS?N -Zj=d&)e0CyZTBTjsqRptU`6Q(lysCaJ3rk>xmqgvDfq5H^#Wp!>cw#MS3=gPuJQJg-tb4@uO!YtE1p| -pgt=T^}X60W3FD0d9?tBIv?0IuPYCf{`zz8`JjuJABaMCCMpXytc539P}W}igrL_XorBt0UPukI8qJ! -h*PgE2)T^@Z4qcUX0(GD5sQ9k013cRTyCRv^aBXa3Mbh_%A6|`mr1i`*vycB}9N2qtZ4GO*b8Y|Tm7~ -MvfnNFjM*m-*2kPX#X*KfdILb8+de2BdxHs~KiMsOp2AJ>ahhkP-L!Z)^tFH_5yrQB|de0QV02XxBgL -=LBjZWTh!Zl`w4JUJG7jhaQc77Mz-SZq*t+jJofg`$AVe=x4tp54e$uwa) -fF)GjAOtp)vL*v|e<;>_lNHFPmo&ka31=O -ph;bSshkX3>~yP~G+O%W%J?@g~FCWxdS?v-&z}q6wukfoq>TqF_^Gp96F|bcQ;1XI8&2Bs~57hcFD$@6~Y#O!dfn9yRe+`$)n=~`)Nq4$sL0>BM?HvCVUwQuL0bV=RtEI)e3H5sk|8$ -66wqEUexkr7kp}JCFDc?0-$d?|_m8ao12$-)t6w~tcGMop|^)ksq`KrWq@s2&_dONeJd<&zP^+kx~wT -SQJE9BRa$a9fm%25zy!mX{#M1CCy4*~<|5EC2u|0001RX>c!Jc4cm4Z*nhVXkl_> -WppoWVQyz=Wnyw=cWrNEWo#~RdDU85Pvb}ye)q39n$`$fax<=S5)xXYRiHyRT5bv;)K8H~3b5MP8QW< -(JDUH#-?8Jke9H~?VJTH?SDiZNJJ%{BfA~=UN5_M&XP0z-b~3oU8PM_h)yco9f%b#(fo`7_U4`zG>pL -Eu1QSJWL>Iw-T+egp&Ub&RFv86E*$E>R(?rE;90wtdL3&_h9L{_(Z{0%-GvkWpljEA3f&j_L{p%mIH2o!{2cfR#m(~^-SGmR50)AxHdzn^(X-?G&NH0`;e(2* -bhQ7kj|=m`;GX*sI^mpc{}?JoQScbQLd(xI4`wuWdWH`4iZNO%SW -_CCXgz_41C+RRp!^tMXL{2-mX*&mCj&xjR;Vq{xYA%45-UZuV0Ka|fq~{|s8V4YLS_l#}~1^;|H9R-xm^a{vc}i^1^Z8&>p>&(6NY{76>#Li=0sO2~W@0vGospL&egw;x0G31wIj$F_s(*)jBLMU!^z8gpaPwFp=O*MJN~ZIz -eCP%KQ=%`HKRmeL2Fp*~N3cHif*>^MIEZ2|Fw#0>`whgqzC#R- -QNIKb7e^Q8V5s(2Rq$*_Gy(fs8BeD|j_e;m)8G(;2DOO_8RF)D2K8ibQ%p*$iB>D*&{_pUz)UZYO}Ko -Qvf(+pBLBbCR+B?F9-GM&2MbL%{K>d3f1yW|xkMBH$6do{Wmei;l$7yWDcllBeFn49%h?L84ZVr{{uz -B3!aY;5x_o!LlcBhAfvGaEZaL!F*UJz>%zu3ZcF5?3BOM8|WdYYHLIc^v%^YkE+qn<~|^3_1jf1dDD5 -)3|mHO<_rNu;{k16y36MZ8xH6FVM6h@vsFJEE%j?ERosrGsZz9EJ*G#Eyg>zhqtKJOW1UPrqh8Wi!%< -xAZsx@T)V6!E7ird4L03IG>4WUBw_$cNC1}>-$PQ1*tROQvGz|fmf)^)?pf -$&$#H4LuA>i8Fc^-^ywiIY=7_tr3ARGu-UktR^xjYFX8xm|t!eRn5vcVLcI#3Hjq|HKs8gz!Vc@cVxi -69vUlwc;|Rtet-z?AThSQ4BHD-+ZsVkAJo1}7fJGl3Rr8^mD? -LlG=ZY#_nRpaRD$j7Wse(Lx-XBFP%Tw(50~XfQr-RlaT4;7~MspQW(u)2pl?W-r0Rcvbo3QSv~{k!pPa6BB`kIws-Uq=^LUk2 -w%`Lj&BrpemTbR7DlBSO&O0o!C2>4Qk7`I?f*q=`k7%d54RV@ji5()uPB%@7MnIcICx#1g1JQheGOfn -7vkC)()<#0Chg-4LW~_+A -P@2cfu#*JNqYB4WLsD|0^JKzlTwXDxhaCCdXUZu%^z=wgT_dd8=w$oX8ei`^hjvV#vJX2UXZ0|%nO`h -Eo+`goRdqGYhq%FK&)(5;nynsCIzKz+j31@*LKPUy)AMfuSnapwQ(S{YM^@~+jc~KHm-_;qIK3F5DTx -DqaahaAsfpGsxsFisLu(x#FL`4&HtSjiXPXkpV#BODz2=F8|K0){e@TSDJ;SAM1hQBYSIH}$pz>B52UZ~tYz;+z6sT0B>d -Bxf_SVEfIR~*V3uYJYWzwCW8dGXA{LYK1M8c7`F -5x1)8i1ZgwQMJLg%~&O|+KMk_nip1Qz#0U0qr7HxX+8=)4t7RRUy(Ak^lYdXv6UCf<5l+jd~3pS|kNxI2&qgE|q)ahCmkNLk!iXJg^ZadjPm`#zd%gi${Kaiysd3z*Ur87 -t!iefd&D$;u)$d8y+SFT>V+#BC~T3;ov=~PfK;@g^0uKVSkx-7dk7mB8_%yQzCH(g76S{^j@S1)Pmhd -(_AswwpzHds%zDk3VUH2uVs*MTgo_5U|6wzloVX9F)3rL8(_z88YB4WwBNCSm5eQbACz!4T9?Kv%}6*m0sSN%4wcI8F_`@B>T6p!Ny+LeN$^dP!1`*tmGN0*`TiW -HNPEffj}0P<_Pk7P(bj`HYjGJzR9kLgI$li4Ut&fDXUveZmsvXK@~x^wdA(RMk{gfZeA$HK~Z{*7jlS -oX`8dHN7|5$o2&HxJ5&9>kk{=>F1$N}{|^ST$UrOyi>F}AET>L!WO2}ZvkKLkxLtN^m@)} -jBBFNe5hvAxvq@PsvtZdqwH`<-wq{7w=>ITavruuVYddHtn+`B%1pY=^Wgz7c@lHyPL+aTKGZ_q|@Fb -cwn3P&%_bnl27zvkkPLH4HnMc;(KeE@kJy1%fZ^5H{58PBKg*zrcwAaePmiBZU(q=DQz=ymynjD+fkQ -qz(0pZHtNk*DHVg&;X~yhxcD!brs<-+57(`0Z8uMD4ePBKuAavwNwEd#3S^@n29&0|XQR000O8B@~!W -!@*U6)d~OrFfjlCDF6TfaA|NaUv_0~WN&gWV`yP=WMybDEbsAHj@Zfk-U=J)VtXKzK515k`nDWw_fZnur*Xm;&6E8%$X -4#=+!I#Kl*U=@#Kt7PY#dHu8!!#>G|PbX^rix;1yjzNIK8s`#6mfI?QI0;(|VBe~*(S!u8|hB8{g}nd -LN1VwsjSh0R`|r=Fy78Dr+}^1Dp3xy&iMqtfFO_GhvzrqNtlZsRO1aGB4ue02fGbdlxN{b??vQqJghx -$@XuD$13w`4US#l=SBCE%C`@3>RMWJvvAdx>U9WUCKh{-{q`|AS|iO=wewuWN95gs7m77Jj$1fwYywODzdxs3BcadGF#9zN-3AKxTxHNh?1go_FI-?{$nC9Y~*_8o|gg>>5SrZ<@N#G;{*;7=o4f`w~`ixyjvtacz -`W^J-PmL{^gnu&c4ytgUicS58I3q-rM`^hPa5(sUbb0s*GY&qSoSs~NQ|OORu -FsCHuITvuk`CzN;PU$9@XP7JC0%^Eyg0u)+9SG>Qd6wR^pV_9dTL54(qlf6b -M4G2EhN37!iOiQT%3+eF_p5j@#Sr?Q;yX&SvPVyO4DCRDo$SJk$!`y$pYHW&z+n`ne;BQv+3#C6l~(~Ai@{*ODyuA^=|hx9Q;4Uigs>~jc%0nL>km@+Pm%m-ga*?O2+u=SH%g0;zeKTLA({d425?#4&T;9qRso?A>%V(>JVx -Jf)d7|(gYDlQ_`8?f|*B|u)>f`1JH~Y#!9U~ay -=wsp#hC_U-=+|JW5D-@6FcfgcF`3{{;G5&V01^TMfpb!0%0|tBa~cDIz{OA*D?`Pz3JDH4CJk{tRL<2 -T?nl4}lO7*392|$h5#s3M7~mM<7~vS>fZYgo2$zpwH-g=$4+kR{j$k-~;RuE!7>;2$hT#~7V;GL%a16 -UK?8dMg!)^?_34?D03&k|T5Fl0vOcI!+GSgS*m?+ekA{VwH76~~VKr{mR7fKuh7 -$|{&JOa4_!V%DgP+|hnG*pw7Eyf@`0Z|1sR%yayFe>^A0Sw1#5a|Tl0;?0?(^y@Dm$6bIY(PAL*g!zK -0%{bHCAtR&V5l6a5THf@ISVE0P=$&~LS6HwN`kjR@D!&UHvjJ?|IuzD{-?XipX?&Ki3IH~qDoP95>+) -j=qAH0x`}E6yXhuj)lF0#|J%BWY82gW(yzP8pzbCLji|dxXmu0SD6l$+th$NnEF)hx>A$#}V6%%KQ;F -WH;CD_|Vn12Pzb#}smBl_p#(u^9yEw;wYQTj(HtFw;!r|DAb0+$h!C+4eMW}{ziBWs1`p5Rh<4Io)r} -7?~By4$Y3%17?oBSFyt?o2R?<=^f%duX#@xz}P4}3R;=Z>h|@zr_tQRjgf^iAg0wQ-@o+3E}uV7)*85 -ja)|_!uer?a2val6`uvS^MCb#(4=e*`%jS}0dJcGcE*j7Jx>O^PaMYXUA%bHq -fcL&}Y)7Px7mls##MkV?+;j52ls&SJN#U=#yYIZjeP6onScA>4r?GZeqL?4E(N~&rUKi>~51SZOMzN@ -%-&-5Z)3mXt@(x0a%@*eL**{uarkIbqC_H)mLEfDB@n;uk!!J9yLfuLK7qRC2Cb#?~A`mw&tEcoIV&N -IO1(yj%kD{o$96S}~xZQ{1OvQ{FuaA^d)t%XW;+*;q93u|1|->g2{#dE=|V^(F>lS%jA&|0^0wKfYce -lm4yK{U+pMuoiYMBKu#%Uzn$fnmC;1(Sc#bCsyBc9jKJ@nNs6344EL_rzW3pt@nQps#fIVND&fx(~P; -qTTdF-wwrS-dx$y?_{^$WI;cP+N{x5!k$M%7UjBTn@VJ%*9Y=K?_Ik1nnKU*^Rl>87x2Fm4y> -^n*);tv%0B?It$&NXyWv9U`s17eoYnFPh#dwHA!tku-P|NAe{BwmeS!MbU4s}yOZ4A$%d}%dwdu?9Ua -)ak9IAD-YmF}x4>5e>pQd^SW^oIYP*rK&YE3rws<pIfLYGj^Og@Zu%LSbEbbii8wx7(WM*{Gw}ePOIo&`yo}cVl< -Gu2uqHtjsy<%6csVdj;R0MSb^zHhdd_?RqVOZd6?@ZWNOHr15jG5y85j63jWXv*F&~)n71t?Spx*HfE -u%1H(yM-j;*6LH%ZD^L~PUH{l-v(QEaF>P?y5Wa`bVo5yJWdY?AG3EETB=IW*2nR*2RbILsafoa_rAX -cX3avo2kV58;M3$w@VRD@>WKY8^WOw@dQgQqI)&=y20_f7yL5_zP8>(dp7*dude-9gb#?b?5TLCa6U)CzW`860|XQR000O8B@~!W -A`j9(@(KU|8Y}<+Bme*aaA|NaUv_0~WN&gWV`yP=WMy#li>`sCfgAee`_)hoV?Z$7LBE!3P{r| -+L4`iIys_MP`m+&*b>na7WD8YSW=n`sdj;yn9ToFoyR=ksM6Popx+#Waa^T8 -b&g3_LUSG>yv`Gk??HbdoJ}F0uzv_Q=He3tbk|XrY>q6(>^sKhzC`-#czF)%3onrR@Ekc|}`Jdt{P9F1kE;3_~Fe3P22_Ol}O-?+{_&GQeZ8ei8!sqK7o7OKp+hLj<6EF -w{AUv9#NI~8QlB~om(*+ -qQ^bf=h1q_8*sehD}gdrrr)p7Kwf4$b_GEb}K@IVx+`90+BESBlCTt;<>R-#*x_qrk#oPE#oSv64|hy -W{j;x)PJAxo0%dyG-JE|y7IIT})8L>RIUdi9h7`618d@M;pzV|pwi#Gw{D@_ctdqK=GpNEwR-iMx&N6 -Mf*_p5Ba9K;5_5WsVh&e(`s)Nn#|43H_frNsJ;f%HQtXEGDec$bIF@V1#pw -Gr%*o4RP+_S^8o^_vqiJ{(YPiA90LRR$_*MC->33kLF3>3tYtnQzgVoh?+>8xS!Dda3h+%8jTnYeKA% -zFEMu8_LBMiYKG>b9NkTC(B@WOmni9{Tpiz9)ugAd4vehPVQvs0LvIkvqgdfp#KOks|bsN -FbQQ5`X~Gghok7&@n;>*-it&i5Sv}K1pbZZW;%{BV0!z1b_&HJsQzT<|xvJbBH!@AVShc+<+6bsUdiP -PzAJVNC+s(K$IBL61Qzo8p`62vRIJYn8;wERXzZ4a_OR8x5 -rJX|q=UxQ&9ADt^Xw$q4v`f}vLRKr_p+luupESb7m4c8sTvbyE4C7#m`2%h&Y71?XZP^9KG(vqb*I(O -{ZeD_EU2(WVZ3i6ljGK-*Je~sHSONQqk)56yV52}y}@%q -@cIVx;5+2@WI6w}QoyXkd3E1P@Im20BG0+mecdPWLtKImpe*^uk{-K=>E3((~E-o)*nhgJZE%I#4y<@f`P -qousvNmO*Zp=FQfM*7qWVvvAZTAHeAchCK3hi#8p26TmqD}EUN7+aSI#{Ym3>hdlE3e1mIxEiJsC>IO -TeFN~-L{aMAbp$6`L6t&9D2L(rgaT47OXhT{JK2Z%9_eSFptFGe(yGXiT*eVW -eCNhMYD6A>vrH5mJ%{6_zzs!TjtIoi;<*toEj;^~qtNu!rbMX9{lmgk&_MME!rfkL6qiigCW@*@F*Dsr6q@LqhdwE8(??-mO -Sl{xheZkdcmXF=9`rcgD;=qk|UMq86l+$mF*m5n%cEW}@;B}%&t@bt44(~4dz}AVI--=$01Ea-eCc6u -|3EybvNzUunD%*)$Auub!_||H%FMu}b^B8H~T>G?JPM+t%vvTdbvDMAXaBCD#yx#K~w)O&l0k*}SEqd -J|oWGuS-dL>Gm!qQD+N@T$*fu^_Y@&@yJAx(Ew;e2ycqOzwojsBGN(5$WRXz5ZiiDRs%IDj=?9T`5e% -SQB(EbHO`L5=m!@iBf?#po#iK^Af-_pAov6lnOdl#}|PxUYNPzQl=B$wTdjs93^-&|{*-Kxw+y~}}Vl -l7Y`m;TzA^kh%$t>@mZ<@T8^rnl8fp8Y$XmCCaL7yV3$6F388CmOnD@D|V3KC;!uYXxh!Wj?T*M}a8uEzxB%0^E7ez-u%1% -+O5lGlSucY^UMv44B(BGVBjAmZ$O{|Aer3lifzLy&tqt)b? -bgpXR{*?~!$|E}{*uJpUsEZxry_3AWhyectasV{h8i`Tx_>F -W`&>op%`(WeRKvxI+pLcFI>)b7gcE~D?X?&i_r{ekHFe#@u93;Nb?MxQ%iWSPf5XfXfSp&C`L7V$Jn? -iN`Q(>D@#)hDhP8Vn|iKEJ3&{i*fhPN$Fb1?OF&%TnhUauOwl_6@K?mv?D2*XZ~KpgsWAFI8s(h0ExX -I^Gk2_rCWZ@4rw>0|XQR000O8B@~!WwKBtG$O-@eUMm0qCjbBdaA|NaUv_0~WN&gWV`yP=WMy(|8Z)9a`E^v9>TFq|TND{vDDGHNAk_GKyH!WFmum{IuXN+-d!*(#p$)KgSO@t-|l1idk>}% -|M?0s*u54K-ZY<4w&6vdg-hM+|@tE;QN`l`C9=mqWkZHH#rJWd}DXj$IxO!SENV&EUWJ$`q3PG_e_$L -H6_^!DuH=rO!mT5eT$}Fc@605Y-rl?)dOg&BGGRDkb) -Mu4s3zbuLPi2oz$e*jSm_-Z4)W%s_;5J`md36KDbeZMr@ma2-QqAdZRcY)l73EsjVuht1OL}$mn#6QE -fr?)7T{=t>y3(=*U8zFlpVfTr$x)V;d3?8oo3D!32N)rGALXCuGEN@y_=$E17M4_Ibh#=Yv$T@<^Iv~ -F{P~}p-bTfz|Nc9L(9JUc6c>+l7Nrl%=s^LPHy^e2C#N^($Jf_%a&bk6ba{Anb9(gQ?C^>%KU`g2Tp#ZeT`OfE)?oI5+(3K}l}{O -voU1a5lVa`qM})V4fyta6qt6Oqo~ao0qX_x5SbbLvlPrCx{KXUt=o^afDa}fszT`2u1FCkS3oSOjJ~C -vs>(fX;C`vyi2*EX`pTzf2eUfBZ?$g_>D7EPOL(C1N5W$WJ13~oR`f#uWy`basU$(43FFYugqtU@S2e -X7`k5L}YK%Qbvgk`ael4M2mOcmNeQeVLvO&CqHQhhBe4SUdlP{+u+pRZK8%+qQ(JfLFrbO*h!7Rz*2E -~7O?E7gt4J5_-S%)Vs#yqYKvC_qL}wS7m%Bou|k0)?1vqPs*LcxTX-j&AF;*J3x>MUM1@9Q~bMdGO5t -k@NpW0m;y(aNnmroZ%GrI7brKV~pYX2+zlXPeR}8=eXX}*V6ZBZ-R#y+}pzh2!}$`7N2??O2!!5gM!g -`g9U^MQlFS4Fo|#qTuWFa^>ZkYSU_N9!o9#f>3b+32~)L&?4-nC1(vg^tv|@4fcCx>)EIq3RB*IuZKP5357epZ0(=_2~La$$AZAIz*r@Fo=Klu>9yB%4^fW?bx -dUScWuF1nYZ>y_#D}`-+aY@Va6Z8z3^wi$LB2`36R2GX%$t`&K82xUI5Op3J3vB374}yji+u`71(20V{d2WGO&7`tyvZPWF^kVR>iqOH -pGSOgQ>w#$MfvJ$Paa*j@d3zSPk@)7mU}}-w7pw(MRqoG(O%}P&JUM8Ap_r-4CMK4nVzULpVVpU7_C{ -WhIi%KG0~s%-=DJ~`U@N$kG07yD48uUMy~fQ(YqY7#qWLsYsIu{UBG5e=3{2!r{)>8L(YVA(#ByQNPS -|IS@LldY7KqMg(BvL(gd~IWuiBZ+T0H7ugEc3XvB8kcGcegax4n^Qg!@=2xCOih@rq!}jg1X&y#_1Nw -~yYcY%8L<=iE2>V0$FNdC=$Irqvq@M3aebJ&?`%(&yFE9A=mF3`y(*i@Po0CQhomkYf;l5}F -hEpVrqe#MMAyYqAK@LYf0Udb{*`nKq}IpGD3h%Mlvfy(AWw>M#LZT4Nkpe>u7C}iUH(<<_QEE59r-Wd -3HTjjg6snfQ_w>7e^NVX3!B}6u=B%8>ayB;RmE?H7*5g? -`VzBML!-xb2GgTag9X*kXIvdUxjDJ(CAv!*-*ecg5Co6C?Y#;(6c^A&R1}7ec=s1=&)-$<*QjXQCTaw^j@=vHdlS%|_X=z>> -VNfUnklwXvHEZ|-_A;1M?ak8sLOy8t&#?9$cE{2>-L7KChV?y>C?-6+@%ml28k+s;H@7Y8h`K-sBbuL -Xv1or>hLkvG&lN8Ai;Ss+`CkR5KezdvBf)P}JA9=S0J{JR3Kh<|UlF&Fyx0?S1XUeHnG12YA%Tj(}iXhosj;J9A9 -bY33~5BNHwg@Mb69wu7E-H_R6^fR$`!F_jq_TFf_Kkn<$bXHW|w;{eWxg)_42GUvAU3Iuevd_G>p>0o -x*LEy$1Ibs}te!D(+oNrX*KVM?#d9dI-(`VYE%>-+ymdEG_l+g+-3^$Je>Vngn>^|BUD<`Jy`62Ka{s -Qg&Ec78T^_bg?pOV63>pPC7rG?wW55qHQM9gp+=ahHK|j9R{YT=DTkzVef6G+=I>G!h;U6B+OZ|(i+c -LY&^e>xkpQ6Rf1KRY0o!dAIND?N -qtgkajVh?{oBRcM3tq=wZeRKuaa&KZ~axQRrl~`? -W+DH)o?q4w~Ur0+Rh9o4-opj*f79GJHhE`EjS&ms?731aBOCs*q-;CdR4Itszv-8X|Z)aSd!0p;QC;Q2?HL&qxg^ez6;}kzcCr&iZ^#<$P`SNVxAHbJXEb}sf -BL96-TuP_Qrg%WD>*_)E?8Q-)AcH+$BTNVzCOi=PE9O5Fh1I$mjtL!$8Pb?n&k`oW`l8Q5Q>rt61RJ5??HRj)pNR=>}?zj-!Fc&d~UQh*rDX>yDntd$T+0cWfI>YX~hEw -1%UuG48d7Fc=R9mffjhaT!ZfOv&7r4*C@nO`6L7IZmg}=> -=!;+$#fy+Uq4&V25C~O)cgeALuswIGi&pabR&ZB%)e2nesN@E(K9;~nxXGtz+Vq8x6=;i4k?La$v9-F -c*Dm!&O$Qj;C^__jPXFP=mrqI4rV=+zHF>uzrFg;Uv3j(}3>4Z-4I*Kp$buC%eWE}sJeb)EyG_%~Vdo -#mXpNly_!0huD@_|en0QkIC`H?5$^$mhtkDk?>Le6Vhqr741$7d*p~pGy#3fgle4i;5t=qWX$k)S#>* -uS+Pa=y}J*<(+;BVrc`M7T3`t_dml%4Q5h4t8cg0>0W+*ysWMh|^U!o4LOCCISnyVyjbruDGYf$mTqN -5UW}DwZ{TVF6~La>|9Q)@t}xt2NKZ-4f0`8>bVWemgd^&sQhD`uThf;%l7G*C4(|fe$

-qI{}j8i0{fg8+T27*L(Sn#&=D8*BkNKA6*D{Lwq+W--nPKM|?Nt*|;Y0HTUuzjju_3%|d+ -meyXIAT8DAB#CN;hFZg09-bJ?Zy9h^ow=rK%^>Lrw5#QYoU*=+T7xU3wL>l3U@9zBl&?3Ip`TLQ@G>OkNwF`}oGw==Ygvn;Ek54*2;c0b^=LDa>GJlP-I?4he7 -m-3ERY;cOpVsI%^$`#Ge)PjyqFq6L(#wus2$X8dFS$g1L@w7V$G?%4OtW$1TOzI#HPNHJntJjrYT5@i ->xI81itbc)!`jf)x7hUp`_H4AML#Vnr4}7`ATCIJRxEFv9C3;xgLwV}$Kf~&I!-xc{xp%(CtTrFST35 -VK%`R55Er>JE>s;PRSq3n9WOap^+mw8lyJ=Z*YWVsP1Ddm4T;02Lfe^#v0&T11B_|)4-!7te#2)d9*i -^njTBW2w6QOL;ZYoOqSl#b$r0TN+y&cqP%^cW0etG(*5&Q(_1&fZ>5v)U4Q4BMcF@G9JQq{OCXreNr& -YxqoEHm#RD@whu}`^=K|3@WIV_mbnCrx6^st=4Gc*lq9?hNUQf`<&8)@D>Mn8MMH`FQZnPUD@crNd++ --Jy6?iU+&4t>599NJ{Yu`edaIp^Dst(ZQf`3T)Bj!V_PHF6$1JBSy_+*fVaMzOJ;>ESng!6|Bw=5Cwj -588IQBS;v}ZzQI&&#=in5ls1n1>R1dV8A(u!rl|rW+D=*TD7L<{PCoOt+QH`cO$$g(#5KOL>_*N4KxXLP99*zT2FLHi$2O9KQH0000803{TdPBwKIP2B_l09 -6eD044wc0B~t=FJE?LZe(wAFJow7a%5$6FKuFDXkl`5Wpr?IZ(?O~E^v9RR_|}(MiBkZUopCa)?=|SU-R=OQ(!5 -38I3~y1CggC!`jx{Slb(`Bi$w~4^`!9`Cqz%a{zg*~FSS_HCqjmXjH2n*tdz_wW~(iJ{aD$1mGjLM$_ -%Djsc55wG)<%v98`nOu~=wdZ>{8!W~M|%<~!)z&{m}s_>we-BH1Mc`3(6o{7q^2uT?0btvyO*2oWq-! -+M<@lz$k{X~YTm(F04?$Z47`ViCZ3Bm$NRlb_JWo+Yb7-+@hJwoilx3h-G?Ziof$ZEV{UIHBuS=MZg= -*n|L7_l?aTJ+QHk4J5s#7&X)f&uR$@rXdNL!LCp-d;lPben(Hzf+mLC#Cj780E3nGrP(5J06g`b-XlD^cf--peYV*ThVHmOo6%t6P?x4%#~t?Oqpm~Kxig -*2`YlwP`5>_svr6P#;s}sy1tl>#zKD|@^=FhfL4t8eEB}>I=72G3A^B*V&Gub2jFntweBn|EdP5>2sn -BxYwLtHnXG_%uN>SfkZ#LW(1Tbh-K0B}7;E~}g>U=1(`kR|{NC;m&1X2d^iY3%| -C1Z(s#c3MCaJYwI2)}NV2|qA!Rz60#%7uw?hRR{X!^Z@y%BObGw3#C=?5zzIeV+sYC-HL*llTS#NF2L -30VE)4YQBAr4JuIWPht&a+B;s$Psy-z_#(cdctwkM9a&i7l{~+e>+x^_o((sQf#7nHExrvd!v=39pfB -*ZWL&+Z{^d2T6#WK(Dny}yCoa>)Dnvc8hOdO^45b&#x)i~AaAh?|uusd^0m(SSO&I@6aWAK2mmD%m`<(J5vXzl007(v001Tc003}la4%nWW -o~3|axY_OVRB?;bT4gUV{>P6Z*_2Ra&KZ~axQRrl~rAj+Bg(_=T}^5UO=K0=vHcX)CWj`(lQVwpwVcx -LMCy*9b-qfGo$p^?=c?(0V;JPAtm>odwlOXwz<2z{ZM}}8c%654hGYBK>f)q_(8wH-qr4CzTq@8Vl5P -t6zG(bu=JpR2`L#Zlz8FBB9m;GvD{J09Z#G#lmObQ9T~<-I04vK{=%isxgnjAyFm^7lslWSoFlZ|7D^ -<{39T$XO|H%E1H=?+vyUf+Gsja}l{?1krI_(td5NVqj_N^!y6tuc6gS~5>PbnF$6AWG<>rN_`$+<=oD -r)6^VMzRZ$yY5n0cm9$h8q$dPnHck<%2GZll!>5pPQTnAAS6-{##Zv;%}j>nztoxhC34j;cXtDOQG=( -o3Eh&dKV`y<(huDs@2#Q)GB5?7k_;=ZLBFy*8-d>QrQ<4;3nf2!2+_&DI{3A59lD;TH4Jh%0W;Q&_B| -NKiZx30IaAvy}Uo-JJ9t`bOeIBQ(^Y-+6LRTp;h)_Im;m>b5$^)eekJ2tak_eE--3xi4&>>5?QoG{?% -@5}YPYNvIv|29Dtcgc$S{dy-b13d^%XHo*WaJ&xz!W{WxXrcd_zi&u$c5B3Kvm0iw7+@&iPSdFXkyc2rrVK7b^}H!S}ENTCchvI^8O2)c3JVu4i+_^&_f -)lKk^upD#uX5vqVzV*Rm-=_7Kvn0viiZ2ouv)oO`k7I%9;h|jdEU(1P`54RRJY(~qa!2P*g)-9J=6Ng -x>mzj__%3r2h@dMI7w!qz5zaVdtuWPj4XwC`F-Ww+x;9L74EPbJW-V**f*;#KiE18pvmzgu~E>q`*-6 -%WSbeTFc=Q4Hj{{v7<0|XQR000O8B@~!WY4+g{j33(07+>%wKAk=!sne6z`54=oPMpj0gOj8F*{IJB2j@rMm}1{*rOL)PoSg^ -Gwc}YXJMyQTIU&3C|LeG}RriByWuv#ux{28PqYupJ^-Rcu+`Y~YT$c^Sz9Ad(kO%jCDr -<7&dr{y_=8+$~4?p|?DU6+3!C&mcajygCmT3%17_rD_7mMh|_mcWU)40wgu!4nXrCGo^3;kL200sNV7 -XF;smd64C<%qOm619{-s -+zUCgLUt$8!kbk~9gBjDl7g^fAF_{I_aoyD;NsZ#JP09$HR?usv?RwG^8@zYibVP0Y~Bgt2PpJ{xo|d -ulvyX6U{%v8bG$g)8)$p@12Tk)K0r5O6VB!#pUvGGF)Tn93SS_PIDEui3#!D)YZ^d~S54o?Or;~%2*$0y^n{%FLG&xh=QT^tO@Cr6iqgCV=P9A2D{`g -O)eoTp7J8k1_|WfRXJ%Ud5>a>^siaYI@4A8>j@D4;uKH`YCe(`<7GdK9zZ61iJ!bq-zMyN>G%lvRU%W -X_CvepF)*fdhR9dSBt}LN2TGTZ2w-*K4e8z)qI;mkXz01oUHP23a4wz8}=sp&v$K*V6;w>J7utHKVB; -j9rc(MfJn_XP-+BBGpP|7WlWU&b>MGWjJf%(mA#48^`0L2s%*(j(m9XrCq6r|F4b)Bld~CufRpej9T` -?7!*>6>rd|rxN5ns|G@O0kOn>9<=4=j_m(^71-1^Km~9I7OqshOayPmN*R#0b8)|+-@EctKzbW -`lHNPqNP04T6vLAuB1i#f)oR`c6}-&XTGg5Oc|JA&U)^SgrIrTDV`UBT~4eyf)K2;3BWv# -Z7h-&FH^g5Oi~dxGCf`OVBn;FjQ9lHa6o!MA2gd?NT0HGd-b6E)u!d|S=81>aWlr-DCK^QVG8Rr9&vb -2Xm}K3DT+fKsDa;(5ZO1(cEo)2r8q|q2gekzH{V{PJZlT_7pP4AW}7Ljx^9$lUG -pEoTnr>P}_;m*zXyh&9dNZsZ625lc+4f*N!b(j*B5oFYgqN(tS}hpqlJTY5#6j)?e((76kj0lj`?ST7DG#@C&|fc4ExBn^ -*~p^Tpp-@St`f9IN%?xksl|G|glIlfTE2!ddDl}{PF#0BDci`o80nw48ZVM0^k<(vQu%7MU%VR6(y2P -D!Cqwug&Rc9P=0N!G(v3YkF>8Bl?rUXUSuLEl&M -N0DFr;WL^xJL@o}sqWoB>`E1~!}Rzl(^Rzl%8Rzl(^R-!hQYCevYP&kg2kT{B!P&kg2kT{B!P&kg2kT -{B!P?i_RN-$<5_u@EKLh*5|gv3#-q)k{o94n!$AdZz#IF6N&IEs}}IF6N&xVgsc=3*rzj$$QxE&IvGN -=O{VN+=x1O0sA>7b}tD0ScDLpJv8fHc5~9Nbi6mA{3vf_ykjV5gJn{KEcBZ^KH0NnDO_xa^vrrTTrTlVu8tYPeNcQJ{FjinZc33P<$*fB#s1z!m+@R_ -;35TzVRr5={$?TGz+)LSYWb`c#ML;Py&hthQyJ;h_q(>?>Bi|Ul14=5VjDQO`1b&T2KEl{)O&SRZrqy -ZZ1H%J4JK{`jP?S?QW8@H>2c3vuC?|R@OSX87hvRU4+(Ko=|NUvv~x7dOtUOM9)6k!E1Ck?EE -(GVwrC(#RC*vBt>!)cD-iq6cYZz8p51Mx#=Z+p-fA{}DIK)L4$aOfyz0_096{XVFNE~??3ddfC#F3YwaO`DB9C;ZE$6h9j7Q9R{B0R*z+T*odtO> -%{AJU^ls3hBd^Zl9pJTbU2Tfu{fbvm%%)4^Dq=kUm{;DeX#@Q*6|=);6@KTS+){A_$+ihTddWP+(%UJT7k}Dh>1o6Z_Yf{zg5wcKO>tgP+>&tqc?OV4{rWV+Gf@9C8&|=A9o|DVm$QKS`0^Z*=3#qN} -ebqe^82|Nm0vkHX*9ov6%T@kz1q_PpJBOhQhM;&@kW1Tm5Qy=}53Zei?$wp8_B+ksC?7ssg -%@`VpT*(J57=@hgU~Oz+T}H-c)Y^Hp|a*=x!y&}&ieH(@;Q?18)`XD1+1WcnTDZW21!SiUFp4XoPKwPqJ}{x!20b@>OnP}HtqC9b7z(#eU8d4I6HJWJlBlQmj@lYTiq){M?!A6bP#V -ig8&R^iPmyjg`etFW{RgMM+*Lw2n0X1=|-gRC&ObDKvz7sy+M5?OCR)UF|WQq9b!#Bo)wp>#8BdI*zj -3U1<2ZL*7-7_4;@jf|TZY;+R?m76HzB?u=mP&f(NM-=L^?&TWNMGR6G0pCoh<@nev|N5!i%crd0?)6g -?{yQz0NCU;0FhBAa)RN4neEk%)wSXgkLE+e6ka*5tyyhH`^vx$GdIJjf7b~QwUSiRQTM8d^h}LCd= -ZIi^2S~kb?KdUv0m9t$rCB9(_Z(rrl~a_dBr}ag<87S+Vd7_nObY>e$%BlB@fxwwf3I3O54=hPe0P{) -LI=~>+E@Jbxf_Zbsy@{o05m@>RNZtTcvAi-4}5S+qImjYv!J}oM~$2w*5&Oz2c_iA$z*k+w)fGnOg6~ -`cwIqvvkec^Omzr&3bfy+WqhoU7PHA3r$RIvUA^hk@urjZC$hXx)oW~HZ^;7^Q)Sxq@!Q?rWN@czv`9 -6Z&wvJpq=GS^qMGR5}_**V>HSH8Rb2Dxe#NqikkwA=DWWu{|8V@0|XQR000O8B@~!W9(C^?p9cT{85R -HlCIA2caA|NaUv_0~WN&gWV`yP=WMy$RT#i -UYRF0EFiIy@)jF5 -dYBZWKQ7T@iw&&4E$x0eA$%0qr#*uV{9|n9LA-}|-A@`O6U(PDkR%?KZpSOYvJ<6PAx^gi+EL7Aq -&gch2-E57(}33lpoC*MUpKd&wvHU(jVQ)!(ck0cK?a~ -Xpcti{^aQ!WRVK&BEhjGzTS8oh7na@`{53b!@#3C>O4TBebeoACr`@zyY8fKj>mL27*U&s?a`#$nfBT -v8cs*U!Pu-Lxs0U{D=^DI-b1{A$+ZBIXcC)yG7kL->6LKMb7^J2GNjpI=qi_NRLExcQ#tg6ztr(UZN!RrGQ@nU%nf<}^{=piVJ!|qX -GRF^t-Yo>0jn*e3@Is^Bx}smQ>i=wMT~tJ~Z=VxuTvfE3%NAr=95iQ -HHOah%p$LO{1}aVUAak$pY)|#8Z?BmZqkP>LK1%{r9~preYbRhaNSVE??@zfr=wYL7>GR-}{&&BJt{+ -WJRhwHzK10Q$FcY6tvw{gWHV@MNkBy-AUZTyB{WK69k^Y%EWuU1C{bEOda*r#9NlHmIqzW1sIb4y^k= -+a+FrE2!B!`*_EfKg{Od)r)FWC>vL3g1TWw}HsLfcbvXZKYjl<(up_;GqWz%3RcEBktg7j)KsGRLW@1 -HAgwICxN%f+0$}OwWy(>W@N~)|V`_(CL;FH#TRoP;ogt8|T1m9EGC&mhnZiuyM| -ZFOsaUO|YY>nknZ6$RnY)ISSXp?2z{pmtQ{e7sfUgL#1Qhu{;(c=ha!>fz%RGs#O=IUdb}C*tWJAk4Mw--D6wwD^N>xiwihu)QLU?n -q5Ld!zc4h^W3vh(tVbY(9SnTb2yONJNu5D|G8**C%pv@>{i3IJ#}jIHOJ=YAGeDJ-AJ+9FN%%01QGNk -%!FXi`RjezfW^Xm0suF_}nlque|2h4( ->t+@eKYsv9*ISU%jx<$_s*!_niI1#>Gtox9@l@N=zdFZEPp%{iwu3f;2NXUQ#BeLRx@K!=Gcr@a^RU4 -$C-BV#Bzzd+-37IV3efKM(%hVA{X6x|4z)X2~2 -92~nJRRQ*>-%$X;)c;qZGH~^698*!-06`rz=zEg2)u2urq@jF>H@(8^Z)xB45)%Z`C{B%D0gNgNM9=f -eK3hjrwqf$N^K7;s;+blF;zMmRLlb7PGTC?6rDJ#z!C2x(iHD;Iep%`r8#1DDG2zMLqU=Q~ySBbaue_ -vK-mj$o(B$~P9J`}FeV+IN6H!xhiQLN1vpD$mIkq#>V22e`_1QY-O00;mj6qrtm{!gHV1ONcq4FCWp0 -001RX>c!Jc4cm4Z*nhVXkl_>WppodVqa&L8TaB^>AWpXZXd8JovZ{j!*{?4x$sb4^%IbcPvx7B_C -3N2dRL_k%wS|O7-VAa^jcHnZq{>Dit1OkOSOO?pXJdfwqcJJ=;7c|>1-2wEvt@gleL$fz*{e&~NcZEB -cEGY~XTQEU5w4_ggY3R#;80Q40f^DeMsPUFWX==cyhI&RS@X*vL>=?R&8HQ%hbVIpZQw1^rlS7U618T -HK))YmnRVbK843k3Rr&>!De;_f8q)OzTqQp=i=26Uex)o8DYaQWMO9RDL32K!}6)AGf9cXY4V{5BnOf -^*->L-!3q%exjLyWJeOW#of&?o8xMvN~MTfse`hX#ypzxzZGk0pIs%U6Qahx -Rn}U6$J}?o}F0nZH0|_zEEw&%bDTJB^Aul5X+QM6R@;aPOpfPxdx5jwf7);)u&=yO9S}btF#8zw0kQk -#8Yewl7D|Te -wUTp80hZ7XS_?HUH7`~(iZv-j&r?v=-eqFJX)`i3MP@*ph=qrz1jnr6Oi{jr72lYs*6P((s_a{38GcI -ksFL3W_+s@iv7&xN&?jD2@+D1ozIuFkNa6OQUXMRY2O%u5t{)ly66Ez95Pbamr -C|?sOTRYF3Q>uxDF_;v8G;b*Ia)RkGp(&v5!#hGx=rA8M5eijPf~bgt+&W1O(pUt`UoePWyKl*HdXY>c6h0L6?8uaR|0Zo;Y#H3z+4GCn3@|9yV1HKsDl~15_U3(H{~!pcQ-~->FM($bMPDtHJ1x~2=m#o`Q>;I54*1~mvgH_xP8uLw%&WTVLJ -SOj=@BQ^gp|I#;uIl!I!`+ZnjjQi@6Cc=SGu%v^w-}Lxo@bb;OWQd^x(jU4NGf*?krMFJiDI{smA=0| -XQR000O8B@~!W){$p2AO!#bz77BYApigXaA|NaUv_0~WN&gWV`yP=WMyAWpXZXd97A|Z -`w!@{hv=UYIG{-2p3YFbZykr5g-XYehC{@Q59LnUSO|g7wxXo(ocVHZDSiSxl}roZKX{Gty9Dtxm9H$;c864JL-lTh+V9{00f< -WX7ImVCX4Y5JjA^ExS(q~EN?{aV#73&RZhU}+XymJ}H09As@eN%PDl}vyO?PH3MaCb}M0}xqwX-TM6= -S63(tJZA~LatMI2w}(<;crqQej`J^+*wmBLeQ~Q8>TjTui^c8PD7?qDcv){6xdATMZ^OH4 -|%|ZX5?$yTAN-MO5NE)oU9PKlYmduy&=YNZgW2~rD37#R(qcP0<`m^o>B09H&;lO>g)!z-=ao=(1ZZe||O*=Dp(47xEGn&q4(}~k>5jl+QCAMN#iJVKk1ms3S$&e -YJM>?hci1um}7=^U7sAQmhib2q^@;A-*IbO_RPUj@iNVopcu{MSq(Z`k>XM-` -jBV#n%Wea1egSmw>*Dq*P71mD*U>Q3tVC*X{PzW&7P#n`rL9a_*u2xcAB>a#5=-mE2Hkvk2C{(#&j?T -!26NXD`txjtsxu8P>(A!^|`}&0?@!xL9d}QQP>znhUlM>n10TJsG7Z`w+n7b7yBd3vfOSoLFR;V#|kCu2eght%i4Or73T+<`SGm2r>PTJk3) -~tK8{jY&<4g_iPZ2)8TQdH7IK*5FH9-G%r4KEO|K{X4LeS(n2D7*gIf+f2Ojxi75l4mz;8bJTVJ5QH- -!RA#=^wCiA8Ui2kA?Jc1v-)baC?m8!=JOy-IHO*$;!A0CeMUKw83bNzQVBFZ`)-fPlqx2=eh@)LZ@8Y -%)7cnztd6s})2F*&<%m-~OTr|FR9S#w&s;1txf1*yK2S+dP3eeNqY~*_&CeOywr=Ms+p03gwI28c$qr -)IW(>;EUwzft5x7CB?vX0Ch%->g;!u`MBo|-2WxN*D3kp?}Ev_B?O6@ -XJYk2pwWb>y0dU~nm*GNz*@sip}UG1N5L-G`b9Ioq9x33PS=d%4&xMB_y?|k?VZc?xB_Pg$2eE;Eieb -uY=UrFOJA>-BB!#9;*w_m>DF|9NZ=1QY-O00;mj6qrtRfJZ%W -4FCYeFaQ830001RX>c!Jc4cm4Z*nhVXkl_>WppofZfSO9a&uv9WMy<^V{~tFE^v9xT5WS0$r1jpUoo- -j0;<3UknQuy<*U*Q$mArX5~v)xp|FNQ^jhJCHnN6CQFW^a -JLA)Y?lVbUhIYke%^+?)pm}Fn`KIgJ{tAcqkov$?5k_*09lI{OAzI09xa7e-pXi;O`d%1_afJO<<-rl&Fm`DNckEiYvp_6Z -oneI`3w?II3g^D3DEjji{s&+{0$8j%-@c@fnF&D=bB%GE}1=&s~On6G{9EXEHAP^gUfc -dd8XOZO7$gM#FXxWGE;QiI@fF1WfvJb~MH^;rf$G4!xQD77YtR;!X(iISlT?MumuCQmPBv -5({)EY;NCk9J9mWRTE~zLYAv1ouTV{Gqqo^WD0%D#FTk{SYr=?fbGCM*G?Bwvh%IMD;%rFUNu2vdv`9 -5pbz$rm_l^N_5Gm6PJ9^>>E$ta8?9!uQEwhLnvC7{@n+M*+P$+!g3tcmix)5UF8xX5a;UIjOBuhE88ab9OSO9<%TROhd%ibQ$n3h4Z9hv-c{TU{mB|mYnd -(!}`v0{Lp1%9+#2L2cdh-pqS(&ynhja;jdn1y>0FeIkxddn#6hj85*yRf}kWY2g7YnsO*x-brN7|A@d`UC4?C_ed5 -KA@22l471Ob?1%i-YtO}qd8>f#Kf4Xf2qgYUcN?}sNJ2kqfmd(b`|0Hxo-;w{HtE -QQOfuEb@g-O@bF*%{{0}P{m|__PW(@)_-_AdNNktK*C77ABBWn`^XAo0 -^=9RWRXzxB;y=iGv-PS~sTEWaKN&--#L(Eq@T$bn+{N&^#PE6-!;d9~!(9w-N(`@dG5l0wc)5$Ad068 -3vGPq@&V*0da7chX99AWFr#0jq-fTEknDwp*Vb<}*MeOeM5Va#o(uJ^Ivjd7e0_LOns;u?;e -+rr2pH#vHh2gmNRLUspt0N;B(O^lW#Qq5xKAJ#gC}8KatLGFxr-AWk!>o8-%4-NVmj}{KL;Xo-a8s4R -x=vakcBJ6^gVaQJOCU-roxCv=UEehq%8yq@}w~jA29NKt8J6Q+!)oA_8=G=W^v!5s9ov;#EX*`qK1mZz(G0U3!9s@I9v=5kyWK5zIj&T)qnU1WyQ2aIY@$l --Dj}pKD#-vmv#%BOE^a&GMneae!yLRk8& -ilFJttl=XgqfOZG=$el#MnWUWbXcjla|A42bKH{!_*$QNJ?qfsiy4wG^co+42V;1EbgZ0Rbm5FP~31a -az}GMjTDUEjc{RQV^!DN)u)wy;s&+t>@IoF&PE=&8o_-Dso@A41Y~9ppBR|kS%;AgJQ-zjAu8?d+sMkSWSb9`qn(B(c0nwa03gq0~u=Ud34_m{F_Rg8&XN~oweP -GmGr^7mJ)@aZ_rM|-!k}45~F0XTMB5cp7$^DoGyq!+QI2N;QT)Xst*!sgLe_TO@(WWZn^Vdd${;Qbvr -xcLr@3dckSwqzr$p{&Vk2)v>WK#bQ>R{Ewm(A9}leF^pI;xL)v+?@n>$;L&CmDYzEotp&O?BF4Eyc#7 -Y;C8OTFsY-->W5(@rTh;-jU(LdFR~jmddZ1uM>x4TOBgzio^m}+(y646`QaBAL=tCfw=^hqH;M#bSgPcn%9KVQ;y3jl6l0S(k!GMNOnSp+US(>J@Cps*98P+SSlr^vSMl@ZmW2klSGksE|3 -@MoSXQ$z6+83pAjift|!ce9DG9(eq_|mdIQChND`d+rko^G{l>&UmAP*3k6*6Z`DderC?WYSPO{{3dG -Qxhvi`_TkbGUdY^z>k@t^9=qc0_U(5Eh`5G)^Hjatkq^(nVREE2bHd*LL#dVEuhnR^(mr7>!}H?|k5;ElHl7Tw3U3v+v;51_Rfag!G`4-k#iUNZCp$8le#ZYL)~XjIm4fspz6U>p!?aACL+E)9-+& -gmqXI3u((x=EnMaNsxp>rrY?`^&J@9~+4?cJxqYfal2Ul$>(Z8*zb;)#30F|fcBZad?9)dsdbSwrMFIv%KX8)2-q_Xt%Nw$>OP`%cEN)jDEq6;}P53yPRV$vaduqvdB!8+D8h -vMcYLg!!O6XKu_h^N_g3d)xU86h=zBd&dTO7DzOGgOvJzw%Xt$5s6IL276KeJJLBqUeMttBT!RyF1_) -S-F7!}TlZ|4KyDNRdOE@>Ll<3;XNPMA)zz8|X|@o{QXMdz>Ui*{likvNkDg -?cEOUl%*Sr6^>5dO;)nL`+OTM{X)RhV~iyjg5u_KrKD!XoBP -;<^i^G7(qmijyXSmTlk@pCV*Xp9r!?qtmXjqvIpDqUb%hlBO*V_vNQ3CN9c$CfS;so4yFHz9Bog=hg1 -+3Xs+=d71lxTY75h3nwJbOW0zjn -=m<+l)F953#=JF0^Hy@$&RwUdXgnfbo?=Heljm**dNvY#goOeaIz@ojjTy2C%=li17FB?M~(SFsfn5r?5n5SWHc{>?a#EU8uylg -(=FLMMV5Mv)_YM=m$0K&D{Ma8SI1M#s?x$&_WeU~y!a6q;VuMym3Kh+!^OWsem`1`}9rOUBbwkt(=0T -S~Py&>nW6e|L9F6lcRN7;p|=5v##Njp`kfs*<4;MzLjXq-yKVJy`%|k$QtU<1587xCT;az(|;H&031O -ergS8OBJbY(WO)&f|jZIAYl)%l{v(b0EG$D6+Jb=KqQi%r6PPL6P9iZQ!WxJr%-KBWqQ}cXJ-LZ)T9) -iQJ|t~=J}Gdn7~sOqtFPEhD~A9>qDo;g%H0M0%J+^Wp^I{8TpIc@2E6c;Ku6jvek@TkP6z7DfH7cHwC -amqPM_l8fu5M&bHuCX#z}?v}@`;{Xv9O=m)J4ED>^zY0kUEK(X+361=#J00z!0d>we+zzJR-D3&@+UY -cLU#Ig-%L`+qwNSG}NCxV&n4POW`c$!Qn!E2#@JP91z_hIaMFo5~M3ns(Gbl|~!;muv&wg7y@U5krmo -@?^H#VJu{k~*27i5S;a>8~_iO#*oW>*yV6%rP?BD2V72*=&DkhFpqOSua5j4SfKXf{>;QABxfL(Dt27 -msk$-?b6c6Ru{hXDJT+eoJQaie9Tg!9&;&G7oMaxMd)lm*xpUQ-@ESr((3~(e6oD@fbERF^N3uwTB(v -5Sn)bi8qG$@B~?$;D?Xti8GSVK(pU$g$Z6^8fWpJX$~Uxaq%w-vOknx8qovPAtaM??D({}V^pvqRu7+ -gGSnF&Twg|?zp+5^}?#Q0D=!toxb!o0-wHqSo9?&@e*RexdG%uWc?h`yh&-&6T9SNoohK$Zl7`8R?v< -4K9>956oRC1FU^~=MYMcy0(zCKAx$j-B5l64XKG?whYUz6Wozhej`HB%`=p7uevgPr{o>_yx#NfV -@&OAcZDZ0xoisUf*7P#=s-7%A?h%=!-+yDPmHFb?IOl4C!Qj11P@sxHw)r --@#QpyNZjkP(?>w5crp=eC@c?z|p7Ngg!QQ+p;~+^_r;;ZQN!1_S>)=Hwb6;31UgVnr{s&@_$P{34Eg -Zq3mOK;f%sb@W15u1G>?t=?Qk!-xcjhoGXRGluN}?v^((oBix*#4+S)~@TW)Uw_3+3_PQEHj_kl51{3 -G`{&x!~*#%WHLacT#k-F~7mDO_ -??Ls^0SE0ld08!_k1(qWe~l{(Y*r_I~6V@6ScoasL2NO9KQH0000803{TdPDjU(*SP=y0P+9;03HAU0 -B~t=FJE?LZe(wAFJow7a%5$6FLq^eb7^mGE^v8Gk3CBSK@ddq`4z<^cb5!;MhAk37nmrhm@d7$y*rKb -vCQ7JL#i1EhkM -vtcjNA?`8>V7Kfk_g&A;8%?S<}lZg()hP)h>@6aWAK2mmD%m`;-h*D?bD00031001KZ003}la4%nWWo -~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8dE){AP)h>@6aWAK2mmD%m`?X5w4a~^007ns001Qb003}la -4%nWWo~3|axY_OVRB?;bT4CUX)j}FVRB?;bY)|7E^v8`R!wi?HW0n*S4>`Rj)}Ztl1jf`Ey} -|iv4$=)FON>dXu6Ixy-GX%(3X42Jksm3Fx_7-1MFFxU4uCJMZh9w*@I6OZsT`WA(n+o6&?||Qh@z2B7 -~UW;<4UvYxUpjVwmUoQ(#eh$8-dXqHjp-MSKzp@2wW5=ZCR;X40Bv^{q^d!DSAhMya|cHd=IPs9Vb2v -6HydZqQ*>HUn=B+u9HS8VdtQDEArU$6{nd`43S3vUj!1SfFqm8%xVBw(krHovasY!tc0<0K-XyOivu? -$ghpCNqXEFOP)`|>$6N3YWN?E}{uP{t74k*c2aqhRal1~8OFmLQXlI08?wqiPuoO@RpYfNb2XC;Xnnw -7%(x}Hdzzu8A%cJ;v$X}9~q<*eOOhUn;8@%$vA!r=Vy<^-MzVl3{({#^jA*yGCXJFTuyAtbH_ntChq0 -zb{RxIBL>|E{{se40B0}E^j<7C-4+%!Art*HA3WDVP3i>dhK@4wiz1!fP~uU{UT7h&Z&NKUN9qmIRxDVH$~ee08E7bD5-bh~-M5D#huD7O-#Q(I~##gPTx)@#Do) -29K9dFT~;T>M3TJiI%&BT$sNCH$RH@yPpwgzgv74oED80CwxSa3hR!%N{9Yyxl{>C$0q-bS$NiKf1)@ -eVHjQ8l1}>~LgOCkb3wY1RP2#8H4>I8=3Z3C4Mo@)d>VRgT0BQ-C8}*FN?A)$4dOrUwV=J&OPWx1$MV%g8b{I#D+CN~e%ET7$c@3 -D7$=E1kui(@(pXX$}gj8|1Lx|_uQw24ob*IG1P9{)~$Y}eRVdriXz-Riy}0v-hQH~C{)%EBp+rYFHl; -#gr>IO5Vb9H4yU6OZJ`4UQzSS;i^pzFFBk{_zcfVXOR>((kt$`rr2eOrvbs*R?QrZ;-WE42NHg)#zn7 -kEfB74h$A~{4T-6W|dmNHk*3u;6P2o))W%f&ftOnBOk2qx-^=EyC&793FecS9cpCFq~*@-lJr<7{pBE -;ebv3cf|y<@%H_e$2@8dA%dSLne!YzV -N=4=MWbK$zM^#fmN@CY4kr(O9KQH0000803{TdPHjq{)3N{n0Pg?*03ZMW0B~t=FJE?LZe(wAFJo_PZ -*pO6VJ}}_X>MtBUtcb8c}D{=+|B@#>8)HEjqj`u)P$}SRaN`-!zH-+nW4vtfp_}V?cZPexfY%{!W@$qW3U|eBx -%V%(DkjO9KQH0000803{TdPCgZO+YcCG!^= -8E`Peh_SvDDolWR3(&?dn!~42hwxgewU1vW77ZKPw7qqNm&G3LWf8IGM)IrY#ER>OQCDowr#BvCdoF7 -cPWq!a1d01B*WQqLZXBU8YvJY%3=(vjO2oG#rOszX(mhv@h#&tm0fEIa7z-U^4sfc;N3m@&T@zu?Pg+ -gtykAtHv}2c96~K>O0axPHX!y_r{Di#Tl1y=vifFQqhMOBoEzL}#jrNjgenVleX^xj?OTiBB|z;2CtB -_|B9$mG{B3XTf+|6Uis4bU%x9ga6XV|AA2xm&9KSJtnKcC}LKz7F-ogWeL9Z$8_9g8H`;?n94nNEMsB -bn(sl;Az$$Z^_R`&cCM5^R!-7sXFsW5CwNY`atUspsWK;-V(C}8Viz+VDLp-7by?0Kgfy-!$_5DoF&_ -8A0ru@ZUAGfo(niel5LVz}CaPK-BF#v?dU>zv4$0_YY_;=uyD`d}9Vs;q^7EZyg{k;QB -b<|pCf^ZbaB1p`{`R(hAtqISR+115Dg_2sjWrz0JMt%K5(;cAAHlTD}Mz3SI?TfwgVo&GHkw&fEt~YQ -eWF{^<`1t8XXyBd{c3})|Trsqd#PR%T_8RJ_qQ0Lmo`#F@YuJ9p9u57Euc3}B>Zkd#Wd0bq9dh`8`oY -l6FzV$Gv%Ig*#rsS^>o_2#+GvU;o^)(L`i=n>!MN5+1Y85$ErMWH2YLqh989P4ry9^Nb36uTQl0@GhI -heiH9Q607{LELoSiY=8sO=EvI^?JOp@#nCei~AW}4!}=XoX+#2qtKdH`~?K -FQX_JmSE{RK&%MPbYWxD|1$1@TZY~=TrcmRS`CTTLI>*j*MOf6lY}+1p22r9)nT~0j~nev(gv>Zz@2a -RmFH)0p_fZ$!}_27}4naPk6y=@`Bgo1+U2qUXvHRCNFqRUhtZ{;5B){`?X$hohCE5PLms4r^ybk)8q% -&X)=WCG&#a`nk?Zubx$nSA^ndB#6lBGEfX0}9*zfF+{0|Xco@6aWAK2mmD%m`)?`Y;$P~007=7001KZ003}la4%nWWo~3|ax -Y_VY;SU5ZDB8AZgXjLZ+B^KGcqo4d97OebKAHP{@s5Cdj3IFD#@=-A5Jx{EbC$?j(uZ0eb0!(+1Pq3!AS#LSdCBC0Pf2H$hLU;R4*0tWVI**8$|5$Wl1+)^g -lDP38uR!YOTjS`#zN9KfJt=Cp0XM7{V)!t?|XtpGXPX>PJ1M>W+#0)F1TtnjK7I+3s-q>-J(i1U{$A5dEmkcsLVBZ_b4m6Zums57ChR0ld0GZCqy0!DQ4Gi -6rctaktY>2X56C(oU^6bxL=bVoroVS4YEG609ca++@J&V1)(k9icl;hpRCC3+SSAr$!h*nxkQ2Hk2Sw -{Wq(*?4@|D2K26YQ;3==ZCy1gL5f~HVam}YvxVC4h93tcFXP%&+LDrF#W3|b;^)_5@-{=&g1_6!O7$P(b41MgXf(bKR!pjr^z -eoLlJ#|6i@TAivNI6iWWXdCQYdjzqct6boUmk`OdTAg~`s#UA+V5N4;TvV@iZarD>EP_; -FM413)LYE|Pdchf*MVMJLto^D&6GLW|5poY;jQrXiB>>Bz7r}(my^68~!w5}=Nh{-D8985u<@PC$s#> -+hNIdpeI@Li1SP=^?84gJ&mL12Od(3MgF{RNYSRJFEE(q2$SR&6XP%SLBASeN$!HQL^A_oZGE$JFmNG -4QgMzH^b?lA&jDv7F?9dIp6RD)TJ=74x?FdvZddJd+OJEPwnKnjCAkZ?f3noxEGfl3b(qnD)?bE_^d4 -WpMgpE6OjKRO2mtVQ35snopaErdqRcOI8h1Xs$670X)_(n%QJZ4lHjvn?dzey*s3&dgG)6N`yjWijjDZ<3 -<5V+B9LgMJeQ0n4(R0XtF|`vluE2zI`rQ990*Pfnpx_4GWPZq7t@zOQ5VQj&P616P!@s9y_-*3ZdbO! -j}T7py~xhyCDK-2CQ|6za}x=>|&;1C36za4Yu1k+Z@CqR4g}pS1AZMq16MX?`iRjmD`Ztra&D!v?P4~miWOB7xTfJ`6|2nz6yuRNIpx?K9|7FtV{Fh0a_UF-u$<^ -IxGk_6j!x(=ZwS)lQwrSs=U);4g01^D!K6$VJYU*tomzdNlDg4Pl-$3I(u5-w8)ltm`!g4?aO3KER$HRa7JcJM9j2SI270tOJ(I-^YFD53=eW^-1MwYcemmurC;WziuPu1Q -o2=cs%W=ylhUtoQw5-vn~e7*ZmK!Ik(-ouotr8E?cAg=D%?~7XyGQMUFD{F1UGS$nY=PLY4tXZP2AL! -Hg6|iGdIyzLH -tZQELIe@zox+4JgM4?y|Q+}g8Zb4F~1>Ia+dW~p?nyisTtWn$s9@Ycq>DQ_4cZ;#d2E9-diw7pwz0K_ -I=_xoOF+368)zt?r$1O#^v48hyHEq*f~mA2n?p&szYd33iq_o$-wi1QH7gHY6b8>^hlnKM1L-=pzbog -g^d-j;(^yKRF#pRr3Fu-cPUz0oYraEe3Js{`RvM2KpWlDNDXS%YCOa6-svIcDbEt&9`lsk2WzS) -pshnkEY`l&lf}^~a;4|EU0DeDoctYMY_)P9l)^EHKW(vy3*$;b(T1rL98AG@j)%?aRC?Q0s&#FifL-` -az}HVbgH;-#X`YHjUeRz3uV8D_8%HRaZX_^0JLj{`2J2;(M9hOV<0W0x!g+V7vKIdHr2(o4NQS@eX=z6yNO38)jFWEqh_#85f2i@cVqI#Q)=`Wv -4DwvK&)!7BXjN;ne(NrWBKI0IsyUhPyFk?y6=>8cg54O9T&8+T+UyS=$ocA2ZCKNIP -*_hJ^*|+8f7ox9Gthyu}Vsecl;Z)?;0u@YL_im{Xm=8GU@c~*j3_?hx8 -V`@WuY8@g9WA;A|fLx>A?Aq#*a1pAHnSDZ^1&=bx8co1vNvrr)#n|#)hUm4j!H|?iR6=`FG9=DPrpD@OhXyz|0EJZfME;8^p^=9V}t6*G~pZ+IJx$em -p_4qqDk|xV!=k%#e7!r*gxD*J=`^@uq+E4I9-;hB{*3-{{>J>0|XQR000O8B@~!W8*fE&g8~2mdj|jj -A^-pYaA|NaUv_0~WN&gWV{dG4a$#*@FKKRRbZKF1X>(;RaCwbXO^?$s5WVMDjMT%Xs}R8!38_*fpcJt -P?PXVR093inq%}BpHFhZZ_t?&tlkL)tRMnmtkKdbl;~A{fu_nGh82GFtGY2N&6C)$AhMSkK7Ad^H{{V -{@E5Ry_AovcY#soAXe7Rk%@9x)7aDi#W%cCL#%-~;cy4_AmyElSwJBzM$6cwaONSV~!s1uiq8)&`ntm -#30bEYVYlm)iYCRde#4DOV~-h@P*DLN559xu>eAiX2XPt=gSD}$BPgTa -1Bx!pJwUYGq}~dLYTdIy#%%Wg*&66^rhV5PL=3GZ9%|S1lli183zRCX>fmwh)Zr_RvG18nFpJ=n*KpD -nage)VTd2wwWFLpP=%I2$G|~$c3?8MzdHWjC+t(TS$?*>-A9buc7J7}!Znei_{t~u5ZtlCD#6k{adU8 -4L74**Fxvb3ujbADd!e>Wz_>vPj9U{%1_enV=yj8BtOu*4wAqZDO|x5Pf7DiDhAwHv83dON&yX}c_$WP2nJcBh0QR`w&?Xg{2=;Q3#s|)%d0wd|^WLBf)zc!Jc4cm4Z*nhVZ)|UJVQpbAcWG`jGA?j=%~xA*qec{d_pcZw+8VY5(ovQQ~DBND}*yaJ_2LzvZy`fAHU+gx(b4sp6z3)$_@rrqDH>F+xEN4O^L6V@h+L58e?1wnLoleazbttUN -!HW+YL5yo5SiH&vj2WZMB9ojie=#rX_GUDNoZ^5O(Uj8!mhd7<4akys>s8>9kM3o~jq=_mb_Hj{Y&l*Ga>>zrzPLr*dvLa!Q`DiKc$_24%$ZNet}|MU$20fl%iZ -00;ZA0EbEDK=;FZtO(GkzdBu=GTpQd(XBempk!x)l)yJ+^$k|-bJDA+pjcQ~??U#8VK9%YPEc29XMVw -!d`Zp+AW+20bP%JvGnj{vy9~Dk;ATFb7Vx{f4&sa?>J#>`4zv3RT~O^iafS^2HItvOr>dFjrmBQr@z8HsS`Ys_kV -jM~&Q)P`?bq(R1A-!wHhdXVBq1>V|?gR4Sar$xTCz+}^-VS1@@8Rt+*2z5j>#k>B7%xJ=7eT~(2y`MeL~j)N>VDKIDN89u{b -OR?62gvD{@LO7faG(PHNk_HN)4r(|HoBeUT44VP9%;_?+2f1?UhtJ&`w9jKwy>t1Y>nITH!sOp)!n)V -WRIWdpvDlE#a*Gi!2qYv#n*SubWKrveLs+lZwG|Ad@bI(B?F^++it^=Q=KKgY0@H^?C;+-DT8uN!^aD -64^?^`1H?in3hfYr+jA==iT!s8ik*Ug3N!IOP>W3+V!QwgyZNw)W6vMrEyHZ2yxoIY|4mP7a;ZYNmT3 -(5pt>$P-APM1=Pi;W6>PK8AXbPc1lx{ILOV-T@d|!%=4RS(T4vL(wa~G+Vn{77GDsllfFH*BQkvMMR# -!AIx<8L(9R5G#uo~l;^VX%u!1KCiX#`7Is@l?b)B&TWU+>_I+0Kzu9iJL;KlFGU)kao$a^#lMRQ%K0P -EV4y?TI>(^-PZCgB)_f$Njlm)7$Eb@ylgTWt)Phz5tcch3{Un{Ha&X6ZRahB}Mu_vsp8BzlNp)_fmz; -eekg#2x;K#g6nU>y7dP)h>@6aWAK2mmD%m`X7001T#0018V003}la4%nWWo~3|axY_VY;SU5Z -DB8WX>N37a&0bfdF>e6ZW>4Qov%0&QVa>+f}N&OB_i3FI8Gg?z)|8Sw3oqbvdo~_*2@GClH4UI6qxfp)D -X?n{uA$S~Qf}}3Xl!%FscWJ|s(5x0bnKDjLx;~V^7CdQkfhU12c&Q9&fvBJYvkq4j7>@`C!GO%O#1}H -vrRV#fA*Rv^5nHA$SP}>r=WGdLM)J@qZl1+%%<$S5YZjr*{1ki|IW!P4piDrRupmI`#1Ch{kTY*t+)$ -?A(oDRVqX7$_qkhQ>D-tu;Rx}0njqoLpg&-7y6}&~q{c>)5rEV*+NuV+x)s0B%l{}fK6qAKoQ`^<|i51$XAmt>Jpw|al6+hOB(wA%^P^xtiZ~1Buni}S)QR|r%+J~rLQaAw)ml24pD(h(4y^x&${sUHp-0vto>A -cS>cz-W*jX)4|cRl)=Eb^&Cc$C)#)C%g}=+u_JsLypIh9%-~Clg4vd5H4Elfng4dJ>muzmtt3FXj)@n)1 -5F2mc}Ax)c8Q7TIS~W`z$Ml*o&6EjHitMX=tr7IVYjodq3%!kHZjGgBbT@f&&~ISo=8eQxe$|T8`ARe -J+0>_X}LWQs`)EZ$o?UGrY*RUg!MQJvXB@zb<8q5?c0H4(^jUg)=L22REgoxn5Z^&IuLCO7A8yy;B=e -PLA~^cOari24!H1#VfJ1Vprs2p?%Xq)`tJfS?WfyNYh+JD^rc@{pd@U3gh_u7OZyp`)O?0=~Ghx1+vz -cL=%guVdtK-z|K*)ZyxHc4H@~7amd<i{i>7MsAD3RdI= -G%QZ`keT7tc@clKftkh_>tne1B`ow$s&U=i~ix23wp9QSUEccatlJaq#O(;z;eMOr3d0x3IaHkYpyG( -DW*8zdA6gd|B)`9w0#l1%{u#ceHF;^1@B1QwN$x?m3;$A1ybspk%STavt8YCzORnM*b9T$Ee77O#;_h -up4$o5HF9s&78q0g*`xU0kDJOzv9b_7SQlKw5 -rbi0lyTgoY|JBcchqf~7?`u`>1hoM?E?vmAGdTee^<#ld9rM5>8XLBa(7PwT?oDvd|$idum3Sf_ePII -H#Cov^Y+3F?#pU~*bY__*~7xTZ>%b&1SIqmfL(Wd#m&1y@Veyp7wqRjzq?1!|`zWTql{p8l>JcvXrip -R71wwlSti&WuitlB?NO9KQH0000803{TdP8*_L`CI`207U`-03QGV0B~t=FJE?LZe(wAFJx(RbZlv2F -JE72ZfSI1UoLQYg;Bw7!Y~ZI=PN96pq)m=xC~X|GS+EG2qwyQtwQUz+1jLX%?5uzx0H$7a!Bl#=jZ2S -1e3c7q%JeI2;s>2WZofaq(-oG&6!M5GI&cLX48k+M7BrxFjk)-)}N*cgtj&*+7>fl2V5e&ow;-tVwdx -eCWIGvw3%ijm;^|mrJrRoha)@53PP;Wa;Fs|!g{rgHgOd2i9y>8mfOvKw|aWtZ+CGA3Qw83al}x$q7d -UsCCN8ZD=m@)7BHR$vtT|}Dy?+e!n0|)GKc7tV$<31{vtnAAgd9UQcUMdnv<)q(lB(|9INV8+*C*k`* -K+IHxZGe5Ju3DE@~Zubuyl~>7_0PZi>A@HyHB4LANr@q3ltw#VWrC!qidbhZldhG^`E(OG*hf}L4myPF)vB1t}#jcffVR0yAE+XkngKsP)h>@6aWAK2mmD%m`-Ne(&;ZN -006w90012T003}la4%nWWo~3|axY|Qb98KJVlQKFZE#_9E^vA6ed~JMHkROjJq4!Jo?!r26U$@CNp=)2Ig^8~w1Wion6aIS1#418`p)JUk -F_nPkPyk!YL6!RPqP-u~XcI4)P~D!aLDL~uM2PaYpWJ%E2c6W?V;v=-;l&)F)3X5VCSTGVMGno=~ksd -%++Zp%WPmy6~;s#5WyY>OmnGWZQXq?L$ZyrQYH>$WN3+f9|G%d}_^)_IzWZ%&U-UY?(X&AUcKMIw&RU -S7OD{p!ud+3R!s5!&r7s&Xmj^F`aVRXU%GY`H2cXntLndE2CO{=T;-e=lqGsY=zSdR_1BHP!lPPr#r0 -vCj9>cX7IE#3}u9QdMPjB*ea0Rng5dIub<*=)X-X>IUt_OuQ_M6vkR0%n%;cFxPojEXvErSK^Q2>2QC -V$2riVxH&yjNT}~T0)3e`>s4CAP}fnN@=sHG+@$XsdI-SfM-KEH -0WyvYinC$y1YYO~34SuC=fS5Z|X8*Ahvd|%P`ZrE^s9mRLlL6P;gZL+*;(N;NiQqR@*DSm2;?(@%OR? -vrfm1m87OrI@ad3LQp1@N^>fkNq90P#y(HZHAYHo{PQL*`y(r7`T -O}J)LFgbcCwl}ZNf$hBP*09DWRQ-m268r05yO+I;+D~b*bRKF!?eIh!I;+Lc%oat#M-KmlL7F1CUck$ -Ph7%0(Uf_e{?dZ*(A>*a3WR<0`WrckuP-iM@y9`0P@Au!I*XsR&F$B)H1kyUd==I8eOV>n-fZh{b$gv -AS(V0(`f<1`3S%-yq|=JYfvc^~JL36fjANWj;3lPRn+AAxZT|FbnOCdW`SIV{v?b~J1wV9z{rckDZ{# -A-BdK5Pah5sAOV+GGCU_xL(LHE}Roeic_2&+9)}&QambqTF87$R?7aM=t-gXh?b=q~HuPi9@77$!j<& -Dx=N?b{V@nLXV){P;OqtU2)HpYK1k5%Oas2j%j+obFf!Lkh -h|n2p7s*yG`ab!Ikzee<8rwIB^QkU8iWrgf5Lx$H#~{w6Z?^O0J4^ew!p%61hT -PQ{bn(nNHp0-@~fr9k*Csy{1tQTp(;ukGPSADjzla(ecC6|GiUZ2G$1r`&tWd{}wIIteWW9&FLzT8N} -d-mui^&s5Vr)o-a>7p;nwoQW9gI?FDYs&EH0p#Cg#u(kDX)t3gCk5rrT?}N0bOTnHJHQT0WGR&6JoOF -i8XER-09D?G7HYlwg)$E`JjZ8~t>2Cv&SD`z49Q8BH@eYbSBu$>df+RFIYW8hf-PFv~ik19K>G;ksrT -*w;%ATZv=BQstV#P5)2E89gP0FP8d9MQ+D9%9)dk})}qP*pgh9N+mzSsFT^Q5Q|fjMi66TM!7h8^oXb!W@)ns%j)J4 -vf)v+h_UOw?0LXFjUkOmG^kE5uS^ABl#NIV+r&s^{-QIT+`XdyNfD9)3dW(~o8{@ES(d0%s&pA;6zR; -k4}<|z`RVZJsspHr1PxVpuv~2cpdXGcGt@Qx(x$JC_`W!;Yw%h24?p|j^T$UbdRt}*aIDB+Dx!o{pH^ -=nUK7`AKy%U7NdIN&*wTH7z76(9;Ms-;L^i;&RB_JN!e2Ox#K|KlXDZ~-T4Unx^8+6PH5qBNM^ -OxrW#rH^z#3wNBssgE=7#_nuSe+DbZC9{_mM|j`Lo6olAC(hvdi|*1%#jC{ -2YhX>LAfl&VQ93zfFN8d!t<}s-hA_1yga)QQ3DNEL}+$?BG3wH4Xuy?32L)NhKjHd_qSPmYXHQkUJF8 -e8&y$^>I!|V3K#$yQRLBenu`)zRxCW&2W9#Ig_<9SCV7;+Xc2iZV -m)HXQCD-~L^+AY^QjrAX%fE(KpBRfS%?&I=5OG+(_gQlrjNcUp2jKC7;nO_pKX -xaym4#13r^jz%qXX+6_>vCs5lEaauhS#}2sj0h0AS#=1Ibet)*JO;fz2`)xGHElM|t))0Fjia{%A1`l -N((0w2q@y8YmJ^Ow!k>OTRM|t@{kUN)!vt`a-i@dd*XjhBu+OzrTO@A)|wTvC1O|&8zW`4>5E>c>pDB -t-~luh={D=QFkiAf`C4|DL|15OUrZ)R>|rUmzTB=M>`;holGR4l^x*#zR$*}vc^A#;}G5L03l8Ir+*) -#Jql0%{POJe$?>!ElU~FEjg8m`xi&Ejz3p!Vs4+WJZ(H{7(kff5arHOiAvSy{0+?-*VlE>=3IH&4o_J -vR>3XgEgK;=7K2=BQDVDY(Jl7r -jCz!h)&gV^q`Nih$3=IGTfWRCi4bt{E~u30O(7h_bu|DvPrMmNNjWK^zd_MO)BXcW7SYsOSWRCjDIFf -fR7;2AR9gKMO{z^8g=o>^dB$4&OupmJ9Xd$b#4V8=;M^i4O=AzhSBtLP}B$BF#v_Z-a7t^7>+a_UhvF -?B%m>5D@+F`sClnbOo~PE?rN>TOMge3=LR$$JEFMjzdepyn=4=gSgpyq-LcSGXa~p>{YE?MTcr%&KRYvEb=wz>J)gApc*I33UZsF5Q* -gFInqRc2CCK$AS8uFIqNyn4IV2u$f7ipxIbqPt=nrqY4*hrKm5@5@o~ZO(jeOp9#xDY3sE9@R6Q&^aL -X3jgNN9{nhU*c3^ucaM$+O(PqzOkuB*QR?yJA;QUDQTpju79uRrvy_MUS)(u?|mZzYbBGOdfTbdJ=D1 -zY`~?l*oQf-Y=BqsR7R8La~JfTwyAlgXs#8JWlf(f=OUKd83gtT2EGYoq@#gbgeqU{6(oAB#aiCpW0I -Jm}dA3c~d?2fccqlAURbWQ4ZU4&JRzm~#q%uy4HrX9KMvCP=^?Nd2Mvme^hO4NAhxHpu$(GjW5dA6RF -x>OgCm)XB2Vn+%ZRMO~ArkkObj)Lx*J2AG2v)Xe7ryW|fa-rYylP3`V!z{7ApPqG-AhV3c=QU|hSk6f -H>RP^FVT)`=-)yC-!!9`%`RM1u`0GpyHA`+-FOx+KjMh6SCyoSH>6 -GHh3=NSQeX@uVVLh%zKWw&DQwuY}77U+%=x1`=?Rauao7$IJx31Jq4u?A5=`d1l*5CwY*Kpjxn$j>yY -3_Ni}15Z<+_Qf%pId&i;Ne!Hr8Y3dlN(L!}DOeXwgc8ln2>4l&WE_zw<5Mdm%K&G>GC%HF>6@nv^VU{J%+a -#5Q!nReK!@_)bS~QokV5}Jz;3efypwN^t?Ws6MCt8?7CzJH1TnX_xBCJL -_hE56g`>w7t9oY1_{A7J$Dd)^ooeys58LR)Hw$!2~nr3iG?DTB0xafpoT&7Ji5<{r%y&cZ?i{t(L{GB -?(j8*6&(gwxm{!A3+VOG=_);*qfJq)ZFBP7+y4;QpZQ)FL+2$gaf4N27^{X!ht>fWms#R6u67q2#COJMdjGW+axt&}o5XA9X*A0~5K=@?1n1hl2l#lc{fM$1SVkHfz`p^Kh -dTSt`&6>Bt2I%NQD?hr|d?IXGx=SA^6X?LC$%Q37jT+(vSt^`Zl6*5@Y75EqI{LINohPHVvo)sGW$9+ -29S+wjpBEo3=Ib^!0ndfNBT-1g!Vg5Mvf1LRE-6*2{>B)=BxvIUZ%OUbmru)7v{c9&{NL;9q^AZXf4n -?(&vK;14D**lpt0OrIk=DdO2bt!(v(1dJ5Nh$ZU2ix-|%@9nuc2r2=M!4`*5h;xCwr -4rnzw{KVC%x?sEp=dBy5U^+lkhXn3?ZfH`=@(cUiP}(gW9^2_34b{#dB|QkH-y -gy!yJC{^5sgcH{iKKmt3sd(HSoGKN!IDr<6cyXsaOM(Ct( -$FJ6})?-q*T}7x@9=N6B*|H9uiSf_T+i2|X_pgM9)zcWu+K@U0Ux?9mx1|&?qlK$T$H(eHzgTu%bIs6 -)@L{MzRKx0qiNRx{t>2mcs7AsJib@1*94RjIocG&w4(3?F(sH4oV;04rkfeZ7wh7Oty1$*fsJUj7O`r -NEAMqB5dc@zldj%l>RT|}-6Vi}Mv4FV?h{n -dVxI@JFm5`#=Bde^Y1zu_uNm5}uW5?vfbjtrz(`kBS@AsloBt^ON(Fi;0_5kx+b1X?G`0LSEo=$yyv~ -wvo0lfUMu$lk3y!3#)s19oNR{#>XfF=q8R)`@{`*wLM+C87TG=6*=z~jysuFA{ZcYPBz=FMOF>K%C8} -o@T&;b$W8)#q39yT&5%@)vq6<THG5Sb%td}Hz?m;~g4+h;w{6joD5`pVN+X3^5Nl0 -F>A413-Nw5PkcVI~<@%yhzNGBa$-lawMH|@A4X#+#f73LpoN^t72*6m-NeLH`1@#1q%W3?;OTvf`QgC -|)!uTp0peZ&}C9?h_BIjFN6s;^Vqd?uYSbJXFL8T6q -{4zpZt93icxtJ6(U!}P5nZ4%UkZoi?~GdoiN{<9a-{WA{Z?By*OZz|mcU`0R`4Qrpx5tR -_11Cz&kaOlfJdD0cJ#?UYB1TL0L=zOEhR(%4MtITVOh3#;YX`SIx~`QBK)DJwc?WDhW`I93c$2=psI5 -X-rY)o1ig`9ro7r>*bhSX1=vNkYu0d{b9Rn-2)taE-s6d2I)fk8lT_E`2EltgR65Q)3R)bp1lFf7;DE}rDtAydh -f3lv;0L%*Rm1Duq*FxTmA^fm)~3XEK4ac$*uFmngWym3lrB_T{kZe!x8E$)i)zFRe1Qr@#YdIsLzkPY -y(h#ZOczmAlc=$K)no9-tf{_P@1*`iaT-ZDC38RxJ5Nh{5v3bEhB6gl8-jOmCu)pHb6Ak!=POb`L{p@=-)$0jrIu)O(xvu|7u~=4>^*UIY!I$;i-k`g{xr7P5v5Y^rC8=vO+lw{eSuN$ -lmyK?Wv8wR5;Yte_(>UPqA3kXS+=sNKo9UhnM3ff&pymY3W2NHFM^B}@izwdR6w1<~&^Z(&CFwv{OdFypn)x2tpLgry<|Gd|V%KZ2wv~NpJ{ZZAh$P#WdrK}BY`vilV)!2nja&%~H- -KN$w^Q(UY6z#>s5dPu4zETIKW(8|ekZ0!Y1ZoGXbeCT)&4!OW0-v>R_xfcE26qj4Yi4pLIaTfk6@jW9U -(xe*9A*$5>nz^?E?$t}RFmg6b7g&zNoIU~W_tkK4yw-U`AaHS#xTfZ5r3f8xHrrQa+C!y{tjIk`B76E -7suF_dDfO-Pz1}0~g7-GQ}*jv23MPST@6%|}#Ks$nOv-I9bS71ht?iR{vpH{)83=LT8inBVLc?z+4)N -mFGyv9{~oo6v+c48yzqKi!dTOK$Od|Z}JBEb;#Lp+SfSqK8!mFDvFYD@wfSaOU~%aT}v<3n1WAOdBYu -b}}}Lr1J|WFn^vf=>&+N-081eqUuxS}QWuoS;k6JZ0NNwPNK86AQY&n0x>YO=4hRJa)4TZoxN_p>I=8 -p-o1o0ReL@4cBYb)8tx6^4WFIa{hLR&xt6Dq2Ok}1@)XvwP*-=^fM!o#d<-RgAMn3=EwX_H5G^oWe(~ -lpy?pTFW>)q)wSCfQGOq-VR#UmG^(l64v}(+BNGIgKBy*rTP}Y|*X-hx9(91gO27l58-SqAl_cS!E;) -_95+Ae``aTnaatUKxSQqg^E%A47Vd8W~AAh6BQ1y2i2vOd~8lapiWg7Bf(KtWU44h2l1go^gN -lD#x8`Zb!cm`Gir5(9gt^23UecD-#Pt^!tHQbr9!xU>LK!R7CpFQ)4w -gR`yS8P+74rl^(77R!;Z|I();@ZUU#9mRVtkg6y#$G50nf2B`f*4gyb6 -zZj21OV7c06A!;7X=0g_LhEC7&@Faj^VlU)R3ppBxtT9e0wAME)6TJ!ie%cZk_Mna=44GV!!kYy*4NeyR}mKT*IVYdVTM+6q -d!5CG)4BECNRh;UbJ=J-pLcDz7j|&2CS54+|GpvPR|w#>a~l|tv`k@**t959P>VgPn^@Dd|76AUCNps -*~xxH)u9kD1ZU%2g|E|P`8GATVk1)XOAv#sGI#|GN4&O>Lmx>kOu7LATquW~n>MkmHK|barsj92*2@x -ERd1kHIPMe26dSK1l|*_7Ego7VG3k~;WJ1E!r_(}ql@;P@(jQN&z`*tYy?n*s(t7hF<70fH<~v2#_pO -XnXeDEQJ_1`Z;8c^cCfL0qAWnJVtzPC~&p3*2(>XSn%c=)F4#ZmlU(UqS@b@2d611OjgK-AO8p^H>g4 -g78A>s8Kx9D76w>NWnE;9A`nCQ4xeDbS1XEP30>v3-*&IUHT+2ORCkut=e=9?jU&VjlgyDY -t*@UE-AM*gIO8*%XUBc~;!joK8#1_By8;F1(zCl4}lNI^jse_nHdcX(ZyH -_S4Y~p0_B#6-)EfzOqZ+jp959R~uG8(zoVp7r+l1+*+>jkOtN)@uqT=-;}_?+vUUrc>?O2(4rzIj<>0 -1O;xD@M{nr3d6nXstjkxgPrjRqmnT15OvPVL{^wP=IYZW+g-Nz#%A}-931iZSLY!weMTFO!BZ3Zh9Zl -QkG#_mP*5PfVx>~Ti`3MwZxrCn*=juL{gop9y;GngZs3@qq&YB7_+?-;QH-(U^)4$?`&~}QD$NFS#)b -K4ahaKWmaf8*!$yhw-;OUmD)?Wt= -T}1m<9eKl_rLZXt@&J@yt4&u_ZVwR@}e5dC^=xXcSW{L%%?#%73+!k<81b&D3i729GvJs$MoxN3B_DIB;=!vSw|1+Sy0~%gnvLF#<<~$v@)FOAL~FN1*SdPc3s;9*Jf -C56Kk%9iod$QlP56=KPG=6x$2(f<-o_HCHiOo -~`L!vj<{6f?^_?{!v`%y(SAsjxwv%a>c}t{r0?QT{y4Yi8UcoQyh3U&MfiK^jzBp4Z)`D#a`h0*4X4q -d?PwDdT?amihrg^QHlS;A;C#3_OJj51mOO*Q~kxt)W43(~vdT(Q!&T9H4&C#CbbARH(MDB24;DT?KA> -=%5WZyyEZoy#;dlO(&LL)qJYbJBoH?W?wCo^Lqx6+~BgZG_WnnB>f0cQ?rv%-u>laep1OjqQP71G;M; -UdUpOtHzqfxW0`Z)rfW(KA{>D#oJN5*9$2c#}u8H}6@wQgICoqtu!?klI8Y9O|;$@s+n-DuwB&Zc@NQ -L-Rvx$t}P!+vZSTatZf>|w6Zw1+)$w!BOx4@tK -1h#L%|WwDH#ek_V;DkPc?0lndy&-BQKC)ntP=@q=82Y{E%=z$)1q;_@137MrAj-fbRzyrDwhmu+9-0_ -qymooPZ_2f>D(96F=-F1Sr?m@eyq={PFtUg?L9W>c)1JECfsG4AsB+&Rwo -jeJhIj3t7;ps;q%B4_Uc18q`)yVcxR53H7fn4LhFTTYxV|)WsrHkI~Q}_)_pzC(I;%xyw5F -WW$Rt}yyF!6mCk)osO$6^^9BP0+x#l)g>}yS0W(6WRS>2(!DI_e0ig_CS0G*J;;2lm33eG(cO(;hpKh ->uw^`MXseVHtLvVLFO|D31zn!WWp*wJlTyzdo)5WIssx0Vm2=7a~I#-s2>g`{^$2`r8B225%yb{pd{F -kSYw`w%Q?eOhz%X)LotzHx5!1|xs1>?@p>by{9bE@RLsqC|Dn0-K05ib@}!xhd9ffK*?EZZoc_EhN=O?gD}=ZtKX%9h}1mXo>4 -*Hl)EL9=I|G=H3^Qq>a;ooSeKfjrQ3^R&c2a-MtN(W|hTvIhGCEoFjL7CN3{K&-lvrr5%F|wwUe}Bx_ -Jfw_a8Q`Wh;DvMVYpPIxO7+hQ^fRyP-BjC^ -xal{nti8T>w+w^8_*DKxB4*n$Z+_u|sk0u5m^n55J2o*X|38FQbFM&9Cs^#|K}`uO9wRzQW6VEtfH<^_KA^0P7&j_ -j(ycrs_@)-=QSqy;9?s^m+uo_(WaCpx-TbBpy`gix_YvN$ENO#*&M5j`eYJd>xPq&2ZVsbBOqbYFAO2 -B=}xBIh?-CvR2nm%Dw(Iy~C1jHJ69g=^`mCtmC7BI+@6UlmvtCBT&~oaz8wDu0Yg$r7ay$oKnt~3zM3 -5h4*&zLA9)sSgT7c@g^=9jtf)h6?>6-3tcTYvDG{Jj3L#F(5h68t^peFqRH1B@a@Y-RHr0~rmoeY8_g -s6;%1h|?nt7zE%QX}jz@6=_OhFP*BC4;~T7j*_s=~zpl>(O7!6S%y86@PmoAbZfeMJ8vN^1ukI1>4?BNnvESeAzxn?U!~YGrGl%!X -yO|!oe>l%~Vb$M*2ixht6YU4-?xDG>yb;j=E!zg=O`Dab+ExueRBKZ$@PBLVf9zF@fA-4Fl6SL%!%aN -5+Wu$odRI367w5qa3zXmojWde7MCti|${Hm|f4@cg{|V!qhC44F=B^tqZhlYW1?#lVIj5jR9;;SKF1j -$6ZvO|rebMGR@nv7Ns=pkcz5EVezx(Rh#l^|%m(Hcv -c6+MUtm7Q;)woN?Z&nYj^o7*HG%&}K`*<+}Kr4H2ku`qx|QRZ(`iGW+%Vv0Zhz2??BipCdL(vqp=?K?V -8AQLilBeRNmZ7k_3#c<*c+jb}Y74f4j`~qi|8Tr(qlG;if}`y3JHH*MeWvpuP -K(Fnklejx>QSvuXuoIubQ{uV0ljZh`z-Q6+AVCyEyozsiHW=m!;5M6og8Dc9eQ^%KQyQBbSZuIs}mA= -W>5sYcKVpHUt4`9Mhsr8JBtJ3ck4yq*kc!k{Kp - -Z`Bl*BJjsB?=nc8;=Ot#CdkU*ZLBtdqP6@-6x5k8%)@af{j-SOW+>ssHX=caZ*Xs_6My*d|Y -R9`DMi?69bOeB|R|v(q^wwxk1K;0C?=o?GM)j_(wXtvE?uno?XYPyWE=jrBk&`Rh*p`+YvE5nTYwoui -sO(gsvf~qbOoVRjb%@PYy6$!pt{CPH;p*h@hH<5g-`^is4zCf}AN{MR-`P!a49|g+BENkSeH=K#ptp3 -nK?(k8d*#H>(n1ViG_1*z&Ojwpi{x#^fjDW)F@GNWRbA(1Ni^LsmNrcogs-N_Kv?(L;M}X*T>vfqJb; -#qn)2{<^vO?#jgpc8-8A6wyd@x>%fFN`04dtKDVLk#UeF;bHo6&pDYs -|P}B#iOlIB;v<Ln2bHL7AqzyPdv6^pa!p@pTXc9cr1dPp|G!X60|XQR000O8B@~!Wyd7{y`Y!+gRmT7T9{>O -VaA|NaUv_0~WN&gWWNCABY-wUIWMOn+VqtS-E^vA6eQR^u$hF{i{R+e`7f6Mo=be;xmA#6snd`cKt?k -LoEscwU$fkr52yg&U5|h3Eeb1xc50LUqvPtblC1VljKHYu#^m+B^(~q;G!=r58EXw-oINS8gqd(%CgU -1JtvuDkE+m=_?eKvYF&c68U^DmCzKYz$RT#M}Ow!d!b?0vKB?}}Dr-!_|iQS@a~Pod^}A+nb*o}ImZe ->Uy!`>d!J*|RsVKfHVK=kGtfdG{V)Lb-!Sj~=}}dz*dvhi|fSwXVcU)I9@%F9!$9wpnGf*>clwS}~hp -nWpWtOB{?c(O;_ -<-By45Yq{pXWM`+UkI%~v+d8|Si!}~tlC`31Htk$=vgEv30Z>)`ecwXkFW$(Hx1#N!mil@n`dK%>2K- -F2@9S=}#$X{ow%<-NE>jmPF#{Tz$zey^Z$+_~iF<_IO -|rWdCg1#g_Wm#L;Jaw)&mZt(J3cr#n9Yi+0?Ikb&U2iSw!GZnbmWsP|1(g_i@NKfgjl#A?e_CTnJhoM -x_VJBn}MqKr?)^s`A6sz5}IhCOOoQIFuO15-Dt+Bm_gUieti4p-G}!Y#ZW$9Zx;aYNRE2?a|aC`JbUx -%)#>Z!(UL%8E5NHNdhq1T>PBNDTE{O -pyx$-z&SUZrT;l$2Mzfku94x6VSiRpZaMOIJP^*5dcE|_FwL697E*wm8gO1!Rm)^-vaj&2YNX3N)+wT -Se{{ltiP5xoB+hWM9eS>a46_F50e^!6C -|O0lAn$0V-&I?!BvY~_;5GV<#N_;YPWb?nf-etoWMe1w7FkFXq}3$P7iEjCp@qAE86Sm61`@f1i|)C+ -n!)@#A1p!lkIC)OZYfV;vP!0F7IrAzcovdF)HK%oqcY}9Yp<(#M%q#5;nJRM#h6RLUg8mN2%Fz3|0Z5@RK#{TGxGSp)BtdgS -tOMCt3uA0+iG`FTrpKLU7|)#mVDK;KX27mc9imB>I#!b6)gW+gT^g4>NR2egpu!I`HE`@8l)!N(N&sr -0fc5LZE6B|LL`jBm?6ZV2T%;~8E8;wn-mq>3-;AO)%H>i;(M8C{1%clkcs{q4lNV{(g3?8yOtRae+Sn -^8-hV2^(ELwIu^NRPokW@)d!mEC?i3&$vD^~$=@yo*&wB$&!BFE8!OWljZsBQLifS=)sC=k%|B1zIEd -W;2Q&?0}06(HPNlsydd7S+qvRVK_fm1;5<~O)T?nHhopwj{-w*gww>U>sIsG0&NzZCNV_yDXp3lYGE5XeuDhdngZlFy!MkqZduj~QdaeNr~GOLm1kIfM8dW0*bI#6dBa=6jX@ru7nw}HSKY{5in}I5_rH2NrzQvu#xt+1S8KwjmgN9vM)bIVc--gdsmMGaT -^XUjs$!(042?owLks2DQlk7N!Uy{&FW#(%Oee^m2_Q{#Z*1rUwkfs;oL+^2vEh+bv0#0OCaf3ZW3U~f -QtHR#66l8-3(Z#C|0BK7j}wevqg=$ywLQUQ;wGh6<5<0akxUD``e*x2#~M{6zin073>9d_saMs3NLh6{GSJS;V6pmbbF^NO1$bI83}D@?Hx=3)+B78M)-YH-?yrj;MJxb;QO9)w=$BGr$s( -}y8Ewoug;^7gPp}7pw4M+O(1&gnMkj%KQdtgL3+||@6q#}WUUtg%AOmZXMg3a|aK|s1?bZq5hO5S_=KGSC7T=^Wowi+DS?heH!s#u28aPzX*m^BfV#~tF7l)N;sP{R06Nz&Td}T+ -xkYEh?xFAu3$q#tD}vV+da{7D;H&Y`K`HFC{A?+f*m-gy;U^NoWa8s5<;Jczt4rWAW|EKfh^fXgDvD; -*=%7IdRJ|zLh3mT^_?KHb9Q4=6$c!FDM!Nx)(4YcVAA!cah5>F?qAlk(dI%HHAV8}^txG==v6hwJZ`V -Thza#&BY{kp)7f@D|V0b>IVh(&|$Z=4ud!g3mMu!*q_f*c9jtst0V-9XV@3v{?6k` -y{uU>BF`A!NbBHF3-fQFnUGgk}2ZV^U+vM}J&SHK8nagqVq8@?rtc -KEbO~7|$8N?-Ea~_n%C%u3w?WCsHpPYZ -KXt}qjf)=U7D#AiuT+U!-D4=SqYu#SfH3y!Ov*tONKW=&{6<2NH5JEi8%i*S=;`5Y;`4hQII|4%6nv|+13swUOqjH{?xF)56uCijM -<1P4r(b3(VJ_6}-CGA;u8016VS@T5WWZYKUDpwO?kXK#%YlWUV^0 -`Uq5rmTw;|~pc=ndcRK6bNPr7XMq#NhilWgSLO0NAVb*x58Rc~oIusVb9athDdvf -7R8BH{dT~WPfgt$m>(Z*p~VlhL$}DR@mYR?V7TKyFUJ#M -%13GLg9vz)-O|1FDM8^kzR3fwXx3k00$}J<(6RYu-i-{x6z29R16&kg=Abja5zj*Adw5niWzFzorjxQ -_lh*mN-A|%Y)SE3ZMvSt5^ZYh4HNiDM3Hwy#PUzvT9;b4h(1p#MV~15|>5t1z36@G<0*hY=jF1x -be5+%}>~Xyp6u^d_Tk>&ZJ2!Q6N5Ni~f{C?YfJX>0vjC3JcS>Mz=DB-WvFr^VC?^#@-r -a0X(~a!R7W>d*u|xMaiL=>!4%b-WylkO1__i5?1KK)(zAEhvXiv7J$+o)^;#xfra$QS6BNOi21OEWtZ;<8w$q&}& -t~kP;&dG}eJ}o@N;T2*7k?m$BE^Rk7{No(n34+H$K=CxAJ-1_qLda#B8T+b+{&K5-~^oEnPK>4%392} --qswq+Z}m4Li!VD98*z_9`Rh{iusoqZ&&-o&`qm8Dzi3D?$%CRmJ6-wQXY2D*?`#4t7DMN(E2M8Sc+U -7%mmXD`suIy#}0M|d?uTh2oEYT=JYe{!w4?_{jE4VGoQ=96F~1Djt=`vyc7tY5pEztGBsevvJ?T3DS4 -7gG-frok8p$RuMSr$1nWPa*oIp<-3TZ -q{in9!)J-?B5VxP&f?d^)#AW-pvrC&Lk_sIuwzx{&_-hF$8!a~#C|^}KCKFXd4fGfI#;S`|2(?TCWb- -L<#ZhTsNFo0+x~l5KgzN&=B~ziP@2o~wFdiBGDA!bW#BLGnPsK4VO=riD(sI9JJ$wzy7CUPDYlR2XPv -c^-QH;nnJTekB?a5JkX=((XL(6OE`U^2GQ#We>Nbg|c44m(I`|-ygrA$6rH4DL3VokxAqF5wdwUTXuN -Ut&eEuS}=ilcX^nv$|lT0r-vQ)iIK#u$#&a66bBw8BXxd5;=QcK)RMi293H-YlqaGfr2|17-1l+8%~Xsz*<{KMi -R}6A94{_nU#{psY%=Y*QRt2+gq_{jp@twBu6(LmG|W&18nmzwl0g*45}7y3h;Uxo -BT}BdR7&vC*lBY-vfqyHd~0h+(r|5<_~rFp^fW@x{*%n9bP1 -9GP5s<=Pxa#9jlX3Nc-CQlrOFFOFT|f>Yk>k79M%r(R1+C(g%nbaY7316N@~Da_dCy06<|Kl8JGf7+0 -d>#4p0Y6Kh;*2b`TFB4uB54`7nG1Dc970IZ3l**Em;ZrP0~Ap;AS4)wCdwFr0U3dZ+eW!c86HM -tdWpXNs=;Vku^q-+U!%O -s6yA660x$#JnC|0_p*dpl^B6&C4(Y?7?rQ*$`SfJHus$i)v664S^*?Qmuf -2*J{ukqxN$FWBJcC8GtnI&Zq*_$+xk4il_gpsIm-L9cf3c$tHefU#&3WQec|JL3H0djSYaO)>Iu1Z9? -+isUrHV?oqzkJ?S0u^*#@b%W~{*K|@T%Oy`tDrVj}H_q%3(azYX(=0X>pA!A(e$hvSAADAL$2nn+-Y} -71qg?glbSS4(SdoVLnHZ=?B -b8J4+3*46+pB{G~geug{ZR6reA!iB(m>n83=RoTTh(Z-PH$~rQ_GPpR1?a+Q^_1d=Da4i?W*Sb&1*HMyfaRoo7sXzjooU2L7fr-pNn -@X;LZdfqqdStV{og_-1XXVt6X;vSIEjnMC(cb!#2}a^o1zMV$#x~b;-kMeV#|Z05VZkr8BpySBd_0lI6LNThtsz&ILhT3rL0!AC?B-7#4WZDvazYq51Tk|V!T9G(2ZJ -m$e0}N8D$;xWA)qQk~9Otri`*PQO+mT_70nqbmU&N&R(L~{td>Zwopt1w9iNW;DIfa-P)x}<@*m*Fr} -*~seO^2Cb2xh#R9#S+Gf2+b$pQ7sd+j%@g_4lHR|M#Y0)5(oDcsYw#M}kp)%bj%^8?hO-0W&$HqHg;lTj}XnTRE8ATI~g~-x=QAu}rj?MJf(j?Hjo66^R-<^CE=~>}8sfnXn;`uLh6 -rrZ5>GA}FmHe@H^t=7!q`X`!ifv~jT(TE{Yy4~vZQIqnl6>N&ref#@D4WTNoZTVe%{Z%VN?PBuTX;ZZ -7HdL8CsP+n)6nrPMqW9R{@+0e^mMJGGldOOENHt=tgOz-wMTQp=nt~WiKoVeI|A!;YZ(U*VtCR&@qWj -L+Ii85I8kckbX`;v8@5K~hFgPFq*k;I`6ZrMr4{yy!eTc`Q8+gn8L-48BUv-ENwJ6IRc4Ic9A1aaeO(Fe2# -<8vto`2l_@DOUL0(rMV-q~bq#Jr5Jb)TCn21iye%dg=usviVEHFP9#7OcX3Ec@0r9d``Q?f^#m3Uhxb -!k;as8+J%c@V5D2j!L3ry=QQ60@&ClB%Ir5tiGKb%VDPFk)W;GU7zUZ>OsO1xJVVY<#fLsgvap0z7KW -rQQ=2-k^rm=0}&~8j1ilrouN3(bsvH|_>WG_tNlb%K5ZtmK(+6V=UfwaRp-Cct -OSZE*ljw6w-qlxS4T@*Ygj%Rmn#FnGuB(ulkjybCj)-jWOy#di$ULqG?gV8AeM3>T< -fiIi0}7G?P~B6lI2JS}>{BO-4b!Wl$ -#nB9%Rqx9KAVhv8Q_8}>%{CBQ7< -%j}u!8A?JNk$bsbtqq^M|NrC6BUt9rpn#~1$S!nk{7{M(oHkUA0r -_ZOj&9C&?b_k}>^$V+fT=_z{3kBN0dI)CB0tF+qE?%wi{rAwMF7(?(sC=yrGT=ek|nE1KzTgD+RE;Tr -hTO~beM3tSbj6?rdn4RF)O3QXvz5jUN``{KTG=2K!+Jw%XyNGd^6q!uZzl7>dvykcW}D9JvrTyP32Mk -Q!SGhQy)T2#sVKEdUf{!%%Zo3rz{JZ;lSJ^7>n6V=jJ0AoF~=@Bc%G{w0GQo@+U2aMR7oJp)M1c`g6B -C7BylN?iG+44(@x3l0(i02&HXDf?+~aqxL6FiybNF`T9e1G&(V1{6nX1c_U5-{E9qSgTc_2Pr|SnN~2 -*;s48c7bcc-cWb)=%frl%e<`)-7GB>=C({AsT4W7YDhHTRfX|6u@Khj`;iOW#%vJ2|j2^KSQYNY|`J; -QV?ITB(TK;ayivWbVY5EsrFGCr`w$aGT&3?FTH%pNRrQZyK|JQI(XR7ro_gx!Fcm&ae~Oq4QSDEre%_ -L+aap3-djjr=dCkbhai#EDE|B}z7Ne)Pq0z}x-$WWKA_Ia -tq8O?^zZqu-#@*VgtonGhYPY$xubJGnYwB8?_Ne#wavFD~7kRkP1}ifQ@Fl@R>ecH5FPeDf(Eq -c?Rq8^M#eX7Tt#&N37t`iXT1M%j4R!6ELS?TvVP__Fkl{std%4J#~>PQuVQ&;mo@JN+5gLp4$qK=@KO -Dk-L@Ow>)wu*ZxOn)XWc*^r{xkd;aHF0tA_CLNm!h1bnI7&;R%?_m(MYBCpJ_edhx^tC}go8ndsR95~ -n0ONS2JW!Jf)g_9B0=#@P%9T+@_<(4L>74*Vc~|ku&W(37cWQvdGfA -+o5DmN-B5;ERc0m8FKGKsYV=MZ5Z9xLwGQ=&aOQ*W-XJ_1&`*v!Qu2F>e~=Y09a^RwWi+%MrtB)ilej -!yclT%2^qH|pG!-?bRd&tuu-380ru>-$=5{t}Sm3`QU1CCs{cL3#W4yZI0S#rKioN!R1K&Einh?XCNb -?lmO|n>SZ=*{SrpRvSE|f&LEN{o2Z8iTm}0%DTB8DPGbdHr!jo5j$Tgh`NmCZ~Aj|tiH<5g -mgN%~}J;bp+XOT%^Poyd8v*mM^TQo+y7pY?^zt~# -+zT;%K3K8?fd!D6C$*a9!6>X_WDaXgoa*e%&yj7cZrwq*9U7jO2-)|Q;RzEVmE{3V66e-{b|La3lSd6 -jAq$`Og!i*zb+l=bX8)<7f6iqeF}3?w|dsx;R`J^xHGRzA@H_qcjj&19@?o1!9B4Q7Lyse`*#t4fX!t -}B-wq7374_U(%wU!8$=UN0(j7i_2U5B;@VtNj~fT{@va00s*}Z{VL255V_R{g-GHA&m0;Hq?4gKGYX) -;{GNC%~3}_br|L!r@(Y1|_1fA;W4mu#vdTphEcqCyD8Cge)XC%l(D|bG -eh@9EMM!bd`-as)v5$?curG6rdNG>_aP=~SoNlOQxfhGr-OlpxAg9r5SNwTLMoGFrtFyZ8+j*$md)Y6 -%uCkLGs_+zrC?sL^BFQ;dwQD7`%IBx8rMHD2!rt)S?kLmJHjwNZgbyi6q{QvAdzxSa -j2hzbmJvO0hsjo)_sSi$w_21cAviyW_yjy4L|1sf8`IM_I!KXTVtMNJt2#nEWel1bKNIWLe+;r~Lw!U -uH)Zhlq{)PnyHwzoVl6|BH%_N8|?qBbq3VXmWO@RoC%d*CptH^m#I-)8@QS05x%r}w -^jHlP)UZ=uy2V~;QqY+TJ@!S_Zmw-R1{K0R#>~tiiwVofc6eAY8eW2zc5tX+4Fd_B#aUbGi8^f4bmNe -89hR9u(%2@Jf`t%XsM9Y_Dk;_e9Rdgx(J5JQ=AOA1npVgp<=z{Tie=ZbH(v8OE8l6!GpAN2D&1nUNxhgNbUimP_DXh;D2*!IAqMJ3 -u%*VXQGKzguz6Iu?z;d{yGk=!w-xuYlR^^Ed0P?^T}P=y`m3H0GGl51;8GvUlc!eae=}Q)67zjbt+fc --2s~G+oJ9;{+D{r8C75)l^ZrR&E9Cb8w?Huqwh{?M&vC`q2IaPU5}MQtIROvMST$wxL+j3KU}lwZpyX -Xf&Ld@^Kz$%;^3!G69Mqnu-uym{AZALNe+a7(#`x -%p`%f7PQ;R!d^fL~LIf+N{95mI!EfyJ{xnfn{mHAy;tgqv@tiDqrv+nJh*%emNT8VS>g5<}P%H34p;6 -M0$U9R~om`OWWpru_belF%%bcSLLxE`75t76UU%Dvn{C$mDH2DX8m&Z@W+71{+d%_959p#XiCInT>Z1 -`2BThB8aV;)?8C0;58QE-vUN0Hw=SgR7QQhVPbKTHOXD3MLa*@k8Tjc3O4Kgm}>k;~vCvS-O&A;vQv{886HTFh|jKO-t7q+@R~Xn@sS=z;z1})`|D1h5oN7wsL!N=HH}w}6vLX)AB%PG~(T8L-Eez3tvqMZZ?r{2nml8 -PpRz~bG-$Uz>uA+U5u~>0TekN&`X1z0JoIcJ>M&z?e#b}34p|91sCS2au5Qe$Q-k!?z2Zwf%Llw0~OV -w7A_!0%H=&_FJ#B1h*5R%XBj(?2g@OJ2bpzvdR24V%B`M~uf= -iz>mZ6<T$+J%Q6$&f;XO@@`)+&arSj774yl#HVDj!iWyZ25a{It1PZM`!`_Ix5Lew#^6DXoCli|d; -dlT0EM{SX*`5oK48!NEAN_4y8+%jJ)_~r(>9sCmaWLr#kZ)?N%D!4tQ&8-*WA1k4HWM4UkSO`L14^}pb4jWO;rpNS4z#lpG)A -W~m>YkXil`_2qBHY|t2aD3&YHT&YO1)DOZ88RKb^}B6LBd0%sVf9W5(%`%oeDfa9Z-d@^6Ze&mHnQQc -F;(@BjTyO&719+FB!JI@igd%cs;|ys|5WGEeu?{@E?tId=bs;c3@<3rXD7LWMF)K|TQrKU;D2ad -B4)u9t!c031TArwAY{t8B76SkgPMEIAjkrcI)>J*$hmX4v{?oEUxLQS5re_N0KoWTXd4MVb&gi1A(2j -3uu7+u%swLxKBmvHt_e-A-5aNfIV_LSg^umZa6sq>_Wt7Hs48y+y7}9}ZJ#R!V?o}6-j@V(v5Q)o1wQ -J?>!U@<=yWvazx`A{a?igo*}@X)66y6QV{fsOgGGFX^QLO}wDE$91=CFYw5+pXvT@LbNYXfp1esYUzZ3oX -FXxl@+Tw9*=>1hW$Bag>q=)t=--;GJxwzA4YGqhUZK6xVNma12Zr`cw7<{+bsX_EGa)kRiBv+47}+u1Qa~yk-)8^Xckb2BLKqZ2pW4puHjZtCua}3={^2*ypT#{-`vE`e%i+2GWK#km&3ly!S;KTw?f8ZO|E3u?S& -oeP9$?4PM`JFM-x<>`-2~REH#qWe6o!-ZtbR-30qFoYwMS6zuv1a*v1jboAX1+DSt9fb!0qaBAWqR=5 -DHO*dcm>)GZ(lJ*^TuXc@SHo5_zR_=n@e)3KW_8UEkdd9=~9U;!HG>#m~3k_-s9pPSgG$KcXmt07gzg -T4gVAM5m(9f6lPDoPAj$tIJOn=k{R`vDt0F3Qkr17acIAylwA=wwx&cjdSl*fYiE(#u>(s&Wz|^6P|( -kv{{TlxG)3z}jbf9ZpZg|LFIb5j+>HS5N>4=xjMt3ra-8vx5&y%J#i%?9wiU*%^A(vmc~j7tOKD|rSs -{)n{BER!2Z;`(BVX;Z$iTD9O<650BZT(zON;^qBE4gV<(%L3)E4_h4-5Ig<;ohaL+oo+dn#dj$}KN)b -BL59mxI%cUNnTuXvmY>=*}abnaKa=6SoD4AqSYMXS*P{lI42vP^`DGYLLaaob*;mw+nYxm^Q1xAP#k? -cJ_Z5S#(gtyo^gIEJ(8&R9}eOSr}`~`PF~1&w+VSw6QoWj%lN-1Bh^^@&$ThqQ`Q+uk}%}zcA7g@%5Z -vfQ}aTM|`p6QYl1!W03jg46GPhY#0R2*$=x4h&egp{&Mt%lHW05Z_jEQ_^vm2-puvGo4cYYVMcrjTG)wP6~87Rij)x#FINE* -)3-%sV?&kp!ZgQX>}!P3S~+OWtQ;d%TVq78Q^ -WL8wZFhxo$C2?iWAf>7L%r|jhB-CM$bEvansyjOmjO0=m#8F4gcO~t8{Y$Hz7@xx4T}s`ru^eKrZx#) -z6+|q-?j2QEs7D2n(o}TU#3O;TV4OL($wnMPv$9Lz(Fk}mT{m`M4|GSnvRt9kZRT|HHrAVufme-6tLY -JuXdP->>A6tYpoe<&*%(JBEk>Ga-ZB*H2?Y`Kd^rv(1ke*smx|lb7(ds@zzBV}%i3B&QYbF|0Sibqh1 -=@?y?%b9^@F+%T3bvW62Uu`PHbo8H(WfnhJcDgeEqCtTt~c1;R>Sia)JQr@Cw4h8bRt9v~38|MvPb@^LGU+Bxr0%;8O=;w^^+)R^=q)1_^Dse2YQN -Z}IBN>!wl(71bxk;A&wXBGkQ>-*nm=_(#36^3_c!Jc4cm4Z*nhWX>)XJX<{#FZe(S6E^vA6JZq2Kwzc2)SMb_3q)B -GwN7|rw+r5D6Y?=ie$5^lXfNRWXB+d-88cCO;c0Il5fA4va67`y$*v3T~L@>M>i99?!?{i4%p*a2GR3 -t^J^39p3&HD8B_~hi_$wTp?DEC@zwnl_6X5!hCr(cP`s65__H}Q|EjG)C!mB_r3sW62wTPa@e&9=zJn -__M5VlBnDMV+UyQSc0Iq!uv@l^d;AwJG4&MoYPqxj|TOq!ceNUtGL;a}k*jM#On4Ui|Rt`s(seZ?Av2 -dV>$4-HFvNYn79$si&Xs=UR?{@peRM!(~6S=3~sLH?uE(jn{$i7aBT^SqKDE#jF`t_gUN+r*0v;7 -Wel1V)mSMq;rS(&-O*RSKMx+`@0{YK9Tm%&x*tc-Of=VDc>EL{|(%n?iloX9r|voB>ev*RPR+~`T1Y- -PFtij`8E{apN0m5WqC&o@%vO8r_FAND6FNPFPzxnn}Kk>({m3m1z#-pR#cc5?E~#kbGjzPw&szWV0kZ -_qf{8dFwhj~|!&Qbi?6PE_a({SKPuR~OG;evi%h@kx@wbj9m9xrsOO5`^kQSgd}OiJ37Y9z1wJf3LTy -65LqJQp*a&tOEHfxu;OrRWP;HDwE<)nJozL>&v+($^^;|CTO&%8HH|EB;k4w7_NfT=DOZqRtxxNzLP* -OV)TMWTtJ6cX?*qf#cu+Jkjk}Kz)NKoi?EW}dXD@$e^untPRXAZUYF2T#hI!kC<#oYGI5^B=%i_I2Hc -K!2<8mvAjR9Om!eqHvkk{2wM&%>{_Q23cI|c*8@HY=>_67K~ckK8OqT!W-%be|Zohg -UUrn;uy@WSOy;H@zOC;yRWigpz>Q_M2aF-R0?d`{!Bco0`W);(V-`$Ro2Cpbs1)WobEQNs%!!3g`630 -uqiiF&llSQX4QL1vW;3F7FCqW+q}*)nCe|H6LBRfmEUxy`%t`v>EbA>Jql=CX9j2hGNM6HK^FL14@A@M6q&n?+O;ash9--3^{->`wYOVvC#cXCotjGv`4_%w5ZKFPI|&zPG8VhYE6A-qkTc-5SerFWE@ih(sFQI#qe5zg4_(=TJQ728_)CfFQl?(S-=)A&~ -)kq)NQu|sUuC9FfD(UhAaWvEc67Gu$_oaDmPNc2{E)Wm!hM^Rcjm0v^2HO&j_FeGj2K9dAcFN1w!cHc -}WTvlqXz+_K1M%fjC{gc){Z}T~eU756iPQjAplAn9f=nj@YULB)o#w)`I|X;shnKOC!>`x&+1C6-ID%^Lmfayf@zPTk;F18%v5$z;3blEN$Kp)0?1Y&}-|a1sz(q(1=$R-^$~~>kYI%EMAfLdr^yBU15+6jVoZ1FB`(w3t -vopIatXxY9ZQC)OLfSwv!MNrCyxzd=smD?nwYNs%<(jBCyj@gEiP%rVyn;Xj6HN{oGQvsDKsH2~bCD= -3U9~cr--t0E=E=WAu|lx_9YK>{&^fBai0vo&$}zwRO@38|YggSQ)1xyz43eZ~`L$3UoTsZeJW1-ZbD4 -wFU%<)`|qn6a5kuq?eC)gkQAb+@kq+IDRX4QJjLRTX#IjBG -k32i)S`?)pb8L8)NATY9-MP0ErNeqo{RSLS|Kn~+~_vTDI7iW~poGrh%&z4Qxk7z>n0ANAhG8qGJVu9 -3{4sMW}HX;&vy;}jo=-!>YHE(tC&2zj<$pR3*lL`z|=ca0dfNOhG9o-v?ggKzKRJBlDz4<-$G<(?}V)15D=P- -FrXWu=KFKATdpwKKAc43PddP$tY07b71&3enfBEh`&`b0}nw5A&g$tQ$~=B9zxf7ZpF)0MZlqeg8^2P -9K>GWjsa!?PXOv#>Y+m5@GMzbu~Fcg=!r{h87&c#2f_huIRdmV+s~ptFmBG^Y*!eZkVeF8cy*_;Oc?M -L=n3~&KTzeQN`M>AWn$WT7*MFJjROyO`m-Hi#PqZi1kFMyaS2%)$CHE_6VDXmx^TBunH1N$?%DSW<%5 -u*#2bNx-2_J2g1|7R7-k{_4bn&yHSiHwGYn>tM#E9|!19zLo<&%7Uvk|D0Iljx7(A+6>Ks}zn|TJDkx -#OsLd+ZSL|fNOItHuc903CgrZZH&O090eq$1r!qj;7C -gOMF^+o_X?gVO=uKyg0^aI&QuF+`RXA%dNzk)SbEF1TEh*Z_F6yfqEPxzYfWC|5)A== -&;o44oP+R_+=Zco4|k{=9e{5u#LI{}9Q57+#Cr$*P2N5lnLH^iq0brqXr%X4d`*UtG#;EiCAK(5Lk?Q -T-M_Y=o8yf3N<#WDJ^Php2O1r8oe%6vi{%-ren;&wZ?*Xf1QvTE?W%_}GJdgT$(K`gKI7IHj_Cg565sl@0{}~|EeOC5hP} -!W6;fpVLG`}|SS4f#4HaF-VNKES-y$}Q`VhfoO$W0RCt2-%n@gCAvvhuy+Mv_VJUtCfh)L6ahX=~G-0 -+JkIhXzoR=A3IE9Ib;K0Gj8a;|r)?#J8^e?O6o#6yC+!&wI?XqroFTEqJ({TZ;PNpAEnt$yx%c^5{-O -5)-yPW}~e-p&`Gxi&bY=CO?UhIP{;9n8%u+@a$_yL@ESc~o%u2DzNfyn -;Ep*nclB1n^&b_|bB#D5J|=cdY^2)51bVjxe-Hd*5Gn+T4y$b2 ->-!m)rkZTig%rfuOxD!nK;+PRCO?&9G$qX-KuDokLxT;Y!em_wQQ -@u{6iBgs4yCl4?gyD5#4;6fV9Ed0fV(*xu*MI^q3!AXbvdxbEMVc0g$xGU-`Jpc_v2&P18hOv5q+bQn -Q@<0|qeX#{n1e$#nJsX+iFW3qGJk|&tEk3r8B73 -_+TwT{zaE9ewTSS1w2HB6uH)SkP*bPcud<(9Rs#m8BjDpLc8;8rRl0)eIn4=AuKVz^l3^dyPPVF#(Uh -#IPbr(%+!I{Xp;C*TS+EMzuMXENu!eY0aM({9fdd;G({J>3oE^Xsyzx#UFm7m|&JB{j+grb*byOp3b5 -fB8n%e_KU0BkcwQqUH%$~J%6Z{+MgymYsHF#EQDbKh&zk_Q^KKl*9EPYlfd{oh{h-x2^(!ZO3VFhElV -dKw%m$<13P&ffPlf~2j>@m4zA`)TPQWeDX_3^pm%H7;;zzFV7IzLG4ktSxeumNH0KY@4%CB=BSdB~GbM_fK$Hb| -?sE~4my#o%iaP$zC!E}8UOv%^hdqeS>ma^?!6NgWOakp?>8%DwOk9J)q_?trugEAKBN*d}0ES}F$j1{ -(QCgcyVo^gJrKU|;Cu+Y2=KMcb8IH2rAjKifci2%w=P77}2j+8+i2$1JrL+<7e^1$MDcYt;C`#Biq`Z -!`d-6b8-*H8^_)e$-3wJRG`S>%*3i5&jf2h~*UCAkte%X?($=4Mq^R_UEBk=hGLY8L2}{(nAan6d2oe -lf#Ru?bU!EnnIrppKDAGPX+I(>J9iyUx99U{p%X^(QDAXwsx1-5sLfS)?!;LVl7BB^k=Xk$5@cR(6DG -hni?~jj$aMNFWO+}TA~JZ*B0);V%Wn+fCQ%X;#-KTD({30y5lVlF0Bk#BdmgN -vCu&NYYTzy`nNlrWekghKD<$5p4({GSAA -w8UaGn;$H${PBMCkc{+_K!A(jNO>`BxbKTQZ1Z6lgnB)N-Se*rdc3Ju!6V>=%nT1#0ju~ru>mos|`g+ ->K`VPW-o*PBtR%66k8oe8N(H^xM_C$VFc>k09scd=4D8Xoey;Tc)Hx&hg%!U1YH;<<}q?HaeJRL;kSw -o)lVjHBnwliA1tRmak%?8`St)X6Pp yuOidDe8T$9oR+Hzp+pJfQ>`wig-n`wS1jF_BG9hQz1sV@d -AW~8RP$vaaVK={dY>vFHf0b@)6CTb|#@gU`FRFsA$Q|2Ewnnle9uFPCe4_x;1zk4YM)$UC+d7=!&X#S -{b=g0{9H-zj)&-u%vwMvA>k|;_gWbww{AK~z#AnfmUPnOrPV(U_oH00GqxX;3Do6LyEyu3Q(PJF;`wS -r-XX^51^bGTswpG!#`gIv0(&5k`tg<4xsnkC)8T$Rx|9&=7rlxnNPe;mVF~&nr#$o35ZuBMSzyn)XIR -*A_%=Q5)wncXQ@Ug`~VZ3A*?}t;v5U8~}TlAQ|s4aCXg- -6%)YYWjfp_}Oiq1u){va{=V!p~i;+VYa*84m4_PV}Hr71Ie~<3rYvzHL?Ks4MoU~cpsa1l0TJIR<%Y} -UVspTjeQSofac7~rr;RmZd+v1?kfOP+2HuDgoN{dK-Br9CGz5r^zf*7dw^VE4PgxSB}coKNdv(JqJt- -n#G@3Czo1cjl+w=QY8a3|5+UMYiQ*e$o&g!5SU3j+hLs`+3cDhIZsVe0Pv4%maxk{s*a3mtqqy6U9aE -XeqbAtgsfuu;$N*3DG=arY=^T;u5gvmFBHF`1jZ<|-|5!l%%Mp=hH#@>-x-{69ah%6&GNO*n=Y$A;O> -OLyv^TpS_%y{f>ob<t4?A$n+JYtypDl4> -pPd0MKgHC;M;&~dE#w{iCx14}Fb6bVOyaRcJHLTcc=>fpc`UOZ_c -h+Tu-20nni73pItWTVK2y;JCegZ-M(BL#ppRj}b>Va+C`Pg1p=BNeEnwP)N_<@IPnczqGJ|N}2FYkF+8?} -@8RjaR}C*JXvey-^%yAE7rC)Jw{Znq7<3wafi(FnbP69yEd2Uv*sH&9Ch1QY-O00;mj6qrs-lC)GsGX -MZ|$^ZZ#0001RX>c!Jc4cm4Z*nhWX>)XJX<{#IZ)0I}Z*p@kaCz;0Yj@j5vfy|93Pc(&z=VQr<*_rG$ -hjWJnfRW>@!HPZ?2#1;BtQxy5?}yOGBeJ9-+FbUyU_qCJF_=?&f+8%33gY%s_Wg=N5S#O$HA;j^I~xt -Y?}G;pYhGX(ZNyhq+D;Sd~wwT(UVbd^5EggG5qs+@Q=Jmw!y39pZPk5V&CPntf;dzXv(0u%7Pc$=Bg} -$SLM99O{y&TrrZ>1(&X?CK4evpKzl_~<zB -{|_T%dxUcSPYQ10L$U#-ik2^PQR>w|e!u7bP_BP?Rvho2)V`r<>JkJJBG5q&DD5n -O~Rr^ngbbt9oDObpx-TQj0K!^7E`*L2p%|Xj3i!S?0w!fDh}Wsx$huDca8`IJhEN!8i5k1YVD+kDce2 -O}2rOzii3|s~1^4OV;qIhE*#TlV-cl>TxjLupnG7w%%EF!GbW%k>*L_Zm*3H+k<1I=SuzFS=JXMw!PJedZ!cgL#=$DN&L%0mminu#Nf3sr|Gj -)4>rc;$n`D`%)T&ehcuTz$vt)LarIU39^HMcioNicy$*js!!0|j;!oHf3I68Rp?ce)`ShAHRD&dG`G4r$0 -gE@TzIn_38cl>+L#^*F+HGvRcsh@ZccL<}{CfTe;Q?=eW>XabR0_;W0a -XgFi}JPzrdyzyK@N2GZA_I;0SA&5l7Q3THBe{RF+n*eLT#3+2=;04I9LK`EP>51%x+_`)vtVx;9-#i? -DVNdM0|M`SaU_2X{9r^yH4Vmx`zY08?B`^i%&wCKOc@uS17}(;jVfF= -3TMl*&cYECJD9<)s{@DnL>`Ld%>LtmYXX85Bl!4E~2SNUud2hU*5g6~Sk&fp4oi?E<0nYlV32=| -le47OwgP3Frwm}awNgA}s~>SS9}XLzRvVJP)sX{Y641EdRfH(=nb+2A}=ovU)QOap{~H7h34VJ$Tg-E -cH5)R>sOOjKUin=Ckb_~{pa`GThjw+8N>Nrp6K^67(#EQoXlBr&wdp!+YfO9bnSd|)!)08xaO(P$jFpauL@QYTGQMKW}l!zx=ZlUX -+5H|})eBV}W|WCXM3ZzfyTSuYftZ0I{zbP1G)mc;v_v|scYeAFg5pt@E=4-r4i7oWN>{-^umL{UiE9A -y=iQxrQo#E|F}mqg57a_KrahOG`P9qCBY@axRtAPzaK%S{E#0UQ>jBK#RT6oqkR?-Lg4+bR8?cF0(#)=6;<`Z95}-N)3nWOOdH@RdAQuDLk}Q(Es2d`c)J7{Z1-E%~#q@Pk6sR& -VAf}>3`a2B=C6uqYE!ZL;{%{{B1RIE6q83dNd1yQ-W*I_A+R<)+QUW1eZ*NdYPo_EiQ_ZeMGVbnx37p -ZC&_Sl|AWtky5Ts#H_Jnuw;1gT~Tqm^%$QmY-ya3U7B0Grb%ULM%Yi@jnVE8gw=mJ$zKvUCtQn&yMJuRyypTrt37SGI0h(N|vspgRv$_u&0 -+?-pp+WmEp1wGSu9Pbf{{ep$z+>XYmzUu(TO_k>czM|eEN84yJrtoHHUum^BDS?_5o2C#Up$Mw6O5}7 -Pe}KHwfxs__792+NEZz@t7aMy4P>EO%TXesUNQBg#?ALY!W&qQRXsLf-DWg$z@q@AR@O^{Dxqxv)Tjv -lxq;Q&)HpUE+gKpBJ1TX~EY&u0WyR6RX!Y6L)Xt(2vep?0M=+1KqW`-T-yZyhnakg4F+i0{~q_K1g^$>O%&|qNEH=wL%q -fSxoQVgmf?7PS*Af_P`)KlzOw?(vp<;5nmelY7bNqs#@VM(HqF M+=X@-W}s+Pdo08gEZ1F!RkG!^ -m}Vf|lXl*-97n-_;vRz8AsiJbXr*heDkgBNAh}JpHX0ddGID!OM8oa0K~G{TX4adu#t65b%nw%=YSY% -M?RsNoj-6&TxuT!BzJ8|+JJG~6i5Q^Wjw;H)Es}}Fzc}BZF*I1@H?Rg$i7Y?x5@Zb|!XVhdTCLY)K)e -C%4cVyXL%6+73s)b@ePf%R+~&(A!bYlwB8 -3K|3MjqMq;$xKK<26EAeNH=bDOhns-Pi_>LC>g7JXhe&)UI|VJZq=kRslWQYqbPoS{R~JT{p<$QyJJf -%e*F$UdIeO04*|kKzxEd5B20wLcI>TIxwe6U&$g3o&gyX0)0hS-_4glPzFTi4(i_PbNq>retyltyj1X -*ET1UZKSGTwnUv8%>#L1Hg!4#j!K+ktqTK?t8P+Ri?EO0ua6p-*)Ul+Yo(GfJTGghXJwUCZ8uPcKy=kKiNhxe+796h>_Wk^vi+o)mn)UvHdWN?pEiz6Y)tv1#XC1 -4s1BMsTDQ9*VL*CElGxX2nHUR@)FGv=}G_t@y`SWkpOrx*!r{Cdb9t3DZqu?ID0)CO)#LLXE(0pF&;G -Xiuv0?MU%3har^6RD3np&AQlR<{O9#1*BVp$Xikuo~1QH^81#iZ>f9=*lzKcp27lg$@8zjDDU0+!h*-i`iswO{Q=FK*U0HIngOeIDlyJgHtq(!1 -=JLGX(A;;wR&>>(C6>(~52$pgv(}}m#Nyq31;2uHgt{`o8>7iRoe*B0#+^x*6s5s3){ft6jy8#;rk-y -xl*zR%_z$S|`x>_1C#g8uLfL48{O>ug&Ghd7+Wad0S8d)U&HLp61Wv;>DR3x|Jg -<>4_K4h^vWWg*N#cd98EJY-SuWaP>yw1l=Zm@ABsHF$nF869-#f^9<(^+@;zg&vUaI$6~iUXWEF=FdS -A>t*4vrucijEN{{B5`#QhHNtqa#o{d7L*chKHrNSjY-WA@q00t*qj<84n@Fb2bA&1z -6&mx0l&>}gMyi*gLOvH<-F0IcFgRc_X%tk)$lP92=_u|4l)l`n9vQSiZ_7NdQ7jYx$b&W|5n5Z}Ka?w -&>i;Q1+3bfI=cBD>dKvx^d|SZuN7F#|l>dTcpIqzhNN>9&B6jR4dZfo$Qy!lT&Z?|`4gtC1Th(RG1$D -iq{wa0Sf$TC)LI8=Iye_7U5jZVR0LhV+L1SO0c^C&X3&d5jJWmzS-ltEiZi;aZ9w>S~&|4A%o%0#({r -s3>wtlG-YF_PjY%EDT4Z9i3ru`na6|@8%^hW=66ZY%&k+Fsy@YQmWJp&Yn!&3;JIw>ILS#L1B+@5`nbq{Dj6dK -PlT*P&lZa#NjY(T=rtiq0zGqL;iH{pWRvO`q;o%_NwxlsgcF}T6Hk1OL -J9Z6AW<|hJomwEhDdTZd{z%H^tnse(YQuXy#P8PIf5=Ilc8kiGaa6T)H-2-FAVNcF>Hk2 -?9v@4Y|+M|qEw-N)n~*Lt1roxV&^wBndz2%;baDGSd9^vEV^Sgln{HUI&A1iFC`8w2~LhFupo#`VRl5 -~K8DqeX`{2TKX}3>lx6Ew!akr=7?d+4BCo!EeDe7hW42>_|MllPOc$N7EbIfvWz|;+KtjH}N6tfk3p5pI?1t8$sv)J4!QE%V%BnI%Q*ZPKilLhwX|FSN-@+3-w@ogWW`e`AyJx -?D$0gWKs>%Ar|AZEZ`H(;?DoRqWNqo@g`sxfHh9@+zfWTsJ!Kd_e6JcsgV~a=4wu!Wa=3qkS8rw_2gp -A6n0XkPpHnU5n%Q2!V-TTsT|pJmhM1cySKDdngv_!)Yv`KM3w43*M>If3u|Y&afX_zq6ylOG@Df=uuo -}jYJJa?G$EBG#bT8n%Y(fnjdl7Nz3k7)%waDw;NQvq&nhH2kfKmTZIUpajZd)doE`itrdM_S*Dd6p99 -ITDEUu}KI&!-YAjJt#*Y~PZF*x3+75z5Sq9O=_`xW|Ex69At7P39s6-D}d2|*)t#R;WaDsn6!mpo>Lb -n^nY@DJY?eY>;rIJHC!YQ^4t{8@XLkmL9)*Hz!>+l_2%JA9C+z8^=?T5mE ->IMhU`)t+E-zW`4C>A7s@tx$vNPqOSL3(?YpX~raL$QD#%GI~Rd;ZYl8@Rwn#5XH60jm@Vb#3~d8M~y -9a!N6b#zFW6RXsIlCW}l5mm9b9a{&H!l-Tp(Y<;UjupT$@}?}3Z=<+9kfI=IulHFS+@f@aDz0 -QNy+*dCTJq|r*DNv-IR$}9(fS_c$Q$m2kJm0JP2iqW-DP{~^?>f>+IeAW(-s8#T=XhmzmI-N_C8Ifa7 -QC}oLA^roY#}~*I^ZrR!D`A^>k%-ce;bFuX7I4FiBiE2*7%jpo9AYh(9Ug*Lv1szhS^NBkiwDxmF|!b -l}#=TUHz1vRx~OF_O4X24+@vBNf4|_^>;*YU|W=yp4;Fac`apnSqa8*CdwO;%S}T82 -fpgQ;t{zSB)eh~-ms+#z94)Eh>}^veo?R`Wjr=ppuJX|%M`=^mgeY0t6AGPFRN-I0jp(~0VcBx69WhL -+kahqn@)QZlu6yC0RX_u6*)BSNZRWfYNpS*J-v>ar>KE7phXj`X~lNadWfBE8xI)EX6of8Ez+6_`g;`P{{ZgShwAX41R0vi%hjvDEjDs|7enom1QFCOk_E`>3fI -f-hAAfueTikNb>=T{uN{H4OMvj}O#g~D1!uh$;)8K`Up5|yd5M6nqVH7Yyn^|u#9+i#k^afpTN9R;A?9mWm0hp+u9H!@M}vFT!~BCm!>C*AB#eaYD2pg -+C$=(WrTQ{U -5qKE?Z5MyyIbb_4Y&`+>F`xCIb{X*hY&Ggy3fkAORLw*eR(^w~}NEhatyyR1PDH*A^Vf4=(R`CYjo)( -h(ZtHP`_Sv609rvMLxm#`_eAc(DU33s1w3btEfm>j{Q010*c7kMOLH!w#!JM`W>ujMAjfZl_hnCT;U* -8eb!qCa?@Yy&!STuwQ)@WOu|_ppx{Ta!6PYyN%A5QFv!N_WD+)9vJU)Kh4Ctu_!J5Tid`^cP}}~hw2xQJVDUY`uNfJV@_r8qB)M)ytt-+*ft*-1x>HDdCJJ8+azL(VR(TgJ>9Jh4rgrk|2Sl5 -|W-5Z2a%LJ>^(03r~E09OMil0X4GXuScEmqvOWQlut8>FWGrk?U{8&j&N4Je=XDer>hMuqpnbYqn7;|ubE*%#f9`eu;jx+539>+&+^u~T?23DsZA!HG_xJ-Uj|9 --SPX{2@{^2GWh#<`}TV&X={05Ry9Q83j3k$djdF@iXW^kLd^WS%1b2J~l^% -s!Uu2HJ!8KxO5$l?#VU;>xV8hG^y50Oz4Mx_av{j$10ek$`;vMK5ECY70R71h90yA3q16>7qctO`H>g -bV||pnre7MSL0NEkRb}(TAj^rC=c`qg=1G%5%WL#trdcZRO8ZytDhvoSSp|nc)(=~#oJ^x_gp*sy`7( -hAGS)JwlsPLcHz;qCXop!aV6gft+wawvV;KpskrYof3OJmEWmYTzmUu(6w>bUnVTcKiG_W#;;p|7y^* -5Ap3{#GMb$S?m_2Nr-_wdpA&xaQuj}G63^5z8IgzzSOCoevQ7muLYn*!dB;KL`QuMV)44m>4hldwmMbOyc -ql-^QF3|oQAe<1d|6HQqyx68x`LW1RDyPlU;=7!SVq2q`-(!YM8}*lgOc+Y?He)PYEsnl-?Sm^#ys#_ -~M+|U@G}NK91a1p*m>_y6b2q`$q{XCimm@s?IXV9I!SP@I^glis-#`89*;oG&AKjb0dGqf0Lg&aM2>; -<^H`Gglq+lO4Q)aYQ3Fc^bVO>s0Lrc(pL~d`e$@ -xt?S|+P$ngAUL!h84boxDX -W2I$a{+W8MgquxL$lC0S20OPiD+Wc2W{!dBHz(IspCHa*xsHUP1PCQa4j^;=?T!2;Zt;i&c -ixoCeMLgA42zLe0)>i@slSdPRP#SF%5ct%Z-ZsgUY7wu62lS@Jicn66nMEMpN-H|ISUT$T%9t -VU8N8TcYK?iouQfiK+1>!L0jY<%NT+KLAKckZJLH=6?)u-wq;8c|b9km^)BbsaG^02B*`&tv!!DcTpP -F*QYNDHA%Puxe(#ciHkp&(w81+M^i7KE7ScalW?J~w1LjmKP(-cs>YaFLaP9DF6S-p--_F!Zl`|R^m% -)6#i$W4h~GGstPIwnnxIXNwnCfEv+HX)vGfY<{uLY@R_Uf9qcYrARy1Hws%uW1L) -O5lTe!5JDcB^>#HFqmDT@-g*|M7J_%mJ1Lxlceni8j5XUy>qHKLRoUvO#nNnJS~nhj}IT77$nV -Uc}T8)Eu*2F7d#A()}Yxp^XurmbevX)1!O3%K}{(z1m{rF1(UYDCD0T%0-Afi0-j}0nGSWV)0Hf5GN8qk;2NbQ(KvN};%Pf{!-D%3z+_k6Ln6g)3c1KU1p*b>V-%@&0kv_5^EWUI1>Y$ --#2#pC8q;vK8UD$=Ym_0!t~$j&~Cmw^hT)F4A-&}$P!(=D`D@Rb4h3Gf+2V9r~H>!@L2o62gl67pP^e -OcU|gBHLUTH6eewpb)#IvB|9@y#A?Dc21vw>_$C)ex#-14-cLJp;J_Kz> -L*N%!Le#fz%p+{9Q*3QI_eabl)fKMkqyj|7WwvNLPHl49@eYyy~()2#fkTP(bmt}5w1BzQ-Y~D_y{7w -4jFW$ZV^B0pZK6{r`E4scp9*G{^AdPTzKB_4 -*pqp0mv&ptCld9#}y-)+fA_p7fO$jG36R+Y4ppvV$3LQ_euC(1~Goc2;G9DcUqJ^(Jp9kK4i`P>G{^BHO-khCqdDsCnM{LR6S2m -3N5m1)2O;T+O`=VCGtt4&Lq+<|W5(8TOm}18OEXg`W#*iaP9Rv%-WJK3SFzEiXUmH96VvapB{iYid~A -|WQ!*SnDS$RtvVGcTIWd8MKHDslj*ZpG8%iBadvsn)%<~#JC;Xpj)WnWjOXkTE;mZ}yJg}4e{gZxT$_ -~D6_V-R=B;nPzQbk!TeA*XIB}RZS4r|4I=pjLt};XbI=~~_$UVU`I01Zmt -A*Dzl$c-V5uC&KyH02i^&!mI6O>DVPqBb1cMTe+NJ8H=UM8`?Hg~3(W6^0yW#Rk)V(t2off_;JrWR0Y2Kp;CL`tsT~CYxnTz2PBo+KjfxYlfyv0TfD|9<#=T>s3$ii3<;>hq7F`vcWREl#QXRNGxqN2 -BYTx!DN7AvFnUn)1}%|s*lnD%d}tD^Nx?2%=kF$km1Gz|m&cfxs?ITPU8Snbi{n+cDnV6Yb-pE;KmGJ -m@cM_Ze<0Q4R9zV%sj>_7zO_0B83FJhJ%!N2s&7_kH3D@-gQEa)41KsQQC&eE00Ik8RY_NizWzC#V&? -3++AyqQGH~~5XhnwGSL}_|#z^tO{)CBC?=dVMsYJSKnBTa`mULChrpTKu>f-mm&TgJyfO>WRX;N>WVH -cLmBRNxaOn2iQ1BLnSzRtlDX^%LesI9h$}?;~Tn?2kJ7kb{P0| -pVYrq_6u}RE-Ph?R&MAz`&amQhE(x56JIMPvC8RQ&}JL{)};--tkNF9H<>;#-DgCTx$~Y}plisK&(!p -H`N4SF20}30w9J4y4nfMkzoZ0U5!ny)?RFgSuUyryG5;534eOJYIyZVs`T!I90Q)BPBCbK|@B-0%+0$ -iwx`#b_i>k%%8=Z2*_l!dJW4s2|i7@kr0( -Ik|DjX8Q!BYc1VJDfq+@mwb13|imV?1{5h58`x8ftVki1)n|mY-gSiBi{NOC)CO -AcK-9Di;o{g=RbdW@yY1RKhixv{^&`sRlqj&nZg~X(OtOGTu*+c9}Dt?K>tuQhs6x;1wF7mQJltPx51 -obC-4Mw8Zm}OOeav?-Ua0_zOU(~JS@5g;aK2k -aivWemjWJ}7rZZwQu91X#;n`tmWxZ*D->zrmX$0i)0W#=v;ME(#@n~7 -aem{3I#fp>*FPC_GLR8{ov?UM4X{49ebBUTq|k}XEJk~wo$(i-Lw!KKIUTE9+6{`ZCUAW$+X75PU>gb -nYNNgMLsmSnw~P1RLyR<-OW%iknH~&-Nl$Cx!=3Dh$I+t)#qAepO2A;b4sTrYS3Tsv`yl@b7SDzov(t -&b#O}&Fr2cm?TEco`}@8qc7alwKw`>%TXUB!Mcu>jS^ZB5v^P3)C5_>U?4{ -C|Y!=Z}i;6qfgX2ye)Pd_I`-P5k~C&eGBQWQ?H@on*-uKw$KT&e%jwr8aqq+=R_{r{(PZz&!zonbXNO -eaxc?l>2(N#U7T+jfy2onZZk5T7A{{0S}21nCjft?GY4-(bZ6Mefm|OdCSs|kh5;f4Z&LBd0*gu$s#X -^wI+?KQ7_e9&}K55|8COoM@%6jW)}l!o9N4u`tWU+Ea^NTI&}$=D9&`^B~-je)^yRq1sX);u7g0J;hh -8Rbp!M}#l(2x6Y%Nv{nA;ll)N={gP5iAtQc3q>21IP_LzUX>lQp}oj=nY4GEIq2Jo!N=1?u&P_$9IA3 -Px19n$%+llm8Sbp*3w86(tMiJ3<3S+0HZBQyEv}f4#2U$>D8;Anfms}mEs!g!&Gp2M8j5$-hhr*8rmv|1Pj*Ra>QR!+h+{+qj{$0vk@dV`}?;h_M`kJGCc -fqVJQSpFf}<4j?L{->C#Bid;zPcn;)wZ1(j%b&}uSqvL6d4Az|#T{9IjiGKSC;a!h0gbXsuYv*Qq?-2 -x5N_4YQe>QjZ;2Dg!6h)uOB`9bqzpe5nbA+(5{;sotc_B*sY;=n}`SGZ`bKmfKjUGH9bdAS+Ae;p6(- -?CaYO2wnqR@d)cWexSZu@1RB`Ap5E_qY0uunFd -y3j>~w%2?XpA%<`o^o;QyaN{JK@C?(5gk^c(W3}xzVI3H7)iSb2;;sZG3dGFWR*776E -y-4ITFN}7V=9oqi&35`b5#JQFOFc^!G=zt<#eGPO!JGUFM`ibz6kE~r_Ub52TpJ~Ot42u^kR&nRFO!YSYH^?MV!3}Oi==shh`*kg8$+HYw3(Zc)0eNF{qTJ -9@~L~E9TP($T0A;`b9;R8$>>e}@s306Rrn^t#FJ;3_;K_V0)Vx8bpG=QtB?MKy%L+4HW+gvEPr;??<7 -~3X*{G;W!4Qix=NoOF5{-eQFl_n$9y$_dDI*4dU7~<-_1PzdSQ!&>Jw!*v{uQk(R-hst=AZONs^|vMX -5FC^~}NJGuwC7Zx9jq?4POCP>G -^W-~Tq-d>8kw$*)SucCS5Kx}B82DoPsdo?mOGcbU`%_}s8gOULRU_~Sj~Y=I<3oI19h<@#p8iQt6~VE -wKp}f3?J96(UVLuon!ew9J`mN+f$;4r7D}IZ?0*WydxWmfoxT_0zK}I`1X=2xhSX4o$f@s);enBbNFz -iBCq)Caq>p$?_Z&XI;kYARB^|sL{4mTZj(Da2dd(_I-N^t=nW|raUe^`l)iPsCWbc5P#1AE_}A$nBWCP%Q@0D2YL3w9z)IC1App_lpRvdM4ETNC}E^RjVWV$o9nIXA_z4NQrwwYM%8QR`aK~(Ep%+uo5&Jw`kDDf2ts7 ->r1PGHfw#&h3Y6=1t>!c5W+4)T8M$*723nGP;+*r{kq#qzl(iwZ%`B+ODN_`D_tExtS3-~5;Wo&z*%j -n-8j*LzD4TXUy&y^YsU;Tc0sm61834N$B$_80RcW>3kSa2I&Ued^+nrz0pO9vEerUmWHaVlU~C2{zx` -Nb*iup(-v10nPQ=pKHMB|g>h|EB+K%;pV})FiB%M6Z68QNcqaa{p`+e~>^x*fv`~UP9%!tPMfO}cPX{$%ci&QCRK1pMUudJ)9nHK -pKF1nqS((&z$Q+XS3y75jzU7&lf@xdoHAPVfO4Yp{d4M<6UWv^nplVE7uI*Ac-7g|;wG|J2rCU*1Z!Q9a+e*YXq{aU6qU~_NGAepaG3zV8M;npt -h+zwi9J2khMqi?AR&%9Lt|xsfS~sq}Ix3YO9VZ=5fMzUrQEoXr_a+g@9EDf{$bV~YI*$Gk7l6Ezl_u%L(0@*t>9u>`J8_rf4UWVW49UKAC -dY%Hj<`zxm4i)Cx$*w{^~3Y*d`6B{$(m8&u6A+{O%XlYbZNxb&yhO#-gbB<~KPA>(y(n~YVU)FFod7g -fxoCE`%VJ($cR+!6613{tmS_cqaUeY!j(F!tu?C%I+&IGO4lQvd(s8_~Xv<5{?R$bQ3u>?l4#mAEVg# -SCec4k-09qoK7`GJnU)tp|OL9qy->t9}mo1%u6YqSN2&{HKFm>XFgZWDHo3#O`QNO%*LII{I_H9SR`- -%(^+BMs%q%}>w%lb-j=)a3b{C^^4xb-tEXh&*7v0it7G?TPWlryrkEaIr~bY)PU0L0NdHl1=oFf>SI= -6bD444ai4`1L!}=XF1+?CdYl!KH%u{qBz2ki5Q-m5i&*})9mIH19;8e8!@34_b@lMd&v#UQ|i)2pOpt -6C($WyrF)om$*ck$D{X68S0Hd2v|It~jIjDXNcKFB$rg>z-FTzkpj3QzA6OT^37>g2Iy_{0}kv>@~bIXq`^~ivOU9H-U{cbF--7!*c1Fr&}J&t_+9ke8kf*kYvI!LQpJn$Mj&^NpeNX7 -%Mh-zmjP7@7hBbla5J%+O+C2_wp9ZRKdEFJ2IbJl!(Hla!zGsVO4k36qk{0Ir%EmEu>Y{3Cif2-MGnD -b#E{s&*{DT6!(+qX>j_L4H9S1_}-D{5!tm&eR!|d6C#b-qsQT?xsjE4r>6CtfbHlRWR}x4Jy8bA`l_( -ZvB`SOTq>Q0Dzi`Kt>>lD5{Iy0?|@8!LgBZhX=6$cF&^(nQ`K{X5^~XYL&um&pc`OPDp3!0NB?Vq810 -O8S-wl6P^Sbv6K1wbd0SNWV^fCjMVY%zMfZM=fsX9V9wZC+guMnVbZrM0PI_#r{HB11_52lw1F#AV3_ -a5WKmy-d4`QDe!x?&n5Jp`}zatAPvYOp?Ul}xG_@3o4$u!X}-otkwXBHH*=$2$di$Yo -_9Bnc`}<9%suef-nTFIM)2QDc -D63&B4Za~TCBpHv-hIR;;=|W=EJHB&e?~fgTs@HL%+B$SeV7^;PmA3{OCVFUY?#`;7gb{c>46|;2;g9 -WI12vT=J{{99S{uEKOv=#FR~wluMRmEMzgf%9BZ{b{QQ0UM6>83Ts#)Xb?tH>EjAqJ!CKy*5AW=DHfb -9b1_NzLi)6CvRH~7#}zo^o!U}6V@1{7tUDTK99 -{2~uCnT7=)vK40;=P^J*VGAZx)XH>iK?3;#g%UMrDsrQud;Y&j|6clg%=dlRJ&^>;0Gn_&$wi4e4r*q -teChv_i44>`mZ+@3+5axTKRpS4Iy}EPIz^6wCioyX2@(&IY$~qCdmyEV6xztm6_ek1RCwb7gAXX)+m> -oi$|Nn2XxNe8FH?~l6QJ?6Eck*5fUgA*iVPxH;c}U-aqeB1C!&-Lv^a~AyplzjMF6*&FkXgvxF9%Vb_o>V69^~=28eu(c -qs}w18>1|zjqr%#;2A0V1GW^gda{M{&mgwOymoCLGwUlFaX97tzy^nye24cEZ_uCTovGNaK7Zr=0q?$ -C6axHTxbrO5y=bJQzY-G|JhkNNt1}ZJv-8`D+VL?0V?sg$<+5K7Z}n?KXBYOTje}tlqr4JA~e;Q6&YNv^f)n(W{4cMA=)URfZJCv361k -xWf(p>1_-qMHXOeWucvL*GC~3<)e)G;2PM*hnEl_BJgk!7;+BLC%LNtqF(pg6;O>dB3u+uUdUAf{>kz -{Es}9&Ta_x?(RB8>ARk%Laf39w$*%y2Ut3I*4|1&;leS`?Z1PW941`SX^ErqnNK63}RPY=8QcehnSDd -LxmEgp<(T-J^p@qx+_hBkG#j$hBH1xtc!K~wy$iW*omR4U3bJ309Mne|26zXjQmwN5o66dBJ -gl|T!?7JuoLdM~kk&5OPizY@;^}g%imdhkYQz-LRJ(N<&_vR(0KTC@y3>|>(m4OIPdi$qkUCs7EO8ef -gQ8rf;J^@%`a2-hbiY)6IaBMX6w@;?AV+h?6U;GD9=g`jc?c#Ott6&`_VJ^BIm84m=L>Pi`&R2&T_;o_p&U_-6Sx -{pqW0!;F3L1UcSMCGhy?13-T=f@&6Yr+$k2h;btPbO{PyJN{o%!>pJYG^;Wh4teEQ6bVmW^PJQfkC1e -FuM$Y;+hXwRi6^N8bje_kxo9oQG#Z7h2k4>@L-gHKh3aRvmFhJl-8<#MRZO_sTupvv{ETueYB;L=y%& -ZGqj_(281kOH&Tep<*=eg_t+R``rLVT9GJgG<766|QYCph$p8JO(5jsq2+os>Qgi!4=^AOgf_93EbR* -Q_OP?&H|9v5aBOo8xjj5N_Yv0?{FV52aussHVcF)e1^;=p9*A|R~{)BzSeKNI`}BSLu)y}g_&ds`lU% -|p)>~pSQb;;%D}?p^ascU#R@C0Tl`yK8CDa4jJ$&iDkdCZ(mcE)p;;h$#bBuQ#PnWCRE@VAnQ7ruXrkVH3X}>#m)w*A -%VQZ5s}0G<+@1RQ;g3BC!qDgsH7q^mWv;$)mrqe)jQoD_Gm}ewK&RqQ&n -AH4S@>6$`CIrOT)u9vM=S{;2pVWwW;1Owlqgv$h5`C~E7)qbTZ=dY8&invv5Cb~d3ko!FVd<(7SO4eT}sbqQILQj?Aw -a`IvQ=Yjr(L?oqp>lEje)a85-54>!WmqSUpERe=r=3E5IfO^x&<&W60`eGckZ&9sm(p?wJ7|AeuV=6m -s6fiGxGZ()3#uDp2d9!vW4WqYlMLHj?zh8wmgU-vSF7Y*jZ}wc`&!$S78!LjXF@#%)8}eSM<+TmZg+| -sD*KA}mb(&W8(T|Mr-#$(csSLxx?m3?eY=&5cObpU`XipMX;H#hyUg&5bPoPE -mn36{M46IlXMfBglFskElU72v^*_c$i*J4HjEnn@L~cc&N6e@?PktmJnzi`F5S<1k{U7Zxjyrr0Pz5mO(u05L -Pyibfu(k7~~u)m9Y3?1jkfb8r+XVf}R1U#_33b6++2=~M`MhnJR+lmKtnbWg= -w%#Zh>vlp|q10%5n*r5sx+YBD3|2(FrCd&(u6L>nd1oQlRRAR+*%lmOJj-@|NOP&%IAv0$;{y -p{%Fuo&7{H)%{}nZSE5Nv1CEM0AAMAj}w4C8A*sf%MK$j{2Z-LmV_Cj -^rYg7NrxYuFjKpV~Xn5W?yh)+dGdWfZjIRL}+Z98{s9*+V4(PQ@Ss|-kk^i+J>zvN+whLKSv{J_2wLnW>Ps#GAu;dsXNLTGBgu-yz0UB=~f -_~b?>7}_++K8Ftq2pwlDDMLCCF1@@BWY^1g(dX|pv`moZg!(W*7D5dXG_jt8`Sn)5-ju;%~JWWS -wa%<&RCLcg;sGK|c{4x#eCKKe+Io?|pS=UpeuGV<$UR&WR%6?t3`7aic5=vI -pW#7#k|x|mBbh`A~_O0&$4cHYLjQ3lwV4Kmq -WJKX->om=4q4}nQX^OT$`Z-CkGdJNhE*~^Tr$-_@|L -#Vc1>mnOIdiL2mPQY_|8it2fV|6p?j#JaB@A)Dq8HG#kZn_WWI9{WPr*HM*U2aI0yV2Xo3k4u5hSmc6 -6q{b{Z{!nSEQ_^O#&)IKbDv7#yGeHHg5cG7goSzozIU^Qc5efGqqxo5P13H$`-R -a9vjgMgw-Tb@}<7#YF*IQQc`c}RO0&D>5D12Hpjt72)L=OzdGz2rmu|ye5IK+A)ns{#gF6fBG`H-ZyP -VxK&<}K<#G*nBbz($a_5;;|NLG2A6qD{_GHQiYnqV}UqX1jA-TrRSq!y+wP{1;1Yr@|OgeD0X&TPjVp -T)Ehr6F4@eVT@Qm;q4zMxl58+qHq(_Sgwbh}pFxQF7k(jUv@8+p%GDGM%crYky2c`!TaD~YSB77~?r^ -xGVDldsP6JHPIMgk2T)P!nLMC>C6~b=?~2wu$Q8!c`X#u`a0ELo|PyL>tnPhGe?PbPq&#sBcAmgk6nk -i(?ZW;k`x2*VFuZ-udBBU6QoG9UXsvilJ+j3*Z -VbkM)lt$j@8y>kSH@2naiD#U1>uk+fSigld*7OKk-7cBpR9sh^lNVc?IJh-iI%-E%MvQ@6aWAK2mmD%m -`=90h-L!@001Kq0015U003}la4%nWWo~3|axY|Qb98KJVlQoBa%*LBb1rasg;#BF+cpsXu3y0>C}gdU -khUvU7%%j;QgHil3!CubioZ$4f8_W9=Hr)yjUTyk`Dlw47zf! -hLj;IT|RawP?FB5SH1n9^j;OC?V#DwYjhGBRfiEhPqu?PFb01BP6 -Ocg2!qq2!w6PEitY_P_$(D(f@r)-h>RW%UDFfM3P3Fx#4G&!I8A3iMnQkKm}WGe_b4lq5w#tEwo-l-# -CZ4W??vOnR3j;4xBgT~r(vX*H7BBq8wO3nC=2(_CmnMaf38dv-=3ED$0c0e*mIqXappm1aq_Aa76a(3 -_Wkt0nvqxGr=!%iN|H?|^55{o8-E{TO -(&$H>-#w+n=#o=$Oarww&NJ`W6ZY$5H!k$yzgM24Pc*j*}VhAKIB~&F&%*HPV9o;4`918z5hPDE*O%d -uK{LE43esk0bVhLi#`ORB8J$Q8-Tg>0R7MT7-KgC#7MJhF~)d+yvORtHX)+osKU=I#1M_5NVzcb5eva -~zqK`IvS>s(`Qoxkv40w_Y+in8*&)EzUXTwdbj?b>;K0I*kq=4%2^J-nle?2&JK;SXF>xYw0r&wWn#w -@HTjoeFlG9-nsX=_9i*&-=BcdHyM6P)w$~6tCEpc@0XtePp<`WyGR)>)+rVYF5%iUHwrA{>ZUutpJ -&Bl#wpDMNcgu3bC9|p5-?TikL&|hq#s#DRpSvEbxRwHya9>nqgtCu8qp=k;%aRUPr3n|_WWBwh!u -hT!TjJVeNzn{H)&H?pUoNc%mvsVNo>bVC>sFy%*FEM#OizYGGT&vkCU)+Pw -c*YvA|;B(JhM9(nC?1XyYI8V4O#VSTY7Z^#ZIQuOI`alXJ6Rq~LISBD$YH^tMFR(l~DIg;_t$H@_L`i -7iE2^mh8W=;yP<=ZiMH*?`-6?hk7_t^H%ew@*-^va#6m-qdpM6T)NnEnTd4Eu#^fdj!A!(W4N->^q|W!ahG`JyvvLI!Gl0TU?w3Z{5PonxjHw3!!@PW8#?*dk7!Uq4Y#qbh$ -}oCosTLkWXb|rQSHQb4w{N4YgLS&a;W(iB;3=K0?-AWjUf)H8pkWcPC>n%tcnzaSlz^cK{XRSY_49|D -0xwpxziuE3dnE}9RkgpGBrMFtK(d>UGgsEyxqalu7Myli+1T*&9Hy62u)RV0B9QIo9c&<8WEwJM&T1y -`l1d=cqN`r+@@WE%g04M-2~6kh2o6(uE14U0COE*fP;h6=p(nFr=3m^Pk2g-6&y|!9O&xO`AYa234CL --8ZPa#GPTar%dSX3@??v8_u5htU$!bGp_6N%i+zg|dG|)yr3!Ha41_(yc7KdFmj0ZcXWmzcDRwU;PZL -r2;J2+0iduSu@&Qlt^55abY9)rt2#la?+eBe|(!5;rfia?LB{Y+{TUn>r=2&{m6B8x6;PxUDc|sVy_cjY}rqe6T7lPQ_GRWic4-tu4FawcRv90n=|CD`G0Js&59*=@qnP$c1Zm?`FM*odZHnujlf~V!;uF5X2njm^Q2qxP*li=iv1+VX#tFj -1=%ZuhVsaWv5To!54WMwgiPREP|FAkng509tg=3^5iMH)PPb$D`g@b#OMS4YSA5ZY~QZf+jT7de}=qM -^<~c@Z=K{v~S?0G9+8WhKX2B(v+}lGVZM>FavDv2nayEXt~>gCx&`xzS;sz{6-~ygdwd#yj|*$&gT(j -JE^!alxvL2FwRz#9-s1D(68QUo4wt#o{=~<_I@f78#I)#d+4SD#`1O4e&T8I`&66ybJ?5;g0mB&I -#1~o4WRJhsWg&mh%galkv;4DS8yg(dSb}+$)lHtAPe0Ds0*NvN@5H+Rn=PB57og-GbG_pkW^y`d##zC)G6olHIZbX11tUBVI2XJs0R%C9@_zzl*Qg-7vUhO-#?k#K!_7*&g55vny -E2AuiC9C)@G&)1%{qSBLS@bYlZ&&8lEePJayTU(mBCj*DatbRPgAW_eQAYV}`cbq#H&RaI6|n<|6djR -1aN0r!E3KP|J0rJ4=0I+*j`xWa9~Ps`#W&t}a^$W6oMizaAF7$QjnV8+`D*uh}8jOA$!JPV6~`(P#@F -Oz)i8~II9u~~UpWdC64_nd;Oka$yE7v*iC$CQ*Wmh*E~d51YDZjwApS5r;{P4Xo}vSqw0LEQ=#%X64c -u>bmiZ%w3YnJ$5~;~4fG?3TUYG?c@J!ytV9-8b>U;qzDV^ziAcX9tJhSPx$xO`lJXj;7BfcZ6p+%(UR -rCs@|7in!@f3P7(B_6l$>)f*0E7&|0s6%wiyyI>V^fgsR0__kcIi)EhQ1-BUpiE~(=tE9MODKv*Q1;G -%M#f%}t246n;3a4LlsRB?KfVsQ9Vz5KI(MJ?O$N&QIi-W@{H8^-1@5B>$Q!(17fP56bF9QDa{{1iEz- -|ry^z{g^{p86`{QO}0;@L4YixkC2f{BpGhp>(CU*pm1JZVrOhQp1({t1tla}Wo2*yf2eS*_^xa{uT%U^gO|0i>f>3y=0tExc%qCtv-Ct;x#-&Nlc -zUkLq|>|m^#(|6599HChCujJp^tdZ^I5{c$|ox1v~_gw9&P)s6rcf{8FFJ9;|Yt}>q -^VxX0fSIw#P)q#p^>N?vUL8ID_jtJo{p>`AZ1 -Dh45QAfJSJ5r0gP)#@2+C`yBWp5>JHYoLwj#e2?_M?QmD|7noDast63q&?}ZZy>>jkG`+fdO?j)P?m6K}8+LU^pa`6zp_`;cuO%vz!xMK72hD8KmV72AGi*d@%mzNR9RBV@m@wgqNum&)}N2o -OrAv=&Xj2?mH&gUYzvnG-|>m#Y9fIxEcxkygdL~^n=lEzUeko@v{f(iOEQ~iRg3V>R20Xjr*#gY`jI-;n1>Jx{Fx~D(62O}8@ikSXqZpq1-TXN#tl0q)Ep_5bu{k#r-S -|&NF-pX%O%R@eAMdV;Lz(a7yIRKq@r`u;V@CACtgWu@0v>WQShH6jn)sl-!TK75_10KLLH^=~wf~adOr1PP`-CVcz8?Zg9_F)5S5+uqMG?j|}RBrHx_ -*Yr^sB+=X4R429W%wH@sBuyhwJ!-5$|_5uSj;$$0u-lhJU7=KNycQE)M__M`)eT)09TylSER`BZr#1x -N&-vL>F2UGYR?rP32deLuLaFyIJI*?~qC77&ugR(tD=QrJ?z`xK}v<`q7@g#&9!vTL@mDj8YgwZX|`* -UDkFs-k_KFXRax~*x-GOsNNJIGCF{@j#VYQ32Nn2%s?NuUT0M+3{Lf$1bE-xWq56az_`qNln7WsoI!u -ftac20^cGP_SFM3M92S^I{A2=fwPTV!wrj&}%>>o0ZEvEy4zng=R@{7t{+j1Fp=GSlEQ20K-x8(N&MYaIcG6Bly)ue5`UX;57VypHJQ -(2?mpV}`k%tNb~^2P+;YZy4aap&@wT~ePwlonRpCs#r*=KwHl@yaIPcT=7Yh8 -ly}EoIC8OcJF}UZJKe+`pBS%9@3HNc?YqA*Z(qz?nRQ&Z>w4{5Jk^3?I)FQT;hk*nMMybPO^+y1>*US -r7gLjD=IH1=oW7X8oF1MW%R?YCBqF|lb9nId)iV=>_Ojb<^bY?$0(p6Ge9SL_%X1t)!iUcfUQCbopSN -6q;pvb2qrWAie{7HbFh2W2d-^bHfuaxKa94gOd@z*8zz{tV6wHB-_sDyrT~bH<@bW0rd~j=S~|NW -Dm*+TIA^dj%o>=m-V4+Mj_c)l1fvY;jW%bLC(_qc5?df0g#j|oI2;TtJ>^k70#hk?6xd6x15jSD%Vc& -Z^^=J6mtJ)YfXbg=kFU+gJ@RS*@hGY~&ZFx>%$}f -tIcs7k;mgI2_Ur@#Ng820jWT&axE;wmAk(C=?vSMb+k>KK7!Lod+#!W3@Q!yE)pJ-ky;+kzylW8e{v&@|!#*y -vw-`n#x^U}^zIwlblmEbqgHh!Kn9fzu5H4-k@{+>w1eG}WEW1OVM$9t}_L21cQA0VpZ77kwL5zH_M|9 -f>Q*8Sw+Zuy<`)Int(Uj_tlC5>{(37U<~^2pIRMUe|&W!}uczkN@an70=o*4hLg&Kv&VAJy*j8pg2e# -so#JYx(c%svW~+I*c|@MUNV1$on|?#l*VYE`CkVSs|idSpxzTVtrFu>Fl@kry)t53Q|Yu%I73eMrXr -4A^lov$LPHrC2rEC4|s_CE&pEFuXUb~>7=OoT7*iE!ke^Qf)bEOgt8j0`Ee{l#KD%gdUXDv9oH>Ie^* -C|Av`sm|+5n5&b?AapRl?%AR80H{;t_#H_P)S2E;Tfq-ktf1)t@hHcDUk~UQ4s@*xbBL$`l3zp-^qga -)Vqzn4BMFGOAsS9pgw@k#Ft_)Xz>MFO5Rdb4u7bH&u!8bL5j+nua-K)GxYw@^2Bx!xta=WtQ|omGJ*7 -yqi2fee3sAPAa0n(b5mUvH@aAU@D5bs;R^o7}ZM@w>ijzqA3Xmv%ng}K#(C*MW%tg;tlYs8Y#D4Z@M|wF(J5eZi^)Vb)79@agpmgqJE%E6Kf00Y?D%fSzAoqK0r)KY -lP&Kjqn4cmI2K&Z9oFuhZs63gfhJXA`H1TxK%;@)OyWb1fxL?K)*WdG>Lmn9&Kmf`1<<=-+iI~;(@NEw-n6%=ag|uxCm)r_BwVP0rpOITRf15+GdIH%y3yy!q%>YGw$)@>)WKdtZf -N!Y|3L(mqDR`K1*16jHSjHhYtkq18po0%TVLLW^iU_CB?6hgYpCVDutuy!!D}%vOkY%`0xRPI6i#9;j -hY6`v;-X9XaRnvP6v^?8l16{P2Oq1#~-uZm4tDb#_@Wd_$nctFZz#1x^~ux1x_Rp%QTV5b5a90X7jY& -AEMt5v7!jn3fog00MG$WqW*)Ybd`iX}IzNi1z?}Isg};W`o|gqIk?miE#Ydw#A}~X`;IG@lgrZb&g4Ae?O(Ku -H;banAetLb@XWtV@n5cr<4erJ!1n2Z_XksTg;ly2Fh4-`9$p;L9xdT;6T6;lSQ=8q!_pvU`2}P0L%cJ -~1cv7ev&H-|kH7Opg!>>_hLIWNK5uWEmo_{eIxGd}TFq5i1bd##=>CG5hE+QdUmBci(Zd=RspC1a|na -z-q&lT35^S@x$_{%-#Wv;SN!n1l>pg2pPmsKRQ#DCa7Iy^Z1rZv0_doXxOx=!rFOI=^+?DWXE*Ko8lM -PMgJL7N@DhL^qWe$@c4SlR5FOJKSj<%by_B;=XtQg?7zjyMo2rlv6ocveL>lE?lS4o;=Ds7Y)zXW>rsu-U_%Rm? -eGZ(EL53=T(bx;;$6YKyCMu>R|kmrEwps9y!(&;9Z)O!%nPe;B-U0Qlc^6OAUT224Pl(6&yNdzm}#1V -YzAn7+br10Vgm*=vet(jO3GV+*9OTcnkTc@kI5!sWmE%rhC&F7x2?O6+}%*50okGxig)stAc#F35U*! -Ini%cR1UE1KPR(d?x#DeN1BlUzQuw?~&by5- -6rf-Z~|gCta%L{9pbfW7#s(VAljLyJ7)v$(nI@=jz#J5SFFD-_f}_2ZZY(=jn;e5$Z9v!u`c#Ajy7w2 -o~);I_-7ZkXD`EWnmG)c6wMe-P!0f})BO!8*Zig}yU-iH3{dSsefWDB>;+nc2*gb9?F8Ej-oAYs)K?h -HuCx@Ur>)QFCV)hy#H0`Os4Nke$%5;*OejlK+6xom4@e^E+9brMZM9cXS*4->Dtfk+>g#zyd -BN6#bBQt}=L8tjIZrN*BF7RL`sX@WOLL0aI`Ue*R;kAK9Q(6|mZ6%SRaFjApC*Gp*6DGnuZ1W;&&LS< -+b8@(FH^5JEZJJ_y3HT3LWF>eICJ&*QN4-rT9%*GVDSFUg6!Xv=)#mo4_+;Z#yz1A;w~wX!J38_@j3U -|Cs^e|70%-7B*;Aw1k0M=#ViXmA1tW?#mb{jJnsvVc#ZhLK%)loSBPOF8HrJ((J?N&Mqsa@pCMbS)1YFE@TTARlRo_SUft -t!Z1gdkE)2*p&cF^NZqvHt=omsIa=V@o1IcLUO`WkxHmb>6x~Lhwi9JaIMxraAwWPIc#OLtbJaNzzoNX;LPOP-VQDV9rwsr`sRLoW#MsN0?M< -+C|?fqsNCrED4&(7I6ZOP@c;EO$rOfrrCrB0I(Pbig!^3;*sbbb67l+6lV4u&pCcbKjG2C-)32ft5jj -1`281BwXbR=p*0NlYB(yF$GqnpufG{LZ8U&r@~#-T~fl+VI=Z4mkX3TR|JF1{VVxFFezff#-jER0s6G -KU0bZ-&8SaHgPS&HmGO{-*L_=oBAz^5y8?6Vu&gWy`^sUc6!tCyhlD+Cj!yt;G{J*o%D(`K!54r~AL88&_we>Z)1tV%-Qk1X{N8AqB?>cM)f -YcqhALTefh#rsbpx%Tkc^sO9(8*1v7N!T@kfMVBCB8w;pJv+^^o&ssi1kzqHOjpA=@k6pq5<%u?)7Mi -#`ta#HjW#c`jtRS}a6!;u?wI=Pe3|8`{?j*_7?R!SW>P^R#@3I`wErGZqLK!v?8Qx1l?9zOavI0)4o~ -*q#^3M1IG~koEwZQfN7S`{hOp@7s!Ikjx6IJwfDX=a!TP%xT-DklzAl2%;<(OBphZjz7Ry#a7|SB)+- -()w=ih&PCaTDZ_9c?W!n|HT#dJ%2SYVN!{}KN~&K~?G0gEip^U5?(C$?E5MLtC=k0F4_G|^$;3lMQ8B -U)RHL@ME`%9mXjDH66)&?Q^65ZvpoflaELP6TnhXe0%Nhnni5c@)MXf2(vkA&Db7O9-h5p$)F`r1P6eAcllW~Ht^5jo>4ARS(6F-g+>v51Bd1g)qJtW6iSN!Ntx65-h9I`Zu+#P{vb_VtiC~)VyGJM6P>Qe^h>;J(J%2Y -(G@oUs9^#TLw_<=K~jI)C4yR)aG|XrQWt-*^L9s5VT5jKGDZ_i742waX_y^txSC72ITeT6Xz?%3bU~t -fDylZqITWd`@-33wc#G=~+o1Ecap{1_S|y>{h}Pw@nlVw1D{9yAC-tjErnX+}`w)WB?~_z0b7Q6&Z%@ -uQ`I)%m-F^&Yzud90-d>vYvn{cG?_qGJjuTgourY}bE_vCAOKfs?nZjEktNt?Vjat836<&UEKL{2HFCVq6|oL{e#IVmryAApoyiZ{~SJ=FVPsCU%R+CD4AuC*IFV -;`)^lU8wQXNlZ{lv})xW|Gr|v4};Rz7C#z^@k1-k7;PIJ&dYgE3o7p{F;$F4P67T?nnwlowWPvLM#xv -skP+krMp5kO?lQkZt4t~!v43sP2}QEhug!luk+G#BK7n#`&o14zv -1)yqSzGJC*Z`Z%6)nt -5fkmTa_Y40fSq8(UoyN>GgD-=GSMAAi|%vF#2^>nN^C6mMHQ<+lOIC)r++imeyec+$h|-mX)g~EM{dhf&q{E-H -O$X?({s9l;uPimqE7DYQhxcY&c=CV@MSkmF1o3CrzQp3N>V?`YR-XdI{?_+fq?BX}{))oAag1ZM@L&{ -sY_E7iNkWO2XZ)ZK+=hKv|4WxsYPL1SrR94_XR#&@SbG9=9kx_E(7&qS}abeTRnK_4 -&M{?4_VbFtjOYaG0i=KeMkRpsA^c{NviSxbb7fO+Msb+B*BOB^(7 -w_KdHsN8%Zvcq$45j`<@u?l0xr4p+=~v~ZtmDEDW|zs_V3Lci*A#w-h96j}4zf57lhUBVo!kKc9Eq6f -k5!-Z~kIJriesYbw7`JK76`enC6rXS&cq-_AH@(|&7OSyq&ZN}DoMbFjKq-H6WO;0fOLhbUQNXas0+z -CrCxW>|0_imSk`qp8;&qC861EEkYK%7UsAIUeb`r12taZr#NoJOF+s_TR^m+yt;6Y+}=v;QSvPX*eD1#WofYy}IiK~OqXclT7 -W%=BKYddXY4wT(3uJ5exB#QPz!(uD3T2TatSHSzf!dIs!Ebo{*)X(shk6VtB2CoV=Y83YEfO!J6 -=91JkNP9c1MWzKCXM=;H9YglO*s--@#&oP$K2O`cX;PNjY*F5iW=ykyu_|x3DkR28X-%C^qQ7)yDN|IR5Ai<@!&ZR_>Ti -9dfX32}LLBq@R*%Ocgd$JUrWGpW%_;MJ5^v~)3=M3#TY~s3uKk}ohl!PP)o3Fib;|2Am%J7YPk%PQi6 -{Dea*1F$S%{P66TKsO{JxdDtJ5p(=bjBOlU(*+zviD4bMq6-Pf^nI&d*WO+s+Ru(%a6DOw!wxADX0Ac -2tu4MaEBtENjXRNhW-0Ggf0*e^a5JC;oLlT_G)qwl5gDgIh|xqsP`l(TpP6GLGG5#f{OZ*EX$0d>u2b -LZ=mCMnyEJd8f|-#Ws#DML6NtcXbYw7$<2ORS$8BDS24^_ -xGXMw$E1*(B?(z*f#Oypi`mQVEl&em=|*4Z%G&CoVFypTfV2{m1Q;`@)T -tRX_IX&O>~95z(g{GHwT!%OP}!}WA**^-J8olNV653?VpjXd6xv-;S6I|fsh3z_nSTrqG|<`@z^huC- -va1N0^&Tzi?_6D;qF*k>`Da=!CE*fJwrr*M+rCU?#UBk_mSK{yh~A8$hGxRCPPJ@M}RYRb9}q8I+9R0 -vTUZE%xbcQs4^KwMafI;YW-Dzk=Kj~pw`e>T1xG6QCC8s@Phtw2rHFC{82iK=~hv7>t&?E{{m1; -0|XQR000O8B@~!Wj@^V3s0#o94k`cuAOHXWaA|NaUv_0~WN&gWWNCABY-wUIa%FRGb#h~6b1rasty+7 -J+qe<`-=Bhwaj<;#s+&t+FuHA%G${h4$swB*XbnT5E!yU;EC~|5yUyXhduN6Zk$QN&cQt~n9y7z?Jbx -rLW*6UIuyv8jd^=|cwYm5+J{gTiWA?fzkCoi+6pLO@*$uHtL>Ng1s#cdCHZ9XK*1Z#$mi%RdRJu1>9{bA@(9yDC=4X_Ws@LHy^Iw#OgsYo~P{f# -}A)By?gcL^T$uu_z>tuo2uBeB-tF)p%O{LS&Ox@ce1coS+U*1%8&L#%d_w+1ElAQ0sK-1A^M2tZ7p~wY;-xD%{~Sj -e{+KK!nbDR9&WQ8S2_AL55OtA&fHF~r~RFXKQI4RQspi_t>yO(F9rv|Tiv;TX}RGIP41ca!PV391iZ^ -(dG#@W9-rv70K20y|n0$U3PN&xA37m8~7++2PrRgfi~1p6t|gCCC!Letk}?yRwR>oqn5{83COM-_^N|IcQ&enPf7c@ca~!vm>~9!XVRo -TuyD5HRmvd5SDDze`9))YJrs@9SQxz6GVXv`|0$qS_|q|!h?Je3Fy+f0L&_YcmalsaVGM{lb*2%0HOo -qD74ID=xuK@X^0kj#)pvLQeYm>=FbN&>h!Hbs(SR6-x$lP69T$RO0n7@99`>Z -36UnS(P6MKCTg37LdETiwaxfYad$?{(;)uw2|5flcXwKxRtr2g;!dJ1<741p2els{Or%jojSPkqPEtd -+yt;Sn*6}l3zYu_v%(pi;hCv(@7Ft-fd@kOhHPtwsHgW_GllGTFYr1m%P!a+-BOnJ= -wt;u9FFw(9M^NDo=3((0!mM_+_5vx4g~4EE&;;IJlwv64 -i;OA;8FP<+VQLfE#w_sF4yL@5&l*NyT#y*bpXN!1QWHeq0gfC`Wiv2L)9Agn{a80*WV)p*7LwP6v##( -%h+)5->m7*;P2|&*7@{7QBn9HSgp>pemD7+g28AIlqsv+2Sii#c;ll5Uvr`9&Kk%zXdyTU& -|ITu^L2WH(xA5@bO27!iz-``>;6|3G%23D{RIVr1#92u0`yaccrY7mFDFzlr-A?!wD-Q{RvJ2S-C9SB -AeF6ia-9p|s!81^9N8;mxG)ru37A!bgXwvtl*V<2c(t_K@kx)>o)ua_0O~dRJ7U1NLs2;d%M&DrdNu$ -)qDxhz1qfSM%4P5tmI|35n%?BJsvtpJ7G-of?T{U%fF@&!JFh(@W8WG53r4%3cPz9# ->y0M}3L=)x-c{^EyI;D|2Mt974O8I{))k4rNF1W;FKq*opoQx0wy1Q+#{ZXHtJ>ch9FzvZV1*6y;Bo` -m&ak)rk%I{$q!IBBOMiU2IwDAngU|n!WeY)vw`U+}=UjAo{7sgGt?O`2dlq7)E!U1loo!dc==gXAbGm -b>siA9Zo`%5H>|td9xvtoA_FD#5k)dn^jsgGucw}iI>U^RAqk(YF2+P9477#AtHMg~o8e)Y#76(`iA_ -LS%=J$7S{EpWIjXez!ACt(*v<>Psguv0lIq8Qd@u1J@RE!h2Y-*zhQ42HgWoRO_`2&uNQ_~R1Nc<)EJ -p^4R0H6mP7A;rJm%b&5Q0D$r2QXH!rPqtGNEZ5zhP`;c#NG*=0)TQil{^h0a5PmY5b-)4E5-Ux)EKmH -XHZqg6VR*SUC5=s^y~@}bc)2@A@Q54Dtd~F6HB{EZP2RUhFtm#DNe=eu#G06&uJD -!sM!`iVfH?`_eFL4G`S}*4aR(a7;U3E}oyXE<{MC`VblK#t|&#q!B8_=!V5CDCm)cXBM?H;JxEh{D(jzR8hVI4+`pPz^p_q8H@4By%*ozeRSA$V|R-bIC@ -pGPA%)iG#mcgSAEf1E*EuZnLXPqctcuGqz2yANqe3FtZ-bqr^|co=5E#W_rJ1Q*f8Oa=*b(R1Wdfw@}w-(^cFlqGfJ~p6d`ncRbDi4Y6p?dcW-kzY@?N -#@UL?FPOpKa`O#EHQyg9W`#tl<5^FzR{|f)`IL7Gi{;$J*?$w;*U@A`ccT)`;%C+miRV!(m-%>fM>Au -YS7w@(vmIeh9#!j&;5{iYEWjOBS5YmcEz>T?1}2Smzv!sJk5 -jPfPtE82X~C+Aet%3{(9qXq@xSQyGtQkpV@eEJLWe9 -~4kw^=(wv(-F_RI5>qBdEWZ}-%%@=#LgJF(~dp|7tHJNR>t-9U4^DzW(mcf!dKkDG$6~%2$AIjCtb~F -9)Pjm2VzT+eOYiYcm>>`y;{xH`pQPQ0BHstP8hBKqnMdrL)5CUJfUdQ$*t$i9}cCaVy0uwihMc)B(|3 -iybyatgPM&SPdP)h>@6aWAK2mmD%m`+dL&l9>60090#0015U003}la4%nWWo~3|axY|Qb98KJVlQ)Ja -%pgMb1rastvhRz+cuKl^($a$r%1&T<;NzMn~I#BB;#6LIkw9)&U(-GsVEYX=%Gk10ggtgtNZQO-2g~{ -q%`AfXqPRLK%>#`ZZt=1`puL@d7NaMb5_aq^m}|V7!5}3=e#(S$!05=|MQqVd-C-86#n^^{g!0mfn9} -Pk|Ka%uabyog2zneOl~=Qdyv~aV^{fF?!%I^mwA=Np-kWz{NN=EVZBV2$*Ph$+-*wEcRZ5_>xy&sYVq -^s>#NH^-bof_G5h(=>+5%mpWa`;d3S{mVccL{<~x?;EZG%#DcMg4$;IN$K;NeMW&`^%x4AICN^X7$Sy -qv(?+#+1UC6DBiXNp)8_TNeIGD*3fS8|b8WyFPzC8-hd?=CN|@#upAQdQ41at -v_#qU6?^fx7!Te0jhgF%Ki)hPtp_uNHsLTZj!xTt+9*SLX`*g^5VV119kiXfBy%?|>)FK9IB=X>(gMW -qtR+KpqTIA(L8Eq3}OH~3kAHM$%Ug9q2!!rRt<)MI|`y_k*Y&d%{0O*gVQ>GxV4->Rxd``PDAn`Xsg&p(wZJFGH2yD1;9$yki0g+eymZvPmf9JzcEVA4Dh -L=NDB^MFydp=x;so=OJ_QUK5*qOcbti~RgH8UiB0Xz>t5t70Op%^jPOmxGNwb9^2uqaGZ&}_ItVy%-> -fOaJrXZu8M;Ta48*#+5077bo5-d$ZUUoBo=F5g{(OqHC}36Szv-v5jq1>Y0|dH>_bC)587K7ZqXWS`{ -c;G6M}fAPkHtDoO3-d-=SFMoae>f)LJ0EVL@77Fk*BF*L?zsuz=1VvbS=cF=?0#8uw=~>KS4k~JT%l% -y*SExMeDvQSFwVExLYUXmOM~v%Na1S^E#6Z0fAJzY#>k&m*N&#aKW*|Var0)e@0|C~qQV9bm~&44fZ@0^Y5``rcaeQ6%_XxGP -}LtPf;mr0hOCB@}oSytKnCAvzm^5BH>Vvg%u%)oVmW*M~Z^^H5ISsw;9H|`(@F&O9EyF- -Bh5fX&Zb6-VizFJWb=e``Vg;e$e?TCQE5OpJe1()cXI9nyi!i>FrbG7&ov~~#y)1W!?a}l89B)3`QBD -wR%$a&}am+&_9P^bC=(9;)yS+?Q3$lQiy5@zHo0WaT2*W!H${^^Zd1DA?#=q%I^K+_JNea&Xe8L4@RS -Z3%T?JZ@}qiqga$aeSaZUN?vEg?nLhbcI#EOh;Wl3F`3&&g>COX9#%=!Y1Z``)HXVDH4}F|BN&Pkyc_ -!_6){2m1ng46(3-e4K$~XKI_6EohtBXSDF5q3aBC70}oSoS_QGkoY<<^V|uJ?wU2e77*)nIgk4Y*-l=y -n|h@#%{$>p5r%3S1A^MYqKQ!t8I7u~@YA=d?PDUAJRV-ms9Bd^66ii`X=SC?gpS>)mk{pfKtDkTgc70 -)0}^1YW~lB#4K(PC#9q8$?$3n68TT*j=EyQK;ePN~7T<11?!S8P2x6t5BcM_%59B^D9LZTwfAoS@6iI -FD6=@+!%yJCrtXNFwOK(fI%h-Jtt&O)r8J{84a4AW%KumO!FX9(+$*2~Tl@mhw*WujR;VzNK!cl;(SI -;NyU2vC#_J9!A}LQNxJ6$Kb1kw3TBl$Ze9q-+v@oobSakCLX~`zjcE(5DYgUX)NHXO44|#{dbSq1Dh| -GDxSCYVC&0I2m$p@!65Al*g~b5BB2PEVqm}7)C7&UJEexV-zL%4$b`&uka`$`(Tq`I71xeg1wccy1lp -u3RoOrMuE7x&YMp?+F+uNyCKG|g7IoN-+b2rdO?B&*H?Gs*tk8r23$~*cA-jXh2u_Ug1eelPGM&&+po -A-9L92#WCCYeV5`kqNcD)U=8;bV+9+n}{_H|yyo08MM80P6oR#Y-*WFJdypwsy|+e%rS&u07mK1i}@m -F|L=&;D;03MvT9&{^k|nCVT-Mk&uWa@!;Q2uJ{=?FKUB-xG)v~L*fu*D(f*KyYOz=S@hed&suh*y}zSVpFaDK(}eT=6=qYYIZoy}en9l+x0d^1-h;&0iq4 -P}4gyCC8!O_`W7|;|MnWVQ*gyjit?U7p7P-qi_bjPdi5I<#7h{aK;g^3zg77JW{eai8D{?%!US+o$I&&T)ene60l;N7 -xs{LlM8?-b}R!nLYQ@ -{B;PO9*O&DO}sM^E)9zlqRYg;Y~lBzodz^o3=cIL+pBZm8Qq1JV5RppNBq_HAr;gTB8|mVsI=aut=wa -+#)Pdl9hf^G>lbhla^~f(fK2YpiEMm_!8X%CF%N%=H+ujxeU -=b{T8N`n$dMEo=rsmtQ?y>%iWIBBl3Z2Y>&Ot{KQj3(k3cHK*CfB2>?vo!+c88tm$1wj3-}9V{83-A; -=U1*M8|2n02WAxQytn@wB*OfV4|#f0#uNW77j!<@HY_4)&1i`$%X -a#&`I@PILrwV7_-y*5c6X!HDP^sI!p@@CqS)-nGqS07V18=tVue1S@!)ui -BYZQmcf0laXEfg;9i3Nd;^{RJjF_;R6Pi{l?0!*49C`$h+CmJpsXm4im~y!gsUo9c2>9a$WD((*O|Nwm#F-;?did2fP#50G~GT}b -eQ5DS?8Cf|Kc;hFA2^3~W0Lm*h2`hDG9{`a*y1&6VI-7gWqc3n|&SNT0DmT@RU#F^H>!2T8uQ45_GSL -(e!wisl9)e|x9q&g1-C?vct)_En>F-$94bC2YdW^~So9RYffm4&FyUW-ms&}?Zmy2Wvn8YitlYWCD^- -MwU;_su)+Oi=L`41#{x8QklHhy&JR%l|){5$9TnSivecFDK6lp>Xala{4Nnv_zKJs3BU` -+mwX4(XNK1Fd<`~_O2caRYoG%I$?ad6z>s^Xxmv>;fq<9Cr~Wxof|q7p%vTjK?gCjvu{)hE+Kf{H`~z -6#J&ajLHJ~PqP2t{=50i4d3T&fbNLC@S%B6%EC42*PhJ9i@_5kB=AADu9ZdcLtwvK=TRrr(-$kOUPJN -84Db81c^tUh#FvTLkdjhfw#&`+PX@?PB}MS;8~koW^-N*yvDHKKUonMsmWU5Wj3q}9;gbU{48ehR1PN -VEKpdb!W7b9EDW1$Zu(#f`sc!a3~OaHBch?Q4Z?N2Y&^{5Zc>1ycLf*$LSk2(tB{>J7S>_>rJ^jc)v#rRt{a}(-D`G7zed=i;X{MmPG -;GGWKyuE!^|<|#C -dWG4s*=W$V#HIG_yt9V?R!%^5~r56>C~y?gpvWI3EOiI+%b@cg;7+MSS?s{9`(8hPcaTW-@mHxJ4!YaZx^wXTh&3Qq?MbOk3=gld;ds$I_6np%eN#_!m5T)!Fou)w12+|R^ -0G9MeJAlBa%@}RuCFSOSOS-3C6BO0iaq1_IIle+Bu@r3mX5z(b3NOb)VbH`&5 -3yHa9vl9(RaC6MMX#(Rt@k)m*NZBM`x+%&WqGO5K#`r`w9DAa?qpdQx?YyF@3&wzZfH7zIIXO>V=#C- -nLA!yYrDE3jIol5Cy(p0Oxsq!ekieVM*cA*0^dQK4#?$X=;;c6U_!nlpE*Mgd1#-+TFuc6DVGsmpKtC -*3!v0-WA+{@&PiRrhD2ZTwn2rv3GJ-1=Q_y5h|0PO`gBYln0+#P9LjAG6PvzgE;mL(ulvEmEA+6?*lz -LbvVJzFu>kJnE6Mb4x%pBz=cUAvIy!@Ft9EVeO{!7Cayp4Xe9i`}&d}*ou6b=_7X8{U-Ec|mTetYRXCUx%&zbJsF>q(ChES)RsiTNi@6Q -Rh@BTUk96F4q{&t|kcYkel!}bcW8U6g3JGx1fn^K#PXijK~D{T;Y#FbCGosGx( -PR≻!$nii0_X+_4bP_gCkmYWY|A$BPt@i0J~sWGI{X|h_H1?KffZ$VjqV1^&aK;YkszjXJL`VQ4^0 -U8JRTqPrcTQ66$JIzWX_O@E3NyIMRF4#J!9>yk|#`M;N(e^hZN0VB+-48!wsZV>Y7RB=-EW@1(@LZkg -x@*+!pSpuGL~Tp3&D%L;@4qPLb0IPxShKUSQVJ5@1Im0mGghst#+3DdTOIBLrG2AX*L5(_-8Fi%s+YqQmV#721i~?R;;1uf-P6{GJN8%7=TaqrfDj7D%-qJclwYgdwauC9gjc_ -V*&pY2e`wj=MoK;!LOTU^@2AP**9IJJ6t{NPD&8c+JNqQjvts;=b>^{-`uezD648Loi46uvFpVc_iqB=m3LGeT<6cr`PawkEt6@{ -XbAk0|XQR000O8B@~!WZl!l8tFiz90BQjM8vpqr05+q%M3uHr7f(r|~L`c92aotkIFauZ#B%Lf~GHkW2-mCp;uUu-cUhOT -nm0v2j%W5_#RzSrlRHIGttdnXiF)R==-{(0qy9sFT?fb|3dH;FQ%$zyrIlrFsoaa2xbDndy`mV -iO_)}Ge+0SVIoXr3JF9Cl!lU~VTUe0*us{MwA?_9Oif8U0}^$ic)+i>@f3-7u6{`()`3xBw_utB)L@V -@&CEAI3Z{`i44Yj4QT&MeZ)c=G(6H=KU*s>bBsohJ`8{u$meOIzb5`hLCfJ^Gd#UxfDuU4Ll&h{6^&K -0@Ok)!|>&->=d4lKbxQV|o9m?QR#tEHqe{SAO*VUCFpE#%RbgWHL+#eEeFA`_=XEu+c;fD;PF1jD<1K -^yHff8z>S>zcBzloy`;wVN>tai~d`0GBC4gLk!Gs+~3o{-3G>)!7z_~#xMo{!x-!zyke}nuwVZe{sw; -SW**)@XxAHreKlVWQ^+u@Z)jL^H-9(7WESgvpALUVFNcGAoi}J;%o{VYJcCwd;yZBR8yYq=+yi0SSLi -dd1m3LSyX7^kUH1S0{%4Mc16tl)-+`O=k9+w4|NDRPZ<*ZF++zj;*x532E@OXFat(-$EF-u=E}L5wtf -An*MOF2yz$5%fCvNfq%pCEJTrI)vpMJr~kO#9NF6?xZ>A9F_4H(osrpw95)dTi-2m^F{Bnmaj)vV91h -AIc#+#ySN;#|hPm?$|kM=;EfKY&qkhJzK1aw1e^kX>wXBver{pu8)`R@Gt&V$XD+e<4&Eat+v3|LS5W -Luwq58hgpTP>cPDBgQ=*@h=64#iUSG)qv5b3IoKO59|%ztHv -%0GmLtYc%jz%|Lh_=#0RU(oq=2%Du#{V%9=OjGrL)1}rt9#`n)YCpWUiF_SCtl-vtt#$o<5hk$s^UJ} -V-7|GQqL!}JUd$DGyzGQ6&#?aclSWzE2IugJ7prW^+jdHI&>^R3g5%#Z#K1o84o7{%cuAX97U%&!2)& -THRS{txx@(#-|&>HcL>BT~KvCvg~_93IaKfrjgszq8=&?g_c2P&e)w~r5>>-0Yk<-1AGC5o3&#T>P6g -_2V*+Yao8gnGvaKE28j+whfQl3cx5RNYv}?&_^sbwnE&t2b~1AjsY?2?=r)G@_;k26ckh@4tSoMmx{~ -)~n{RKp2q1S1J$s{4dk7>~q6-x=Cz|)^&=Nc^suP$DnXq$dz!v{suteSSp3XigXVzQpiO>pO>VMqBP} -b7v5J)_WnvNZf`oYXqDVvN1N-Fd)2&L$R%FQ1dIU#pa+X`t9cbjw!OiA!K&uXMu0?`V5o$A8vWti7`f -A5Iv2Z;5r78d6#$ey?9|e`6U{xRndEeOLux7NWDrj*5SLx``J{@X0yS?2R?-=&D6+W&>*2N89mw#gdD -At_Sj8U9>nI!|N+PtHv6=!V;VwdLRwVYPS>F=R%*8yChqRtD6Gkk7xY7s@F#1~DIO -J@OCpkF=dhQu|b4+tq{F0x+4Y-eFMLz&-diGK2-mN<3m`uPSV}s)h5la)CS1&m!! -3D=nskHUy$=8uvL01F{(KE|*t)=44)d34lB>$m)kUzWkg}B@5h++sD)c&L@e9$^5tg>n4ItBVEA?zyl -hv@E&BymTOtDos}=f-@zfRWdm0Kek_wX(~asK<`UE~``m+`VoEotMo$MW*3v5whewGmK@uIBPO*4iqYuz+^F -Ou379R2TjR=iUqr%j~zh%N>OONQ5k{N{VwNws+0C0q{i0|;p*WH0I5!+6_n%mWS*7w5P(s#V?liX5F$ -lll%K#4`;mIdIxiILg|NF_Tf)d%=)at>hl48M1ZG9yCB(|E1Q28B5v_Jp{rDyO>egqFG*o~MBmpy}Te;*cwq}Xsyi$y?x;h-M75@KbV1Ljev$_NXRDOT@zPv|d>98bu --GOge{2~zO%0A?iLmne70lwd+`NXUnT;3-Hrd^}<5FoiImFT~%(ddWc;yVSt?R}LbskM_grPl-sSWTN -irp-sj=H028QDJ6e@DWgk -19BIEINaqk+$mpFq$aRvrcj!AeB|kUTztfhe1!g-?)QjX@EEg`C;s8JZL17e+Y(l2Lt`LntJzsp0~IA -y=>4kBuR_3+OVb?1ZJy=Jk+YQQ^%dxw>O6l#f)BLD#NsatiWCQ3^T%Yi>nSY;md1K{nN?xy9dGd?#V|}&wmx`7=&dia@xW| -!FkE=~>!ArSUrX~R&xOgbR9p1(z2pTfu~%EK-J}M-YNWJe1&hVC1B@5t3uq4Z;o1oZjWTDykYDB+;71 -WZWI@6utFWZ%0g0u8Lb8Eg`J47iD^_+7`N6e->q=IxS|{bmReouaSppU;aCt1s@4nXBz -`r(rOB0MhhY>?Ktwg{1m0QA-EsVy)FJC0yJ8KD*q`6UAdv^UQ(i>)YvO-&SiwT#h-Hf%nmUzw;@|h+_i}n!-d?w -Uf@Q(xL`qa7DlJh=rHhnwc5s4)WaHhYrUhFk1Df}h`42h^KynFqnRV#E{i{(`?w2W7H2si=u6y<1*&c=}Fm{d>e$LKv(?vbml!6W?V#os -`Wa<1snG3e1TZlB>hJ&MpCLAy?1yN>Zu+OEUJ5oJ_BCtRcyktzwcBqe!J0Jzw-=>e}#EJqq-gnY8-Mx -g$Qv>6Q3RL&#*cnj%+HmIdo7a0XSbQp7?{d4p-Ol} -@r4RvoCC;zFqBXZs%Mr?~oeJR5AvAqzqfR%vVVQfWAa80&+z9K6pMgQ1!4l5ZaX=qWcV{Mbm`20<$XjY`L=&^&cTG&FB;6+SP~=KwsDc!Bn -g6bair>(76NCc!Mf55(1)B!68zTwDWr=9JHI7M8Hw+~l&bAJnn4L14I6ZU@nX9}kOwcpfM1d7QM7!g>j2G)OJ^!e8y-_~(Ebk0+pdUq@8~l$n -NNm*WrBJF$$NP_ug4LTq4iycU><a@jSQCM%JdPg7SgwSwV?vv;lIZ+5uQp#)*x&44(_D^cZse$P`yTHUc>l73F0iA9% -i1>`?6|&YdfBE|Ou0Gsx3zi-SvS827vkV=ic@~1p2SLREuJ|#Wo>O(sq$Y -CuXLq$3eUjeHtptGE7{W~rb7ag4qMmgbV9N->#6(W4*F;V;}aP(^%2js@yc -o3i*wS5gM#l}8{pL76M6#EIsM;kNb$T^`;jwtDJ6a&%X!%7xia2%bRjB?cB8rZY~ke=|8t~o%?Zt|D% -q#5gBWPoc7u0(O?wXOlB$VK>BNT_)K08_R@T{<<n-uvh&18K7mn_9{U^7T<{d0@93D+X%SOm?L=@Qd5Dbkf@GKVz4{S?qy)WqkK@}U-W -q3N=^TP>^Y7N+=!QjT&Z+D&18TYcn{IVhEP`@H1G6vYKsO4UJ5m#Vj%Pa$gYe%ytrFLSX1NXtiHkvC| -c8$gtDfdttz0aW*W=DErQ6lnv7kc)Mrxpj>u4V$h)lLr1(TcDw(?<>@fVSsPw0&qvyKyl<;=lJjx*TAZ}6hpLnfIY!#> -bM9b^K^Eq>9=NUB(oN92x?iW0|y8QIZ?LC+-Qfq>tP}J-*+gqCfm$C57?D -*Z$eAk5^ywN93grc`GO?x(C8KFpreIQCtP_Nrv*#9Aaf?TBVh+k5|GP?OUJqFSUCJyfMgq-kvdMQ^`y -(vRo{Qju$eZK^`LtrJ)y!j&ARYjllU;o#*FYT#@-U^3;gtTNmCjQa3-c64HjkK69VWlcq64E$L+Z~0m -AVF%H2k;@*S_!3Kx?e}TyghbCM3$0*5^gRMoZKR$8zr#yS^41Z3d~*D&%;{2f(KcAfK(ZF*RN?aT*j^ -X{~7qKg5b%0|29pe%`>3e4gcVUchb&>9NXuM1jV#ykuY&nI27#qMs%x}v+ -esTPranOd`Ml?5BjwM=o)z+1#Yqwq29|F?Soy*gW+q^r!|#eyeG$HML3rm!HEH_b$yNiJOjA~kXiWs? -sSrW?viS3(4TFB!a@VRn&;AYtdIjhs-Xxk)7k9kGq$8CsHXD^bK#Prm8dpNs1LI-1is<$$z_fgU+K^*31XzL7GfLL -lQqy+XyHdV8i)d(ybs&?|(v?F{ -$1j8IR&SG%nZg#>PF&qL5Km`YaHkkmdCT44{dvgT-in^07j(hZgN)^B~~_2Ku}(kTq8YqOj5|e=SXZPVVuNR*adhl6F@LAps&-xvCwnBVmo9Syp7mc)>rmv};^mYCF@Ot`D3k -x8!i`g|W3E$>j419w`vCE3_)JPh$R6&{n{@aO(y9NM*F-tEzGt5jlX6c(am%2buB~S`>LYAGaG>Dc|H -E#)|z|{Orsx25s|%2L%^cv!!Ky -(z1lKtXDCiU0a+}$fNaHOx(?vh=~S%ikR5Mk0IMFsmXG!g$gux1A~9n060~$?We@*0fUn9YK8%4+JI4 -$X6#4i`arnhT24ZA=%H<|pyxsG2-i|zKv^g(COq7uzeL@An@9?|mVR7)NEW}Oik~l%eExcoWb#*mQqB -c;8gM~Pa6vTP#as!*nE19W9))+-r}5WN0Ejxd;O}U>lN#`1u3iL-KSdLbT<|fv2MD!>CYDo-S7TyQJ^oQpDHK(;IEV`TvFxkKiqZhl1m5n5Kn^Ht#M#3oYH&LsFE#$(@Kv?+Bc<64bZp$tNeNDA=q1OVaaaC5i+A3`}OS7cSthB -j6sk>tDLO{Bz*LON6fJuSQ_Cz!mb-F+$LhuijR6j`HOaNG3SU(DbPri{JF0unA-`e*3qy3jC;+S -NCpW^xrEE;&Orc=OC5>NG?j!}f;8O~n#^)2A_Gut+HC_;s2c-7DIsi^Ty29G+LoRazYH*PLSvF4+HAMRCV_lyL6 -8ykPS;R5t$JXU{hbx$>Az|QB3OS9jREHA4H(Ir)O-zE{%}TGrz_;8xzr-vs<|APYSpeQwfo;gbB@}>Z -v01Ln#P_Q8T%23`JKmLEcj7##q-xUd=skrn|OZ2rkp_bau_i4JCBdVk+W2w4^B>vqXTrdh!|#TqhuRL -SMRj_iBWTzD8xm{x@6RV7G>21E%LcaO=>YfCNl$VmLayF5yD(o=uI^nUWn-{r6`I`sTDw>){peAB)ybzuFnI%OFU2 -x_a$37fWpwr!df0}hgKT+`+4Qd6I*V}K(CS52xsuhs)xRKFu>DSRy~cuJ)I-aNK^gpAi -pYf8%+Ea^1|)8p^EJ`$<>R3Ya)1r&y_zUSQS)i2!=O1w=Ixe3Aqz$75>!Js4{$!oOXE=cKk(af|oYo2 -V@IvLZ8;VC>qr04k6&Sx$K?|KkgE)70aJQJ%TUvi_)mR-O5rZc52jEOhWX$cc_6YMIB%wcH5-z1X+OTu6$KMS4Vcj-^F -580uVkVNw3FCGN$G{mxrbG?4VWsVHLCNKruJc>dyT1f$!Q7G1YZmu~EV)i2(Z-@F==#agGu+Y0@vO -iy4Z&laZ&;~q5x4%*t=!Rt6k5>NZGAM?XuT>u`P#?@!ADl+=bil)AW|`OLk-x+}fBOl0zg<<2ub_(7m --07q1UTj-H;OZmdIZu{^$c!Qd3^z9iT}(k=!vrE*9-$KMfaq2MeLHr=yyZ*4C>{xz-;`un4?(s7UVQPz157T`wH1Ji|MWU$Y|AyY+MIU^=R(^j7| -@ZA#<38$NI18uF1a2RST0+Se4!w@fXsTMSp6eO+0ip)nThhGPCrMK_vjX;^*&pP`l4k2m%Zmc!DSB(-Y8*xeI8_rr%>Tf?4&#G3)b@!#BJ*sevG`y55&m^3dw(>8f?EJTNl2dGjn3BTXoP`2h?`m>9EQ5IKmN_Zui^R_y@q(syx`+2Y_OVdQX-X8}YxB@PYRdSV`mWe= -OB4c4+{gxijDrm68ODDpjAVui2Ua#}$3Lbr8pZzar>Bk>oQ%ZmACDlV+uP|S~xlz>nj`fsN;HcD|@r2 -!_{wcOr0+}^MPDC=r#nhuF$A3zLC$84*@9tGVaMOG)*u&9g&UwSo~I%;ezOl5t={oz#w*# -Wu3PP=jHikG6J$dsgj3POcKZ%8qd;L)x*fDl>aCz#c}3>OOb(hs5lSmsQh<|PJ~?lZkz~b`XRNtOC>w -fa56}ZrwPiD@+v=!Ie8F;TNmq?Z{}KjI2462>B$d9;JoMzp5j_6A@TrfW-uk>i)Wt`r%=a9@-lTVlU! -Y>xeZX)jMM5ye`=PDkSqP=+B|U+*J(60)%iVgInE6A!~V+kpu~QO+N=dE`O3eGq0nv -M(4e0Em}eOq_UfVVv?0pTSqjkbDu;e1=YWOWrnv{NB8r5uT%F}rPHenD$%;b=^VYY8|b8i8TuBZp~io -i+y3&ZukNv|xULO7t9{LEaa>ra -O3M0)ACyD^ae1>e&)5M1d7(Np)ocxa3)M{3M0^SFB3l<5nR8pYL!Dir&tB9NJ&@@EW|7Xntu@z4MB=I -D$@^-YDpszucf1sQN6`c3W+p%d7QCF5P+$C?{uYHYyuTgHY=OY-#y_k#4LmN|#y#3|N03II#*k6qR>R -v35Y#EAw@FSc6^7gQnu>vwWjmUyV0M(vEpt4m1{789$c_{jIj22@Qr!gr}emqX^-APye@oMSpl(sAPrT|{X&-S|L&UIL2Lgh!h)zXR-q`BVK@?peZOxUou5aIt2d?I~Z@&Yk{`^>_A -NdDxm4C4%`;Yu|xF|6Pd8AcyOP3l4&|$iA9a_J4BBCIyZd^xRMW2*pjyxoqY0#V~R158Z;_Fc8K|C+x -G+_k&s?l9iEyW(n3GxPJJx0;B$e#q)|Gkivk++4S>etUPz_e94&Z^Os*_~N`R32KR}ABoUVNl?Q4 -ei^|AIfTl+eyeL1zSL)uq`_O)C4s?xsxUHe*Dj>CizKgS3_7t19Vq^*ARckvAq1XYdWgXHwVFr53eQF -<4h&LNJfj9b@1-YGuvJM@Ealv5wk+-8-|A**;RBS0b74Ij9P3~m%zv0UQ+T2+yp>G1tqHXStxTgflAu -<9F5Z0J*%L1tV+$!%2>xOE3w*f;-`vTXl4eD9it19#HDntsgIK9JnMI4(iL)VQ!HgaAoQy=NW0y9Ca6<0VXAajALFtiBLty791XAAm9NJe)F}qxf^H@E -p!RU?Es7-IIHZ}Fe(mKc)x--PzBbOsR`lSk|UYh!$dTdv6R#znH`Dr#q&n1`B^M{m{$0IFIAGng1@vK -HVmFMi?x>XwIq;48wPcFJoo^d=O54@^OytMTUU98C^YQ)h5v4s}EI$x}>!4& -p(qS4(M2(pFKk@fF0Vm1&_fTt4;dmu%rW7Ek)ct)4^MrJMtby-__bwwoP-wV@~Jt0|U0MlDZc{rDyil~dCIpGn(;Q8nZ>H;Ae -0K7%n{iW>+!>B<0QF7^8SzAX^b0s#9LLfRoWJZj{GqkRJ>r$aGDVB;~fW3b^HvHWqYXH^|P-j5-|=`~ -pc4E3ML!&o$D1Pc95WJbSMK+tE&`AnT1040=Jwx9ssf_@ykHbbz@W&3w@W)&N)AeTQ&$-EWK;H8vDo| -HSK+GD{}yk9MCK^y%^l*iwfYEMgzo#NMK2sFRr0c^H)}qOA6`U -@3ET@;O*e?J>#KNlTS$k0~$4T;1yd2hEM$Ti~@}gzV~;866R>ZnJVG=IUyq09`FQK-UmJ7X{GxQ6b%0 -vN6K7G1_b7YJiRr8Mw6yRC5p|14!p_EA=9-=uxs8$Rg==sClpbesH+cA;i-2luspN(PR-|h@^evC)zN -6qJPpnB(6D+lAF;)tL;Nm>oiTZhvjP4VSRJ=SHQ$Gonm5i!&mg&fcedrzj6+3A0Sh{%vBZCUoSbJ>A$ -CHq=ROt({Yh&S%*{8M8+2C0&bP7i%^vV20=n4GCYNG&YEu5Z5vjHL0GjfkbmnDE%8PY;3H&qA -$ycNivJWa9Y61X844)=$m1rVJN2z9;h_H|h&+VN^7;sKr(U%1oVo|Q3~@b+l5s!x+X@Yge>G(Ak^8E( -10r=E{1<-+ZTWp_-YhCbInMHx;-JdUwTIiR3tD$r*g-sWRIq?&o#kk(ZXlje5G!zpf|%xRt-VOLRG}- -49^qBw2^YNJEvOL`W1L#~&BMRwu_j5APJ=Oycms0P@NI3fazeq8*fieZabby -2O4IaMZ8sxm=f5|i2Pyb3<-tyMS5rPNI<>IEICULciX<9w0NnCAbwD!TXFcTVg -BO`OrB-5XuQI6vcCxA<8Rc!fpB~7LwyBa*TwE_1U=t8;@t@%C}uC@%c23Ge+SRo5g_P&PPa`~KiW|AC ->BrK6LX{H(4$pFkOrOB>=Hm0@GOm`SVmDbeGBG-bNm0HP)u7r7k>Kbrd-10N~DfuiGLD7br2r8e2b*D -8gGB+s?wpW^)gQo;bpntiN8Je%6N1zz~)~%CfLR3|L9>`vEe5tnCry`|DbHs#Ez*3w_hL|u3W(cz1X% -jyk+M{G5SS$@W;e7F;iQD0akV?l~%{xX9{jOS3cO;6AH~rdT=d<@CoBGo`$Wv-SCcCE0vK#1c<0K&UF -5J)CPGA-~v`7;gaC*^>@RsKAlPV*xlt3O#>8KKr>z+Y=9%R!NOrj&j@-Z(J&$qua`51-p4yaz~qUlTSWI%@!! -bghoj6UHA*Cp$0P3n6lM+boWBJqv -<6ImIA!Z=LRQd&y}V^$)z&lk_d)AYV)PAx`YNgzkmu=&3Eft*(NMV!aurL!BH=>fri0I?$JJ1FJ^4(M -z_dR2Jl^H|C^sl~!~-;d4RlwxN;XMX0CdTxZSrFsk2m)EBD>aryPjK__7l3>bkfowBC -fD#$%|6Ci1ml!I48mKp&Bqh&$O3m1D>e|$3L!U0kMSiT~tdK|E8v@&?fhj+tXD}p -Jw=65#2Ibt?u5O4w7zbzA^&xxIHABuI@<87TJ -}naCoSoyLIIpm3t;E5@X%asl>)y2HG=!s6A&sq3x-SdgNLg6(nIfvcW92l?hg1q&*z}PqcpagIHQkki@H|d8Gp!J&1h2!GJ>*QJUJzoE>e+#?f@(xxtYqC&7q7ag1DQ-F6rvpB&0k&7nQ -5l3D3&OZ6j3H0yd8U#_F;Biy5DY&wzCDcs*~m{m!M5Nr5;8&S$dE-48g#{xpz~TK!?=}isAGBLdMH72 -;5`l+tlUml3wqqZf`_|4l}{EQ!y~`=7npr?z#E -M;mQVy&GP#F59cNifI5HMd~z;jH(baE3+Ls+#Oy}Xr7rD3O|SIEXwT@!0H={Ma=-dc%#ztW0}kdJF=q -UJGHo)fAvNICMN{NluI(jv3t;?@a1dLZog3zG*Mlxne~5NgFa^pIR_70=_znDcltCL(rCl8;9&Sm=S5 -CoVhiVlL!!14fT$F~^+GVVv09Zpl**^rfLI*=9IGqas3jhw#jMCbz8#6#1rYD8dLgrh6bEH@X5V?Cem+%6Yn1@ -^ZU48A|2H=BUste^*Hf9}GSz}V{$4inqX -WPlem=xTZX?@2)>uL<+43=EBTFe8p@9BD+>*z8N~DEb2Zu8fx1Q@7Qu#4uBol#=Ou$<(ax_+QcW?r({YG$%q|zd_$WdARN6@gTj#oNKZ;rH|DDw -Sua_WPUWt9(=@`v(|}wH;)Plqe~LSemDZmMi@oFr>H2xF5-+(y3lH)|p#EP4AE2*zL$j&2LPo$h%!nG -C4e2$j^r_J1G#CAJ_D_X$JaSwJI{#LBK19gFZd`tB1SB*$M_pv*_8R6&IZ7_oO}cDi*p>nF4}?F!(a; -iEATOf>9~fLNxq75!-7xLPlb%jMWg$b3ccz#QPwUCBMOU$6X3ArSwW&Tkrv*K??f0AvR7D=^zj`z5hG$;hbJ1%$$`d3zKxIs8Qbo=*oX$&grpuh^PyKVvRdSU7N!x9 -frt_J61GQAGQ>$%Fje|^Umdu6b8*~r8_KF-!ChwNHwuL!U5!gk6Z*65|&Z*@ML9a&8aTG -K+2?}5)4eaX7028Vvi=kU?IbEHRrsfe{<=t#TR|OJ0!nOVwb);$=_sANIOE*;ag(}j_{Y(?r(rrK&h( -ROQg7#}zIWwCanS!N>H7lm3!i#ckFCM#!O0~ej`W&5{c$}fGg>8n}tn#mt%H)YG| -ZPjY)!ZeFA)lu6EiZ&)Z3*)3}=RTjJj^8#KZ3g)H&>+0$;ir{Ac1oU{uJzrCoir+zHUl(XjuyLmaR8u -`T<{p9xm4jU+8u3KEk`z|&5v)VlCYE8dqm;Hgn8R2sJtQP4sLIjv*|!r0os;H+bC}DTihWDKZ8evY{G -wl^n^#mm7mOYbO>fsr{a{k{)(HROH=2!F1^VjCX8D$+D6G->(ZR5^U+?A{JMI6ai=o!T<22(!xFqWjJ -!^DKO2b8#kIZ12`-2pRp<>c!*1@ugT7&5M)IDLvAEA8R`;L>BnT|H|1{!N6!Kj?z@50DOwB@laZ!8AW -9&y9QSOO|DGUWk3rCkI?LZS*_2U0b6x5XwaEvGFfh<1433NW2A5kx5;Vm6uBaD1}52c(wF*4|gY?z2Q -=7?pPLN+x-*#epL^d}Ng3+8s&j5?JV@xrx#L?tUIl`KnA$+UX0F_FptA&|YiUNRx2B#=@ta2^6v<@EN -7w5v0f>yUENHQ*p6ok2u!-4cpmEj~jl1lpe@pm9h*V_{D7Ip+Q}B%mCll2I=+8W;=;u(bFuP|u<53s~ -wL?Xbe#|6Yo7ZhQ|Ni{k-YHWNSQf_GtHZ4VP)IY_tFP<#p4{2i#y1#yoDZvza(Z|yfchk%AMv<%&Ne$um$5BI2swl@C4Khx{2rq3WOZslmOwF;>p?4H2@T?`mz6!7#a!BO -(kgo8D!06?;jxH^-q7QEH1b?4B+*VPn-tfQzUNW)6TvK1!rn-Um_e-unI5nFb~N%UV>*{+=O4OTVuD7yI;}ed5 -Q>*EPf>^)2{|Tr5zd3Z!r)Sd3-ST>~)}7-^#p-@`F(5AulQDgp`inNuf#*!X=b@mP?iSAmu38@~!B_I -!CI@2R#C05~FtWf^&s#5E{BN=^B)q(Sl^d4K|Q>{-&zU^;Y#OJZ+ed*B_#LLJj2UpKEpUY2rhWsYt!e -yg5rA(P~r;=rCu6rGBxSoc_Bm>I$Zew5Xbv+*oNcUU4qNs_pvul54iwT~*{t -se>vsa+bpUd2WY9wI1lU70AEW#hy%6C448ITnZv!}Q8FnFnQ9g{f0dT+Oc5TXrm+e$G^@wSKJa}UMj9*W^Th{<>yW&r{#yt)(=bl2_`jx-jBy#lO&6{cri(GNHpud}0qG#N#WBc*)(w?-j-H^ -2--T|vbnJf=&g2fg6{=v5X|xc(6;A^1!Jfru=*3=rd9g$-hYp3!Av$NjBLZlq=&g1aqttM$gwHVa{m76@Q6Mw%-ES9mwxJ--F -gLgNFo+OtYA*pyd6f!+Sxq;Po83=OrJ5zMd&fgqh>sv3D}zqf;O~!TXBSI!QNr}6-b -n6sozr(U&8HMFrfLy>lZVIf;h$92SMW&K)^eE^(A-{&SBH>^-7s$`MFSt+uZ@^ZKRvhy>yt -Z`Os!zd4$Y;`AJAec*o4Uo2Bcui&`eb+!-grQ(rPp+fY@g#2kQ05#r4X*s%5@^yz_r{DYyzf9% -W@QnakY5WkQ|2?UCXawQnaIuqmBAR+zjw-6u`W=J%~puOIm{;&|J7ap*|hY8Kh%vL-vq6NGD)_q>#_o -kkTIkp@e&V!GL1MN%)j93UG;$rl(+yJTU|`E_hMka_epN5T6ce8z`}7izx{nPbkwU_v -^ZX`zh(SHO&I)*9oxSYOq>O;z68;fN(ssrcF1*VJVCQZg6I3V|BeU4!8OBuVTfDJAEUxuR?7Esh=ZVw -To%N#kvIdEG^M0OqCPLgy9R!?!r6CFTTYV;FrpqgX*?VRf<~qAWC@hGZdIs0&JEpO251%NnLDB4S$0c -G(+JBu^wftRdZY1Yd=*(T -1Sw>^|8`M3IUD;Bahc>fkCcq!WvOo_IeydCosW_-Atw!yzlHTq=1KV51%Gk)8|!y6!&IS9mT87o!A3^CF-#p+s(lbg{TkeAUQg0Z1NU-J9Y=W=H*MX-^ -aff*Aj5cSz0~iQ)Rf{7-gQ)XDdj*wP!+!r9j1!^A*w0I{~8^xia&m(DlY3_>r-H4RP>)w#XY2c**{XW -`v-?9+M|a`o*4ayinbU{D%$_G?6N~*a;+_RN=Ubd<7o!ELCy%{$l=2&y=N^1wX0swFnGxf-r)rh&kjM -%PeI@v6Ta7}4dK&`d1T8F%p?d>8BD(;*7|~W9M_37f4jVlEk4QZGv9p0t*RZM|8&qRHm@Js$N#bOnp@a|1>?^wvqx;s -qjxkpqQYMNc1G&4R8~8{_v0@kJpEfJN>OAL8i2P%`Ru4>kHd-c3?QjqOqBD61zu8yJN_ZQGI`P48Bf5 -xz(*FGq89raX#%}U>XbmeR@Q1|DWzUwfP8qXM@?w6fu9^O`be(Ucsv3$*XwhWfB!6bJ;!Zg)Et_z6|a -yJ-c)H3WZ*eSor*z5oWjH`O{sHJH7i!tMOAu*6*)>b3~#`Zs8msf*T^sw6jos?q@8ib7gCL}?Fk -cF3h74$nR4E*STksNU2=7pRfyWR9I)EJ(K#$U#%acjSIFl0xC^%LY3FJavJcFtuCv8EkZ5NJNU)koes -q%%&Vb`uxyN7e|4`S{Q<{`iYS8spn^XgGgtxspHrNC$JLz{uHy{~Uj;bYH#=vhr`S*B2~;Rb0*Denq^SMi?|_a$r;*xo)+zXf>#U;(3+}q6IlnR3mR)D -XuAFL87!apU3jI{7q)$t!v7E#xP+aBUZTveY%vb<&P!5oALYp@}DQaaeS4!@?R#u@!nHqQF$o&jXR~v -obpGL-?*Qm+))0DPb}YK)W1Xcom2iYey77X?hdFM*92JgM2)m{jgpQXT#O%et5?uH;o8&zNDKL -hFP40v>0%*oX}Xvp{2P>HZl9+zI0d1bTuU69(Uvy5kT=iH -5Yj4@vx}6!(1c_9>In^WX$`cg2K%Y`c%@V2+@?7z`SaM?t8ue<61}V=P=hY4K^I*Hx2r{Siq4>$pWf&;YD&1y;RN~R!o`?#jvI)m#$8GzvC0_e#iPUyS{Xl=u20L -(Cd@S2hgq2>n)CYk0+dNkJl@?`ZTejouB0^PYwf0AkG|vqb!O< -{xBt}eta=4)xwk`-I3z`kXr{m0~T_V@I629(RtCO`HJ))bFx2dF5WI_H=9Qpj4ZPxsGbyl*jlCsrLPLmugcoW3Kn9`Lh-j! -_#iEK%-qQ_(>Z6wqg^kvo4!3@|?@YIMW$C!*iN9H&v@mvdboRnTn$aAafXvtWEsEfd|n>Zrd?EEyCBtfU0RdXUymH0@fHTS&zzAeL%wJ0e_9T1w>7HZ{#XXugA&f=LrQN5I4gqR#aM@z6UNnUTWB -h12dm+r6bH}Gt=eHc$oUY%R_q>xI*<6kHRG6Eq`|!RuvAW0n0^J5PWi<9aU&v=@>8z6Vyp2!SK5S$mU -TyleDxti575U*FDhNpviE9rEF8I4D5XZ(a|k5lIto*(2WA&40x$u)ptSYC -Bk&MVcuI$(LnwwJGw@TJ*Y=@iLbF3I$ot)lx5zX9kuE%#bS60ZGWz&F`!co+=6k%}j1B2Zo_`Q3{?{_ -_WZ(9e=`p}AT?*|Nen+Zb#(v}FSjw~7;fZQBb$Fs$Wf6KN>8gNXNt2J^R$1y=WOSmcX#?UuVrX4xG=C -=@l0y~7qNc*8*6K@5YcEx`R;$9c{zwzo@;p!vAjrtC4;VdA{;$5)&p|jY3S-I9KZ5u-3#A_34T&28g> -jYc)^{@KxzdTTzxp_-RE(<^8#~7dqvY6AOE6`wcG?Lj_b_!Jnn@gAQ&@=E-S1MN{%KJE>o`RZpzD3G( -I#-R>-3bEV9BVqDW(jU4Tx|`%n{)$%8|JEYeABP*W_}%d60e?wJ$S6rA#v;Ol)@z8kBrks`lfxlavZF -A6UR?z3a7vBcT<{sq{ev=wDUouV*V^IPa>^whbVRt|L;4A#7`Od?v==0d8$p#dZ!8u -Q7B08~w{Q-*2JLDU*D?`zJh-SyKE<+QhVU#0mYpljhHkkyoMe7fz=z$$>Q@y>YJN;ikKtK&lz -hN3q1=IX(w&$gAY{|EwowQP~NE&N$})92eV-)d^S#I&-)Rg{~L$6VUhvz}4QWo}{%FXJRzDJR*Snzl( -^5-=ev0n(X@9ESe-Q691?;3z2{q$hT(>OZUpIKxcx$Xwh{+KIo=H&g!8uwGCOBAIhQiit0~psMtYAo< -DfK^_j|`lq4lxoWq59tCeM&ewmtN*G1X|31m(pZPsCz|;Wm2cfu;)qmZptg(QH370!{8*UDCjt@Kex1 -`2_;eP2zgK|4rnb3cNplkT;2Qu)@7zlx|q7?3?_aH$1WsTkZw6ex74YR3R{`LM0^?1s>leFpp?yzF|1QDE^#pux6Cb8|gjZr_7x_7lEP1&hDIF_anlsMY2*j8vnWC)orCqjki7SJ*d2`8C580*Wc!I`yh1umdycm!>)?3k_sR^|e(mVm|6=ej<;gs`H>w#*HP>fL_j-Glgpmu3w&0 -5uKo9>iM*RsIL!mZIq@pXT6;rf;tS=8==zg*@jl1odd%1~B2&Et -Uy1oIkg%;q<-VZe%tv}5qSu$-f1WC=tke}w0p{v$lMrhbHH)}MepuJ{q2A3c8MkMQ6x#el5ZS617{zv -QD56wX_m!bRGR6J3bY(r#)|)c`0jIZ4f`+6@&{ybZ!EzE*Y>V&qGVc5(BgyR?QE49`g2BIU+}tCpDSrb~@o%#WxEstLQ141m?`wM=Krw68m@CSX1lI0FDJ2&|&-FGg -!%n+aaO_AY0`-Fr-si0su6%-6nK_OB>E~Nt75ET?46#xmKPP=XE>}ItWozG_sAN$!yzdQC1{Ng+4>kO -XaUkRCSbq5#^As^C}9PxuaK?*3KXdHp3h&*&5T%%#lL-L?6j@iGNug%`g6 -~6HdhMBg?thQ4zNN8kA*9p5tvLq7{i;%E3SBE9rIjS%{tPP*v3gmlvP4 -04RV3rGij&mv*^o=x`u3|r__H#*7hXjBDxj=rnNGxWWXJVD=X5~A;=BuL-ONh5u)Bm#Y}CO@X{HDoP) -`$;W*uOrLodp)V9Z=Sg5dowAg?=7TMZ^B+w+{iT;yB7_Uq<{wTx;Zj}26tdEjRw)&NiK#kh?{t%mj<8 -2;9qI*X$*c$gU@2{T^jri2H&8;=P`I7l)A#}ze1@CxOUMX-rhx?q(O8lCm|Zd>sQE6Lwb|ZR7QB3fN~ -ePj|NewC3Q52Klw~NG>BY=RM8;XcS$)75)9ru7KW20b)53xicOI2(iIH0Z?O%`{kn!E0!+3WEj7CNIRV9Gc+9pos>TVlW|Na5)D5MuRIc_&E)( -#^8rCmCNcbJA1^}$Y~A>y&NvxO-=`F$E4wksdSHMq>&cmT7uSj}}wpuuR -uuKGtGpIV?^+rbCOF?XXnnF?+Qbr^8aE$NWZ%sc={p>M_62VyYY#w;t0(V>T{ylrGhKe}9|SdtF{c6z -H~a_y+NUwB)A?op>MXMFHM$R49jlLxgH~7i*sY1{({;);Vdgq9O$d}eEY&UYC_Ur -+&A)81evyxtDNlS-dXb_u-sizwtJYO+65l5+g{kG+F@8E2Tb7Sk?Czmui}rHc+#mR}r}?`bONoTqmdIge`h1>Kmb4=Oh-Ttmq(xQg!5(n{IM-Xt#8{-eSEg -CXd~AFK*y|PnG=xiA3i@g?kFCMH}G(@v_um>f(Xo!b>pVq!#B!0-9IMt~;tO%vSDdGD)5b7m&sAWNI|&+h+ua2=)@}AlO2%iC{fw2wQsA5%&05y1VG^qWjNu|C#P(bT6a(CAwdtdpX_9>0UwiiUJ -)Ls+hJ+TdtG_2hn)ejX?r7GhncYT72c4JC*s7)S6BK{7!Wf&EEQH?63wThYBa-J8?BDczgW-IwmZ -boZgV58d^2*VA1`cU{%Gk;-Tl{jMk2LU7#hrQ^I%Fqlg{XR1Cq8LE~`&vWj2{tfCTO|wbTy;GQyJW@)NE0b#0?E0}kjg -<{w;Ji4w@F|mQJae6&e+a9zp46G%)^)*80DgM~7vGz+W-H1gmO`fa}ob-DXOTi=7D#a)w!(Ig3+0uuRd8Ku+4LFuVSMTiX~35OD9>SgPpqyn$VR6T{JAj4g}{7|7!(9boO$c#TMgQ(~n$^)BE_KOt@a!2P3Umrs`6SuIIN2<0@sbs`w&s{$-nIYV&cEi|rj5HU`0F3;1-+b5zV1-oUzobU0x}Er%2Cpn% -1$BX1}Lh_HmT&|F?QK3?qcij528e0vslVTgFyZq4jGJPiQ`qi?u%ckS9L57Zx_7`4`EH;IR&g@GtRh74Jjc@8iV#a -OHj77=IiPZuLzzNh!iD8f^tX&M23}4?#uNA$=PntTi|qT!BYtIqVkZb88oxp?4PB(^?cnog9_wLv!j; -shVhh497oQ4lmc(>Me-!Wz5J*1J?qVpm3M<-e^hx!H+n?e@5K3!(|_X_(uU9^hezoV6;>XlpE>u~uW?&*l8 -7%z$TX6X=|sqswsT(a|IM)7$4fp#8;5I*v}%XhO0icDwj5yQJAaN)sv;p@XOvHBbdn=1^2WFl91lR5x -CXCqQ&N)3M9;_^P$ -hG;)t^F^0h8WmR>AdVHmVa2ITIZ~wgY1!)S(Z)k=&j8OFxup#U_%Vk7iaLgW{WQaCK9qUK(QfXOwSjoby88NqTDoQ1N -OnVN_onw5;dS7A9hwra|9k`}$vuO=a5eVqASb5c(=?YgTM$ymPiC6<2UG^@o+{2f(s4bmsRwhp$HZh~ -EJE?K{s`C{o|>!bUV(8`mpO!^(&2@u%HofB(~xVF;&}vXk&eOhGGYC!f~-W1FHMy%rDeS0}QIdobF3a#o}G8YwVr! -ab+v<4UhJ6n71z1khjDG=9D%-Zb=I~*mr2tf_x+8YIw3J+NtF|y`2|$Gb46%9E5qqhbVN=1*=aVftn# -N+5_L#w*oJ$7DXZ=(?Fcx1%(psYk0K1CqAz*ox_JHh?G}o$e%`i?)?I>th|K&15UR85Q&DB3kd6$VBvAPlB@7DQd5&at2XVMaystsqN|EopqE-G~EV1%nj`YNKO;q -ca~wIT;n5WLy&^ULT*EiO9|ZaErFckq_SKyA=@)OD=2i;R5JqhCHm#y3@pJdS#;f!Y?(flJJ`%B0_2m -OEyErnUD0jNWBCL^!+tfU4IW-Tf_Fiz=QT1RMJJTIv|koaBKyAjsoN?2OQ0Xo9p%asgRR`L?IdSBan| -s)I-M8dT(mOanTOp@5-$bxRt=8kH7=iIKzGWiu?=^S8p=e8)A~jcZ(Ro`e-wDxUob*J{!sc2it^3wxVTAZh+{P>E%%T5)Wr!r_OXVh!H -axNgBRT3O=wR4xwA});$MdH?kv@zaH+W(Ly?^brxBm4*ZEP;HaXaH?qIHgkKf*=_2q4A`=}?QT=h{;NM*_qkJtK9 -&l`^`o7lfsK?zjHE~^Ds-|UaRa)+Fed+dgJxq_KCu*g^OVIF1jO$~giUu#Dp+}4>+9-W -f;CEVV0&5^wJrSd`o6j;aQ*0qtc$`sZ9eUS8OY7R5|M^mdFxJ++MPk(DP#;sQv&@ODvet(7M@XjgCQ( -J>RXWh#NmxanA3!si#f(S!I6rbdwUd$z*V_kjTO)h$eKv#hqs_stoSm>F?!$6E$GHfe&hQF{x1txm4F -eOKu2(lOvGICc1}20-3dz7kbK*N!asl2~U6&0^j4yDDH5E(no!mRhcXC^1!v*8Jv);Rv -O;R*W&@ojZUVC|MCkZx0z@ -93hY*cJdEV*9A_C(BojqQnRw_$tYpkjNXmCE+S+p_Hm*I%?f@n9R3?TPi*Z`bz3oSSS<^p|W;^tvtE6 -FotSRP`mDs~ewq9%nV_v|8w@qrpTGy;f1Blr^=nm@C)QlAYIy=V-M-}s(N4KA8*{Vei51u -XtmO%jTwRtYlmNH3Jh4|$Bk(D}z%5&yu*y~^CMZ@XcB!mRAY3h0Cwd9169`bd)rrO`s}pzqb*mG1=YN -`Wm#{j~_{wqnr>t(X6LRVONxKvIw{3R<{k^a|Au)#A?gWbB)^;bRR@$8ycaz--Q$&)z4^s?J{Px!kPo -N$C8x2paxL$|hi573yVt4|QUrmN5TK=x|E7c88AfKv+Cw9Db`-UfAL_!#z5Vj^1!xOLxBMeXEwonH(weR1&$?ya^B4Ky}53UKxm}3gJn+;DGqy`&! -dGV2w#NXYfM`)%X9=r|t1(#|Rv8$P)cs~jA!-5Fb?^P3fV55np5PU$;_!SdtO)!<l=zxX7`DK6(*3q3iXBXAy=Ygr1(+@$uHB*qWj2-w6(_jrwKQ4uqZs%M3CBB~!u -OfwH*Bq3$8x19?mM||9EzRCr0HWJO&>kwsqkxZxMl8eu0VP$Ju3FS7xWji3}=}IQcN)`K5Ym*q$O#>|GemDs&@qRma*+~6WN@v{Q4qrVv#M0?a4mFuxjN8e>9;q -3_dpYB4Na&`lWN!zjRQe^FyV_c*^nfPtU|-L1{vpipWRY?zJ?x~QN?;P(+N|#+ -U#oAQdvG4MKB(9#Eo=oAVgXpTZqhALSU2fAuBq)FDUg?8TO$gkJ}(<*{e1+w4cok;UDz8cmY(OqEXtx -yV%LsleuutMzH^O%pZ1-kH$1gxG?mw=*wlJFODEa+%`c?TSVr>=5>YJ1K9e=pyPdgsq09_jSRF5L1JA_W*t8A>FOO17sYAZ9AU0r@tanyXc-WgTqbY -Rn~VY@D*1Ek)XwlGWPSTPeCKfe0sD~Dq7`9y<4TW9BRKVN$G3H#8ZUn##&7th~!U)G7K+3i`s3x4u4By2fj-I(DwPChYB9gQ{t^q-sjCmqXdKy}GhVq$Mev0 -@TVTI78Vq5=C0>ZFsDqq-tvLfuw2zxe)GD^d480K)JgFN=`x5w7r_D$-hWeHEk2BCIm0pE)+O;)RnyE -e%6${AXH6w7OJLYh#_7}^6SAE&L8*L{GD2Ru}-NRAVO`>kyM%BmDO-886)&U$FE6xq3yC>NO<)XnkJC -NO1diPcBqo>B{|(jB3)4eB_1NhOVv`ud&!S_iSY6W>nMA9vejfSPqQ|+m(McfAJQu%3B|`wJ@N}qvo+ -RUm7QsfEqO_=;O|@VtozwmvQ#AOZ7=U_YmsEn@#ty0gC8@45@kxuncnCOgsacn_g&*sZ9Gu -&dpgBh*F201ryr$_)9ZY5s4Ax@d)*lEl?cQN$9_rh=Un*OXcP&N5LQXbbrV4UVPcwqF!E=JqAu3MCUF -NlK=Jtg_^GGPR%0TXuKu6ghEj^V}`eOU1g&B9u|8dgp`+$7*D1$h!*N(%0?@798yxeio&&6)*YRu(Yu -!?0Z0==Ix0UDs&%)ZLrtu^@qH1N;7yc7X7UdtfhN%UzjdqILzWjqgk#F84bWiZ7nF>lY+BHb5r;s!;$KcqCmR#zcnZ6CRaIr15Nqy2RTU@|t6NotIMzE>`tPaakCF?}Hf=Z}nix!*s>(3h^*e0ummJZ`imG!$(fF}OR -#fd$6jeWBE>fOi&48lHPbjKh6pAX*KhV4x`A(7B0#sD7Ze*zzUBOpG6V970)Kj7eg?b8{oaE3#JtaC? -?S9dz3AC^16b3Tw&qw<8-CQK8rB*^M^{q3s+!<3*@;SZO?x5adnk`P^N}*I37Ia{~Ug{W}2Nqlvilqk -%-jq~IVjW8G{CG$H#%qd7sj}Q@>Rew+OsJH!vP!9#Qd|b_&9khsYZuwb!_k7B@i7CDCVK{Pae-_zAtzBN -c+h^HwQ(rBCoNya**}ltk@Hr7vle=3)^fU>tGkArycJYA+l`@1KC;0t`bXaZoAcEB&bFER;?Aa{B~WW4LI)PQigvKedk -ql=c@L-&uE~mHaCkcxksh(r)$wk#T7UsYOc^aZ!s3T_WN(S*?T@ -HaAcv$a|Eh5_%;(xU{ht?u6TTrw}upqE(PI5_s8>FUg|&h>ebv%=jHLDC7kwmT>n -rWtD$-(`O^cS2A@fkTY52zsRp)ed@+)Hl8D{R6l)Ksh_Pwf{#}-w3Ndq82RdK3+84EN$i*T -ZzS_3}K!}eYTgZZfWickuY?1%uwxTsG@gi>1r*9@u*C4Lprg<=Qmr$xE!V@oIiHz^y28u&QOK5plJ9u -3g-%o6NW1f7nb+w2Y%gmvfkD!wZ3a)0Yf6`fNYmv6J2U1qg6@>L -cyotgH)>+qybXbx2n$Vz38ZS|wi&>-b48)ZW0BxQ;6ja1e3fNSE4_`yyH&WDN5e}3#Se#@yUpOiT=N}pZ{N+!QAxA?H;)@?6egg1g!cR1Q9>PynfdgX9P}`CGPpuC)_t1RSYADrGcY^o@5xzrhm+f -Z^)>h6vfnOK>Y!qLuS_A~I)ghbl@C@Mu9N= -Y}&R{mhgSQKS_-mD9?)^+$KP%%=!3;QqhgmC$?#!H+rzsO5g&q?;QgvP8tm+a*sOaNq)D4$U=aj~hIf~cmWVjPovggy- -W?rRKJ^j%3GZ!dq?kPky7K^F~q*|=XbJUX53AmyLW2vSNWC>z|X9fkUY(5E -%6a@5iMhB(5=HNz==T;dFGB_Cee+%-wK)DHRCVO9IyAo?k)kV8z*@ewQSOLtxY}2RKbIrz9d||z>ng5Mw*8yx!z{fUD-2-TAzt}s% -P#`|GQ#cW$Bu<^a6ts`Zp?-4Z`H$12P3UMdG0x_3)IkM(Yc;11h;jWIC2fxnx?vp~^qqB7U|~|uyJYQ4#Nu)_GgBgj@0no=zJY}${x{ -@CTWPYR|8Sw__HjmCT0FLC-WW}562oww*d0|g-|fSFW&88mz(P}vDsY`pf~PXqv%IQGy?IP5PO{a&zK -Px;PMLGP{XNM`;Vxk`%`x_8EP;&2F}i5N&wP(5dHWA>lrKHF+GPOL3f;7o7V_C)u&n47Sy!9)j}3=IKtX{N!t1vQ*}KDU03F6g2~=PWMuaPEs1TtsMm -ED9W`^2y&E3M=w_p=?V&CV9w=hao(b92<2<<<7sQ)x-U^N5orH}Q=>248FVd -Y#$3uadwNV|@44y>=gJwvhP*H^6S=-lLOQmn_8}IPzLy)i(h*+Pevf19C7dI0uj`|!O7gB_Q!78wad; -7~?QNIrHz+mO-j5N66J1EON0qF;66f~`{t>mNY#`Flp=MFz(oR)f7v_HGQR>P~(B+git -n|rko0|^-+vY9Igib0(VRT@Hj08OsQ+X;yd0Wk;UIoud!cC?Z!3Yv=GGj@&$(#(~#+zUy9@8KLWkLp -;1sNzOt3cRvDcFtQNZY#ngVqS=(W0MlDBoS`{BpbtX8IQ7_(s~!+fN&;el%|>@vt^@-s!ljV5Y7hM;B -qch+VT#5FOsQJex_HqH=;@(ZiXCV1RT|BI65J(R{*e6DT9q%*hD+kThim*S_jF*CeZXeQ< -A%-Cm54pdcmWejE2jsGaUg63KJ1Cok0PG$FS=#x8LW&dW|gGl#}_X}7or?L-omy2A@%X&BDInM8uPiRo=K4H0w>-7lkK7)L%cy^yb{_H79s`id`4aQ^ -T8RYoHM?QnxLq3Dt|0Bl;n$9bSkl%Mi-aubbIzm3(d4Lei{=^~V&0_E^*(ld{-&QtjYggnuNuT6sUfL -SpXH_6O=QZIpslxTvVI^OjM&7_(Y^C1LVqrJ3@;GvuPxqaq7vC&|#Kxij81Xzwm|2=sk670`;cm;L); -8o98|S*1tB7Gb=l)V3$?)NV$>NaE>h|=6eUBJtly8HB)+qEj^L)04y#3%dBfj(RSpV!|Z)>Oeh1T}=e -H#0IO}`&4Uj4qG<>B!|zy0)7Oi%mzow7B+8I?x^5B57{t%r43Zt=MCm9uC9L@x2Yn3n#NsVYp#t^UC0 -z%cW;4$N1qu%Oikn*hA!^93qV6sGNl`}sCF0PAqJdN|th%IQ76Eau8-c^Nm+uc=mgI;}l6fxLK!C6va -0uKx>HxlY5pJTNN|dvg5VA>3QN$NU@*aCf-Hhx>ucCag7x&gnP3OOX9P -bJ+#vAvrg#MX2x1AW1d9kZ6BH60Avj6!6TxMIM%2l4BnTkrPcVYuL4st0nFP56PZF#rc#q%^!Eu702+ -9fS*VC|e1osj2BN$9Dj=(~&gy2PjcL+WuI73iQa0lUUBnTiFNHBunAp$Ew9>E%dw+Idq{83*c%5aI7= -B9EjYHec4!6x?o3KQFM(8LHi>8~Hf&lX`4<-ab>NO?(rMz_lx`Hu -IgdGc!?_tbLn3*a4DfDX*ZX;MGn_10mB!#k)yW$c<_bhTzhoV^*n?{gL?zkf9IZe(N&lwa>$~%j~r;s -0TOrYnfutQ2^VWzY!6cTPqyab9@=_28);HcoG;G^K6Mg5tlSZoOvDNI6!c%*!gKGH>+NDJv84T?7hX&^r0A`Xj5u-Yt%2_lWbmK5#6x(5Lm2q8VbrQd6ZeEuiwk7;vu?yu!|6}tmzF))Vm9L*W46X7q}jyt5Y= --?T3Y5*rOj(Rv^q~OZ+*S`4SX6lGWa&Wqe;_dciz>!Ma#QewZ5l~v2DBdejPe?>U{5g{$09u>mJbK{= -lBSdOy&oZ@-}a0|o}0LI#C~g%2JwG$L}?@Td_ZqeqR788bFEZru0>Crq3)IsT!9DN_^8Nz;;3Qm3b-X -Jls0uw+|pGiS}7^Y9~c=grSyp_!KO*(ug&OXgHFYCoNLZ7T7Gg}B5_lqFINK>b(*pIC{f(#hQ@TB}8b -GYUEyvidS#52yANLx1Wpl5Y(4N+Z~i8hp?uM-oqlh!8dTkEZ@DfJ!@1xOAm3A%u<8cc2e3ik`(NdJeP -b(~#S6dIB|x!YxUpnJ&U66D8U7lpuOUsRu$ogFetE+D-=b0Y>^w5LC|;DO9Ef{}kbqK=D%8!*V#Zs`{ -eUN$IDE)|o;v69l$Wo<_>eCenvL`rAyAEBvzPFU=i8O0gUHLpO#DSOsrnh|-!yv>GXgEQ&i-u3stjG`dUFDm5kfq^nA_dOkgF!B;oew^>!*p_I-T -xn3-8AE|^hMX8}J{X6)gIvoLSIux9ga;u4g#A@;HCz(QtZxb~-MJ~mu;8zupPQjGs_rD?KxBSM=v;2aAVEsR^=mLlO?1stK7FJJX2F&uTJNITcndN_i`zs#aTqEiS9mN`YqG{EB -sP5r$kZS33BR6x|Qt^Wtu7Yp|j{mlf{^06cVqw3OC%`9s^YMbNl!qgv5iWvvl!pt%6^Gs(x-iT}Zo-& -6O0hZ{ptoRezl%>Og8e(uk8q?ga)mF^ECAG*Uzb2QyCWecEtlxQ0kF-~Lr1#PjS?^k+-Q07m6Mk=|glGSi}!VIQz{!(8qhi> -AJvHoKIkx6BWQ0em6E5$}y(?w~{qThjX-BisX+}$GDinODvq}ET++*!<+z?JukG&*P4($eVB3;!A_E2 -i~gULL->@bGX?T)hHtR3!y8_K6Q8f)huKIqv^j6Yc-9?-q%5oPhwCCkN`q(1JV&{^ArH?OL{*Nb~eCp| -ER;+yXxmBy5e__qq7uT)d@Y2g0UwQSlO|QT4&&_YX_4byn+qS>+?tAa=*tu(WVbPxAy&vq`f8gMUA07 -Jmlfy@jetPV)&%gNc_*W;sKKaeJ-<>*r=KHhfe)!Q<@>A*0zx;Z>?80vsFa3V`O8M14u2o#W!T)8&MD -2=)+fq#Ychmpho&UdGF;u(%|A_L(*-s7R9*VLBRnIubSdkl+s-7QLJug!|FIPSPL-qWG>KSJnE -6-b1&oC5TPfAa0zZhaxbY^iW8Ht&*Vyp?)l*|mckIgn)MovjJPqjv5BxPFCg-4teXLv%kHDszaWu`eg -Gs~7G+@yCY85Tt;CQLIA%A6g?#fEVMbX+dUStN`_N8_XwW9QsOxfF|$IF_88tk-+b&dQpVl~qL!!^*)30<0}yOXT1LYeJgQY_Vioj42 -t$v;5KJvX`;BlZY34+uHPe`xWzH~~XPc+mtO--npy(Z&fd}{{5uwI}3}ZqT1xlpw(E -L&XbW??~m=h9>NtVoX3N50u_HD855JDIYr7{^ucgBL`vWU!_LU_50+Bm~zw#-S%m}X282;JnLZMIrf- -YnaiNMt42veHtfN+A><;g@N%*6c}sR46t3Rnjt*h_RZDSrWGxZQ01WQ-`$dPF2fnn%PQ4mSQzd%}g{K -Gn14Ukoz(3mDWAF3k|1*?o-5Es=GYfQ?BsYS;Tl!ic(2adgMk+_lfm>2_-0$(SHx4{oTEat(NNYTJouOH0d~CHSlTP1RdNoZ8Ew20pS(v!U{`jh)Risdc9$8 -O`Zg);agqozE0v8JQ^(u#=8`d)a`h}0Lqq#}+<)dT5Vm#Vs -wK-LMI{eiRTNc82zwi2gf!Vk}kaoQc%Oqa)9rn4OZIm1d4t`o4*YDcRPE*1-F_WhIKv&)AD -G(*ul^Jz8_#*pQC_-Tn(Y)b0Oz=eqshzPE1wj{bG~dv>Yne@Nv&v8#z?b*<`uq+0 -yN_t%~Nq@dc<$Gv;-E$ACm)&F=k|8GN0?&n`r&(*`N39t0qqRZhC!2)lJXSqa}Y_Q%0L=rK -`o5y7Or{rEY)wjJo}wm{~WTKjhV3uFpMcVsAWJyZ@=DOziAaRsE}%vDUg6GX&D;1Z#2}n?Y}CDV`)rNwQ}fS*Vcflt}<_ut>{hvCtr?q<>Wxmylu|oN0-nK{?GV$DKw -YGt3r>9h#Yuotb71wOZ1`X;8H?b|(wT&Q6(@A*V1VvocHe9dZErp(IMUSL~a5kZV+CqAkrlm}Hg_3F$ --z+n^l3wuhY$Q>?(u|%XDV@(`NH;Ta@$g<4Xqlto$$;fkpj>#H4ZPMB%F$vs7)!a{X0W=R`^^sCl3rkaXeSy|r4bYnA; -1sRFqv!|M~5RwYsift|%P#(2=Ya_D5%u{UBrkO3#7IQW#{Ckgx3_>>{E#=|rh=*h(#$=^rgl5_(+)qR -^B*^H@6wuB-#I6|Cdvo1rYueZh68;j|$AT8AHfeSyXpIJ4>^$X0p{Wq3n-e24Xljx!xUN*~P6;dS$%q ->g8qL@PD8rHAQFyLTbi@+IiGmMlw#q)xjdAa5*^g)UewPDybMJ)Nhc{87%`3T9;t8siY?PjgyFO60s4 ->Zy6GqU~D%?Y!dxs<@T11U>@QkC96Wq@-k%p9_RB-GfQh^`po=uf_frM&X7K$W}9i@^?Gh1(Bo40f^X -=Za4>#7|d8bz!j_y_G=JDM;NnXx3~hDW6uSb_%Rg;!2?qCOv=>hGTlWt_eWHGa|Hc!vaROyF)5T!wkR2TVvo!19}aOWSUWs3f!f9tOM+z -%;rOZGsnKSslAo2@kJRpoBQ~kti4ZE8IL+WRTXr%M8)QpLB8i%@$52|T-b6=yBx9Co8EnR`Ewj=t5*a -nmtOSeMUG8y+tt!9R1WO907I7>_@<|+-B-Ki!N2PWKSkve&wQg!-jQL62B4Zm@^N{<0{wnMp;=XG%Di -7bA!(#1KbF*_5e~-TrxBp!K_b>3%h#ySvzu97UnDUN~ZWLb9%6I5`v38Fm8u2L@=IGGF!mJDQuzLAkP -rlce{TitJ?v&%=ZjjUUmEEvk;0_t!-d1++CBKKr@1gR0v>a!&>>eZEm`#vHkVr6*AetbIz(mlWAb_A1fiFQlU8S6+r*}qB{ypJE;37ChaGc-( -!8-&S37#a#CCDO}NHB(AI6)Xee}bL_T?qULS`joQ@FCC7 -mCkP|xPtciwA^vHTz_%{>@?W|9T7>+q?;3V9uKIf_!>qVKym8sY)?6VPDekhCA&kq{s*5J^oLis$OP8 -kF{m;7B=Kp8I*XIA9>tDZaweQHI+NG5*C4N8|@gV{D@mbP*v-Moi3Aaxv#xBu!6L;k-qit|52S&pUKSy -d!jnzl-jer%|9>R8DicV=fk;sh*BT>}D8RgFDiHs0MdjvsDbGc3)JB`-)oJH`e0*PA%>SYH>eai@U1^ -cZ|*DMP$1Cu>-;XXSh6MDp)Y`F_Mf@4l7qv!A8#y2|%c&uhe -YvC8|<7c}faRemr4XCyEQER~&AHDBGjbz?(@3}JC`aV#Yzh1qO2siJao=|7jPSh0e={PN4}-FM$*g@u -Le%P+rVH*VZua?{Nff$60TZ$9ktL%BZ8uz%L9!{YTYKVOmSQ!#7S+_?yFo*$|>%nw~5@BQ?yrX1!n^D6p+kqnJBCz-Lzd6;iX`DbYi^nTXNt`C$?vlc>&p>8DXBtw&q4S@hm(>H@0Z^zB!3*ET7h>;z -k>X6QJ5Sled#^ziU@z`(BXZO!xfSKcgSCQr~Em09>$^~+<;%j;j7=#+hzC*{1;X%K2&k&GSa~NjnNY$ -C_qITrBCmkI}SFzch#Z8L_!kEM}PeF1x?ONazr`aujk+2c=(~i6k-XAOJDKIvpxDq0mOUx$A{Oq+jK~ -T1(5sCA^mwdMHe~%!vB+XV-A&99L_Bi;SY0ueeCY?3gM0LRK6vv%DM0s<&Pv>k~hK&I}*nwZ;`&hP4Z -^?Me-$ivx+u_Ij6L_!NdY>RG=l$S|Epj=Q0g}mcX09K+uMR&wXWHzZIYN?Aen=MM -bfgm>Bl(!w*;C@ny@Fu~%Pxm2KIwMez6+UwpyNojd2|^DL-aHd7zEdAm1i;*qRJ__n0oENA!m-AU6kS -q@cE(r(Ukc9+HzCrr=z_4oK~^pNxXxe1(KOPY7^+}N>WcP9<+`5N8hr$^2h$@$iJKHt%4_k^+WEQhb# -y>%?odv__)&*A)+D_1r%!Nrd-Hor|9?(5x#Gp!7)4p72)%V3bo31wsw02z9Nh5dwdu>vTi!-yo<9gdpPT{kF(&tob~#Uv;LoOHt}Q5LO -wnl)_0h7F>AH*em|w -r<@j`m!B6cCcf`o7ut(oNX=R?1K+JU%#@Xr9rv+b> -l$5Yb=YL|~U*)W9eh7EQmGSsB~Bl;-5G(3nlr{B{&SfZ`9N_)!#}(ke@#_;V=!Vv4_-;{TK47g79ADgHTCd=fsQsVQfXuz~X$Hq*T7F -!euWB*bvz9gGj8_!BAq!xaA+iocEGf2NAh8nI}07q!{8Y#H;XX4{(`CeANo5sWu}kntW_jE{Ph@foWa -U;Y;3ZysR$=y$64MvC8?;t!|zQz-syiocZNuc!ELQ~X^Ne?P^iJeQxO_~$5onLB`{JSZBSBf7@@kdkqsT6-E#a~46S5o|!DE=0TzlY -)U9j^fXt_)94MOB8=M#Xq5nU-gQYF11r==%A26Aws{;hT -qq@gI~LL9f!DmLk2}gM1+M!h6V?RgvEF5+^JIszac}~D=CCUkT?BD&_h^Qy#KujFl2~P_K%DT4UY__< -ikTlf(M1fcR_#-9on^({Uf4GA(0`WVWAWscy;UI?>{iU63NJ@NaY%Qck{dAyLFRN@N3uB*nSA&Q~HsS -5y6r1t(&xHPW}|2vmBsfJjD+VLFCZL_`91lX(9Ow9R1oE3CRd|`ti-0Hfb_!fC%6(0<<+EerOncL*U= -EN$X)UYQyhC4irB=I3#LBWMp_`d`l$IqWN8S-Ra}w(`qq;j;2#q(8M{vK8ko&a;& -w$|gsQ9Rea2d-eg}Wj`dkzZiuG7>XA$y>#BEsC7nuz$m-F@qMX*7+85{5uADl(WDsnS2>fnEWD^|bms -BFHmz5b<))o}r8MJtC|!|M*Y@85z{j!`lS^&|qTMNLJ~O@*xH@HE7&uWPE5 -;a1iktW9sy!Yp8GIzEL4mju9$vq#q`{$^C)A(4dH_-V*;%`eDR~5#hc1Rr6M*Pel_E(yy8~i>!J@RrB -V&FsIy*8+?iciNe1}p3A8LYLw-2S#ULZu5LL+k>^H_9xddN`Q{;R+2iHe1KFaKaJIq{%C;;FXPcj$&m -K5HG6nT>L%-xK_KYMm%%=O(Pe09`d+s^5di83ycI{fWe*JnOE4=;o+d>|E@4fegtnhi^%j`LlH#U>3u -y^lX_Q@xo2-)E5neW({GiTV@vu9apX({{p=bzbc7tRaW;P>BuXVMRyVxjxfX(2?*m8c7y~)qf_+6%oPXl5!&FHgeuwB-L;`gTbCW;?P@h4F -H85I99iocrTzeVv6QvAws?mu$Mf8><^t#V3BxesXBvZYwMY9X|sEt_}f-n~0aA-6QPY}veJ+xy!1Hfn -Sa@mY&@ojY{s)S-K0U&Fl(>Ahv!_MJLW*v7tXy8CzcXRX@Z*SUM^`rR8-fJO})-qWgWhtAy_)bD(c>| -iu@zOTDp@6(y$+zef@g%{HcAl?QplY75P$>*7Q#K`?qS^sl9*q?*90Ii1NSB-`~&QzpcNZuN7TbLv7nuTB*x1FxDSR -IIRq|DeE<=FbI#05^W^?5ROZDNCYv~+0Wj_rEKZ&Qh}$O>wm@dSC%S(FSbxLYtyC;3Kf9Q;yTu=SC4u -YVStrNN|=(Mo~DPGg%{#z+;H{{8!%8jZ%kfB*j7Wty7H>0nC=%HhwHAL<$d^Bo;Kc5F{~lvShKjN5#|gbBgD>7wVmzx -?vc$7vqTckkZKfBf-BPU9*6;)^e!pyJKu6bBkSZAdBXYs#y@ggT#W_kPe?R!xfF8%4JpLk(mp}U+9A3n^#`syozC)J -O@9nYsuo#J1A{k3=pO$w0ABksg=mo8kmP)>YzjnZ`e@y8$hx8Hud`1$9bzx)07-+xDWT}3#e^9gEiy$ -FY;i2G;pCwU5axdHeq02&lPohShO6*`n>1*+4c0O9Ngs&hA}-2s0E|Kj4}B~*{?h$r$u!=62R1peTU6 -DLlHIyim$w0H-OXcN?i#r@c^V*=1NP#?IX-q3as=cA8468NJIsr_@*!;Kp^xcZ{^Yvf)5e`>?`{~7!* -U%t#~7!v&7r%#`b;9~&r|M=sN`TOs`&#BHi$;_e+qx?}H2M-<;0Nf88I3U`}@#DwEGiX2`0DeO|K^+0 -NZNGAEKEZkLC!F^@$a(hiET1SbJM4s2OZ}8fkT`J9v~X_a(*At&~Yc{?c -U>j=}FEjDk@g}8T_fQcLVTOK&cA_{z^MRI{?4LearcfsOQLd;9@D+GNp#yCkdUl}eo;}-9f1U^Y!6((}0N;bJt -J9&-0$v9neRpUJe|c7azRos)Kc78N(12@F3FqTw8lu1Bd^q7W^ea_+1`Tq1?uI^z`qU28C$%LS+Pow6 -t#mD@3IBHO+PV3k#(0eLH`NE)FUA9i#fj+G*I~)-=+3{KqT`?P54uPFZiF@+EU0vXmbi33N4@k<3Vk_1^m%ZZe0 -+<-*_a5ze+T0AR5+MCH%9`bN)~%(ct1d?wr(~(I-WIUD=*NgVLTsgVLVSCv|>bBy*)Y{%B_yUr5e!18 -7j7Ivq8&5rr09+jIKzx90ZaZ#*2tUztrb%pAafFZ+pq`G-V9Jkc=WN1{R1o+IV<9CA$Rllputjn7J-) -QMzlb|{1~fqCQD}i1##%)#gCE9Q$PBpN%k9gz&F{({R%>OujuSKtlYfV)Bq`hN8HnAf1+#8`!~4cD% -PefYaX!`Auz_~yAmd=t@7y*)ogebVyu5WZykAigLil-s9;@|?sl?zBC~zy0!vpg}ETbdzO_+VH3TUhq -HRvlMs(FWi9>@J4$8-b$UIk5|jb7=J+{_`i73K)#b`c!y}%GLLAWwt)5w8eWuXSSi!63^b$;;*TX04M -|~qeqy+w0T=qDekvKG*9SH8Kl%)eVUQyL8#iv`uf6sfhg_t9x=!k9C)clE=SQAT;6?Ta_>Kic1GR;>i -H3j5?HPU2TH8Rr+A@%@$O`69W|;WnX(8N6G(1W)EF>D{5e>Mi%NUc7)!hF8f8qtf|HRjMpykm=ALW}i -Z4&g{4jl?Di0eA~Hs6!?052pO-X|JFdnOvtCn@cD4fRQ@EW!MlEE9i%Xjn=#EG8QAiH{bT#lcOYPYO} -V7;l%>-2VfAh5v(sf;s{R;J0YeA~y}y>8OjA>(?vz>7r-(2TMZvZhIg8zTBSQQnlyxG7ZnkH2j13XzB -D2?nsenz$Ii18lQ&~to~7qzaO!iuNJ6t8h@9M8Z|01BO~KO;EMK$HZXtwd_jYnziw40xT8%~pJUZ@eY -y7yw~T@ITp+jSYFC}|5Aa9b4;?xb^}t_wi{y@qELE4IJZgc6K(mTCIG^k|m;DfAh^ZqThimR1+=08)F0dD#${RM=>A3h4y^- -B^$5!gXSCSX1d$6B4ezS+w(GN3%A05$BrEal6A%?_;>BvwRcidQbuB8Vkz~bq8?s+@kKsziIHAyiISgn(e+oXtScp9KI>Y#>!K-*9QXi%U!EdcP8k~aF*k5^COJMv95K1(tN#^=}Oh4SrBOyggFw2fc>{r6*3-?y!QSg~RS&&$iZ -xP19?zHs5f-yeMNL7tYDCd!@Wm4cT*1KI`X1a6?CIxWyaU>pYDV~j>yfj$EBNVq{pLfwIu8ZILL>bEG -PKdb*iWNN!>va+(id*qQvZUE1?xHti5(+Umu-FF|KHEWir2aFktZbzX5_yT`L=Zm=k?r0BaBWMrR+dI -Z=_1pvVXZ9!cZ)jWKf8wRJ3l=Q+4DB>BGLp}oJ6F^LXaN3$1`Xol#*Gv1r~}ZT0BBI=y_kzZz6Rd|Pu -#&npiRwNkf{)!`jUV6`T6zUvSrKTm_z&({K1<5@DlXRa06b@IooVD(SAciL%GRh;@!G+6ZHUp#Hmh4O -}wSF4do6#LVp0hLVt|9Q}i2z6PDXK?w5HuttB=F(GhYQ|X -zka>IA7za)$20IoJ3#*fcgUvTAIREh2WSIm6G#_*FyVfK(#dPyyt#?${l&d|_qv$0=Hq?4_#7V-f#ylsBg4c;!`0@q^GBgzLna#7~jy>fWH+!L_0vcM4f<7Pz -UIf)$$OYkuK^8^?~u6=*1U?=r=uY6L&ZMYF<_Iu$s4l8|VTLp)EZ2*khdfEHO^2FW{yC;-H^FUxW+%g -ESJtmT5yMsed5H4{F!H-5&W$#cLfj*yaZmyJH`OuuB?xcT)X;Tz+K?4p8wL -=vlM)ZF$i=h`hN5u=<6^Zsp&x3ZriqvKl|*nf}fQ(3;^AVZXR+I-oZ1<`T_NsFKe~he+73p{_1g2EyJ -i~o4V=*ux8B~5g&9RJZJ;H;4So>phdx*uGxRTnLa&Qn>xL*2j)^`NZDq0 -Z13VJ!h`P@o04Qyzb%pQ#gnwf;w$OVw2;knbV?;2rC70Pq&>`}XY<{VvJ??G^kE{Lv1GAJ_klxC{K%` -cLX7-1;BTfUy(u3;I9s0mdVYohW0>IZ^hg2SvY&dcZsSeDt;G$7oI=)-{OczZ-XfKX|t;KCg}6)qN5C -6}<(@88m{|iH~lOjNqcW!noSW~ -$o?;|)!aJkxi5${-0sjd&K?LuD7N%jq(F+b95Hjg5CKaBc(Y{SO3GsxV{n2Jx4_BZ96&pgBV&@ZGlHt -2$}rf`2T=Mz8S{EOcNE_LAmT3dN~dOkpNyBXA`%h8{a%=tU@wpRfNV~y=r`C|@1bI=T$FQh8-d(3l@FXU*Hi8AMb+@!v+UiRRR(t01(%C?l%q`Ihbov+3ZB7g -PXhw6JCP$n3^emQr7zif{cdd#J=4sgmZoX7tpt((T2k=A{c{R3)##QG4{8T-@y^Qt`A24f1%UlT~qja -Bc%K>b4o1}+$X-d~w6bYRd2Lnp7~519OuwC;)ZHo=d_rL{J!@qiz(MuoLbtP_s^NJKrLb279>+iq?*JgQr -V%tgm2gLacGg`OixnEbQ7ps@ -6YbGKa&Fuxiz+ShPjV_aUEyZs3A4!2Q#8DPr9a>s8RJz9#FoUy#=q&?c}xg0;e2bC|mfaH;!ftlg^lA -8qU5hab+M{y$Y&AHci-b32p?`W}?UCD&K{!zZG}Isx?4n`Qm_dR3diI+IggC(Ds>z$N&R@|{R<@=DeA -uguTT4k7ca*ICqScPOV@tr;EL^G~tHg0;Fl!ePF=)~LE}>i>|x)9Flj{`u!)u{H#G9C#@6YGvOb@IYC -hKY|}Ftlz%zaAljQi62$GR%8DU8GG*Bxfzc=_EdjS-Fd~wcT{?=1jy!7lz& -TEl>1`Zq;Xfm1RfR6d|=VwltGG%{2KmeaUeY(&CFI~D+=q{AG56T>Ol)tjK5#>>ROvZ&YDcq;TTXo8R -UAuN2OYL6F12NWPT?T7QBxmsn6DA0{YtuDXuN!3?SN2v?^4RxW_Xqw|{>Yo;kDsuX2)%JcM1;`40*4t -hW{7e}f1s?9C_JF(kQIKQaiStEEo~a{ayH3G_^=yu{#(td+Mukc?3X1cC-1`=4|Mcn$ByNw3#_lvxa? -jpK)EY?sO%9@?le~YLFM@frS$^M&wpXkCmXlA+9*1HqygCu?AWoF{$$=Ff8;}bjp+Yt!b6dP-+c2;zIyd)p({q;2%VF%ruY~07WpF|W&8y -%fnG%hN83}@C4mEY3~LUD+r2SMzq$e>*x*^fT!DP|uq;ZwCMULS^A#lK$kcUij9;_b&q4*RA -@uTCa*WxxuG2RldCi-0GWM^|!n3cua!o_E-MIce}<~@ucyvO>KU}kD)KT@WPfCUwrX0^-;fW*s$RrFT -M0qm40W_rcLK5jm%eHeO0(q7~Q&c>mt^yS+nc)*IyU)sf=N$XKK@5sN-Wjt*EF7de&={#wp^zOK69f8 --rippgBm)*U~v^Wx<4B -q&e{R-)RJz3G+wHUols}TqS_!N-GI3thHiJ4&1^2$oG}`5kkh -fNOQ2~E=g%%E{?eu=6;y>Vcyw?=ADpXAX5Qv^jo+vhk?BK_ER%N8tSX`nxxZ#9szSUlppE|W00~3_5D -Y~g}eoM53(L)O~|^KZ){rS5NTk}F_iE?{f!?#UaWJY4?{Ve+Pju-%N-!*laSpZw`1ObxzjxJ5RpgBcb -spea(V8#=Y%|nJtA0FLtTPjs>|X>iZ%C`b%o|r@Br --=M7DfJKDLthU*MO}^_JzA70`f1eVw|idXZ!H`m_J6LPJ&b?&-ph!;Rf)fA*DfKeDf@BIZ$suneV{*8 -OMtqiOVP{Mf2V1T=Zc{8KYS6F+3#Wf8q5{oz3Tk~MBGYrcCu(qaUuu6m?f~7T2Iiy -k8S@V)Z8ikcLZ`MB{JKLN-C2fvzc6wSy_JDRaOGdx!smbQ_gzT>ADN`+(*_lb!u2VD9`z2(jcbnOxoi -RNjBPGe4ZH+ZsvQsiM2DIzZEuh`NhV_lc{#J`ETbw|0o2dm#@hE1td8*BlVx1$ulZ(YX!$!H76QeCDG -gH#c)6Cg!PqlZrI0TLm8E&3wPBW(AcR;&@?1+q+nbXadc1BxD$W$DqFrZyhLRz-D-N63;ue~dc&a$|| -AF}1JNQATrsK>Affl@N>Z13EedG90=*$faZ*Z{FaKukrzQzKH0N-V`_QKCde8zI;fkpcojKn2SZH6n{ -*!7X4=!6>VgC1oj{FWUCB=lHLGdQR@2_nRNz%$+;WeV%#Gyys5(5B&MxgQx%S=r;X7e6{KSnzV1*^nb -<^b24)>v$6&c8{g0;h|E?Vu;X0pZZAc~=O=ghC$Qtqn*-MrNZD@Bop59Go(xtSDzC|z4E7;Xcvi -@uoo5mhvmF#V{ogHJ%c`A>1HXqHW@dx=+yqquQtNCXB7XOGJ;)l5tH;H0#Sey~bGLlcrO8Kt5AX|p*! -meQy{w#bnToJwzHdj&=t7lXn7z%g53^)sG_3L_v9%zP}31+G(wGb6VQ=t(G>s}cgbt?*=_>jJ`#oF24z -Z)`9ET#Na)EqPzAtOT_NucQt8P>rN)s^fAh0nj6f6=225-m -Ya2En>l8#wWIB1yU(7p{iD^<`_TZr32(!D@kx9RU%*#!Hy*>YcoAE^AS#wYS -Qyp`xJn3yE)78}GC@sZdk4tms_6b<5%XerzKnRb?4WgjV}kr{G;93pe%NI6F4%c=6W@^^BcoG&ZnALV -knTD~f4T*pfCFj+(dWNuN$M9 -%6hR3HiC_2<9#MR$39{Gd<^G`^DT!OZyn^|wZHdCS=*bhI)Z?VAL6VHeISWNlH5HfP;AB%1w>$V@DKgECw4tpud*%CO;(s5d=u&Ib$064fzAvNRE@_U@d -)|Rj>}83&!vT{3ZShujacv1N0Ij#gn33tnq8wL58wpm=aD>Gt_FeL0wb{&=I;rKRBi@>DH#b>1a~SER -WO0W~b?5ds<<&9b@x-F1}=|>=wJt?za1F>!?H2C91|O_p;mK4!FO@=QcCeSmU%6Ng=spIvL8Q`pntIj -_pJMq+vs+E -H&SUVme4G|Zpl6xOM}|rRB+yBZUSvb6DiQK^nN;vme4u0l$O!?w47GZZ|DhniZ*x_9mgj7XwPM3Y(6V -z8`)Q^vuDsAJk4hV@!L$rEuZc4p_G^L`FyK5Ct|Xt>?Gr!cayZy^Qp2*zAjJ8bFx|3Dr_Hi3{%5m&!n -Ycit438g=&DRQm?CO^?^F0&Z`(C!&JBj?t^(y1)Je*_z-I0D4d4#&{DV6Khjs~Yjr;j8udVZqt4UM=v -5y1!#xw`+0}Nvt+wZFr|5;Kndh)-T;uk|<6RMp#ScU!sSF;V!`OrDDYloLW>5NcKf)(^B&`&O#0jxf4 -h<)TPlTsEKQVQKxz2tN{TQ#q@o_F(8Ed@FdH`ANG5#8TgKqI!vyJYg!&x4?ht2crca|0NgFHcW6aB?) -Vud&>7RhBY$E(J@Fiy|V3-pW8;do!08fz8DdXis~r^q@|LEDNBqLWA#SBh&ychO52F-(jVv&5gpZt;z -1BX9A{u|U2izmiGeH69CN!U4;n-rx+>0T -2KMUm&uVy`}x9w+fa$nit#UZfv+gjA6h!H(c4ORj!BY>$tNn%VoO}E-$_wC%!8@ata%;#4T|(uHMD>s -PXtFkTf!gOdtiMge)O7q@E-MNdXCLkn6{qA5;dLg1R6^Q)vdxqxrPR>wbmjoH`ow{GGw_*_|ww*esS5 -{~Cb!-c%a&1p*utSjd1Z7zEjn10%fZ+2>Li__uhOZyhfdRdHPKuvZFPpu(t~ui&e0=uuE%Y@o}d -f#o%$|asHf{9JyXxpCA!|{bb{xVG?Q&|O`gg3dx`?j=5^7RQGIkIO2BrQ=yww-con8%4@~nKuFzrzX5 -k>r#vB}hxp)^A;&d#+nK%nea1NGY8UFYCN|QBNlQmhBHQE1z{R2=-0|XQR000O8B@~!Wwgsenv%&xX0 -FVIy8vp)xduG7+fZEII;tF3jZwY4OmVnQGbi-bLZN)(qnKG1-WOxWJ -`VX@!u|35xt-n;v~=bn4Ed+vS3_pTPqf*@Gn&oBg`Uf}<{!vFrS3;qUP^9Im(5)G@KV ->3%Eun6eBcpR`2&wW`k3N+aDl5*ebn{vqb}c!yIqewHh;n7tgLi*ypA^?Tzw{LKKEAQ@5$ndwnWM@whmA-mCCZwn>LBIX{m}5avy;od1CGfFQhZBd=4)hriFx&*z2 -zlX*6w1_DAZba*H{N186o*D!er&&b9IV-+&7GZ*FaPOe;9Sq|?ECIB1ZE_mL2seB6-KL#1Sh{OOZHiq -Xe$~X1UVa1|rLc3&L8Q55uwgkRWVr+PYN^m$_|nSaI9$k+mZ(V!a{{+ -99W8axCv)khBFOQ_qO&+XJMHzA^}#ZIwd}N;a_?*I~X7C66f}`t}Em#y}2a_7$Ab+hwA-^JUT`lQL*u -+vu9x#M-fAJ5D*g!tI(R&6H+Iv!#1vas=A-21zs+v3j7B(AUqWLe-JtTz}r@!SI4yIy6HNB(gQs0BJ7 -BB0k?p+s_$>Odt=8F(q#&eR&i@sW_MZY$SgPmUl^!^=BYk$dE+&j6bh|?4v73;TW*k3b#oj`=ojcz#~ -Am(JO|rr%c)@Wp#JpK*vHqI3>I$A$}Vg;X -XTOVZ*eSrt^Rx@Z#6N-eK<_7gTWG78*^T3RnXcUk+K}4*zv}#qKH~BuL?bkla5uPDuPqpo@7s^V$r@*9UPz -{hiX<)oipKGC-qb-2fKY!pMr@_|HLvl`^P$g}Vf^scDRs=qUiwh$F2R;CAzA!>BIq5_0=jm#D^Y0Cnm%3sU}(9RfW#|N{x5HYnB;Nc5rr^_bD>N~(OY@Xo=$6rge&Cuyli4fv?i -QyQ}>zvO!zOC0VAQ9r5_5(3b;^5*qp}hxbEE08@d<~^$$FQXqAfve2F0+hAZbS -0J+v1g{EQn%?j<7aq5*7nr9r(bhd}F9_-Rxn4G9dYf -i!L^<{KJ$DtC;cqL?n9$>#2Ob799jKIRW2r*(^D?MXpk(pSVSZA()0epeWzC;esVFU-r$zs4j(t^wss -q0*z2e5)mVYU~-WG?}xy4=NCDlT+0Tj=Vjq{Ohqj41i?KA@rF0LB#s`HD3%Do9t-WusB{v{rtjn}MWZ1tDDEmL4__^kpdRtG$BJw4BpH(nR*Ijh+<*AK4CzWn!GXeX_St$~e`HoR -(q2L)~nu=dUP{L1ricq?+$8Q4n{@UOH7|ph#!)4|u533hmbMd<0*1b4lfLs6ZdcK{r@T%rv5N8UpT1C -~+At@p-(&iIaULItN}{0;vI@#P(o#zS~Pv&m>^>QFk0>6g&QplPJX~ZZCsJH>4lw=J0qPQt}!CTAKl4 -U4Wd8l%!M~e+yQz+_NJXkua8p&q7!>+Jfdr9ur_W`o};p5Gk{z!Hm#xDU1TNBsvk3#9wZNw&?_DE(n0 -m4+2%n4MwuCpFw14yI>GVsyH{MFEReQoqB;jY(;toe2xw|%LB=O6&2#x8YVBxo~)lcO@cZ|Zfvwy^fV -fVn(|$f+}LK1N+8YklQ|Ql5F}*awSLmcC0u{rQHgAlLv7+O8vwAw={IA6{tLrU*m??H^BSU{L<%g=PL -@ac2m&zESMkt?)H0gWL%^XDTryeoHCBfcIpYVAbFw;){yJGL04OsqPq^r47pPOK^BVNAAXfWfL37z~h -Z8fz5T?ymd~HD*P>ORo4!dy_gH72G@N}TlE1Io(;+%S!)DzGa8_$QH##VFivX7sjA9 -Z4U_P9oqbz^r-@U7m@)&XRX3pQ5Y;^Sy(ff;kKVQn>sDkOrs0J635!u+Lcq@Q+dn!B~O0#~wST_(!ii>^+Pz1up0%BbUJ&aI|vo|c2j-{+vYAettv92kn(U%X -B5RfOBrCjY#2$Qp1R0WO|M_IB0WFC-QrLrczrt<({cLvG+0_!TE`sy-(f%0U0{Gn4`0BF(l;Wet -Ix2C#|=0*$OWHhuUP(-wWve_LU|!Q!c9Kfxt2bJ6e4$yczh`g76|)&p{@T`EXh6Z^xJ}#O|vLtU0-Wg -#&S6_vSIOo~6G|pB#llMyfy`OTNmaSszSyK`wf4G7@D>)To(y&DClk`_@gONoeA0f>`rQOv1ZExg3>N -j|MT_>S+>#O>%kbI^^qNs{^u7;U+|CYxGv8fvN6D3E=mZaCU44Bp$wzC2ox;rqz!`YW6sj^Y4My_vAkx1v5K -=t*D{lcH(1uN8=yOX8ieny%dQmH{Rm3sZ0^^mp6CS~iq5?m*I{EW -RQCc@hs|b*>nfchv>ly_iP)eq;VIr0uBXiWK?=-GBP;>+M4+dGDXfi6TfMWGkccWOsD;1}=fIzuFNar -pgW&}rV_I*)uH|h4{Saiq?qZ}>$K%{(7~SUV<1Rmd_vm9V7xXW;ATw^ROa(zHPd^YKeu2nCVcpG?K*# -`AzYaAjA98w>0bF!26bP1g0&d+(pTsJ!;#EHCL{=09x+|a{jKnL85wA2PUKPkkm|UNyb^>n($rKQ4Yr -u12=@4w0UV~MkfE%3yXcTIA`XSUWr*_Ic$7C&*Qdv432&i4I?nQIJvTNmtB+8z~W$AK#m%;wQ{B?Fw3 -l1lz6Xm^JkR+8WThg{}g#|E#?mdk%RScPv*dl!VF-}X1T{oj-6f#sheRFtXu|}^!Oa@5AK>z@WLt#G3 -J1YPRnT3o93=SfP--~47r&G`bpl8wr!;?UfBQv_H3$QKKN>_qDfs#`(Owl%a8pUD)Ge}?t3CtjY8H_B -jqX}jXx4GHk=7?UjNO1PiPTz%Eko&s02u8mG8LMgqXtb9iFjGx^P&M37m8!$l -h|M`^2qFXmpXudu}Gyzzhw9dDdEuK+lPwr}gnGW$m1y*g^lw+le+W_buGm1{wd-FJo-kF9YPGfcVy-o -@vfZW*pI#R3Dk))>EamXo&YgcjtkYE7p`kay*x`4w;g2f3SR+%^&JkO2k@J`2(JBeB#uTe)3_^(HTox34AT9iG2o$<3;h5V7YxJm_2Zz -&Zt#=iQqM6R2<|2yIT`5b^5q=Y)A7~wwO^ce9I8i*ehg=I1T^W7HwXF{$YQ$OXH3&#hO!8#at@6?ZXg -O#uGrL>_0?zYdU==tv0l$xKT?W?JqHhUdAs)E*$m7#%tlB%dO(%tK_k53vGgM;#|4A4w0A4S751P -1yG3Lz5Wv?;)^quffIjDX0~z8Eyv2hs7Y%qeXNpz2huj(~#pHGzF0sJ%yv37dfqr@=HmO%m;CX3E#~A -2D%KarDC+=ZIHFi2K5?DkjPKUekCvl*%l0YVH~pSZd?t>!_ef`4b>-f4kvwbNV2bK@Cw)&J;a%PQs)R -p=DX+7%dr35)0|#0^kac*N;k@U#;($0=adO@c{}48z1CpFy8Q-|pnW!0UbM3`U>@2E?C_Ccz@Z1h%lu -(zx(8Ly`Wj^Fo|^xRIst1LiM2RDPyk^+&aIJC2h5ob-BNy)GK79OIN8_x;8pw3fCYOMv!%#Lxr)hFW( -i{kuI)4rFc5?vvJYS@20+=t$m2-DnvrAUI!0l+0$^!lJhdLTJ;k~M6`ocVl@otGl1vCK1bh$(zO -j|(*vTfiHWF})+yrb+!bfhPI^_}km~FlpYBB_oqihxp0Xj|U1`zEZJ@S+cJ7NzHPP -*N<2;2LmhU8YJ9{?RAiJ8Lv(!eKqhsNncmP$N$ukM$+nh!A?hR&T3bI}3O;V(5Kt$>G*=$vSK%gh-=~ -emZYKpN*23gKyt~>^KGKy@9f;cSH>|B0~*4PuhjNS`Nr+b4*ticUp?4g>LcQpEE2;@9vFD6Hd$qDmQw -m{=KtE7D~b~>?i6)!qkDs}s;(AtW`C{pME7=@=<9nVy_?XtNw(TNt;iN?xfJw;C3NY#sQgJdt-CidLL -C}Qnipg&An2CguuyU1x%GB7iU2_&YN$y08S*;Za>5^jgqS<4m$>doni_-;7QLWf2>pckc#Sus`>=ZAK -rm$rm%(T@N)=o4ac!cs*xVfsjV{YfNNux`?zXPi2rxtrSp;?n7m~P+ -_6}6k(wj#$Cd9GGgQvf4M2*H{zOVOq)@W?;A5`nQT@@`-|0?iBb+%e??^`>kOp+z(-g(tl+n`*AD0f*5f*^uw#9 -Y7aOCy^B70EWV;|FcK^JD~Qtf_FK{McG!+-eeu0$JGXwh-7pkO-a$QIF1I?`*=E&Fh?C8Y)%oZ`qaI$ -Hfrj(~*{OEq9n|Vkyc_uVfPxod0vddqph_Cy171v*nQnGuAd1s50~$$(rNec-P7pfD2{Gr(=AsYsbz-Std9rdX5HKm*yc*>5Hy4M+@;Lo -F%!*PxJA6SUJ$q~7}_im6iIIJx$~K^8uTq0lXCIRi*FNwsnibU^?*zoM11$58~Gpi^&tVVsb5!ECKRFesNAuG5It|zLrV!)e13m6lqWSkK{mjdTVjG2*liG&rPCMjpW-5@ -Goo0Bt@~Hr%QbHRme(;&fvTDdnQm=1hM89_y)4q2&A!~;ReW_fVstJN8TTXw5OHol|uQ_M>^GsvR1g^ -YP2woff28TH>%vrH@wzy;B7M;e}-r>-6FC5c2?JR`m_ySVQR_UmSA}?1L;JJm>4kc3nEe67T;-d1Dxn -HkR4Pit;vofsY5}iz`%W(=s)4Tm`JX?qyD_3#W^jnx)e{|&Vu2O-ylb3*oXvUYp6^kCU`uaX@L6CX!i -_X>eRmgRm9vtf-QESi>YLBOQvr2kto7VCZBk2S~^QMn&igA7TJ7=6oCTVRawBHw)9$m=%`}#d2*C%@x -`;~j51O42EbDn9$f1AW?thX}&*mAP52Sp`YyalTSc0zB#$6>ruMJIx~m87JER+)nb*(crCU}8BQmqCW-JmE0gDo -QqXb43`;3XBIl%xF5ULQ02AsiDOjIG+WD5NSknZtpmNomK&n~Ss`cLe%oEBFrJU_z%?@lTnxRZH+LT+ -gs8hK@i>50hv|fw)oFB@B{wAQV-L7r7M_<9>>%L8kBKCQ^TR>ey4AZuIqpMi14t)hgr>Ku>U!BvwJfm -$-5!Zc_rZ0ht)CZvwDZ|jqwdhP`h87*DOo1k^!nTKNy{TeoB;ZI-ivSBzy%Aa&s2BKQwsZWXRb1CSP| -v|oHVb_-P|uF%%!HhxE{f~E%3Nxd$X?w75&gEC#gGN6^`oIOMobNM*-Ll(m-Wx|36au`;fVgG1fSOv{pg@!i -4!w!EFxv>Gn*(E5QEN3#wCGa~gTju5+j7&GtzfC}4%s^wGr|^&YpuI+pVE@Z|fb2dx5$)Dfx&);{2Cb -so>(ta)Jzl3!1v3_mOgpQ^?91$t8Fsqd&CNFdWMg;SfCb6W;~?o)Mp0PH9zPK+?3VAa4m9DlL()D-(y -cOLo6!<|0tUIZ6qm(M*#2BA^CPo3YAWfuk6etiVIrPM;n}jtQe2oYU(Hd#rbkL>jt|? -XzJ4&W}zh|@`l@vw%F<;U2KcgT8kcG=cwBU{{s6Zg1^%@|&OaN(5o9|vCASNiFFV;VgEe^bjldUC -k#BY})#dhxIgUs7-Ji$it3Tnb^w>`iN8}z_G`Of4`aR(rR8}Sh|5{A+J5}nb|LlOcLvBqK)+JkNvF!S -F+Nqw|TLN@GgIK*pCgkEJc%R(^3C4exB9QIckj{R$p0h5^FXjvn$0mz2qoi%KB>>)$V)J_{9AZ?*urg -TJb@N(W(`e`Rxcz^Fk=m1#;KD0C!Npjg-Zoity$>+M^z^$c-Y@)x%jTgtC{}Ycx3;{t%HYVJ<=90ceY -%`ri0YQE>&;;<_A3%}zILJq9P$S%uuxW2Ya9tKektP_P3EZ#!LUozVvrN$Yj=8ViZ!pUiTQHLKW()~@fb8%^yf#m|l4CRk%u -=hcu!%LSLvuHCUt?~HhU1^_FcGpblY3}hX*hlbF;h~Pj)W_OQS}Cj2Y8upC+H)^+<6IKtIpv(a!N?z$FwdhqvV%Fz -Qn%Tp45%7lU*$_btPg}>iej%C;F4DPY=>*B5mv&|X*sPXP@+Jf|tC-@EAF)0v$p;cfCXa4= -}qzY87O<+t?JAF=_&|>|Sjcb^Oq -Zarb-%`B0|CXZe*G`{R2e()kCv(n5&bV7UeMTLMT)@?0Es3WQuSI`1xi1O*)m~ziFgF|TeGHb)_&y`w -<+N5GkFOTQCUTqxP^CIZV(6KLwmH)o!-x(`L5e&n8{KHP$V3m2P11YVU_riEb2)DDnYRYaM}U6kYQ5I -VXthDlf=pjyhNNmE%HDgJlCa%y{Ov8i{=O8rsNf7Z$}cr36U8<8;u_iH>0Rc?*$#EylnouKO1A{ey8}5})sxV%lzgYUOOD(&X6-qspvqND&;$sYx93#Qmz)) -3=-E!CQtja5wO6o%a&G|CG&2{X2RHF^Hxv$<417&BY%XtJ)kw%ip?Jda*n9)0^F*<#i3zOLE-z>0y@# -RSxSbnT^;!@AKJToXz%i&y^BK&=IjMzVpJK|Cf1UB&=)P&_K&*^2AG1C6z;3tfh}`^U^_O -$-645xT7zFi$3KTv?A40Dy4PiI%Y1`|)L8Fk+qgu3?}or=7B{bjanK#X8?~ -dxaFPkrxI`Koa%O$UaQ3K82{UatLHuGKD8@S3>4wK8buc{e=JQH(NftqBr=%2u -1UVH+3ZNnjD%{!48(vvtb;p`bK(F}c-hQnOvXfZ>*9N>`Fg&99m(4C3i0eR_&ZWJ?6`qQm>0K9L}pYy --knL#Gf3SYq!bL!Bws2|b+D5_Y0Hj)!2=9DzCsmn0Qq}p!cf}NRB(`wiGLFf6w-2TCcR4Ub{vX$gOtA -kun(xqg`#E$!qkOPFnxND!u@;q<#+MkWyX7lS<-p;vJ%~k$MODcPV~=bs-4FWweeyfyXuK7Wj{9hgdEBG9Ue*YG%AnCL`!u3 -0WDup%Va`$@7t7NT7jSrqD%MS;v!fBJzR#>5a;{Rli0hK82L18Y$_z?V?=cni7Oq -z^UDzR0iy;v+v&;OEUv`FgJ1F>RznZ)_fn?dS?iG@0V^J{FERW6!h#=u93sAz& -6v#fat}LI5q%*Hz6QtH=}QL#QF~4X3*0PYwu=uGOmg3P;teD*GoTU6WNiFW&Q=kNO2}*nSu0umi__;^ -_;bAzi8D^6lfx7Q%0)>%DHql^F-<386F_!gn4tfS>!z??N!H^hQN1&iEW?ol`m~lc -A0n7@XY|*D`*hei>YZXPg4X?wC<;}-gsR~KcA-TY&5i(7<1p~8xmtloQFC<IxBz#l}k-cLzrB -qaS|Jk{0B712k|mX4!_&L6&rOR(6x=Y*25YfI2%8G8)W{~yhP>T3)Gc<{WcsWe+4?7wdw?JOdF2t{w5 -@xr)ALM*R>+Qn2?o-RPspHTx^WA8;*f2?-qz12C`ch)At8soHpHNgw1*yb?s!r638#d|C*Hk;@ybP^N -)_+%tH%#=vO?ngokQ*XgLo($wGv!L ->BQdk9di%ptJ_Q;H>mci2opqGvDmNY?cU@o>4r8qN9;t4u>+kqWy&CRO*C+tDz9JCuZ@JL9BRU7L^>- -Im75J5Lk0B;v2GUVMjuq5X2jgBt5yPS0^U{J6_@nIx()ggv98#@j=S(|UOItki* -(>e%($B>*7@yvA?AS9gTz%_W3lO1lj%c2YjjC$oak-_TA<&~HOzxUm{<)36$|`c+^EdX*J&F|=JcHtV -6MOqyoRcV=Veaj@kraPuQ3_RaEysZTF4fo{em+FWIwIL-P$dNWA2|B4Po1s(GNuo@b?V^@jX6|3z&mw -D@+X?n967TW*wup&>zp?;m6}o)PIp)V~f#`@5S>f0HjG55h=osYNTM_nryP?Q037J&sFp6D7&%(P|I- -K_m4Xuq!>FAC8OU*S7fblJ?`g`{Xn%NS^tK2`t+^*#2gO(&lqvT{Y(~^jPQzN8GnJfe44r0s`o;8S0V -cBU8RjS!!3gy=U`CO@Ek%X!}Zp`Ub;13 -uErx0NTuoUGOg@tCkltU)QX#ro(ePSSm~6UtBF@nA8un^EAbckH;a``14)shw}pqA>m!p88XkTFX*n@ -vYi!c4`UTB$%S9eQRSLy|U+AF6B@*UKNiQzP37t}n3)jXM}K-kT~WB!EP -_B+)Y^ibu!Ao&i5JyGV*++>^azUaS&DS7wLY)XFrXY~1ETON*j9`$#OdKsct`$L~AB8QG0C=vwK%Ui5 --dO1*dLJvD=znwO*BW1t`e)uAyB`NFM_3-xF^nzVt-qz922Q;KJNwPt3a}D7gqH(VBm5S(@wR)?m4WP7fL)6Xt2~y6CS2JJDZU0)H4xp5 -}s3)-WzI0HO$(II|O8#M0V50f!rHW3=K6ggTrKYI2I2vR)lZ3@)X-SHXO76h@)QN{tDW;3Ti-m2tTV| -#n1jZ`YhmVY;+0*@Gw8y$!Ns_sKll`J`E%OJehSO1FDeLvK_lf(ElFD-hrG=@{X9C6O+k4di|VB*ZcW -bP%jj3cniC>8-_uv%h>p(Al_WSVjkl$!0;Tww{Sdm7j6M#cpqorhA8csF+s%}t(`Bn_+`!! -hNLSow1d6;RcGr-d8r5Lx(U$)el%FF5oI_J)^T`bYlUYH0fvCWh{!<~!Of`gbU%1i?Z`TOv%~P+%&@^9 -dWf7h$#sb=gQaN&a53dH#-fkjUK1itW6)5fp#hUAxz>f|lxW3S+7A$wYE7)*S7FvqUUlcgSpwqKOjQo -U+pzsPP%zBTw^k52y$3o)x)`m_mwXB(Nnt4yy@iE4D8kb6Pq=a|4>cMNO&g*n;dcO{*UEJ9=;`lYzqP -5sOyH?cdsU-U+Hr&QK7drU#ihwr7Z72)zaZY(a>h=pJLvq*ZiVnovCHky4NTXj!IJ>Hlws!eM=2_#+gfj~3ix7ZWPmQ682QD$<^Y}Tsc5!b* -vxZ0z|Qq(l8(yOOyF|%sLchLHS9(#NfIP_cI%?&6<`aGF>7RxTTSUl(0MqE>=WNehHPon`?d`?C|Da) -INJnXaIBH6|@h4=|;$^~l**40yN6Ef)+`#onQU8K+od@1iJ9+A|x;)N%)tTm~4OauYkjb1pvhgL`--u -2*%{DGoj&~r#4x+G3JB6*Iet^M{|$O^Rd^eHs|y?wl_l* -nt;$2ePLlkte626K5pP8MWbm>BRT^InpKgN5psRw)U -9rWUa_sd%fAC!bY)t?i2~}%>|&0eb~R&J_etiz<>LXHCNsqSkpfT;$Z#wCPTl_95!KcJ!CP8!6D16V5nacJJdMp -*D1sK_%jP?Ce8KBv-8HFzrGgc95>nCw~haFpN3Beg^IKbc|}~V=jH;=;JL6`aTlP>xL<~!$dzyVSdGu -w%y>fu-$>~EU1MC%MauEPpe6|U7OM=C<|{VLp!^t!c5!`t!{5-Zm-s7Fr8#}vMI`ww6i94Fuf5s!96X -?c%vDbck844p`+?B$dUrHID#iiqR(JA_7I1M)iLxls5S=G8coq9=-0v~$%FegP^;)W$LFeq-JFByJ}> -UAgH(rQj;3=TgA2#a4yr{aynGmlPj}wI06C*QV>79j%jM0SCN|5F%qmdzE77PD$!wLwAllFQB_pht8% -=l^P&@5j(Z=_&`z&$L32%I@$>mKbw`%T-k=P;fv_dqzH!i%bt;+#qUAAZ>YV)ddA41?a-SGHTv3WUqf3VJFn`GBEbmhu@Ex*rPZ+NCDteBW -{y9Ec+?eTtAc2(;x8+H6mrV~VaVA`ha4-(jya5A`ibfK}`l7r~0%aTYhI;Hjg|Ao|N32Qi?-7b%*EN9 -B6u@SJv9W97C%2YvM8#8w48{Sn(~(;qJe#m$O`3xN0*%R%DzuEhh0LC>cWyD~zY)(BO$xA^H)X53Oc; -jcaH?~sf=C_#5Cd7*~oml?$!%WX38x7Rv#JKltp*G3naxn;>hTJ(Vhb2_HhmR)X$e`tynokP#463)1n -CK-3)Ua#-rS&%0h!1G>s_f;_(0}(m!pp^ru)CfG#7TV7yIQj)Q--$JC>}97|)4(>Z+8-~b3qL}6{5BK -XZOZUa0TU#H+<$f=cNGGT$V@`DxFH!kr!J<~A;9v-i6ImysT)FJr~Wh@^%3)!cb1_;*ESz<#Vc#NL}e -(~H2cOH0@gSZ4>hVzdf*_dSIwjC@a7A<^eaORPfTo1W4W^Fx`Q}pc+OGJpl=>bPT7ZOB1? -c0HaD1A`y`AWb=aN27oW}cc{0D-hP0|j>q;A0yBs-KL67kxK%S$Xh9YOOBxx6(ven+6Z35cVe9e -nqA=w52EiKFpR|668Qi-cf)u}Ag5Il>x7D_VT&oCHKbG^PeM1CC|=lMukb_JDlE$Yw*i)X%Y{CafpQR -^JIE<=%pYodIs+9MSnoHX35NvvHCppv9+{00y`EfTpO3Vn_(4{4>U%!BW;P0f$10V}1fag5PSxG$RkG-9` -;$2LS)S3|Xi`RmpR#o~+QphM<2*%n?bCB|*c_hj1o;Bew9ap}))bI1{*Gsu)oWW7xfiz)2lfpN6r08rPTFKwrw-pr^rF-FOhjDcM}g@VuSmLw2^Wu^gu(W{5T4vMs -3T_EkQ2Zmmfl_CCW_JOTO>lH8){0~(3;&rl1b1{GTPFMkV+M%2mo*nSl3FYBI;jat+Vrqx}eB9qpY#IcAPy&8<5qRmqA65vS -6o0z#C#JS{Rb{$`=*&yWKL2N4)q&s-Azj?CH%aQ4ybTEYH%9K`?CO&XI8vbc477af;{#g!9mv4+w4#W -`4SXuW){u(F&SOmMhOaSm5Pf4nEj;kG}N;Bd?PbGRi*rgT@F!!4mDd*U1pordVtJ; ->prD1p-(_b?`>J=CAcE$`3d`s%|gR)BObo_nr8mpieWbGhs3*Sk5Fy9&76m5}io&gORQ?#JeucPHom? -%hc?*Z{P}I$|PP^7%A27|SJ!BK&(7oW^A7FTPwqEtfme4X<~2Gu6@m2?o-DZ~6{k`R-I&UjgR;Z7 -YVo!CQaw6}`BRQc?Pn!%{Wf3iBlCE>3k=BEPNJF3Ae7^K>Pi87M5*^tZ!0+HD!e`H>duhy44z+ZDzc`%UyDky*olsiKQmEzj;WI6Kz+1 -LO@Vpya=ssg=ua=$V+W0`CyGor5yFVG7`vCPehX$eM(Kk}hLCG%Rg8wGOEPq+oI7ClqTXMF@jsCEUOX ->XD}?cz^Xvjg8Rpt7y0vP4uI+T7d}Dxo -QcS)Hn45ttQ+DWX6e{BH;l4W>J*SKmYmgF3H*Zw3n3HtC*c9E$xUHYcMr+VRmktj^{3blBpNe-%>Q4s -=jpAyBk;M`t1DalnLyMoeGd9J?__rVP8$S)l4I%bcQLyqOB?AN?f68^tNf -+4zH0~Qo`B~QH3O4XYqL3B&jEyy;)3vIgT8jJAYdZYdJoj9h`8dd!RPT_$?-6zpyv@PKAQ>4Kp)$`Ni -T<2iar2g!G`Z6hy6KUR;`?85<@#u*hZXKgB$y@v8CHw1tOQx6n$HW`&R3scFOY1aOhp-V8~!>5Z9Qe= -D#N_kxYW}xws}{s<^(!gduj)d-8U~db~GC+hRmjsMTojY=An;H^}A=ea`vd@IX_wfY;iolof+knG-O< -Sl_h;+9|VoQS8lFQ%;9I1mM$iAP%AOoizLdz$*XeLGnn6l=I0B>LXi%^<&T`3Vi_0bcy -%FdTT?9!T`s4}pU~cQ-?2o+dJ{pNh5R?njfJ3%lT!^F|HoA&}SsjWOuZdmd??|+TsJhC(zhAH*QMPtw?#+4-v -Dlt0uUad@L-dr);WC3hxn4X!4d;I5pciRG9&l8_TL0TVoNxaVFAmt$B -s0|Z{Xi)4qsn`Ob3v7N9ruXzYN%Vb0n)DwSjz~4~SS!%$XSOCd5q+M$;u*oHbQT4kM^p3`=uJGbBeIw}d-+t+e=uVx@`9JUobpFo8@x+TdQ@g! -v4LFA2pfHzNJ#W%bX$*1BM{3EH>vi=RB2maBg+Ad=R%dprn7En<5)N_|mH!vOL?!<9Pd*Y5(ZjhuOk2VOb!q+L+0k|F35jN5I?vt*J|3v47sT+^uA#Pw}d` -<5v}s%3y#Pcf30v3}p4kJRmTdf9Jiw?L;tJDFMr -Mp=w;?#9Y249s_wcpT=v_I?jolb#7XHn!w^HS2;8;n#WTzY=gelv<7rVQqDC=3Sl$2`ozLN|fUT0&IT -kPKDqhr3T5PUqL&B=#4Q7z#Bryz_g8XOHE3xz#EIoqV?X>|f^kUW$ywvOYMn;aO=2t0K)9d@X-PnBTZ -cC&kYEDC^fSq{H#6n!3E&f$N3y=E%ZeIM6C9*RZp7l?E4M-(TOb?h-FTIOeOu%SB*ewioi?x4G<(tr* -Q%aW&4v6bF0@ZuY){tTnv`cV$IM+{JopS1DkxcKwac>LD -*b5;DQq_SsdJhluCYO(p^&z3Ti)T1fLPb9Ghowl`Dkyx{bX?lL{cc8_li8a~mn0mOKo_<>T>Y|Xn5Th8A}KMrUlRk7k18u9kFOPJCQQeJu`ZQ-M -gOs%2tjAkzA;555!45n{sVuNv)d!o#8XS2^;k}E~-JYMT_->J`#n713IdHoqW$o}LO1SLIjR~%q~3g`jXy~(A32z8U562 -2(`!6;s(j{uU`4i%Z{4%Xw@c3+69X^0=0O9vEl^wB4?3Bp>2!mn3JD;7VvEv65Lse*@{#ibUP!@I>#Z -i}&S7OcuAY=NE*9F7fZO=q=Mn*F39WIU0^KZ24WX -?V+}3thms}q6x1d086sxSdcVCrsis~f~Ql=&8U=Y(RZ`0z(@#d04D3pX##m4Z~X9wbg^c*iS2L>sPg2 -BHSE|Cs3MTqY|f3IhVH0#sp`x_Y7t@y>s~>;Ygkn^dWs59UtZlZ2TPW3r?sJ%gqHp?`XnXOe1TbAji3VO7^%4YLlw0z_dqq7=+@mx&>~V -UNw6naV>Uz(4;}0~uDikcEY&^@7%uKZ`NK;?;34ar -CK(px}Vce|0bNbAB!)-qjmX!03O=EZ|2#$%o&C%9ZfD7|kGOmZ>i?0<6CvRpl>M(}6W&I8(0$%3#-@g -M#hZku07<<9pFl&$;&VAH -OMC)56H&E8){0mwiEFkpc0}Kwf!pB#wjA6lTf*EYrBz$$`|QIIASn4(jgyTHOlD&IemK*9`)Be-30`UT|mj)^1fY)`&F3FW;iML4hzc|5)QI!8TDcG7s*!W-`-;lb0zlAWlV`3MSsp?>BD^)yWj1n#U` -)RoO^%MrS5Pj!R?vk-b{mgYBTd{saHSLas!n%3)|u?=s+WoE7DW12b{Ua+1 -%2e*L@&Mhpc{!bGueSFSdMWaK3as5RKq!z%&+VA_B;GC4^^s#jFaFon7K{-evh^w+2Je58U^E3mveZS -lP%HJ>*Da}`_e)Z9>JWQ5)6Cr#lud&c-YA=F2skuDKYH$RVo`NMtyAiwo$CJ%gifar+Pw$^c^wTXg%M -LpI{KS`o$+YI*6E$%VlBilfr;omVE`54pVA=7f1Y-d+i(qVgXmEx6qc$zdw%uoPx^RK -|M3)v1o%H*4ynFo2^PWl1!`d>bV9av$Fsz2o_yo~To-dTfO5Wh%;_bkCXJ@i|^^-cQT|MLA0Sf$yYH} -Vf~ku#`rW;1mXO?FzW5O0-5DPuqTL|Iu;;(JhsBhyUm^9^!&EA{Q+H&%zOPquJB>Gz=4pF*wp$t%2YV -GDf$clk6=VPuI(nJkxo!(f3vV`+QX0Te97HVDZcWU7u&n19oq=n*ZKH_MUHMeOrg??A;jG;)2$^jrLn -&xFex(VBZji}m4;g~Vy-@Aq-(^ZUoI6}f0t9lPi|tDzaD=B?kb8sCBUXg5FeaVdW|!*SqIw8g~_1OzJ -z#wvpu`V=_Tp2W*HIW6!ems1?&pLQXLa9cb7livZOOlRCg#Q;)|A)pSpfxE6m$9s;Nf`t6yf8a{?CizGiG7Qei` -k|BDR}gfZk>hp#Y4F5*w|~uO-3O6X7(Mp%+0vpIJMa~!X|)1nh8_#bR9R?rJQ$AirG&Rv_H<3@PZB}o -m|IBY-(MS;#YHuzrd4?u31axpvxZlPG-i<39BGV`wA$&Q5qnY6F~9v8O6T|+MWs{S&gyXzI>qg84%UN -?kd&?(!Z`rGQ8~uB&?s!E<_zg-(15x5K3mCgV*%iKxVcvr0;PXm*muBvR@eoFE+G|1?=?6Uo+!a&uMm -sF>FS&9DbcAeolhjv2Lo)XO}tVXv>`zbpr9a3h^o=#Zh<}J_Z(!!$(@7;QftBO{Jdkg0MAys6T$z1J7 -WxlPEJ5CC~d`^4=ie^}Y1ojVP10C5{t4#{{X>FR}UGTu`9c<;b%QY%{6Rj^_`KB*LE7r4~px2bg!2Sa -TO1lpvCgeHO@XLMepL?2dN@D9WQ&%{oMz71iPM*atXnI0v3po!wfFb-RJnV9+$d%=@NIEX@zfg2<%fE-RKfUvafj$x5$xDk3x{Y1Bp|TWcoF{OfOPqHmx -$(G^k(oC(=hXsVSOR-jY2B=mjsvl$VTLkX1WDA6 -+xUqYZks3d*sAD#xvC31XbYquqtl6w)hq@Ken2StR`Qub}yJ7}{F4PUEYS#idM}GC(N;fZQamZ>7)O%Y1)f6b;J2Rk%US#)bvs!_+gFnZ#(qI0gfwDf$D0xnW^DLO -gqPsDT$ae6Cmnn%fOIQ~$S%=^3Bk$0a%H|7#CN{nP7E`Y7Dmk~pu3q-|fbbv??NhGXVK+|IcN$xdPF2 -h3!NkQG!jC=BeTW2VUS!+i;@|9w0NSB|T1E&tk%F;?~*TUsWU2hl07*I0U|92t5{_Ux#XaTny{Ey<7V --i2{X@+=&a^yd^1}NUR1{9E-8fhJkF__gT -tsxhG}@9)fyiHEtf9VDifc3$Sa=dIk%{t1@qa9r;E -+}wuajUO%auR4?$3uN{RTh0=V<};r3dJ=b@yM{o%E=A8IG|F;=6x_BXa@svR$pGD`aiZU|rSdaufi(8J3lim!AZZLnvOfC}PJA2vAwS$Rt~jSLz`y2L%LqY(A`-8=k&f -+Y*E&t{lRXoY`V{Wl@b4|mI^S8W`Uu)c^9<=fRT4P{s&k8<;+HFZk%vs-l^x#Nm8EicWtYEZn_>&Ej7 -fENJ4g6th45EcuY1MMfdHK^osC;Y*crpV6jB@ -Rv_tcmucewG4wk`bOV2@~PMPR~&xtMyexMZ^W+lH_iD-mp;PV-E32A(4+uO9+hy@-m9Daq>B{K^M%z0 ->3t@rNA1ca{27lwBk)JmdcA6m-_u3*iO+A)2T5dyj-M9R(@-zc%~&?vV_o(83 -$5bcc0RfPiHvNom={rQxu3(K;(a%u`({Voc)F8(p%0PXvvQmLd+6(iz58@64klc@RSI<}!&X -^Wtrdjs_Hq7&uU18*YSGsUNiZ_6GE7_-9VvLHnl7aP>PS=ygXkW6$qI2mhU1!km8v((<@l}OjBU&*yPuCZ=o`&w -^EziZZkx-zhn{*3&;Q^+@}s}A#FeWb&Wp=RteTBm|4TK-{a6iXY1h4mP$=#+9G1E4>+yf5hyISBLeC- -n_mXFmnkrRo_v!=ixU2u( -oB8rz>T#PBO~V}q_tid9s#}oU@Rcmqyumh9S^y_k -HvB*Kz6CDIqHBDX>vCNXP!!ZfF-cTVuuwEv+0|WK5*5=*1B69Lgmu|fEHCInFSzoCU9GIwO3Q9b`qUUjLG$i$~$FzKb;AYHSEc4`_Xb -;1kEG64GE-m}2J%bs@3d$!+OKEhUEeJq1%*?4jIeJ#9%uuj}`xMUt(l1Wut#zO6r(8@;{v|MplAN>3P -tylb|lh&3s>gzGIQHqLRnI}!%IEHJgZ)id5AwUeQwd!qmT7oWjKcv;xWO_DeV)qOCqWLcB4JdfIH*1n -luQ_4&z%T;2&C*+&fwWJ3Et*s}L%%g#$JJFKnt@U6*CN+nle)lUwoCNR{O9g-R{GXJ@l9qZh%p$ZST>$ -n?I!zmvEvT74#602#Mq2RfYz;wYds@2^`ucJjl-J;29m8$6h*d+7v>In(c%(p+;IEw%jg?4lPbf7PF( -6q_Wl1`wcaC>Dmb(a}4DX{8Fp7L7yGd!NOH^o_RyXeK<%$><%?^pZsJuO8`Bj#k9+o?;%97(>IpgW$N -70mx1@0!XjV+JQgiTEg%Scnl=-Dm#N&gAUi>X^{K|zQ9TFhy?TV&_My&JuM*!&NlKz;!SDixR@}%9y& -St&Y)IZ$Gf%eC&30UEGnCod(PWOd)+STivOU@##TPi+Z%YUkm>Xn}u*XhXG)< -C4+Jy4ANaQ`oxpbM#`;8PjX@qZ}8Lj*u=Ub;r;8cq6Il5DW5rzWNl+NvH}lY7oSBkum9i;2VZzzmEDTyL>cg}|ov0Ct8(Q$U*oq!hz$nMW@+te -Nh-nf2RsxMp^_s`c19de5OPU5;0^W~`;=(_rZe%xMGW#A{l)FuUNgeU?TvKXH_P;@8>mi=rU6LT(k&y -C~Ofj;6{(3|8aiPG}Gc0#OAlky~8SFa70w0pb7_nIj5e?mWQ;{Be2{T|O4li -l~k?p&~a!n7iqPTIrscn@c|d?Iw1^2&BO1li;L1A5zM+SsFtb&oNnv)q)^R_|@T4v(Aqt@rSS*_ax)Z ->x7REAnmNVHMoCRpqvN4|4$X@}NE*cs#Pc#nUpAA@1f-c$fHUX&^l!*@~wpar&3TTb7=WgfeIWIPL$6 -p84!2)z9Vpq>_-*DVU+&mg$Qd$&}h^RkI$CP1@AHt?1i9&rzyc^>~KzBPeWe3tF>u&97Fw_5yCiHNCb -=iEqwu4_`&N+BZeJwjQT@s0J*VTQJ716iOd|R-Rt5&qt33G4(dRZxDKggHsoTe&Oh+M86n3p^5&@=r5 -o@tC-k;zO8zCO7mIWS^-PYt?i(P#H?6Jc5-ufC#`O`_QO-Fb8qP0L0a*U)JL>~wAL0kmrkM`1b!ZlPL -et(!`VUB7CF+C5>DpqAaB+|#HEO<>>ssn2e!Bsa>fn{*W*!F@CCw!vSL(neRZ(qW7<8XVz>6v{(+Ido -b?a%MY(G?vHq!d=^s5W59!;1^le2y0sXKObOQP{qu+7#Yl3>w9>VUM8HE0{W~_s-n}e^^KX1^pvG86z -1)`+W#+Obm99YQ?EemfmBwX0R5T)=OLt=y{7!of$L=it>BlAcRsu-db)-WVPSjLcf!V-pL3waDF5N>5 -ik}!)QMnT7rG9hK9!*Z&S$Z))!O^9JQ<o2!*QMwf>t^Vs|p?r$7x9DxRc`ex)Dw@9N$YqGsE%SBz( -khoOOf-hNEsxc#GlqjYW8g;V2mhTN#e~HH1wJZ$*3q!|^6Vp`78Uoe<0n$8(}W0mG?r=lKjrQ_w;N!_ -jcGpuW>-^f~EHr?uvh49Bg*f|B7Wh=<3iX822p*D@SeRYC>BamSrd#&F!hCKNHe3Gr-(Z$Uhh;l~lzGQ1h_i3}GIk7sx* -;?WH6Ks=n`sOA#<87@bhFgytH-&Qa>BQ7wU8ms?;;W3CeF&uA{5%x1Y3GrPFNAr8a^92PG5jUOJs7@=+Uz -f*%N2HpqVkYA-#ONOw8;Si7$o -(#JOE^Sa$s*>kq)PBHF`pUCCkA{9n9n5U6AwPOF`roGlLS7Q%%?x|NdccU=HtzLwBVD%e9kRr(+&9C$ -b7zKK1T3SGoPc(rwn{1FrPik9TO0Ej$)qAE_cjC;HhMu_b+!$N#Gg6Jj<6m>CWw60rdm$<05`Aw?wL| -WJ2r%&UNz6`<(_!^tMCku??#AB(=&zrW5NbxIL0HXpbbYDp>gCe(4C(y9ssn_jMHk{584&l2w3^*;sy9szhijw=B7W2i?(o5hA-5qRPr>| -1EtKhr*g6$Oc{c6|^mdLdobc5irp?~*FyY=G7ll#UmH)yehl?`hkQ=@O3WhJI)UnJS|L(#?dTr}1ix2 -Rx4BQCK~O`a+dJDMu8G#)DKW -Dk>sOCr1TMz2>TOCNOmha9godFSgUBzDh|QIg_Yi`yp5H%FeY>M0k(B8V>f6BaNJznV|OF)T$;plUw3 -1)qb`j0F0GqYkUJS}SupY&upMW&db_{Yg=?;!*QziX|4t=*{y2`4TM_~;(Kb2(m -gc^T2ujfqH%HOcdCF@=&TM{&A=K4%Ae);l-UB7ppQ7La~j&)cAo9*dX?yB^t#3Dgf`nz>yK{yyvdJl= -7soQI{r7$`lGvfw)IC3^JwdjUgo~yd**S%xs8t9km~@or|4^joqGm{Ou$b7T2Pe;UcWFeI{^DiaGzlA -57AvDWNwi@>$2@RrY_rn^tqnbFC=9A%^rBmQ+*KXcIulwwC;OxN089PS?Y<=+!7AyYjWi2wvo|xv`aU -il{V)YywQ}RWLq{ryt%4poq0X19wvMBDsoioWNEdjO%=>DD~D)D2xr|o?J$ -tTT$SY;omvZ69v#9f25zR4#Ql|FR$JFR8QrB0@TbnJlba!Dt!lWIHOmBJx=htM56HEH3(nddMu+HM!a -Hfkt`KFn^xv+bZ;94wwSso{1nJdWAjF0Z+(U0%8$=4au^>apmLZiWsYR3EQsC%4-ZZ6Oz?^mp -Qgz`v-F7~3nrUb_8CAnf9+A%{*n{$#etW}r%Zs{C)PalkHtzt@(*1bua+++&IIIlg22bhub22kBs%}p -Q%d}7jJ*h9~;Ps9_o^`g7BCbENmB72cu80fj{RV?JN81^^nhVbcfG3*`|crOk73Ud?`bbPyB(1{o4xN -aw5^MD<@0BxAG9~T=WyT>kj2o^m6-0Mr5>nDa?%S*)_1mY2ky^E2{l-YA!cCVwZ>503DbiJ2WWrKAb9 -!nKkAEAvOKd_X3(C<)Gvg@e=lCzM`U#cnn=x2|6=}DKcK3V)jVU(JG54l6eeI87uF`CiXJ!&vL2R((E -bfog|S1&&ph-?mq4Pt{Hrie>?4v1+;VRpp@A1}B@e>3isNP>i@1?+#9!XTqsj8WI4)2 -^2Kf>)sZR+S0nZ---#+fiXbay}$E$xUoQ4Cu>h43pOo496eFhr2^2q9wF0v2PBkL}A-kaT8ENqcFUP3V9ih@BFv!`y(54NgJFZ-+r4@5?)&1=Pl}Z59dVW@dAd!pQNik`-Yun62YT3L*zurW)&{Ob8 -LJ5@C)8TMMNg+gjli$&zN|0)laDXr(-RtH$myIcC&JTuTrW|YlS3$Qw1%Dq&J`ssSd+c9swWNabk^81 -`laMMn{xP9wcsD}M^B#*anU@_qHwbl#G%Ts|H7H^U+3#BJKkJDXGdc0_2yh<9YmXh(FzoXnww@My*f^ -K|?)mndVUiLOUhX+2w4eOmYL%W}W5u(;p-LDuHIhlULJ5(*=JvSc20Q+V4vYuEA_u~Inzck*bcVT-7h(Q0k(XBw_r|BjhlvJ4hRL7k(L1g~m -Ghu&MoY`4{W;bif<-uA7w#`B)%@CLt&o+|4PgVAU&?oZ1|Uo6g3tv4%@P)f*7acfIy>P#u`bffz&Wfm -Wm?EtmU^suT;t&l6t0SU)!?^El2i$mx=4~b#yv(tO@zE00kP)M51qZy)mqs5_D>AL?xI+xdEM$ZRnl6 -~gzbbk)zrckVj&gQRB+_z5*8$6k1whFBieQx$isc2JFpejHNy9iPzP+*?U_9Y(n*Hl7Cx*KjuX;V~I0 -N<_mOQTv7vsKnS2*QeG+jVGE;i+)?MIccJ --50x0=MIu~hfML;7i3&R&ywPm=_AAWC-Yb6(b;|WNdBc9I0Rz~eo};uGPY4JiEo#KNpU`Id(37h^5}_ -zgk$&>mENWL@C1q%Sf(zM64!FEs95DmMBz;MU1`v;jy&jcvaeHg*ytB7WYp{jQ3=S(oi(0&K<4C -Nd*%OJ&0cTK{nd~1hqJ|5IjDel`(?a2Vw=~3PU;1Yd;VkZ*quCaKn5Ja~uvL1B9jSo@W%8#uvACsmCx -sE7MBo<7Yf?s#vRV5!Ny{6^IOQN_QWS+3cK^_zjLSw#BRjCzvV9Re*2i4vg^h416Xno6h%2~%I;8Bg1 -({9|?&Nw-DJE69%DdPhtcjAS$@S6CJavW|kraU;%9R$tU0ct$9s;zlViN@Csscidsb%v|fdqnHR{S$p -HepP){xWV}Vy*s$R$_vr8=S3Jtro-B(`FPB^Qb}#A9Z<*C;Q_G>kas?(SA6-`)5D7>+0zce?$K&%?#K -9I*yLo^EqJKZ9ZkWrjI^<>+FX#Tw8;k)8~kzCk!}AQl$x}1igi;Ve#@^w59|X)<#DM|sJWvNdu!HMJU -@n8tKG1JEsFf=zAET2JY&qh>({&GS9?+C+Vh>*!hOBB@cdJM+` -AiTzGaGx2EROrAa;W7bj%&Q&4JNK}*=Dq-ot+5>h0v+GR2t@4)GrHLPKfNCoDgA5Z=|vooja -4LDDBl$kFHwQ`s)E2E#m{O72vwbH{}i(zsGoRASLE&(630?rE7Wyt~eEe&@tGYKL;yd0g4Qd_6tObO? -Jz3v;lNRzX8$Juz%w66={)FMOJjqGBvW5vJ3UBe -CS{b@VV%%OvoR1%AMv$D>*mqk&d2Iq&c_m#zi@nQ59ed&ZoTY$?EJ00p -N|cVy6k+cj-HPV>EP#MO^#B8zpQmRAGa-ykl^cV&7-t6iYh#}lRT;N -Nodh3{4#E9m(G7Z>1Yu@|HWE_W~-(s9p}HWMX})Z=3u^fS%1BBxNXZg>2Mn`PnhsRIW<&uSGnVS7;WQ -YO4`N{VTmI^xUivXwwTK9&jiq|WAUV>0nz2JeJ0Mc8BTv37VFqN%AgL6sKoniU*ur0cd9^14M1x^^cQrtC@QMbAzO<5F4GWT)A2dL8u)6`GY0Lo8G#3Lz)2IQWY5)HiAhO;sUcmqn_yqjC7PmYd>}r -6hB98ov28do+ivsFInomy#h}P5aNZ0Vo3=my+%3+h`ziohMO$W+Uy%-?+`-@jHK&0;ABHz^;AX*jq4; -Ubdf3b@JqBb>12E7{~a(nSA3=nN>cM!UZ0iyHsx)>m0rgTu;c32=vm?(L?B`oEz`B9+AjiSeO7yCva -dbZw)=|5wpWJB)8_f2XLP9Xu->EUv2GS(gf4iB^~3m#Nkh>`H}mRvdeEatFjVLjhz2@q~{)WJRlNHRJ -(py_@f$u-o}X4n_>S}@lWGT0-EchqvZwK>J!M^HGMu-U|~0FQB;122kJ^2K5bEP1Y9?D*6ckEUj|whM -}#KPxIL>4kuhr8m!V3_316#j=b>$C;V1Vh!u{7QCrb4%hQ|FTQK7I`O(VNH{g!>XmN(T3|{XFv;i;E+PoF7 -%jrcX-u6JnJLv@PL(@d26D^wiKk$2o -Z;EVRqQ_0`!*>5dpp!YO74n%+Qo%p8IuUZ6T@h-Dbv{gJP(j$)r=vQeripr@Ho`&!0sXU8k$(aP4CS* -T)K(5xAs8)_Mf%N#Go>(CH)b&{cjt|nXgYLZz}enIiN0$wT2LNjq1ea16hYFjm)Mp0SM%T~v$l7C(qi -)KKe0hOOC?yp0OTRu!Mmp1gDjb;f!yy&CNT}v&$C%2leQ70{unUyx`ft65HTu09}IqsNm!FQmrzeKXM -e_2g&x$Z_+n){i?p49=we>v2HA0}z0)v#$j#4tlNJ4B5e8SGEdd#Vn#l*1H7=aLk>zaF?v@S4dKWWaZ -?f3CGv;WpJNik%)e4@2?4d}VYJ-|QbRZT5!_cHU(#<&$tscq`+d%c*y}(|v_qzvI1sBI?`gEuL0C(Z$ -g8AL(oqJGstAu@iMR_lsAlv-ziOSEn-D)#Fu)oi4_!2hz``@4BJ&>M*ok9lComej=yg^o&|%+nUC!Fk -s!2K1q3z>XVx331!a{21%dP?o3yGutVXZgFAK`M%gXO*xL;_hC&4a`Q2b?SjVk9?G_;qRH1(o>5dp`BJ@1o%OI-bK}kG -n%koAo4LMPQ;rvkbokJV72eHP#qNX7Umm8d3HW9b^HaR8mp5OgqN&%qH)v}--^Pztir4*Rs`?fWJf2t -pqgSq|IExwD4ry?=YZ}+er28<~!QI<9tmRO{;c%v{sm$P&+MS20&3eV%ecVvHG0vT9Y8oX?%}g2B)Vv -{SYF=iV8bw7t)f9j*d#4-I*36*Vn$427W(Yk!R}`(@GYY2xScerUDi@%7sBM3Wq9V?dssv8S71lNnJc -hk8dcI=`))MCFFf*;MM*e|57%!=M;%SbU*srv&Vh>T*lzj9M9^g}>!bffEuy0f=_9TH=NCjBD)pB5*i -79>heZp2JwvLu8oP^rcpAJXanu>1~6|v-^uj^3~&mQ0r9Z2J6;VZR|cR?cJ8=K)jb!N~f7hiK&xtGI$4@rl~1J1 -Gg(y=3DD#;%#2h^HIHoWg}SuPp@mXZ6kMW95?ecdM% -CKg)i#lt!d_IuOkp$PDBiim)KPU}*ttlmG^u5}sPrmWy3s?cHR&Ml9MIZ6RMXSGO)A?(u8NA#a6QwA6 -4W#8pc%}mrFteh0%!{)Wz?l&jC8kaBswppBqdXg)M-g0we=`vCY+Z%*<6UTV#|*gP$9HmW>)NqaAv1H=Co&G_mdK*mg)EDWhx+RHyWb@KifhM(uJaqvpFPqrPmX#mLP -O@V|#8j7HiWPhaOWbpe{7t~_IbH=MXSM{E0Cg*Pp0YT3l2kIv>35y;UX8vODbn^f^Y_v&G&kSN1V2y9 -!1a0(XPI`>OBp4!&DL91;aMS=A_5nrSBp^l2u;+=}9aoiF%M5;VimW7oy-^?njbXNAwHk6WazDzi#dQ --`UUJ6%A!PHGZQZ)$KQ<;v9E2rRfjnP!aSJUjs}X}wRY&t8P<*hbL#FQI&+!Bch93!+;T-_u -p66z{93%x%#mumoQ63pRiE~6`H70$jX^En;b(KdZ(H!Z5uLR1Ro0~IEPVl#xiPEP9@M|(bs6SmO-kT_ -V;zCNDOw(az+L#thSK15y&j!~4kw!T*j3_i;_S2wXWts_x6CI?hO@4cIcCXNr4<$UtwBw{)M3XlO%jN -jlCoHcK1VyDLu*7f^*R;WOWF_Dsdf6_Di8Nyr6RA{K*@0ApwVoG9ZQhni> -ZCbT!c5;HDK+0UX&cLuY!=$ -EN$+2ZOy17^dne1S}(2d^h67$u;e*MwAP8Bd_Kky(a81Nw@G%zok_OaI-!;R?)u_c;WfyW8k -lg@fUk52mb+^iHUQrOu%ohZg0l9QL8!aYN%3)+w~AP|u~w0TEcwLVD5osNuApzf-Fsq9^LHptMVbsjM -_m-Ea|leA3@;#_A4tscu9M)lE1ihV^9?z64G6cNb}m`#EbovZoqLdk(ptDNOKUv4pR(9r~tpsQQ@XfN -U#N{aS7AQIPVB=!ZeqkHolXqfH$IHHTN1N02>Icq^Obbe|(9Au5||&*&b~%XJJ)F9_7p+rGt3i29mwZ -dMm9U*h-l4QpMQ;7=@xH8XsK$?Nc719cC8$vYv4-xI$tj1Z6njt#vasuTR#mGU8L;Vmwj71M40-$UH~ -L1Ng%FtkqF?PhpXR%n@SkM<*N@g3`WYB6LJ6r>f0T|}K>FXsVL*iiajlW?ZyHZV#zE}vVk#%nPixrQF%RR5VG*G$YgqGBcL=yaw1pO7q{#;$NL!ttuk -pNPEg{omp`yEF2VP4Si0g%20uQyO9f -3K*-yVk^mEqJ2f4V-&w(i+%VR%+w|t)pslKZR0H!R)B3_Gq$t;xT=t&gS2Q$G|CJ>PrV4NI_+4{DBl7 -Uu(8M42!yXGza@9^*?x`hy=nIH+I9V+~{l`bqCaPxy*J%xb+hDlR^z5<_{Qow;vMdgVj{O(@nueRch= -s1m%N#T-D+(UZyq6*5R(;Uzp0w!c=CcEpv+sPN-{HPc=n{%Nt!D49+UY6 -V}{CWe^o~f*Nh7v_3Zm(4A)FkZ|3Dv_aOT(@Ieb5+80NrAZ`;q%qilX4PK+;|bzeA?wt2&5{(Am4yVJ -TvBbUFPzus@sbmx7$)@#5!eg+q{{CTj>(XzqOc?69gsQDNw&Bbx*6Dle+fJLrz16^l?*gwbdYO<9X4s -(K7D@XDO-p{>zSo0my!qny4*lO%0;Wv1HAsJ3hF!;HaNSH(b!6R7pW&&`ilyW1ZX!xDl~bh$%O8A1Io -YkNcmwB2_;-vkd0c;Hsnctyq5&aO4PkD4Spoy4};38N$nMZMZ}*X82Pc(5Y3eT~=E2Wru}P=ioK?Y(VvkcRV>Q}Ng|?pB9fx^9U4I3u>s$ -wgcLclYp`e-xXKWYrwx4ZZvU~e3-Qsxft_QT`0u?%=($R<-n#_Fzt*hZ7qEpGpY66uv(Nc>(xtVE5^2 -ZmrX>H?L3s7pmq*B~>P@6pNM{rq6&}!^YFtE_>t^F1)$UkD8c6^}aoLJ{DlU%k8>C+({o2$|K2w#@au -AnDHBDAq*QM9eZtC*|3sqJH%M;yi#63%F=K=payMn?*^N;6i^ -E=@^gn7>l%z8qoa-Idp^8=9M0MT5Idn9leB?q#Dz6&tO!|J4pI;v|ZnX9gy%CyxtE%;r&t5KV^Jkfui -DZr2mxh{sqh^5~B{u3kSnn!<*2-i%&`Cc^V>&F+JBj -$ndMmq;t$;5;73~M!tKjHxzXc1u2m5i*S1>Yux^&U#}fYbT7WtO)41q(ZKcBkD0HTf{#Q4?y^LtmYDj --*$Qw$In#)>7QT0gHOK_LDW!+>#F}Hkdon+FG5n6n%1?!iwK)8Q;KA*0TaYxW|#1dqiIy-2mikkVCdW -@SJ?q$Q4DGnJq}X^^c0;JM;rvjlUNxsNBqq>!5~nF#L81Psi!}h_)uwOYmOBZ$n@gr=#aIn9E0K-9Lc -}>lB)g#jrhr>}pr*`=YROt~8zEu>LHG5z`NIZUhHZ$+oZMiA%1g-{^g~g6SqvY{Y2WShSXhFG=5T9cN -Hd@Bj+638Yln&Z}&#!o?(}zmGxvy{clR`#{TJV5Kms(|6V94?VyylkucqPkPeqyBbGEqiwdMs@?QPZm -8y=7BubFi@ju+Qn>K_V}gh_kEh9OKMQNWX43?IWy=6RH(1*q78ZYvvnO~>(!#_OdmQB$ysiSIknMh`m -BWvrHFJUE8Z@?pV%U@T>ZX&8WsGpkO^!>wXWWGLN_#bHokicgZ=gmB3jK=e5t`MueY)h6THD7OMfyST -ezK8$1N7H!Vl`PEVgFnRgPg5No)$mBK1Z_oskI&v@eZ5A!o9Srm#DfN#$yAD+3n!6&sniRgWCI#A<|v -VtdZ=_7VvoCH+r5_4BPCFVyHGk)V810;^r1nvZyc}fB_otNSk)*ZYCP^}Td^i7f)Zfh>4lbE|jXg*T_s4KqQn{w`bBj0C7TOi6_ -7f3x!$=(=o>&R&P&r?J;A^R$ke}&zE&V!M6zP?)c3+$4-Xfrn%<rl2|H(sA~i)Uq!;q@Z&+S`p>4LKJnL+i)d{te81PmO3L)qLLjGAf9zSoSui=)lm`!6 -o?rEUHf-Ru=R%9GlMEMIks+I{j%zQ*>J$@gv4`U()KeK=e8h&7Al`j=-K2z*e(*PG46W -@wSn~==RlsMn!?n4sZF|>2E8=H6c2!RgSF$hBxFxl1Z;ClU=tD#4fyU+pv2Cx++`sxxdE4F~MFkZ-ao -fQ+o!V;m>e=D8)Nly1HlMXNxK*cyKSM9djT7#^UX(7^H3tf7nTuYm>jykK=Ompq@z|$u?kiDjPYsvT{ -jvDcvBhd_vx8z62We}jxIrPd)M%>!dCM!$tnRP2y^D7Ko9OK!bFJ?wp$aV%Q8w%p%|or7o#sJ!mezJa -TNBo9X2vL`9S-jPd+pw^G`o8aG*l&5n)~6DLyw(p_);1)r>S(88U&NL(jNIXdlO_vL#9wPJuIXZemsK -3Ctp%jzJs4I6g&4jCK{Lh=UwOKcq+>uGV6ty2jS(!^3}>fnh`=09Iu$s+M1hW^dg4_;rV5hNS<2TL3{ -XR_b)8W0Df{@)?lU!(D*EFV?oOVV|w)wvpb9DJ%-?1eF%3rq^Q|>k?*`wR`R^*W-7&Kr8`jqG&eIw#4 -oq!JI!9OuJameQU>^&KXCc{wl83~*hU~_#7Q(ir- -GX>_@q+!jZrQOApxsfMT-f+<523s1WI1bTPeJtkaD9(KG*zTaP-BQYyr(#H -i6Xq+Q;;?{U5N`zTi7}?4zSSo1l4ujs?nt;G%Hh&S=j>qJ{u>AP4IHQEEK!v*0Y!8>`K;zLu->f38_= -uS8s#A?)_+86;I3wu&^{*S0xg(|LV(^#IU}uSn9ChaDVxMKc)6;UEr2bExJpgTsX!F5_?=hxc*#1cy5~Y~=7G4o`8|%AwmZ1|vDV -jzc|%3prfL;RX($;P5RD-{bHEhXRKk9QyKp8^qyg4pTV1g~KWirC;cfuI}D`6P0N69glM`Xnc;lD;ez -moA)F0kBsU$-1Ya;;*V}Yh_BXkcv^#Hq}83JYEG5W^yO*>bK$QP;2e@krjk*3w2}TK_ZV^=(G!g$?>X -c~q9dtf22oRAE&NR&OW%o5p#5O~iMPY#s+UwBsUEDn6^?pHy@@^}iVepq{_UnbNXW0iJ`Hy85D -qb=_mk_oY0{nDZS#V#>s(|WqPb7;F*xl(yj{!)HYK2mz%EA50OOD2>$7%C5bBbDj!QzEhgevJOMC?UEDKr%_ZoZZ7`ap0F`Btr4%ZgW+|firCEw;$E%E{LhOU|98<2NpA8 -F5mK>9VU}-tU)CuKcS(rcOjd@~zm=~m9fq7v*m>$!R**Rv5DKCfSGu2ecF`!F<#Z>BW0lf@)#ReCTOb -c_RmlRXa*%l6S%$N_R$21rZ<6t;VCv$W6@bvPQ`}q3#2LvjDg8PJohV|_i-hV(ub|9Tz`lY(nC=>#k24KOuSIq#GuusHUW!5Ev?ODK-R8Nhog8mp%`vta&iC(EKqR=iw4sDux;1ugH;tUXt|Q+S488pmgUfrB|43wZ9`h(oQiXTlElEfAQxOFaxJAEazd`7POkLK>5)>! -w2sI@>>XgDbuo2Gsit+p*|U(gvwMG!b@X>Jq%c$7D5lg}1Z`D92}Vep%lnt*UIdV}R_ZAhvc!d=uDs` -3-k3k&ugm-0;6nFQ$S0HckI50jC|yFShhytM!5`h}7Vl_>R40jkJ+&aO7kZ2ZIYi3GLVI{2r|Olcfwa -JSy5=e6cl|%vpUY`WuRQL0D(|{~qCDitWf0#)r2x#Mr;#L$O=pf$eu@7?{j+GU22 -w_A9>+P0xv=M?Uc9{iW61a`_IC-CX5cku3zJ$yY%1H -*B4_j9>qRgLfz&b>l^RVe^;MBO2#PLOF5VJ(4$iR&iOu{_7NLx?2TmvcOlI|N#AZp>SLmAsWvQ4-eoj -$<1mG=^_HBwn?<&c^WpAt?v_%n<^OICp1ocYmp3+&zFhYcDc)gp? -n5M@r@Y&fJ5zyNbI9OXXc)ZlzQncSmt|b_a8pN%Y`uNuE`5_Z?FGxcj2yY-etfyN`2sIvx8aDwm+Vfq -iikeaA_&UMh)&KPB{ZSBX*&7_QWu>oi}Nej82yV4Y6aStY;+7;_1iH&_ms-(t!E%i;eUXu9sDXdI(Fi -sqluCASF*M3+W_SZ3m6XNg -*#+6~1A-gN;3tO|#GARS+^Uv)n|C}7~um1f}`|&Rn{#;$IVOQN`-tMmMt8K5d-Q9iYW$T -V#`Py~XipsnGQdPa)wxQ;)ch_#b=idA7f8fDQ4?XpOSte&fxz-hO9KUH#sD``ByM_(;>yV;_F>@h6`i|Lnx)Uwrx1$>y)W`S#Rz-~S-A{ -AfRY=BKl*KmYRUZ|B9O%m0rn$a)X|UqOHT-s$Hu9tMKj!^QnT -H+K!VU1f>Cc5~m|&0X8gy|J77o^I}YySaC`b#=ei&5fV82=JI?XT%S{FR^^%tml-ljj25HApZT%uNIK-4v&b-|q>QDULuP}_H;ZbJMiV -tinR?>-^C~aDt9)%a2z2gumEX0lJk-+@B)ZDVN+5iEe0fHB6-Z|>!;>=RmV>+oLS04%-twZ1DX%JrR0 -PDjf`S6M+`G(ZTy8X8CePuQnH%B3?>Eulo|V7$U2L -!Q!HqAW2Qij{^kL$1Y~v#?0|@-e3v9T=Vu4OiwAD|3txF%Qz9RvZX2x?4PxAtz6nZz@>=DOff`qww2~ -3TmbW8qEVpNHWhqtz;q8&(RIar51x}MPczGWj?LgW#Od;v)Lt>l$!IPd3hFNQDH8NA%(CXgqK*%y+?p ->AX4w)&UWQO!^{Syk#UvMQi|0WKCGy8cvm_uGMIskg=S@LNuEJjk}suT`HiMJ1Lt?8II2N50bEGensI -z}-2JC1GXlf15?D__{!5nR00zB*RRJ;#9}WFC9I?^@!@?Z!EGjHEK%WcNQ0C;D4J -PIAI7_K1Zed|@oS}Hxa4B&&K5+60mIe_EO(n%k48>+CzOx*IX-Q#m4(&AP3P>?(sig!634Pivn_epoz -f6~GSo-CK<^t^6Qge>U#rrC=b@mr+50BFWeWd!capaoUW%SH5&@Ok4!`Wm`=G0M1J=1^q(BaA)-U{TF -ZY5kEKWaF%v8bqIIpx2hmvwh9{oFfEdf_kAA`5nCsWQf}3}%MHe5GND(Y)f?KQ3<}uo7pM9H?k64jYM -CDN&XfmXz>MXhX;_So@X&RB}w&gCDG~XRBww82#{lwlR9BO&gZ4`Z-P!*F(2 -l9oY+g}mliHD78$and2fDRVX1k(`MSi>#=M1>4Xz%3ROb>RCn0(MBqY&~gv?Sj1=RT&zZlDOJI5jjIR -{Vek1YNLzyl+l?*5|!#tq)DAQ9$3(l0Ln^6)2$1YeU^vqzH~Ea1)AFz;hIz8=Ik(U(AoQRXKjeo#AEs -4odkRFKfIL9Kz!{!PAha-(;)S4MDuU($cSAL(xfnCC$?6UA88c1o9#ghaq|QYt6 -Zi-hLMq0Zh|XGgqoqXkP>yoe$X@=Elg`CX|!NMjwmTAJb6&(r?|xO<$_-BaDZh43?R&N6){eSL -`UEH6i#T|kSuV+c9_BZD%3H{ve~CNiZzQRW2`WhShT5(A0S6xlkUIlQTFU8qqO=}#i_6eKb;kVHaXM$ -QUv?b{sM)Tb`U7);yc19g!T#VluCKDnNdHW>EL+c{5+2HNKB2m0}z>5~{h`rPA}A)|c3c`VYG^&9kOq{-Q5Qr&0FAY=j1vPz=UC_fUBHY4?qUh -ZS&)0YROcWs5@hxU{s%bLzfR`kMtsJ4#`ll+BZCw3$Y9wmr0Yz}`nmxKOKAh;08N_N8^AYPDyM!m@cw -F-azbGa%nKx;nE@~t`jgOmpbbcmOkbdf52Z(Nuonr2HU^LFn%AopgnSCm*)Dm(13VN8^~QOX`N6vZcq -kO;8#;^U4?LlOJSn{?p9BD(0Iy_nUNHgx(eWjx6OGOQI9|ljvUtw1zkLZ -3?aHV+_uQK1P0-1^nXj&XV$201L!&cuc3IaTK5#Z0-a76b$_xL_$&n@9}MwH+waC)Jg9@t>c{#4D}Bp -ier98`rhRH)erb9Bq7k$JzcybodVJY62&WiM#@LNZrHwfS)dyU9P1m;`8!_Xv)*8LdVH{*kfYlfjxe~ -NFYqqB$62J@Dqv0yBz;WuO_%NHI~>1UHi`h*C<4X`%p;7yOm2K!J_X})bC2V)$%FTQW_MWv=neB&|2)UM+ -bq@ZhR+Gff=7PFwT}WJE{qi@AI3wLQ43qmU38Oq~(0KV-@kT=gr^C`@ez_Vem1R4Xf{WI9OgYgFA -vwx=J9m?i?hzE08YoF$zCPoS0j9z4}R+PD9o^Hf5QAT7wGU9`CY9FMfFVGU;Se65wSJz47fRBF@jGvK -iWPq%ijT4|#|6wrKniGL{6G%T+Xyl0#9v_K!!3Ci8 -Lo>hYiN04B-veW$XRB%%-_gbVS+x$Twz4&Z0OeSDstFE(o -{Jq`;Et(;sRRXJWW}y!HBs5iOsnA_*HCqufcBax>B`ap=Hq`gDJygD8;V5#$%Sb=%zxG*^*N8L_+RilL!7MTK{CZ?dX5Z?>_pIJLwA -<^BZJLj6`oNg+~=ypMaHUEH5j%68>*LY_sM-DEJ8QrE{c4&x6($|&_RFg__pT$KuMryDTE3{5)X{?Pu -Lpk{fLQ*#y>$Sty|MWvW!PLahxZbjE@$#pZjXg8N5RbBY&eU~wnS%4a99Z+o^#%HWR^lto%fhsT0M0; -(Jb38C^gZ@tRoC_49I@-xt(!K4s?_en>d#o1Bw+H%$G4%oyY7VgTYAR-1VvHKt -jr4P})BCSx{427%^jMh)U!pi)7eTjZ^i?(!mt+H67nQ1d#rhk8v2CN>6F7Ld1`wtq#b*{~$D5Xvc~lmU#~&1VSom`had`jQ+NJqt}arWH`f6O>108Cb_` -VIz#q48ReuxVWJqK$!*5i@6{6B|F3Djbc{B1 -EMKZ^U0<8Bpqr*d}&Pcw`A&*pG0&;Mp#b`keqLU899p=bSYkFAN<)r-e3=XGAo;W{2}< ->3`PAGG&|J4PSl?#Fq3w(|0x=Kec*{SNc+PkDH_H=~6_v;XWbsMjA0SN8h*k5}!#^6P!`6$|fubI|{6 -z5kuR|KE9_+wcE4OJt1W@|K$ioj$h01f9KZ1zx~Pe@~rc@bPU7uKimx-O``3x}3u85WoJ(6Hh98$$xD -pgDD)oc9ro}9KH_mk34bei2>xhCxj<%?LGh1k5g=JSM%S%Ma1KK`4B}AEA>pv2jX{CK;~X|}SjXX89PZ+92Zt|l_&kT(Io!(O77jOaxQWC2II -QKcio-Gvi#W{dmj8SXGda|An8INahcO(6a~Q;-KZitW_c`8f4t+ej%I8hozk$O#4tH_*5{KJ4+`?fkh -vgg^Ih@B~3WxC=hI1Iip`1g)VaIO_wsI(N*v#Q^4x2b^;INLvT^w%bu$IGe4vpRN&*m_L!xRopR5#9g`>lnaO0FDd?8KSR@!hi^%8~6tS91y|c#{--JPj(*}$ -pAPC7V&w2#{;y&6FopiwgUVbo>0I~0US1v`Nse}#PLRe-wcBK_lGzDR}N19Ac2WH{sl&u@Tl2ly^Lwf!Itz_u936Y9_ -b@V0ANTe1NT9>MCM1o%lT&=KMs2N*w+kOIIFegjW)IJ67kZKDX;0RGtkBSy1!MFJdz`#1qt0(=;rrZ5 -@V3=ntgc!bJ`2f#bWK)(RK65wCQuyShwqIj+cf849_St9f`;sAGF5B&xBTL44GL%D!Q0$el!$_2at;6 -oEwKAQphB}3bxp8fzwB(t`g0p6F);vn3?afBC=8J&YB5|RkdamX_T;5>Mm0nY}Q1J5bIjR2RzBLHp&_ -})a8Pb0wmNvypE0DqgrXoc|9WI|3ue1wmsfNTtLwg8M*LElBlDBK2%j(G6j4)87w&;jr&fG=rS{>@Vf -xmnBTJRjhzT2|*B0I$^npF#X2fD3diem20cG*}OSe>lQ4-WLGt(pXxAzfK390sr3sTJ+4nOpkV$U?{? -PK^sif>CArvz$ZBV7C@2XJN`NnBK)*vA0bt-vmUbe*hh_t~;(=!n-Z`K3<9z_{SOEP3{wo32Enw|J_|$EX7x-@n*qR0W7Ad1JFq`pS5Wv!GRu=B3*_h4w5 -TMBYNe=WKJeweXEx@nf*$#L!z$LlR7Qo8^-kt|-0lWy{T?STe6~K@4VJ!*xaeyNVcpCxEC;|Qh{|tbO -jf7mpv;glh@;U&FSjxvQz%xs6u7vsn9Bv|HBH%Fqi%qPaMu48BjJ9%sJ66Fw3~>;qt!DY?0miO@c?0} -M0?aIju?ILpp`4ZLu@>e`c(#LoBS4vz(ai&3wUyC)1KzDt!RU<8uM*Z*IIaPvR?T -iLvgaKtv|KN4WgHb#>z05hI~dg9y;Q2sQm*D*f8AK*zre%nsSYw&0R-v#h8zoI?P9`aFw&9AMxJj8;Ja!(Rm2K^%mSzR2qau;eAqO8{SbiKRtoeVOr31wh| -d814_SXgBZ;#78*&4VXV+&eQ`O`X;ms@MwS*c(MU6132vf<4G;RFAuQ#Gy~js5bu8jdIId%!0HeVaCr -l(LmA@lK_5Y!T7aI7guDfK5WqQ&Y_6UM@NXR70`SvDmd|m3*M7k2FcRQ_57-!K0663`m}9Y?0FQpgc= -98Ft4}~*1J9QO{Ots*1Hy+shkghD{Qw)kg#H2?VeLs+*8`4l>q*8}2-BL`*wF*@J_TJ1xE!GM6qAcK0 -gV41<}C0>*a^=UfRi5xiTi=eKLCv!NB9iKcL59*U=D%!p#Yz3fp;0;TLJd}kJjro{=Xo52coqS1gkw35FrDKF3pkEv1gbcW@Oh3SJjii`XE~00=5fC};t1n -8j!?&O+$(M3I6~a}i}ghK8TUtcmg5Lzpa(yH^M -6RIn5=WH(mE^0e@Vd>;j1CngC)rux&X#h66(l7b`IQ%JJJ_ysUdZGJ1kj+k-#V)%D2Cf?Ms2K0ZtY1Kxy7YC=yReZXlDs)>3Tx_^55vuqsg>s)5zSpb4g)gA+cC2tfR`y -;a@q~v}qH0`st_1?%lgdU0ogd^wUpCXJ;qjD!XzT862(X@+WsUmirUM!R5=3Q0Ecx?8S2bi_4dh(Kd=T7naGZs-;9kBQ-NKQ^#zyL<%VRnGcUHWZPs5k5Y?Yse#Nq+&UVcR0f$8(}FEaNUjNf -=9KmW)hb9q7JPIW}0|cm!f>Kyt}1K -J)OHBo=|XJ3ctFb;$FLG%h~ie_AzB?11F-n>Ez`@ROO19T$(3*U|V#MDfy`JslTmFvbV^wruVYX)vWf -W+AX(j8BcAA7{Zde_A&dOypJk$AZbl!F6kz-ODEf3k-I7+~JXx6E@NG^2m5R*L0J6dDg%qmJ=B~?(lf -Sqkw0yhzpjIMtpM5YjZHa-G9aW*NEbo_V$+u<>EU*))_ol4Duc<5_kTPD?CyhZ~iD4o -sdQ;lulRP*)VL_FcKRZOXB0>$)rh>h)Sg*I-QQvZsyFH>lT0ra<3{ -q}gAbC29(ssu-n^M?*|LRf+qRAN?@J&kzxLW|bS``At+&XB`(7gJeiq4Vts;5%-FL~MLx;!*AACTL9z -9Av`sgEa;=~E^<(FTQv)>&jAO0eeufP79@mmJS -NdI?8UkB-rLHbiJ>92wGDUkjaJevvW{|f1!f%JPJ{ZUAN9MXRU>A!{aEs*{!q;GRcA9oF`e^i97ma=z(l3PcWsv@_kbWzqe-+Zd1 -L+S!dMI<_7m)rtNZ;y6KN5174mlJ;4u63hwm}a2A&0Laht^<`{4z!)zs(d$+ftFVZxqS-mqqgXQPGh; -0@9Cy^phd|EJ&XV>6bzJDoFnjq<;$1?|}4sA^j0Z{{^JCyQG(M3WP!W2uL3V>92wGBO(0_kbWMdUkd3 -rK>DX3{T@hv!X(WzHX{uCpDx}AHjUE{rdqbA9l4 -12^goN~G;k1s?LzGZSo -g@FOu+Wf@>62)LSQ;TpiRn|-7^=eX(2#-CdDZkIumnh-HCdH@V_KRfEo%T~&_BFizrOzd{*iht0mIYj -5Aq+-B|;XG0mD-@>AJMEbWQr;E)gJn_z0T+lyr5PCS9FAb4KBRo~%sYnWp*QB -Y_fyz?{(?$%O%GqP`1eI#6yTUVma#ng)x=zDu>A3komzp>wHO@okdm|4(TItj(M|jrwxF8=dnJicfHN -+~Wr%eV%a)zs}9~YnC<1X)`gTT}&z{`n=sj1HJtgI=j8Oed(p4S1InuWRR)Xws=QZdSmA||l}A<^ra5Gfr^{| -2RfQU|$&^ZVtkaN}9$rnZZvdGB<~i-BBDv`sCNq=)eBglx$Rm$DLLPneQS$iXkCUxiw^CW*)mLAo^57 -e9yg_A!kL#W$kAS@K637bs_wOf%4scdlW+&OaT(j~I7T_ -i7q`{?g3^K4ucyy)=b42;WKR8p^i7v0_PqI-%2i#x~|@f|W#Y#>X;56MRH3-Yq~9lXC=UDCq~F#}fgM -tIrQj)e5rLHZO(p9bk~h4f1y{a+ycqmcd;NPh^@JKuAE$|--!DgRgH6vCa2Mh=w5H(_OP+%Z_Q|&(_X4tUd!{UO26xRlTdqC9C;lm+raM0km*tl2{Ib=jk+(6&BV2BVH5HKh -*YFJF1pKr_{?x9r1jEIxV{bL}_wS58u288z;5$7kD`}%l#`d_P14Dj$8Fk+ye+!sCKf(D0q%e;rg;cu -XiC+6Qb+${uLenWkId}3jIMGcE^kAzT2G7#KQer#mu@S(ABaj|GP4ay%88yg)P8x>327YRSy^BWaKon -(!Ikcp^-bLUTQs!^Fs9E^_}`v)`q5ZWBbrcsnvoM*4%CmliXa(O&?ssD}NKcg7N`r?-Vu)%`|BT?}|6 -M@(G`1rugLa(_*bKYnI9A*l7Y(S#;zw77D^Y#CK?VWpY)K!+p8yOdCs&1bDX0w0nsiLyz|b -clO|2-dH?4Kk+%m`Ksz$Go>MibE`|g## -5|SHlg26FxUxC?1X-c!#=h%6pNiobJ4Xy3klyU~^X`}dp2V88|-Z|Dg;g0@wsMG_B)#C#(1z=tA -Dwuv;{EYf(B$P+t6@{fyLxOlNxb>(+Aq})aSh7B90*Q-~rna1!rYA@l3!2rGNIr|D8cmeG^hWCdK9Ws -;0>^b`ly~qJrpqu@N$KJn-#O)P{-6PU^mq?3`M4E0_3|mF+RSfmt6^VF9B&qte+i -7`W=gsH|dVsuiKP2+devuBJ>HdR3dC+{P$o+~Tb)U$^D3{fO5JUSSw -N-V6fBTD32%Q;kbPHvg}?vPZo~qEVBp4$ZLaQ4G}%R5qa_}k;jjSJOYN#9eq}riMIOuVNjp3N%c1b^| -{gdpiZmBE$_bt8~T;cQyzHWfe5wd+0c)igyKN%k?T+#77MbD93B2>g}gZ;T71LW$Q$Wx4F<+D--Iwj@pG3xgTc|~#@HmasduSO`X9wmXHC$y>KI!d{SgrnW%92+9zXvJexSej1Ir8af#((j^sC*I -O|SP6|Hx=rG@^}o6~jEmz(`R0`Ltr_p>+J|SP+BNXE0cO#wOkOf$sZzBKLqn_dk5C>i>3gnNP~2U+uk --f7P`d;vsa-;;>l2fIp~6wxAz7xpHhfDSWZDDBF}xN7)nIC9}ns?HmUQ$Yx)cZtIu -Gt`ixC#u+CiO$58swGyIFjS!ELpc8208Pe&{k#_BOGW%;O9Qusn^S(2d`hPROmXHUw$OF<0JDu!Ms6o -X5jJ3IQ^t~h9uqCO7#XKR!0Rt$C5m1~y_{Tkm-Y1XV+gvKb@(2rf@h|GY2n8#w_HGHj&%XkleOU%G{C -#$8b%4{ji6hnbxSgaV<&l)7>&wN`YWAm-zOi`XhS$%e5jJr3KPe1m;%73d?t?I)IJJDC@hBj!oSg`%r -d-59WCcX;a#@H|}O4cfdm6@$%>8REcPz<5^{5Q2p(^J~Xl!5JKVp0bg->-v==@TcDhxL?0`-%((cZ|{ -4i7_goU+uk-f2Ah}x}l3BG(k7|0Ns`+*m!q*jQ<5A^8en%w(_oGSfdzLj8+V)3+OW#ybgw04u)x97|> -oO^j8dh<0P}sg9ZZwo7Bn`V>H`VzWie|@L|Le%*Bfri{I}T;vzfUJgH1ie*XDqDS9J8Hji&1>&Gev)r -Gee!&{C%W0UfRwUv28+RDtd7@3h8D^ru($z;Xwl42OA7)C1wMre%j=i>715A>@n82MMZ&IZd%FTEszK -)~Rs3J!~fb4zx=EnBi%$R@?GPB9pLRt(rAtIxS=ljaVIk=N5=aapJ@>452tG!}9abSLEpC*|Kd)2iZ72O4d30yxgVF3mgn{91MR|Im#K>P9`M -5uFOnvC13!wicGf80h -mWjy{KsO5-2shxZ*jc7zYIWXTc}dlAb_nlwp<4CdO(4j+R%9JTaufP2AOJjG4h04PM-S`G<6|oTUDER;becrWbm|VG}`G#+Jn -LgVXW0s@O(^MC3MF0Br>wlxM&Yvv(jT$v--nVbx)INRse5ZEQ@WJc#%43f`Cf&MqlUH7OMP7UDHJLGE -hM|Z29(uumFThV&9ON)yz@8$9_(Im$Iyp}Eyb1jmWygZy*J6y}!59O5#wN|qcm(oqn14k_M^Ad>kw?Z -NKPv0fHSce>a^=c^>agg0l97=isuRNVhaY~}#0cBAZ8P!!?a&I3tXx@sfDhRt&mpdZ7w7{zZS-0B;MV -6QA^QB$>iNWhbE+adEnBvnF>BT=QwL#fN0%ilD@)?z7-Qg{{i8d`>R0>8!JVt*;)M&v%I_-IA7;*+DcRZC=cZ4eF5||HyU?>|Pf1QrHv6u5r -I95tpcmkTHgJSup$35;M(**^=nC}+@DQ77BpANA{)vf<q`HB@QrjkS44E@L^6Ir -6(%xlm^&3V|cVMc#Dbm$=-shZ99OcQD)eU<@j<5&F74{h3+4_dkM7yo3{R>0C;-1pHdG -iR}!))~V-FM$L7}y``hN>S1LqbA=bm`K?$ku`d3k?12HG9ru=td8)KfF$Ciu@33qX*~!I>B|Z!Akp8y --s#mSXiv`-Me+`))G&!=Toby^s}xz{;~VYBwvIc<*jIJ!Cl2hAC%vs@@8ZJAH^Qqb8I~kJIbD7|CcXc -E`^1K#s|Lj)?4O0_FDI;L~YwM>LW)f?OXJ<37%lzqpJNI6TcDvVEFAW^Qh-IUihn9&FHyY+*aWVrkd-bkR-9`!DE+7S%5!|LVW9ZT?jm7F+YQ{X2NWYw*G -LM4)90#PWG6blf8!zw!RA=c#h4-)?&vrr!ajD#eA!2H}oUBmC1QU^6s`pyl?9k>@ -ygVb(N#58Y7e_ukfq?b&F|d@bj7f`F}iFgZmzC$BSu{D)RL<)BSswYcw){5kNW5qA8R_t8 -qU#ki;guyuJ2km%Q*dV=d?S8|PTZImS50G0stf#~K{3|K3ix=OzaC_tbLc?Vd_v -Me2PzKh$|KBwyq?9hJ~}U`2zq!Zh}cRG;5DF){IRjrZf!=5rf1x1AAl|A)sVr(FBXQjy`uL^|#b_SmQ -e(^I(rJ&~tB5!w5Lp`|h!!1}w}Z@;~T=5~Wsr%SPC8gpJyd;6{0rN66PI-v2nS7X}&8UynkhWm6zXuN -Tz-`BxD8MRRQe65{Y?x*KOc6~1rv(>DBx{~#OuQuGLYnHnE>Goa|TR(SV{;N9Asm(1`yZH_mre{jOkv -8$tVm~`CQuITWdcAe9)8odCOPDcZMm#hSJCQ%&AF=EBB5XCWEO83&@tD!8SOp5VVu -9X}v%j*mBW%p9i%`1~o6XHN$ErrnMO`@Z)60k=HTAEM6~t;f%*Ju9uWU%i^zs<Oi5nH@ -|mk$Nt5MECmiUg;lq50S@Mr$d0eApU$kWc~ZixS+nBZbg(vZ&XGaCjhZU`1!}^pUQfGW&+z0Wks(S;o87@)8#+P1)4e`%# -mJE(Q^$-MGr-+@g$C*->;;4RI=!X>r{71PiFzpVNRNr$#(1Z{G^%%SzBVq&&|u`T=vwbPbp6m?aA*%0 -{%@WTWBOh6il}K)8@KXEU7Y?3y$RFfa@HT+=Z|Kshg|a5=A-NRPfRvx(ximBbLYmRi{$&n=ir7G_JHF -aUy|t?(yyYf>UV0}^PTZT-hEl+%}rtty})ltruQ+Ayw`F0NWoRFCe#LPq01g#rcxYWyh -;sO`m}J^irq3zQCmu^qD3*eX=nQ4GbfXy6)3DzxeTb{kQoUdPvOg?z6aickI)RdPc=t-ZDKFdUe@KL# -ESfbd6uwKh~c-d2+%VZ@dvtZ-{stI&5BT?;C^;_5ypvdkp%wg)dywiSp#pC2Qr{e`4%Wqei7pm@pxQe -V96Rs0RaQ*PqInul8P($D!BcaZct_EMKnw*X!SA*N=~nKN=GgW9qK-rjwGAU2u1V?6O=Ah@FfBu8W$VeGDaGD8;3!Cg_UIg~fnkK21I_43^JT= -^ILb^lpgeR{9U!h^};K63!u?MzCVr9VAkgYtZpSY5ooZL@kIbCBUzSvF9f1{kL4tu40K -dpcN{_oS{p+^7YlTQk~pueVmxvXEnzFRr8_lVe|`l?I1pD*gQ=4*b=e^+d9gSE~2w#Lsji0#;KYPrZD -wRHL#=!d(H01vPWoChuJ1$G;o37s1^Zk+0=T93l$|CA|H67ur$;%&|ipP`{&zkbrNVMBTJ(MJt!w(e* -9LwpXovG#)d5|=Mup63bX3RM}#{$YQ{j~_pP>rs=(=VNo|Ej;tgGp5IkUhr84dtht4#LM(lh}#vz+-j -^{wti?0%UzSe9}O8Y#MlPzRkd|R_{Cm>8=G8QT)e27Yn%01M{SL<|K-tPW8h`WmdU(%^GvN6+eppH_7 -rb&ZL>b>SpSPGf!D_1=$`FMLIW~JkAwQt>eZ|5eS$Z;b{YPv)IhN_*gp8Ybm>y$@09MvBu}t@a4ggy{&mr!Mc3J#Kp=2NuQ4b;Ki|BrpZS%~=j)W4o4cW)puq6c`Y`ycI=$C@KK-=Kn>SNuy{y+bqVjh -hJtQ|qUJEq`>2@%9A5@IS*K>}UORcu&^I2q?7|zBsR;RFK&wd-snTSvKXjt>W2iL{N9(*usp=&lLa>s -%Rr-C`~>K}gLhA-$`g>6EQpw)iAqiFpCnLa2O8}@c`C-O(~S8@e%l}OE%W+`3tTFJ?w9r|D=f;My4@b7<$*Qb2CZ8mBCvGQiAa@#__>ftn+hLK#x-WC) -%rWsG_lVF}gO|ulXe?f|d8vu}NB1s^xdFS9{ZqeS>=r#a?jNwel(8(ct(-hkZ1$5J>Mu!V{qvUp$R4& -HIfa)`Jn@9tQ|vUnJha6t%f~%r?*E*Z@v!W8=S|LEY0uxVVS|a)?EN^{ZDKC?fjxE8!ee~7TmJdH<-f -friEH5}Ss#Byp1`%S%j)~bxX;H<^zdJFc*bw7{mK&=8MIFP(%S9LC&SI}to@7g$ -#C;4YqdPl3F+yHDbFX549`eOPEBtUF>FX`tMuOe6H^k>8>J-m9x^C>P~V}AdJjrzm5`p&c=&x0;VB8J -NqrO3?SJ)b6LDYT$cVQ8`s?uU=%GV~rJMi%S;eb04W6fGrYH6uHY922Nawk}G9+>EFkL0FPuC$y!;_K -|`z5BAz3G1Y!3;f>|D)L@ad={Kcrt(6L?onlN*z9EVB(O7@L@^qdh^d4+eGwDNKQ|TXdB(6f|IW;-lX -EyqnlhuYjl$`(E2>OiQUh(UE6hS7Z=y*(T95Ua31{g`K^1-{}boSy=%OiyxYA+-V*OwZ=^5EhisF;EY -4k%yFGV*Zb@!w?j3nyc@6TS@;c`A$m^e%kvB1KX5QkwHF?|f_UD!4mFDpSkDsEnxwUh%mQ2f^nV*}#I -DcvWn*2@q+w+U^_vatUFUdcfUz+dn-{G(A5A%on8~7vrQT|weM}Jp;5C3!i{{A$7hCjU)1T{K ->|g3%`aOX=0<{BSf$%_sKx7~)5F6+i=o;t|crMUCkQT@YWCbP$rUhmOas!J4O9N{ -Hn*!SdMS=Z+BY~2@*+6N)Q*cK??Sim^@PY;fkp)o&u>~Cq))ee7C@lypj4I41oK`rqFt>1V;nKoQg^D -G%hNp`j(!3eoEbm0`OmD7tv3IH0?$>_r5#6&=ug7+ehRW%#mu6MfTsGk -q0BG5;L@9RGjge*sWS0|XQR000O8B@~!Ww@z`2JU;*cA?W}B8vp_nn1 -jsW*-+>SGH`khqlNs)syCqt6mq?rL2?FkF*JzcAC%+Sv;@gx1XA-l;4Z$`Z_PK<wcvKu`ATx~g}BU^AH4>Gdq#4ay2Sa+lRq4ax_j;IJw?z>CXyT -}`q^q0v05uWediY3Q`sY;OL3Xz%NEzTx22-qcw-#a=!IJ2?o8+3YbiVGo&ui_hHc7EZV#n26cL$4zdw(+E?y4Kn-}3=N>1^hqy<@NB>-+mqc0l37 -~c!hrHW2~V2=&+=!_p3%R@STINfE)#GW62W!WF6t6qO>>g4Y5hp@6qu5V$ST>xyaw4r!kj>&#MkQF=S -3ka2DjN`6FjTt&xXOX;-+~zHfuGGF%b~AzKw=@k$}{eyiJ&Sz119NaPdrQ8$&ChAmCK>wT|+PcB^N~t)o1Z_T`lH -KG#Kw(SVaUJ;zaR%Jd3k(8Vz>4vRMJ(kw~hL)l`}Td!0T41s_OiMd6}^!GuK{=n2q*>M9^n9S$_0O=g -1mXrN)?3K)DO9AJ3D^YB@?>xe-Q8hJ@FSmUhS;CT}U&jSw)@lzoZ1V65`d67=C=;JU5!@(Mad$nt#4A -Zl1pv3s2`TYI{=6fG4@uPS|ap>e`QQi`tR3GV|kI3v|61ABF0jQ-@G8m15k8V5oxr7D#)_FrCZbPVgK -u|y9bUsJEsXh+8h1Me(w{0_q{NQBJ1!(_tuxNpNGxNhF++4=V@E_zgF#uwEuHYUoMU46P6ymrOv7bE1 -XJHtlDicxbZbRN#s#s_$dMbNp0Wf;>(Vh)L(kwxsclhH1+nq-P;QHn^pF>LxNaLa+6@&!wMhAozD{gP -t!P&5dFHU!_^wqgqtbZnthf(MgqeG(uV#W3MV_=Idqlr(TiNSiZ%NQIWDJ&N^S(7&_cyKkPmxy3kt$k -g!Rx=u0ioiu6(x -~Cs5p{x3j(OJCm+BAmMQ+Ea{VD_=c;HeF>wrNhjy=SGF=1oi -Gd@^?(Zp$9pI&B1Z(JY4VcUj$#i*FPx>Rfui1mY_e?Xk9^=6b{NRSxZj7r>OS3}Yz|J`Z-*uwt|&n6O -^5_%_ypn_pi+yN%M2*0!Sx1CH*+ -yzl!}YYMNj00Lij#5HGuAy_VobfGArKYSJ%s4vRlnLPdG;%-ADcnmhA5amoE-dKg$_T+6Ur0ydsmSqr -Zk|pLIdUL+pmtbG{xCT8A0KJMF%u}LG;4^dDARF^r8Ti+Y31VKb*XiPRe1>fE|2;&Y!GlZGs{>FLN*_ ->cupRX%FIZUTwYJdHv^CL;m{dXFH$868N;rnliM(q{V&u*zmd&bYyskYeHQEe-)3x7K~od+*FHV%EYr -^WYXE)kPEDvX9&kPC{Y_XlN(q~sK;$wW^GYT25Sw~L5HIpDu>J~{&R*Kw2OIx?zk(U#UnC?YyQGCM_<}>NO;nGjMr)&r%UH?7W2jIhf_yes?@~SKd -v**Q*-Rv9Qa{5e^xJgd?5H)!`#stO!T2PelIb9)_(3!66NbN|FO6$|<$kCqe`CWfLg?C^oyc&ug#aDIqpXP(Y&k}XGqwbT`V)@w&-jD%@GCwWA9Fgk -;?IVkw${{Smuh3RF6*<2E>_Jjc4J+PscZj%`YCv%f0BmBHaT?;Q4ePdjAyeX=Oc$Z5b8I$9+R_k}CdY -b3q&Nw9yx;C*@@K5qovNERIi=&Ir!i*fgUf`SC*JN}z@qW?mu17bx`&Y}oGjXIcY5{~$vp~gndNKIfr -KQf_5+F*c@Gy=tas1Nz5Zlog&ML?Z#L`#!Q!T!OOL;kL-3f;yF(40Hx*tf7c1XvP9y0S)8r2wOb8dQ^ -&(~}!1l6l&K9Z4|ptFfb9f++*6`7?@56;nXF?!;>IY`V3*)nvd=VjXF3y3qlU$fEF%+HtL#7|X;^1x9 -FF+kC~x#F_ARb!l|?VZ0W-?ObWtmOfEvK(Wxc$Vz_OO%nnrsG*T<6#T;eOr+ms+F)GL;_51Y7*aXp93 -p*3rg@#gYp5vkCC0PI3qf_bA@KCFN$@Fxq^PxsAz7;g7NY<+s{vVE;%5pm*#Oa1H6UU6tWAM$f}A3jp -^iPQ&Pd4Kb&tu^klsb1X29RoUB-bRWm`Xzw$cXouo9y~z&mO5F^T8ZJTmYb67Z+2jj}6t&pImh_es{L -j*SSlejbf$jlEX&Y;5%Ef+V_V=OsdezY*Eq)? -?KIsTvT_Yc2M-o5#7xc7GdBuQYkDJL1JYjf88ibsrdEUFTN=E^LaqCX*R0L0`bg@+Vjg#6jGi_4%$7v -%(_G-g?f+X5+tWX4_V%5hYo_y;I@ZCG87PJ_S0QyvHET#>fu79#)PG_CLRG9-x_g&zDvuDkLB(;C)-n7{}}W_@F~B5!h7KyjcVxf7~FL5=+o0b2%1iqidz -Lcz4z6ohFto3}%$vL`UoHLxDVe6d64{V-gHe)@bjWCqDd)o89QWoBKi&%BC?=1e( -7st&)|e)Z -;2pJ203zOJ`kIkmH3q2%K?Mq0aopDEQRSs(?L3Oe3gL$n^n(>3EBN0wx?SkI}u@YKGc%d$skS;XpRL! -646IRc%qir4$zV-={~1!{7=y0hRB|baIPgsmQL=$sB3LmtAtxL4@jc<|dsJN}ZYI0UY@~iOrU5j5p3CV7wonf -#u=+u1TR(>B%=EJ~XSi!VXRlxTlRX}wlv}iS%$LgIk%C6=mieJrD*$sY7Y~6*##~fNu8~akE87$V*1D -zxWy!Uy78%U>ovg9qz8$S17(+h*qGEIsKUY4gSVo(z>3ZY~DuC9M-EJJsdqyl<1;xJ6)EPzrnN&Z&=B -oMYy@6uwC31H0cP;cO_GzPnCRV}aNnjF6tw{Ozx80~44I9YM!w1pD^kum3jZ;ijNp?69Ki+?TN{#OcP -YQIMquf^bofMWDr0R>|H=$j)@Q8SR=R2r*^of90cPU(j6PN%?j%s|ntX=#d)DTBM1>)B!uH2@kOHYJt -y=9QIPlJ#|S4EqCEpEtXL+w|H)qg6+n;g?rMdhJnTBpZ*PHx~rB(cL~;Rcp70rdf+Jp35-zH*)M^8rn -`|ZG6=oLW{-MSz4xGNDwFDiL7Z}OM@w-o`J?2?4h2qQ&cwnN?-ttMPxSjzTS=3GkEA -g1zAQn@B#^ip=>NxN!eD@&$FJ&DQDL+Q4IDlJ&EPPrn!9!vdXve^pRXJ@&uRfCq!h{=%Qi!BbePwwMz -M^d7lohbo>P0UQzz2IZDL|I-sj?|5wsVkck5P5`6U-}tIrc6AX_B`|5}_CaJqyf5Z9?J07@wil0{?XL -nVd4P(Bf1?%a0FgA=f6!teP$g^=n#9;Hx1E2(qxDsagCwRCYDCB%hHXqv-%if+Ad^3*8w8lcLe>9Wmq -Jm4EIFA#8|kUTj8Pf00n#Ffi5PBoSCc`_!^39!ml^i_az$gtvGKDM`j|1zaFjv@ZAeuoSNuz$LI2wCw -i5KXlATIZ#EkLMY#ayir8qaO47@gHZQXO{z3n`{;nV%hGhuSOJ|mX#9b#$ohC&!I -;odkZTM+Tu@Xzf}JdCbXoA=44vQ^}FEX2`wTGR5Tl4F9- -Z=gx4J(3!_@OF4^sYqJL2XEAmb%RMC9j_%mh)Z=?ziY+5!BAywH8^I_-TenAyGsf=f3k3rvkvGbHv_Y>s;7}IV)f@((r%Pr0Z>B8S}bsaB&d0SY3y$oD -AgnrP)b@2GtJ0D;7O{02r^h3I;awNxL9U^g9vJr5qrc{LuH13Ck8H0T*GVxQKmHmQ|~MTVVQIIG`}aq -0BfT(6>^FI#NBq~iP&FiYqVlu>T?O0_zz$agVbzNDNX1 -4(V!SP@f(4YF6d-y=J5 -1s8+U_PuC`Zlrd}PxgIcY5yZ98$j7K#p=5{fK%Xp6%mqF|+IC4Bgi%urtpzEH0OO!capD3fabC_E)JS --||HeJfBl`3qTfBW&25Ihcq8R$lQ%SqPr?CJnL4{(6lqNZ*@p~n8FUBC+aZLtwb> -{PNaR97zjyq!^*~=fR5_EOg6?Ix8m?CJC`k3*jL$=}MgG#pjQ+uJG9y9Bg6x1Rf?|1oy1pH3 -DFjrwB8UM2afm{iQWLeou)GLHL?%K%qus`Nafn7|lKG0NPVz(8KoT;>R(b9W)*P>DtW1{=3T@Gfe1G5 -{G(7ZdhA=TEY^fqC9Oht;uhxNvfktvvuPFNUNsNVVr4<(PX@G;amx)lI2JC6U$P#m{PPe>ZMc14>rYI -8h5o~s+2{luGS)`mgtO-Ozllubu$1R*#u#*66yY)1`4)vSaU?=BmLrvRSSIjE0JLk{2PtM@4|*;VTCvi>8U?Hg*<)mI#Q*mSYyOrBm&bSon200(FK^h0h --x@cXq1JKKpDK>{Ne-4-rA}mo}5VMv92iv9&yN3JTj;<_$6IHhTr{pX7Qq&Dzn6OaXZf8#a*LVz!K$n -y<|@3RQB}uR>vydrxmIXFtGbc8g7U>-U;@3R&Ht^jUhBk03o{3L{0 -LQb>JjJLiF->kYf+rc<=50-go=oByZoGzBO9V>Pa5f#&4*|GbGb*7`%94;xiy9n?e((K$leux5Z{MRF -7i!Y~jah#kAK;vs!c+R+16}9_xiHs2-*j(`cGqF0P~S1d$?JQ+b_n`zc7kbr$whwXn{ey$EOw|>Do;)yyGjYYpn2tvS -6*YHqEZ^K}Z50>A&39DU~!&5g9>B*xr`ppf*$gYabUf2>ZEi)?6=nSnDzTtxEaeWO%NIj;7Mn -uZa?Y>le_a&?ZpGOYSUG8w>3|2DBNtDTt0j8ERDtt^FM)LB}~?LIKA@>=ki34sdZwm$A0M$TXjWdrQ?bZAOmY -OLTfp$m>10_xy5kBTj*Oa+%}Q3BK`z=&u?k+A1T+SERFfd&CW=uP>C12`k=#)F}HIh7iQ7|*LTFPQVn -EgICNoGs!|o2mdl5s?EN$TF>f1E+~5!_djtl_2T-2(|+~(kKlNM8LOrHP&j0>@LRA#TAl-)A}Zfj)&R -+)X;G~XI&!8YU*h~W?9r=$PLOk9Jo+qBm_VkinMlkaAZgG4I!7!#evY)VlxMh3`?K;W6gP2a-V{?_9- -lG)utqmkPLm2r;0d8$#UL^EIg&TT>~%FVIwR4ie8H7t&xCjzNB_ABnAIvDfpEY>7o#)unAi(b_5`{)6 -f~}%^PtibvCa>{|EhPr#0x|=Nd%=5vI6Hiq01t<|WB9)Ctma@@~mT!+59>$iP1P*agjCX`3)K9c4jW7&>xkbgYDw;qwZ!igwFFzqN`i=8SDd9cNzj~3@Tjv25#lE> -srC=gPW~r3aS|;&h{ixK>fRVJ`dqQ;2TUJj!1?sMaA)ATwaB&TCaZl -lh-8_Ool(IQ-U7(bB(*!CJBXi*f>(X}eg9PYuA=eM4#{O!r -;1!YfT;9UqbR9e_}05O_J=s{|ClFh?t`?_*-61t9!6Xq1d~ly*KaP93Ox4=Ijk31n^|ycRq -YfCn52${SY6N440d4n#GL69qAxIhaGP<}+%-?p<0pQTQhceFYO3 -H%>#}3WaHFkb45!(&S|BVA6>pU)72l!VQLXPYe)*%pt016iD_?YgySX!lijcuAAUad`;#m3CZL*`=fiw>e<%q82nd#QI*R0dp(92f*M@4k)BAhKr8uPL1c -{fNLS`x&P{<00lD=SD*$rjFiG;lEP106kby2$v=Bl#Cq2d8XfQwjWR=|K#njB>TfGfa)Q(mOJ# -AtFTEv_qIfSVZ>!AMV$m2fjQ1U;q-{P9OnPJaARilk|ck@&zwA}xcGFX7hKRw%^_z(${wOjw6poYTt5&;oT?$dFD<8+*otVdUM^?wlp2(mPd2CZMmwfV#qE>4dqSf`YS8sP}U -3DR>D*Uj`Cqc^aGdpeR;8(oSKM(-V^~iM+(yp1i~j=cUkFX^ia6FgNJ>6JYho$ZUyXPAKe{ulb&Xq4o -5t;a4P}xt8Vz650?yN2dsVkxJE9P6lA0mW&JVZO7_}m_8I&wUcFsI?i0H(~(vCf*@`siM*z;i7UU71x -9no(_{Jy!7p~I*RL74dbA|}f!HMxr{^2IN)0^|jmo0!=JYV~G2`saK?v}%X;{%Pl31&*F^cB+=s&M-G ---N0@YC&I2-j@xoF270czkm7-}`%K$>E##`^lTbZxWI2%ybuo(Ky}ud1vdtl8cwoINrLzpUH)K_yX+q -Eq9a6|LK6mbd?nw^aq2Dpbod@kJ0(`JpS^0`ek>o6Y)$U59~zp3nfoLR|q*zeX9FDXHby -GeECc(RO9TnMw+}-9S91dvI^93d*Rs!loATP8zu -pzk3-dzVnK6l$d-jWAkyZ&hJ*Y%-kou@L?q0v{K}v+DTo*sp_&Z72slonD>R^-g{qkukF!j^9B0iWoo -7ysIy}D&hk@A_w?FtPsXvtR&OdLu?vxiD$Z^TZ6vfcV{&lLnsWub6dnS+Q%{s{1S5LtR4Au8f2Rbs=% -mp2pvNpoHH{p|NGz3zSg@ssTrUIH*{Tu%0W0jzYo+^b<1Ztj8i0B -eSr5D;~&nO0ahIRDIDml8XY?Xc9Dr0qq#Ld-vk)kkhhP)EQ2XIWeo;2AUye^n9Z7};-Uhcm*3*EEWVE -6#W7pC%@#U6*cmTM?cyoGSuo#)7S&<@lu~*G;Z;=y(W`i8z`fq(A=o9|%E5t7H&Xs(Q+c5*<0hpAgUo -w9j(!JCcu*8uA{jO|zb%`V_Ys|k&ztj*V&E9G-_<9z8R_PeUKW`IXNa!=c6gz?S20T;-XF2Z8rphH@4 -z&oEJW5)*d4Y~rNz_kHwebD*zQwsM4|4tRtU9_7a?aU5ioRBN<5Mqz2OUYJL}g`*OFSB>mGFQlzzg7l8!n#6hUGRMwZi=nP3w -7nIj2TmKWWuYKZMr@Sc;@oLU}T$<4@1~Mb1+#`67nJ!*LQG!=;(ms@6Xw)i;1j|K>y0F<;MC}=d@us{ -DHJH)WzS28@F&zuMbGHNuRcCCYnF%a6b -PQL~z4bs>V9EqcJ1Uq<*P)H-^_6f8^Zgbi4cA0jUemlSE5Vv!C_)-!8#Nta|^rp7vcU -@%XYy@}f}lItjmj%$Y2A3>t56Zqc(e|5{AWLZwDgXDVN2qM8a4};8W!~@@;mvx9{)o -fe6#BDNJ=#0Ji6k^L$(AU=3KOx|KzG8BH4PyuSeWyxE5TM4_12Kqkb&Bx?(>?rDAL)FQ4Zt`?4ZaHak -Y%<0)PiTkWLLY|I@W*zcMU-$NcOK&}IR&=C;@;iG($oBO|#zpL*$H9z<=yWA6lFvZ-Kxe#=6clpTs+a -i<(^9W*#h|2vQ2r1ED|O~R3Sz?HS%Q`#wCGao@ -aQLC^mhM{%b5YJ?{>zIbv~Ef&rF!5AtLzE{k&#MU4W|2&CnZlbmrga9LfMUUw6Dx-s78Q-BkJ`=5>At -1Ptvoz7zpLqu?G`(UW1)1FEXUm#`lR{j1tp7&`;78IDPw)`qS>WA>HFhkd?QF;#?@)dx^ZYGJu~#mNG -N>!bkdd}*jC7Fg9DkWz-eo13b%Us{Uo85!WGh-)YJEA5y(RTAuDYX{eR9MX;DhHA8JV;=gw@`ZBZM+? -%l+QW}=zL>eY7m^tjZ$s)vv`-6IBmYWu64t9qrI|MTf%C?l~^6zQ38$z2B-1XTUBQm@7o-v1S@qS6X4KYzLGpX -pM;N;wftJ5t`Q+aDv+hxVsFqVVV1Z8bb*qXba|w(=_*cH~8BPCkw)PPLGgVVV2U@*1;()`x+*BPA8Io%21wF)SRPn2kK&(?%aH&$VLUgw&nz_oSruy<;>_ -BTIa-vs#j!Jtx;F;tPlb{Y}>=BC!7xb|B6|qwD?yIv6H+YJghV<&;+PaJ0&m!qh&F$Qnq?Yj(VpCO{a -Y?z4;z84ENylL5kURX=DyT{|IpR$#CZVFB8Vnm6ozbI>aUORd7!7f2)*t2RVSb#ac5f41ze0DYz8JL}>h;>O>X77Ow;nxqhYN6!WuBX1nEM038w}W=Kx1pQ&`E5SWrg<7y_4PLX+CEF`pVIRA>pxRC9DphwB`~}ir<%<{Wd*AsQ9-BOEH0< -nLqZ3GXsb@YuCi${ce63=is~L+h?ZVQK+H$_ELIP%>vVo&t`yzNjt~O%$Wrl$4mjh*p^iDFU%-}`-^q -PF&D8x=GxSb@>4!1Gw0R3f&B={V##jgaGX^E>TRUaH*DGzm3|@|cSC-fT(n^NZbk(k(d%y)bZl9_p!< ->5l)OV^Z9_>YHGr~_am<%vuSNG~xF>;E?!d{K5D=VBRl9YZq0XB-NaFg -!?=!QpOq1Szbow!=d`AV0q5KllR*s2aarC-`EYKN_R=jX{J$@Aqv%&yBS(`bQhSM>VcZ-ftu<;bh@|q -`}@u_L+`l7od;LJk64rg!}*L12Gcw5fuP -G(LAkoe%7U|X7C4e4!gD6bKAMzBZ^jwJng#8AS+b0OsTKkp`?GzHBf_Q_;aM$OR~cWA)>b{r?E$fJL! -h?Gt%yQIIWyaE!}z&PIF#I{u=xe+TN(i#8QWUk3n>w_On1@X*UO(@%kT6rKFm*{DC5605qem>vqyP1)gr^_(c8;_(Pg|YX>Iirfg-Ji*It_N<(!n9pGAA>+B=~8Mw1hdM_B78A -_EvOOtEvnM)nrk-#V=Eri6#`Tc+lN9JHEzBTLu4Is;lXjkv(aF(#t#VLhlbXOOr1Fwv*FG|-*LEUM9S#g_#BavgrIn9+=RwxFb-kq3pJ-9Mvr=Ra%t&M9`2?uWxj4leusbF9vzsPhBkuYy@Z8dSZ9Mww248+@*0tH`4oX1-@lNm}=mvXB&7MK99VqJR&wCnt -{^>M${v4IvyJcPuqzda!$rLZG!Z;LWQu)&)QY0Va%-rE**S_i7&C!uUwU0Jmez{Bkb>!J3+ICIp$A34 -?%3E8z^xrbtb~!yzGBj;{MbaUB{&x5I``zcKumI4TYq~&6b#dU?Ia%f(+CO`Rl -mTOtp@aeFpRC -X>Y5+l82SG>#&+A?27Vt@fo&tLG?8S>`!3@)t$s<~60iweQ(DdD+#`mpovlf;*9e*E=v% -I0B@)Td6p>kc{f}tJ$LYE?izlBdnPae0khf9p2^IV(?&L=mCdI;Dmmeg*rp?4~I4Q@Mu?Pu1+j2N#RW -zkm-gu$mnt6f#E6GN?*X|kssHAVJz<05z5zjoQ26(i+(S4jsg*DOjjv&+J38>EDXZud -|BEh}kVMtRL*d&_dq%`lIp39ZB -$Jqsru78K%wE>K+pQGAOFPVS(tAYQNZ`MFhGG6%ULJe~;WoSh<1YTQ1h4)6J|#puqhiD5Uq35WOHKI(?WRh{lcT(hKTuZJZ_ -GMN%iUXjc#W-i67S9y1@`Ga~GnvC655#x01*%2s%x#&Qp3S5%X%_&mpb-aIUX;o~nLfJIh -hgK(AL06XSLK;JlGKq#S`BXFI$~>g*%!OE*Qlw|{a5O2q&BaB#B!jZ> -rlMjbDl!=uCf6O5oSR|qn8Y!Z3!bmgh29aj{E)nFDJtao$_qsEo`IZBR24=V`BnB;#3GCh)TZyC~#$tUzWBMtkw^h^1b#f} -QoGbw#0uJqEc)dAhP&CF9$%V~B3tp$?{joFBILjgjiu -Q>%Z(o!Zfu^jGM86_Cq}9jPa#tw(0`htwzN7Ym|j9Iu>D6Z@uORF_@Qhgm~e#8fOnaK)1X`TyTl%#cG -MV<`xrb{i_mnm(LqI{8V>{RmR1SwkPkU;a!dKxF*SNRX%_^II_Si!rwoA;l2e{V-f@l5{Gpl&DKt*y(uc(7E$t7DkAVrn+isS-ty+GaAt~yyW@h!4^A3N%0%54bEY=Z#p1^+iS@k|K|gV3t(%1m%+y3!aDF -&>M*`DINu^OO)NBR+OpO5e_U!#T8EL}#pTu#FhsU1-jH2aZJs>zb -VIuQ?L6N~wzyZ+-;){|lb7H6p(~KfSk!wzg5t_ItEcx6SWh2$85gQadz(YXwZ9_-m%NrPI%9=rTIo6V -9_!i2t%SB#HiG?$ig(QtJ9f^P?F~MP`7W0-kU29NVWRHMWa-lV?d#zn-#YM_2pM%WIa@rUf?Fc22#4a -G4Kh>$8!oW=y^$MO2yQONk<7MF{|NHxQTPMeRA|Di+w&X8BC6>aYf{`0Bwfp*loFZDGQ4qZz2LB=Y)) -CEcFD%zaaCVI_00a3|gvs`-@90ZIrlyS!8p)ktmZiY%$Zhm$hi|CXuT;V3u3L%VxaZ`>u^*6yb4~g&9 -TVzb#2x|!pdpI>8iAtn8CiT}x?HTT{V~G)lZms8K!21-Opvo05W~08!>p+16C{gz)_-B2U{$5dZl01WavNotP{ -B+Kqd7tnelwNU|P*=YcQP2bVloIFy51xPh&vk625oCNYjB`_ -|a$_-8S_8sT*qzbm|g`3*n3=-!iDguNd>jqtP9wBmxkYgJE4r9MV=Q=d)U(|)17sB`ba<)1n5jZ4x=H -^p2`rLJ3>d_fIfYsE7@Yj{gxQq4rj?Yu}IIlkIv$W3$#sH?AZaV(MO4{rmL3?rBEwoKaf!|3G*x@b~d -pUYj3C@Zr53cBSv%uh|wo*yaLo{hhDQXmf+;$)3kA*%VSsOc=<(uAgwfohRo8k#c8AQX+RgoRK%i?GH -&jx;p5hSk=+)9=mTj##;P)RlHBOE$&V^Zjj;=1$~;Mbji~H>3$5gZJa$ZFP?h5%QME{I=69Em%bs#po -IqOf!43zjt)<4ew&cDlIrP!#e*}$)_V6w#U(3bq;|X&@W-|#YJl7P|8s%Gd$YJZr)Ifm6K-+KJ9LQ1B -1K-?3J}d*QY_3zpXG|sfeG~An>sTSq11o{#lW3_X;ab1FED7IoQb;jGoqlyy~ilN?o?%)9=yu=p=eVo -t2g%)nqu$ihPE7+`?UQB4A*`Q1*oq?zMPhdMy(NcWHBJobkNbU8mxPbX^J_uaMxLY2e_2a!>(Jy*WOB -g)Dv$CMMd|9UvSY9s$g7C!w8};UL(Q48>FCH$7xL!}IuVA}eo@E|h-Irpya@=b0^J8_a1w(~dDHBA;- -sb3yKY8SW9^=+a@pH-MNTIa;dr&?4H -nXRlE}dvd_3l9$r}Izo=4|d%n37KOzkpQk}hVg71y1u=DlVq@?XWyP!}9)XP}UG{0nAoI_LMk}4T;)7 -?|$Twtg{wvGjHT+piHKn!r4Q*sN;b=!9a$a~8*_LOe9#xL3&_*+d`AXm--lvjOfjA#6@czAD*IUQM%W -6nR;9dj;S-Ak8Jb#KLjt}|G5;LVmH2M>UHhwI5hMF7Pp(Q43hF#_Qv4~b)G%NV3H9JP;zv7!f3f)xZx -$$gbyFGN;RI}lWixmJd@&h!WJTsEahO!$mk%PK!zfn%4C?Scbu^>LV&6J8GCi+s_4SZG2`aC&q7{xKr -L0&fq{k>IV(L8n7;b$?!T`iFCCgG8L%Pa}=VCITwpPFIB(=vel$=tNYxZaR%$s$mcnbSW{Vi|~bAbs_ -nvOjmxW&t!(5>) -5_dU&J6Sv-0HQ3AYEmXY(r>crI=co0HMRBK1VJiOKMbJ1n5yV?=vn0gpXa-JaYl4LFoHr^_qBOw&>e3 -3r4JYJ3rz39#r$r>&2Oik!A&+);+w6USPw8;!`6rx7J)bURez!0qB-47#!8huAFPoeN{h;c2wHeDq -aG-vs4Xfa29S4!DHDXxC$oL!M>R(4C1#-dxC9Jg!!*|TTzPG2R@Rl;hhzPr7Rly9p^RmA!xvvaLRdf7 -xabo|Jyy?u8mSm}DnBo#U>sT%a2G|Zv0$wqRy#U0rzO9^nV8M^8vlym?sF2xn8ORgxOSA6VvQI;aBy{ -MLPpwJ|pw+opFD6cX3$6UB(dM_=Y8*(nec;PI#Lv@hXSs9ULqAYYzd^2CGL%<^iMo&(vwD4gdRWcDE) -tk*c#Vc;m&X(5*sy>IJd(sp^0%SQE(lS&b?XZv#rGO2h{Hk+PQGylHdAf7VsOI4rB039Fkp|eb(1D($ -=UUedQm6tQ>2ykVjMtN`s!?_l84*Z~$m?SEc$eKnKrH7(2mAbRdUx=`TRBE+tdBCqE_bfS=i5<|51GS -a^%Nbzso&VPiVIDvb5$&w8;yjv0gum!T^A)L-I}GP%>6r=O}$nMCjII7GCn4`L4~17+D_759vttl@JB -PAP9@K()xN?N_Xha_@76q{Zke0X+16!O0(4%wHt}2>R4OUfE&rMCQq}Kb1Br1cU -!r(ohoZR7Ox#-<6lrk0e;jJZpE`wvylVD-gRmBx8w@WT$DganjtZ+nYVD>l3@(yDRJJQY0j^p-7gbWGi*^+jn -LFkN`=^b|1Gr>!vn|$6zoR%nJkVv)+>)^OGQq7bCVR=Djblq_f}IXK#~qlZA_`g4u5!HtY|EJ^1yUU0 -iW?wkfWXn4Kr{;@ZnN`zl$*fmeh{>_X3T&e=Eb-kzMEpSZnHi-(P(9{u~RTU1x7^u -k&u1MtsTRf_k%L&OA1c_)R#AI9u~9hf+X}<^B~kV`-MG!+;7_X_{mOn{!5(@A_~t-#VNGgmVzU1a5LT4MtS_{wTlPit%FmXd1 -@0M450C?HEYJ=0wby+)0i5f;BL{FVw~TpbAZLRTSyy>C+(bb2lZu<0jeSX~yR~>HUT|@F1z@ca>Y`v4{^Cf7%6 -eP)}gb?P_Gy^h_IB3AxES0)F -C}Kzzq3D+!mNTG^Q=FMsBpJf{xtxRb(i*YITh0QHt-H+cvUJ4OuxtEEi&?K)+q^Q`ygY7g1QNqXyc!_ -yYHmV5-rn43b)RPYY_`G0^;S{QWttgt{EEFgb}Mk79){zi_U4bu!GBRpSSW=o7lk;#@5-Y=0TIu)-jnBrh{DCrphXtq}&*J%KdP@0SZVcOe -t2?^eW@9 -@4rBbspwwP4UN%!n{C3cA_Jnfr$(T5Fi{ExjBjb(k>2W|AD_;u+XQ_6l^8OXo)x^DXb)lq8$*`3cEZG -@@o(=w&gytoMt20FiDBH0My1^+NFK4rFlEqFJXX7i=coY1G)u-thE(Hd#=Pj)b+ -WS|^pRT+u0f*;u-X+hvowEN35b>6(!-(Pmsy8e>0bt(3Lo!NLA_-dQt`T|{6^L^oMuFTTBH8F)(!cvx -OJ991;avB=s_>oP}`WusUk*;tu}+ohU?qNK;ul?oZ&Ku6)o0tozeyh+4csHK{&9-Uhm_Z-v3?( -6GTUQb6x|G&&VGpI;1?E;^bg8Y$cVOw*L}J8dPwliWW_zkXzQ>^=*Muvi@sU)JX0&338Dos}zx0y5dn -{6R(z)-2gJwUOS}N)+m@nOAt10o~l%w -<~RePQ$U?%_wDlv^ZRfouyT?JMk{!#IX!lTjWLP#P9RK?FnFD8<8*H!7DKN<{0d6f8IR#!EL6NM~+2i -=I`zDq)1V|OvOq^gOrsDj^sXqWKD=fR|0Y=Plc$O8X%(4r3iRKW2?gH99O23$~~6}G5?-z8*x)&L7iH -JoQfz;=YCp{jX_$ZlAS97laMZmWBYU_*ivx&nfd{{Rfdv(Q(1CP%aW6~hxEKUrj63NBEWdFvz$YH+00 -4t6ET?IjDq^Y)8q(`B<&0VDVzmSIEDt`Lrt95!#j$*?Cl5a5l~{G^aV8igC?LAZeVw3sC{ZJ^XZt{lA -9%%gUPM)m7=>Cx;$Bvy`tS*?~vYfiJ7U_EnT_#$k!j9pF6~P3)p&Fb`t@CQE4dd-H;4_0R ->eDAoe^)R(gf*_?^kQJb>g@oxOe~8XCk>5I$O6ry5p4Abinr*D+90syMj@dL(X%T^;v$QJG40*%?TdMb}G^M(lK$ol|6)(xjF3DUnjJt$U7 -om3rBY@tT#^w3qRD^+aEmj748%LA&4~82FZr2;oQ5fW_LK4y~{5na3YHkB}sI5Q7yg+MVkQvrw4=UaM -p5E5&>u=t`s5|tA=KHKx@7Lblqw@XYyZ`)d1S|||Pi|(jKk$>$%^X)$vT5+8rW4 -W)uxE}nn!GjfsZS1jUq+W*=3z3u^19M-KPvm9XeJI`3dhL@4<_@+{#LQbYEx@4t -PFYOZjrgX8H7d28h?<{TpeH97nb_kU2uz#q3?K4@#V&;FiV11-QS1k;BBdnq58>>k7h0Ru9{i1Y#YUF -Ztxfp7a0I8pAA`^@b-Wh5d9=VVS7A_lFsfmT&mV7JXxt}m`rzVdxQrR=)RaKay9+e*q!1-*WSF(p>C; -l-W3KY4%h&Gh2U*XQH_7WSAVp*6!_KK{z+H|%I@;{3W}ATg{LZ|p*PqckafY>IT%f*IsCmWD48aw=BT -zUi`!9D!n9MP}cKd2ZzErqnq%$Sj)%I%N=1O2->8pm9_R>28|nS8hGVZqO>-7^3iI9Fs)~BySOE>J&@ -<-Fl2w6M=uwnHC+~Sdyfbr)%lQRa%Rvuxf{0s%Bx-ywt&(;9luf3!~~-ui`&hjq@s1=Vh}H1WUHD>W5 -0IMXUh-qIr&9@FVQGDQP1!K6yu6M_A)fW~zJgv!=?*u?{R1->-m?=2jX?22^@lIHhSrfSCf`{T2`m%+ -6Zt2B(y9%G|9reK*&^1}KgZVW}&`Jdg*#z6LVXI+p^t3b7)D*aCtHUUYX5M}%k8*cv77A`l+1RFG=)2 -f$@l;qxnLcL0)V;DC%VI_!+N<_+=K!W)wbZs@7fez!{jsL!K<(bPtj>EF&uNl9zA -$PcI^0vuS(4JF&*@L2vSz<$z0wzuJBY%ya6n;{yBCh_GRE8sLblSmxDUce -deBGEUFKGJj{LvTd|21!0AnPB2{4p^a*w&b!pq~6X(+TOrX_U>z-2aHZw2*0aIlb*pNHLFh-hv*)i7ES6(Po_vsIji?L~9%)=RHE=W<3cy$D` -PxER>V^OQ%J!vq!WKrli|)wl3O4+2`Jj+q7Zt~o*r_UI4=UKWIMQ`W|_XT0#_DqHw`uVuzc~6n4zP4(7ZsXIkU#lRd{CUtUgj@OlYt6<>RlQsG~DSsS!Zqk}1v+hz*~5VSP%e9pos;t -O;Yw?O+n*~#54U?{wN*cd-X)3ODpeETs?4}@5G_(#CUs)A7^cYqrm$iu!{`%6%8DzxAEcvDrD>?6UX?^i)#8K;^eZkH -Y662jTf(}~*v(fn8{2nfv2jo%iduStpoae}6`VR%hZu;0IxQ0lrYjR7Fk`FWnDCdZ3Wm3qWM2^#&I>W -s{kxJiF~(Y3X>{!CyPtF0Z&4N%|(T@kg%+Auqs+qvDtB7kFPdcjxj8&D`inrDe>xLTN*=PzZ^ -CWm7qeMu=NddN$&_IQ>|xhO5-JFs@l$ISNN&yv)!-|1C9?zlL@AQYz1ymLUtM*PFj}Yj-fQ$r9@9W7^ -w~zDxy;DQ1L!FzaWjgJogqNxFrFXwawksBJ;P<(A-#}*fFvZ>IheRl4jn*g|LN?WIYQ(P%vKHn4lrCD -F!09!Gq<({s*$Xj!BrK>;rM6HqfrjvzjwuiqNKX(}n1HDLAWkT55X&69DmwE3pXIymGx|d{0pC-JETb -m5N-NO~e^dh>^+akkAfY?zTkL5ts~PvMBt3g2}!Fuv|57l5!8IUDu#6<>^AYztXHUr~c1o!c>>MZBky1ck5N6(qR%H(+!FbVn;P=B -^Ld*`yR37E%%)iQ-H1gN+|@|WS=6_N97^A=u){r-zCI~soR9N}XcgILiX8y*gZ%zk$0zBqg=kIGtt(x -}c*;)Br;FO+9QIu2*%t%?MCg0_%Mq}Ha#4v(H6G5d>w+dnG7U*iI;aaza#L9snReo|;{a7fI7lFQ5m>#!ro=+Xfg7Kv -#kRC8J?SNv>4lld2UEs@)U=e&L5m2aqbU$)EWHmLM5DZ8LFvX>xTxfwZCk=5$3sA}kfDH#WjZ9JccZ> -xtIHqTs`V1*ioOIX^AO1B+YX`!0!{VW(MmeO5*(DcjglTX2Xy3h$B1~OAPibcvM8UK2K;`wYprxCi;I -=zt~9gliu&csp@vJ4!;$mx)`{3bn8ATs3bQV*VKW5*?CXBT0bu`<7TSXrpX~umeCXqY*lE(e!Gb2cDTdN9XccKCdNkp*~n;T_&&gT6Zu4W7Rck%s}+KY!6O -upAEaJ;mee?6o$y+Z_EZ@L@b+Lm1R^54-d*8+2im7jFNPOeU!f;(nUE7E^RC-Pdwjtzg%Egt;EbvmLv??bnYk184iZnfG+|)EB!VPRheUc7nH+_JA1P9xfz3_4 -izMUVfwjB-~tO*z8lXira$f@aP${pS#aK--Rt=D%MCc-s0upRc#|7CtJi?r>CbDE4+ocnuJ>!UfO8jz -P72uE&RT8Gh_gr!LYQ(VLp)rhw3Sn32Q`mkuXy&;8C~?+vm^|3DC~Y{o^sA^*~FatPtBjz$BzSy4?hZ -lTh~o<{KuAkdzr$_1)uM_GtIqQh#ky{X52d*g(KQVl1bWa(4_u!dgsCD2j4OA(Vo)QK-|cXisz5GY7z -nN>*l(PfV=PBOb`{d|#yUsmv`bm7N%fh9hs_W`n-mw!q4=4EqfFTEiFa;bCv^d^j9d4Y5qL#PWLMOts -$HxXF;&ZSS_%U`6cJD(z^_n4SPqg@QihzO2yq8r9G_XhR2@o2bJ+#&k`#K`1jD>T-j98a(TRlsnof<-`uZ1x#-NjeBfxNmLhYA!cj-6nP!OMgrdjxYRMo?za$qh -)~K5L@}qKKhRtB{3=7S*#Ia75Y{2T7Icx+^V=!%X*ghZ-~D{I+y@E(%v%Zfwr2<=9|Y_0Rc&MW(bJ0$ -DClywm)`8Di<4nyZmXr2eNf`QW+OE?*-$h)&3R={-Pcmj@;0X$jQ4#yhY}yxDLoJ{m3*F)*JB4E`XjS -d!L_doInb|DrW~HVd4JIee&T(S$-ym5@fPGDh(QZYO!uAB(NYyDu2JTRVT2tst9+SJWy#er%6j-lQm? -0qz^d0<;8utCFV#D|kRK)9-17Ao6;6m~_Qv%VEXOYaQJRq5nxb0I^rwi8P7)cfE4`vxo;(Iu>ZG8nl4 -+OKE=proSnG{&FqSZ%IsUYm}a&TuIcXE!?0+!b|Lttb|IMPc~f6^EN#&8MqB&Vd$SV5)_eW -4jC&upajQY)`{mdgD%=63)|fuEmz3ks<1vMQM-m#+S2JDot=_fXyUdoRkXr -10FEAgk@TjY`*0w|D%kv>1e*uFegV)Kc>==TTiZRVM}NkhQMdF$Osm@-y#(<(l)jFxh(B=X1)0D$%LC -D}}23lpe-A+RpFrXP^ByeWSyw?v>-$C&V!(iN9O~)9Le*hxApC`6^i85kd{nY(oKs9_o3zd?HUqDVIO -Tj(NCTMf4?*+9kurmp;mg3M!2&^Fe6e^7@}R3rZ`MO|x#M0qN=%n(i0bY7P;^!K`yT( -5$?fsU6Qh9%6bU2x)XvS4ShePNt-wFwUCQzQpkGrTN54!gzZ%Rf&HBw}BwhE&F@u_%B4stl@B1os(Qu -hq&o>+#0w_E1mbhS}RbyWKV=C4ruwXO17uHEP#br{gsARZm#yc^iwPkq+rR{tL6Ieo43&aYy^w7T+s6 -@J7+9OUrqxOQ<^`*IZC6f}xuZ(3SiNLhIK= ->gk;2Y$SFMoy}hc|4N5X@$*70^Uy!O^L;Kqg{Aq(ctC;2fgXPOg3Uu71$k>{eS0+MX9cU}azh`bVD{t -OksmoI5tbaafe7`#UJA2I#yqxrZ3~j5AYFS)BKVcVa=rTe^5&U1QY-O00;mj6qrseh+@Ljt -^fc4Tmb+Z0001RX>c!Jc4cm4Z*nhWX>)XJX<{#TGcqn^cxCLpeSA|@wlIA1)t;8L36Mg80u_n_78MO3 -H55{5N>z%1KthEUe1uLW;tZB^07nX~r(t?}jN*v*j&q%RWzhTL=*&1XD)=#&G}yF)S`e`gsMYD!T~E~ -_wGFiNJZtT9k`~nG-sg|^_x|(pquF0;f3LmvT5GSpPuZP&83V&GM)*?{hB?fr|D4Q!|1S=InNwfQWL` -{r`>MmbWp7`#%Kx*ixm&7#@zd(N?#;dXuAl$>7hLZD+LT+(|2+3+KhG_`!;^dOFE(zvE+Zp7Pb=fT@s ->^Vw%s*9@%Nt#F3g_`?sf88^KH~s=HE=+WAm4QyD;dr)52cy@G(xo%Zs}T5iHE!Z{@MDF)Hf>bUuV)w&qoe5wmw7=)2eJPZ9V9#JC?LWn-K0bR -Z9dO13u%!$=4tm2H1H`MV@_k3y(btZ=l?JVZC_t8SJ2K?x*vzXj@z_@1NR??wFY5djhDmZGR%hSsyE) -n-Ni7o^R>RuhQA}1!$G~y>r^nNla91bE%VFo!G*7@-dcS(_-S9E&&*12FaAJz)tff|0stS*RL6jpw@h -~>+$}%e!~g%^|INSEQn%MX`%5RIWRK5o8$0i<}9tYSzypeAq={f9>}On~uQVY ->axFe}dn7^O{414t`C+QXFpisjy{M?Ys>Q;DjC^$HvD1HTqj~@}xO?DMCj -2i1En-oP6j%EjRN*067DjT%FO?0pxTCrfMjP==-P|2X%a>NwQEMnX%$aFvy;iwrJIO!FPlF}S3ub1MX -Qk~>t^CO|+IfL@MQfxhKn$SJl=idlz54i^Iir+s8$`ES?#hM=Chg$5dj+kX%#J?FJR*)N@F#)|#;Rnf -s*+3@2mBus76QYZl28XbrdE)AB(G_>ZY7Amc+~Wn7{y9G#7_H|>xglarJj -JPJXCY){4-Jwn;$c{;!j9DP-Yj<5nOdvqnG>=t}jvBe~qWLd9k8iVx$%ILPc*u8> -Jq5*wJr!JnV0PK8bv{o7{=fuI_wSZ@>gKmILq;Y8$X>@(Ro{v_?2OJD=~&=R5Mx->E>ckiTEGITv49wm!j;JP`TWP}T=u$QKHcQ}c(v9KnK -HvMY)wMH(gD^KHjWkIT0Y9!s|*PpNfCD6vph|qAsbl05l*gmo6Qrn%)_&>psgQR?ktfKChj@abf|v?2 -6AP7U$(CSqrd|_E2%2)g9OZ&JK4V&7)+^QAfrs?98)n;Z0Detha~#opfgI9#oXNhw>V5_0Pf4r8zk@r -x|kkjWWVH04`8m>4n6(J~w%+j1Hs7<;|4lEd;PYpK{s_i5p2TAX3bjmq)W1AsdwWoto$;AE=2=n)t;4 -P3%<@H7dn-vLcw^g!gedFKSwPWh!G9W#GXGziz%WFfoQ8reU8I~tblQs3YVR5GOry4AP-Ek@&V2-whfj)9#nz(_aH-tRKW_(tTfQ|Hcn{;8!-FZuuL*L9Z63x45Y{7?~ -#%AymV1fLJwqH4y6J)#0th@*)FYYE-|+r|J-hD`ksrp?94(;4>=G#6T!zNn({@Ju$Ynhxe1m-DVT7{q -9s6s^i>5Z{1;k6r`u^APKW@OXsGVM)iB61Xz1sSTaW0K1(&H?IPxwci -^dh!e-w;m+PSw@)4Dq+Di&KSs*O@V1b*jT>8O^z566BP?~Kp#6`naFveEqZx0R`+4%4^$_FJ^G&+KcI2YLTO*`WsmhIGApltp>A|dqTn9OISq;li%<41z3OAC -0tW;DRHug?Pnb4G0#q#=hnD7P4zrxDlZScgl<*A@6bu&Olw90H7L$Z;lH3WIo*E{3V}Iy6CJHPpkJ@f -*KZOT(hdDMevT+lXqKz|?TIY!^kWtk-v0yep7y5t`C5rdsLlHr2iq3bt)?Nm`w=vQMA(7zx -NdoRRFGzYAsP^lg^Btxvq@gCooA2|`1dL&xG_Y%b5*+I-mekf6Dkto81+>nqB3Bfav&~zehXfcE^pD) -DSza^$({+wW -3Z4jgNQUIFffeV3an98frHN_T(Y>pP{`He_G4qnzfPh1q`V*YKC9P5_Kd@@RdjX6T*x3PB#mxfoumo! -N0AMRXTc;#C57&xJPV|8EEx}pfpL}M9P-*E0B@G_{Iv}3q3?uX-m3)Cv3~Z>h7}y) -Dq}67bt#Z7@jS<4IR@tgxE8kO9VC8_?Xkh-=Paw0qLER#={Le$st#Y_XPm!*-X`tB77O1rxBh{TCz>; -mb*mCgfo2qufOKzTy9FUg`OatbGa1-#igZhur-*7JeKAVf9l3h96Yv_dqsEJj|47PH5<%G~|bnxct?n -IY_!n5;>7>1kRN0-#jf(mh6(Dqs|9w0 -dgN0Mn8DlVvi_b0SEw;Fmf%x3lk-kNInun1xFMgG+Qo{t;2F-Z%xi;ah=_|dr^Jf0Vokg7jS>8gf$H1 -IM^`aSK`QqZ1QsbbVK(v>M2V@&dun+Yl_;X1;w*0}aJ6%pSWZQo=xV2>N)>JLb1_%v4j6;Fn$CJ~wvG -mblo)LwT%AVw^O&onfdX_qqycmc19VUT6`f%wp<7mlpB1CMM)?$m<3U)2h%Dsq$o)b($3pC8jE#~Qpo -KcEFsLX3kUvw|!CaAyr2@heiCE+&0}K(>Fa{xl{89_jJY;AVl_tninB{W6g3J8R(7@v=`TU8_oG^ -O%V+K3RU1!OixPKV&1$s=O)40uU+}Qxb@`0_W6=yfmylEdQ%n2#xYpAD>;|8sx^3pFtKxMzR4*DjO78 -$`mKoqE|ZCTw=z`?pEikgq2D+iI@-%=XO>I=UNW+z|Px)%o#+F!srwl9R -~hJDYJ6LRlx5pu5$EnQF#HL%CQDY;bHBFF~$xpd5F!kjIZL-4;jKT=yW$W(HvQ -dwNMYs;neYg-dUA{VBX@$&b>u7^EEnNcOF6E9`U+qwHqnRpLQ~zdB&9EHLFkB$weK|2~=y4Da%pO47mC~v_)_$gOU7oqW2^FB+xW;s$Nq6Hhu38{E?nX71|56~v>M=fPAo5Sv@CiCr!zc2j^} -suFnTZ@u$iaWRHj1$SC8gVsy`c;Z?J`^t&MEeHg(hR&r;JWl$8|`z4FdG^8)a@nq{|9kGkEoK%lgnQ% -Gzk?mZA0ddx`!I!f#?NL3_stgsoff(MQlEz?jJ>WF^+>ijizC@PTK1j`Ohdx7rfBDXJX0X6q=W@RC+L -vR4ilTb-&h)$arEEHRSP28`A$sTo*0ZW8RB!UaTt3y1)b+$s^U1Gv3x{=e+uuFqg(Jf48!eFG^U2!|z -5rqlwPn^+ci90R;tX2W5>2IscOhP!mvpTJ*G#%>)=D<%2Zx@lb%fRK)3yOsnx>?haspA+Kx>YGBvX>1 -`1<=e-SLM-^GBg*B(nB%a7<T}!ODZa{S_l84bKZkDmQj*&t6Ib_2%T -3()9q^$|kt}Tw&l#vua*4qrF-W{6)>67?+qWMkoC`!B>?c4QI)ZrT3z7_^O?j -;+b>~c4`+mTTJJs`vtZllf>&u^dQ8kFv5wlv&OuYf$GT;#g*1hAkgZC7W#opKVh4Y?)@;m!9OYli30 -aX1tT)p)El{4&%vBRe_7;fw69l9>!IT!L6_rxnKuAngNX6A!Cs|8CimWF63g}sG8lPaubHDQ2l{_W#; -J-4d+)#E-R|iNRc(!FVrev1;G27sUoC|1st9%u@sZDhXG%sfL#wWxKWPw;huAy<f1JWb|5fO+O4bc4iRYCzHmJME0aXP?13c-JBVWdMjG`LTGJWu!m8@p1Y-yyT%-UQCz!l=!FpqjL0oSP=saF>zq$m0 -WILjkhX!!ge6SI*kcnsWmm0fffKN)5?qH?%{13&7-o7RS^yPHqqDitn{?rWMsz09^`8=hs_(o$b@JS~ -eZCkBUPwma=yl%-Yj?>lOK_0|*ev%aJLYBP#qRBGu>nmzwcdNp -@lmN)xs()E4ahCKxVx!C^dA1DxA#mF_V2MOcpQkKiW28KkAzv|_B)$YGJNCBo8{T)hU@U?nm_u;O}f# -ZAdXyn#|cpoN*uB1bcZ`JW6rG4f1Y04b@O;DUi`klz1*u$q;r39GlKUM8$cCFX+yZ>1%wg=4ut6*|5F -o?j=HnE6aEc^}rM&Se%hS($P#ses->w(|P${jAV22r%-vgF0@^L6*yW7Q4x(#!9kr2-IcjB@H)Gy5@G -EN)YvCamDg@BvhmTX9eB0_CR;9&$yzy@0*j|-CVK)%XHC0Gx#9FI<5wRFmpJYF|>bC$Y3V*FKDOAKofYmx&!RvYO5gj`V{{v$t -2r#-mQav9$Fgm)DfWE=T9Jvq&ff_GF*F77Ka3)})P=`Fx%iIYd1sB%~`4-eMfSWM*$y42oPex{;IBK3F?jmVfBDKNy3aLaLkxdbILv{Yx$QlBYrzYILA_x_EbAnv -CQ`Iz13AQlJs~ce7GWi~(1@;ah(&|s%efTO*}x=H*@J4MEDq02kD^B9&SF>(He3&nFVUb_vH+n7ECw| -qjr;^70y;AE6|%U^9I*N}3M0XE_PLJgxD?oATVz8Zy?lk+>&L#3PFYbzS4RQg$)~u3MsS{d#Iyh$$;BL)O*KO2B|rx@XBLj^>(Fsrdk=1dML-HI`6*;OVRBIr@} -<(JRiwH1hss38uirHI=|SzJle-ru`T#n)M)Tp~QG$ufB-c`DI|J5+HH`!Y4IF;wH%$#En?GD10$B@f -Sz4dMCdna=|1-tSd+z(5AZOW~LT;Ag2q>xv^+Uy45VhI -cU#;JD6HXE6lFjU{-c3N`3@7N(;I%on}|_?i-P}jKv}^*lNaVd1xaIKLQS7)c(1XKtw+2LCzDHE^&3Q -xH>Mb?vV|6h#@S>Q6&-=>FZWqPa@2)l#3MLuNKC#66Zr9z%u0Zh_=l>idv=AfvdIrQ8yMWOLUFB%QlTAVy -1YzYaN~xFv|XtC%Z}Xf7PHc16J*^-0(3$iYROmf#<0ypw9MVy+$p>w1DF>Mg;&baxpP{y7AEhj2_kDh -B=Us-+6dIKy+va&zUM3uF~{r$90}S1F7GG%8CVDVE>_0O*f0VOSxqQU8#aqO`_4>NX83Zy?#|#r*OOG -cK?JR4vcwx?_k3vgI%pBHKBmy;ataYEQE7mf%?`bM-KmdQ=k!a@VW#Qm}}N2Mk{SSyXK=xJ}#t -EkQiH7MfFrfnWv;c|MuNlt}kAk}X?iOK(-Or9h -(XJWFB8G$c$1uGjv?lL5i#E6KIwbOw~+ebiVhiHD9Gm4qAmv+)Y4~h*!iMR$t -59f-99E%0!ykdg{sXg_4^XJl({c>$xZaso`xmk3w=&tCd_Uxd6-6*$d95Dy;HtBuz(z+oLUB@R>r?Lq -TF)-Qx>f#$f_>B-%!Dj#_?mJ0sfKCxIRa? -!5zeL5YM^kL2v$jX6I7+Y=WtGm_+1({Rd`Gl40b?J44uW_$J_Ducc<|8r8fNi`*A!oedzHxbwb_L`CSWjf=8+IOqe=x -!89|`tc!d=%GDl>{9JZX*5`f$e+g9OuV9TY>I=mAU#VY{R6r=3|T^KfXDtc~hnnV~}IxKbrSPao`IH~u3rR -n3r`8GEb4_%?2A+}I-F!nM`sLZx2`7e;T-3}mc<2{XREPmeQaDn^5=%yLHy2;C7O%vMB6W*TL>QVz!r -unR+6lnk(1)Sw!ror!qKXA0HJtq@uAAZ6Zr$m`&Wb6~gfyKizb8lOxvxb>l1Va>0Vmh -G{HiuYJWR}Tsu@n9=wlRh9=6;!GVhIcr3FO^(zsU2$N->I!p7%oprxx5L_e5y9VOPg>rc^t#8UbS~oQ -~=V0U>MfAg1fig+riHg3ZJ?fd5T;=y5yfIZyrT`pha2@jMPdc3*&{OETApKkbOGJ6%?#7b7TDKpu8uw -kbhC5rLs8E!Yf*3xuR8oZ+IXhm9o&mYak~Y5Ge&7v!(tH@My&zBSnzZH33l(&30DhSz)Se(z3kl)hpd -AR`|CRByk{NUsasPZWL!|STRRh!vged`vhr=Sr{7P98ktw;o=ZybbPz*y3pKhp>=<=N~55~!UINzKkn -CIFP5<6GhnY?!8yi2F9hTlHa>y^4{CK`Fr!ecvA@U&1dBP0aGV|LW1&O#7IGEzZnfmkR<@XxEmqW7FV -ghI6b8B>>JQ_oM07P2!%DN1`*M`~vX%R0k}M6d$;hns`aIH?Xxm{wY45Wu%89j9Nd8hfCq;l*E-pq+2 -2xugT~R*ALmICyz^wF-yBRHxjy#Mf!E4bBZF3&Gas}E~k(abX$tIQoa^bW0z2OE*AT0dOXhflHa>)1{ -13qy9-3*jDLM%J63vlKVVJL6sd-kw%ePvY0qkw3La86P@(&VQB$a@6ieA1$z!i^Pn8FgHSPkGNr<^z2 -at_C9A%+?L%nt-Q0OCi^z^v|UsByVsl?+vGaUO9YfqRf30ffKACNVYHFj(TxGQS8c6G?h40Fd5I7_-y -jBnVv{7qY@(Lz$du#0b3lJOB-A;g)>Sq`QAV_X}yW+DjWm6g=~bv630ujJCIJ+FzOCnFon;jW8q7T13 -%tJHhqS|-1W&!VnwGsN?atT`p9jVbfxa)F@TIhsk4+MtByyjA+=}1BG_HsWI85Nfpj$a{8N-W=O>wS; -C0%t(easxH(^z?A -l?%TO6DH_n1=SR3{@W;X*`1vKIUyr6W00>*04b`q_`+fwQxF3Jy)ynpD(t8AtnaV?3SSdwbAw>mZ;cf -)ZmbpElfRUdh-LXL|J0&jN0P*}H>5h$JSzB!B#)ptzK+J3@<1h>-2 -=G$I>)qgF_G -Ry~?~i6Xts%VMaSinb(pmN$N=gyokZ(%IJPv|0oQPb1U=Ol8{Q9kbx=6{yZ%`6Q=Dj3jG-RU)i>qe1qD)k<&-^L35%|EwlrQ&qK3RAY)|GfJzO}rV-6Il -zG@gDNc@J);2m^%l$T38bIzh*y#a8d9aVW*{eb-^Nx=gAGEFvfVdMMqE@e2M{#VH8x=7{PV{P7_AxFan0_or~IRNW1)aW(r+sQ3=sDIDpFlXni39GF*mGc -$|7rRg||MR~9W|Kdy$D2{S&l2&fIkjsxlv!UcIiTRE2c2({tDJZ|MQ3Xv}$mR@X!e$T_~(!3|BWtR%0 -HCDwot+DFT)EZ0cAkPDm!&Kfa6(T7U{-Z@Epo^v@qe?W1065{gg!7FhY?W9x -52e|i#E7xmBlpe2Yi{?uhlBs57XqYyroR)eV=PeIXYnq|_fzVQ;5I0uy9`Y)zW~m**<&O5PrH2_1L%^ -e#qK2p=T5WOTErI!SG@Igap(R#`T|{GZwOH=@h@y9g<{s8ISXw#HN`-XzK0teGqgVOh0BwwmMFVg3R3 -9WYV<4A2bUl`XL~uAi1%?G_3S_SVHtTA$Z`zA~xr)Aac|RG~m4 -iWV9obqlB({~P;BO_5)kZQ0i(HB}^Jv7|hPj7jN2LyP55k8$NUlRHxq}gl9TVR}(tymlda$7Z~!_p2M|?vgCf`?%hH+J1juPL4Zt3iy~#O(5I^Fuc53u3QDV>UDw -j%2sOn`Q_$MyX33csAyfO?gbrOoFF!)&RE09C-nXBu!$XcR?fD2+&K~}O4A^!|U>)W+JN^OWGTkY}$5 -nq#ht&9H=RcgodJ`mnml+oEtj|l(L_><(&yMn{5fY~5N#mQywMH|*hiksOse?sdZHhV-jAf)iWsk_>cE(BMVg8IYXf>J`A_wCpK&rC -FWH#L$C(qVho5|-z&7QX1_KMNTDa{RFDZdQ$mrUKgsLU~oq*xQ1%D?LkpH2_P4*UQIy(OE{<9Ey1e@j -c5kunCk$*;c3A+q&-z1K%`A7ZMTpi=z3mJT5vuc7OS9?>4{5U_3IGHhox9!k3iEi}3cKJ~si`-Wmo}%HslgA?mP#}^b$#oZO1&XQ~XE|Kvtrk-K^{~WK5w-le% -YNCgQnal6r$B0!{vC%7vHJE%1LS-!lfjIrwpmg3YDeAbQl4m%e7C#3~Bz>CEr(j9h`7rr?qbDV=E$ekQIXI -t>vPXN_X;urFkt|k|IQnjvC*b$usZMH`$KysBkD0Uj)l18e1C!%)ph5XE?XMDP>@_iecLvpl64BYOs( -Q@dmN-)YpAEU1f7mpb#G(vYXEHyVnl9zn41&&-8T?ndAY^%vcb`^eO!LT=??A7!1O@wN-{Z{;#A`joe -PBxHj6+)y`yx~XY!_af94dmtWSfsODblYNlML;i!}aJahbKtQYKp)A2MOF^60*Zp3B0hT#SN(8Xii)0h3c3o}?b^>l^Y)br@s8PAKL-kSMjzqJHUd{0-G- -VzQwvbZ4$GFkyRo?Xt|t*3gPvIYYQOVY?ZFxuF#u4OZFE47lugx4Jo@x$Jv~;=bAc6mD-n>4q(A(|1U -k_ET%&rCYek!tTusH(uKAr(9|-Id+nAsbq0C%G4R;Pdy3#aJygRJ00_=$?<&H5+-^_u!=(}tLP=qV*d -RIBrf$!6dJO5FK6`W+4jQ{-w73P-z0^0q1)<#nL(q$vrvpU*$C@F7#iZI#7yW#R#VA33k5Bx801`<^` -N{^7`nud841!3Ao3YuXpkR+dN8MPI8i=|c~d1 -oi?>>I5CLhYJqZrlCRqqgb=6QwYx~>;Z4}7j+7`gfyH3$U3Eq`u+5DD+aPv2OT*}y%*2FTm*2BE((mg -35h-~w9t|qubVhQ$g!Wi1vTpr7{#sTg4M*b2iHt(&DT)md#EbqziG^@Z?)7n6SX;+rGq0uFd+|MGW5t6Q{ -U3gk~1Rc_Wli-6h4KZLuY2n8lEvp{ST5E-?dB7ZU5CpgXIi8>+-PLPRfw^|$for1O-=?0OMxL6;dO8= -a2GwmvL=m%>?F%NZ{;sYON`Wz6iO96tZWdsvKq}&N!0^Ls^tHtU>?r1CAbO|aV<)66 -Zq;FT?jUR7#G5nE=VowP{^8ZadyR;vjmRQ)dZ&gpyVU$^R;`1eX{O*l^=n!XC(`uK7UDM7(kWJgN{k)mW>fWlOA8qS?hlv{NQDr4W&zCZlm#c1} -aXmQ+mWQWJ1R)BwTCMher=u!F_4&lS3Alg%DWS97xAE$?8%Cu5vP`5>{P^|-X=Kx3bgaXHH~KpNq5>j -u?hP$J1jVN(Z#RurcpE-DnZqoou-CUA*(apR4dFhWOn2F*ksq!1h_v?l~fPx=)~Rd~GO# -=zl`ffq*x!oz{kdUwplqEfl;fj9?a%%w>NElqe}5Ewle;Y2uURmxZ%3OEJurWdIq>ojF_X>+g{Xz43J -0yeFM3P}GSH47M5ys@7cCyBit?bBq^V9O~VIxn60Gqo14U6Bm#GE_D=(yyR;<^<2c1<0eS;9k2;*rKa(*N-C04o -q7k-o&W5FmD2eY>V(t{xMT}(Zo6Ou&LMAO^p?%qF6=s{?!vEh;x23^GrJNxvw5gn5t=u9Nx7nuo6gJD -;1PhniePTOQ|$#cTNb))XsT?f{}shod|9Hbn`}FV8mMk*xy^pYag5J`j)qF#s1hzr*lw&+FSN+FQ#uOMsm+D!rkc&S=6y7HC#0}e^vYMrLFl``u%yUF{PE*P{cL00P(U2{VhCFT$8Kp;bNA-$Ha@k}H? -D-X)4eJ&umfwX1qOTmjV^m{fpgr3@OSWf%+MbFia1>U`Q3TJRp($@I;LZFP;3NKkbf6DL1yPN+l7eJr -YI{s(;V~_rqaGkT2DV)zEm-35`oDVw@agaLxG5XYE0+=mt6DIPFDHGU!UncLc1zhl4RD_d*j&6wVGw$ -PP-9j2@#OfYYMvRS3G-yjIl=J#lbTZ~kd^%LQ)~+w@)P%`v?If70~&P2rHl(|B^4tqF^4;rMK(YQsyV -3&6Zv&bUjc&Xu2FcKmP}+QNu -mSgPPR$O>KwLjLK9%~wlN^Bp#eLW<^*;Ggth8(7184>Ld){l{1)L;iy<*f-MNyeroV)GzYR -f-`7dPy2u#=6XCvwZMD7|;hgaKunegts0LVXue9bI{3UkPRJ)!Ib|AT<$>~H%_cH9<-`UQd-Um9YbQK -Sb~M2jdY71`~V?V3_gqZNch?0sdgCQaIT|=Gn0MP?{xI=8F;H^@g1r>3&clW4&MF}Gcsd7OMNX>Ewj? -1P^nJLl$K}b$8Qyv8yy3?Cj01xoG;1}M)q=<(2@(a;tIN7Dl-cg6mF7mVTcIJ>gchqocHx*f^t3Tg(qG;N$@v{s*ig7 -^BhmH#bauziwTVTV3e3B&7`5r!Nf4B6zXkCR|~H88a2(P#h=09gNZu)LJT+tOmLPI~JvC1hL-bR$VH0 -L9%SX@nPO#4Si8(kYDqJ~%-pIw|{yJ^uk35=$mh8e*k1q)IH_HS{Ay`2|@+=%SV)mtfEAO0{VwgG{yHd#AUmNMv{@Bmg^_vfsZH|nF3^FGQQr -BsS=WnA0-J%>PJ@)6761l7FnEZH2Lf-2nQD_;+hW%miliPTtt@O7wGD_Q7W3!3mZZUUL{ahNE+`99KhX`Fd?BG&+rW4=#L=PemKhT;N1@(Yp$;uR=F2zrtXJzGW)Qjh2^nMPjCGL(Q?!V -HLvGG+2LCMzk4E-f!>Dkyg`*4-BmlUESj9PFVJn$W<^(LM}s6&L)WtV0aA(*B*SaVkhgER|}1;o=W=9 -;IxpB&LjXy?HP4FEH~j30?;)d-d|CBC#6O{Pib5>$JiIq@iy|Rn)#_@X4zkddX?SVmx~p>j`u9}DNsm -X1f-Ws(7%ETGdHiXcut-^+!k+e4OxzaO9RGoZbB)D&rSVpNce=$hQ!rY5VFOJ9{HDQEI)y`)tcs?Ng~ -3B|44m$>`=4bQjcdpuy3ZP~&4zTDhw+#1Rb18pRa)R3H|6qH^XckoEBIh^2#k)D+6P -T7ySvmrxDZ7fq7mZg~F8IFn`K7}Sc1@ok+_wKqD(VG}F+6eGVph0+N`@s@GJ2^{ARr~J5PU ->Y-qYfG`Me|)fI04W}OR$YmRf~86eS71m`qmvOOS<+@Y0_zVxmC6ZapUf>P%1#9*+M&mhmXBR=63UHO+qjuzf%XqTOmrLXt~=+cZO4XbW2332_-w8pWLrD0X(j3q+cz$Zdi -FUfD0$Mm;95zwu~2d{`l?V052%&+Jy(2_|l6|kj`faVI!ml(&CgTGy{poTBXum?|C3u)`fVour)4okknUt^jVE@p~;nd>>BO)Xj9Q8=^*~`gx%QnNNv>Z;Og*!MbxfwTdLp@91Di8k<$Lc#t4~T%AkzsFeO|rTD5YAC6wfgV9XhUAz4+_ -0P6|6=H#KU-biJQcxg7G4Z@k)lBOLBIMjfZ|?;i5&3yGU;@_6#%`^marf1j3vmz)xErkPPsL32*y`DX ->|AvgI(S{BnQQ1>P4CARl9{zYETOa1f)m=p9xH?lP+%bdR`{=rE4 -e-p;1>vHx`iA}wg-;EfIsZgMsu0r&T{^x`YKe5Ph6p-VaNZI=Geo-dT*~?9px|^B?n{J&3f4#A*O=JB -mw7|37qy#M0cRk$(o4Rg&yB%qjqogDf(58|XfJME2k0$Qx_LXAw$2yACZTjdsfsxjCS5EwfM+U`-t4> -z0``W|>!o@0rfb+4au3us(}VWY)o*)zRRv|ATk13E!X}Q0rQU$vY`R(p4bdYAiO(Z`yi+fITtM-!=AJ -j61_xV6$`Y@qtq@F@mK$oIIZ|Qm-=MWg*kE94H%zS+HrN@peej!`4vo7Wc3NnX;T>p{<3#mIA!byo*! -g=oMWQ~t5zHQ2~Bl -o+WgVW`BMw5_+)qgKt+;IR~^oQB(g5xng8+QiL<_Q>f77E8eewL};&SRV4DAVTL -{$?B$W98yw(vQb}>QTCFfD^(U1n4rv)BM6CH=7Tu;gaXvmn`kM@z(~kY6NLxAZZdQN_Y=r4iSm8gRVk -I6gz(04?j`Mxqt%~_M6Bn;2qN~!6DnEx^@)*0Y~PhcY>x(ZPZEq|p7@^-F%Ma`^2bP2-_QsWHF~(@2` -7G(MBRTPL8A7pOp+*%b~{;Wsr}SoKT~@_&pV$*X_+ekxxptb%8v(?U9){|FPVilWNvbFQQ~T<1@hI0@ -3#mYm+*FSDivRkDeEC4a_wSDr4+qFvH__CZK%uT>%C;BYJ|$s%iL2zNXKhWoXtzZcr;4xUxlK3d-#CHr|j%lEkL=#gm263Z?)xk7y2FZ -1neDyBsGId0Fj~eLd=w<2=Cx0N^!mowk*>5P7>x<;O%-uRRQ8bBOmb{8 -hkNyxw-Y_Drz{#iT=dBij40r(+ic{YZzn3Zrzipkk2gLlZN@i-3BvEGf_cyngSq(&vlBtJ~#Q`%fz+0TZO1GGG3_LJEamx&w43ta?@)qi>sem8?Pa1C#Ic -+)PdAEq~~+`oW&sT2lT|e3?*?XP7KTF!%8tUbLmHIjaz+ic33Eo;z0e-Ea`SlH*wh>Ro)D{0t5T68Rp -@bwwLMECk|lC@*}w{JT_v>y7-p57k%>9$Ste>$}Q_X4eW3djI4d@f3{^kar+fp7Hn4UYo>#;g;Wh!`~ -zFm>9-PF)VbTg|9%EH(661(vCNXsj=$)f$gdJ7`pC>tOg}J83C -U9AWSD}+xI1QcDLdN+7J|K|#E|!FMVf;^Sc52tX6Q`|S5k5CJ2sdJQO5sa-EgZsdX5ot%PK7Xvy2`eV0aiI#F7Db0oB(ui1qLcNtfdOh3e9k{fS -zr`fRD#>k9kKm1Jol^JDf~o%EH|3Ad7I<0Yc|3oW`fwTZ4*aUqrfKc{%JRvsb7uOzKKX)1yO%g1LoL#; -HAug79gvyMH_``zo~<3o>a){Brr9G@(t~oS}g(wSiVeXFsz9Z*rFu)h=4cUBK2}jf&N&^p!1hs6a|fdgKheZwB3fP -Cy?{bip1z=2lv{e%&q5p;rDJ_625;TTR=@LKALZn8qy)p5Y2DN5XCZo=)P+)lOzKra<@9&MB$GJ(V-a -`x=M=5+G@{xunYrGzqe&HtQK2G0b4?%A_w{u$5~O7Ko#w8}YD{{fyUFFj>QG$H#cD5Ul}cPDDf0hRL% -hp(Mkca5DQ5<;8gn-~;U3snE9t*}OsI2c^}6s2TEjLN&c4oxZal2b?Oz6Pc~Ip`z)6vh@}z9{EBaGFl -vw>iKR`t)qtRj`Q3sExTdJ=fwhAFC_{nJg?&G -fnd+?bWr{7tsDp*c7LT=JCC;{B!4Pui^J*V6)5!M!B^9wgdQPhrG#){Z_JUC-Cykpq-B^Syu4ddsJI~ -bj>tOAKlAh5zf_XclFqN9Q}OikvpJd*&000o2BNA(MuU7(qSFdBhpK_{inrwSPMOo5@zf~&4{)q`0Rb -i;obH}w3?wJ8F7x#{TDJMXxAJD{0a)m6$ -<6vkP2i?tfTX{6_9ddzhS32#G%5^|k&lZ7hrumnF&!4DzT0w3kF@?-j4R>qmi -;Jd9dfTc3EBpf9*bq -5*lzW5wNo~Tt9vDvEnvlKjyJ*IHSjkX{;UFV^3N2k?xpmzTb>egb>kU}oCO|g8)F6!wE;DV6~HlBUxk -91=}oWTv7C>ZBRe9y?c7YDQhBiE#uwu09k;3wKmEjC8*`}^Hmkscp8}F^2M?{_mO{n^fO88O7!k@tqB!tlRi3o+WaIw3?oSxm=o>&dQ?>TDep;U?p$h7JEz)Q69RAeE9}tbj2y;ZG4!7zFkh5z$-Cb -8&rZX73Q39(nGVJm}*kXlaT8;(6(+MZ@5B$0(L-YTYyNT9a(sKi=&0lhbhx>GwL?=qU1@lLoUes{fsw -B^M6eJG?X~`ScS(NWF~DH5ZtaRBQ~TXp>^Yn|JyR~weie1=+opKnv~JU|B<|Z1pAGbKIErVm0g*VRN0 -j&EJDvG9=yPmBDDz}Q-|LZ#1r50MnLXXUBfcH@q6iz94gl5)#lbVlwGRbbg8tVOyPI;MQSbe2leEvwS6%ONbKNJhnAxj$=6;dj3pCe)k-mmGcW0pNXM}1ISzb#XU8@J^Pag!yu77eM7xQ6UXsil4j1WGNzrD#R(>Qsh6gwS -`5L8~>r&j&;C#58&+G^&X^?xPV6(=_@TQM;ucm27GYQq;)lO;A%1Wr?m-%KvoEKx@6iA -^71Z0^Gy&U9-H`H4-B7@vimIu|n)5Kgk!+1I))=$u>6u4@8H55v}E@nj-%eh6P(5FszlL`7w8>xRCa? -TYYkm+ClsZvKr!!Pj-IjBCzpIp -TILS6guUE=xDJ0p5QDTrvy1U9m3^+iRYSCokURS-x5Hvd7~&_8=s)5PMFf7#miA^5SR?$rd9pYbYHu$ -2St2dSin)xIE6P?N*Kg0s!oJ)~X~baHQrHG?Bf=nw~`X0k4>y;s{Y@|v>*bTbBAIP53~UZoeFq5guJP -HtvFO@}(N_zW4H2(3TEJ^mL*Qnf&z&mZ|74Y^7gX}Cup>{qW3qC~`^(l5($NQYmW$*6MZc^1w1oAmPM -5NSD-o*$`*9#>z-SdFB|zo3SG>x?{kJHu2Y?$llRp2v;!sgcq_dkb0dBz@1rD!FH_l-zkMiH#oVvEO^ -n10N|V&a+=d`hcmP&c|qH5nAg0J6_WRYyAOhU^Wet~e;oWxKLO%)YGaA6VX3aML=VL -_EY%Cm1|dcZKb|Z+bn7rIh0@{Ij$(R*`p+cPUKK`YMi@L;h17d3$+Y4?lxN&gf;0}U27&4-+hcWaR;)&5vu+!P_mj{0fFb0I;^{vsp*u -s&1wf9;KwDGbLf#FENhPWFBLpuuwwK>Qeo`Z}_=bssbdY`Prdiy_wkzQ6u`0YJZLTD3u6nm2p0j?fDg+QdDLCASyeJ7XqEHJ;YknvWR!s+F=Lq!VKk{ -^kNiiVQDOG)3L=F_CTyy4qz_<20oTqKv->k~mb{QYaH1&dI)0AyKUwFzJ2pWTHj;e%95f|s7GNFodAT -MM~e_+_^b@N}KpXwv5l+{$Uc6%!6%A<73B9wZoEm<)H&urm=pP&$cz*U##2A+$t{D~7oJ_#>4O_1OVn -NS795AS}1ojgJqYSBm5JY=R0mJ9vhhNsoXggv!pY2$(}3-RXObI69p+oY5*+Y*fzkKjL%lE3kCRl^?za}l;@ft -6$eOlrp=`=pB&ZWS%dI#SNz4{{m1a7&aF&*DqN9|j}7QP8>;cb5%ws84_s{db&A3(5qRny>;ytQC8H4 -UbAwy4)r8#9)C_?JXuYW_m`l#kRy*D6sjw~c6(UOpu?2?M|=NZ;Z)AvPvcYs^oeG4eF&T>iI~L*^9iq -ZfE9`3}x-J1^sT7#jcL{ixvm^p-sqWR=Ry0e6*HeB02PF1%L>m5|&1lI%%WK+zu2r5CDqOc5^VcbSC? -2Hv(GA3d&!Qb){C1H|%|?c>Nt??B539Rr*{mWnMGVyryTO^UwPc=hNG0 -2eDfesHyCL@l`9Jf4DzT;AyM$SDe+OHI<_J`eUR3l*)<10T8ew^U&7C3(N43f=P1rq1LSM)H1r`4>i5 -Jj4Ih%n*JlH7`-_FoWwR|D}Fr^|HhD#0MBgeisH2go6ANAQk`$pdxw -qu7!0<4_Zgh9Xa>^_V)MZUjLi#4IhwN?$wZSu{*$c$kGof=ZE8iJwXh}p~E;DFS&TA@Uw*)jK)2r|2K -)j8vYzh|K1-MtOp;*!OEk9b;U5r^yoh4hla_kJydkJ0gt_mq-h`CtY^uq)HRd8QrAlUKwTU8J$19mZ_ -%Ak9;3lrB2hPw2-KZP9-!`QvX#1X$UW4ZOYWv_4p~dx1;j($h2-{q*g~hW%}Jazs+cUGZYh~V-DPAZb -=@SFx~oVwb=MFpb=MJ=x*G^X-Hjyv7`lGaL*31UP%gAAqS26ZwJZvO? -re3@kOrEA*e4mUwLA`i{Ngk$Nw3Q+P_5KFEJE-?b^xjLoPoejJQSZ~}^-=FZ^e%fWdDpV&vE)t3`P7T -oEJ;4~qSZ6WrCz+7N3s%4#`7tXN)u4lCWF65FDf#~IqJo4>5|W>7pV+6L%n!rOWLTHp!ZGc?WX;wUV0 -Dn&(zyP`%k^SwExr_r~Rj1`pkwvy{K9wJE#|rj>x^#iQ)*7AM0mzHF8m`b&nm>Oeqn3ic -VFR3xv4wGApIiSYmI83Xwm`Bx^T!(3m7PDK8$#a<2X)*VzF$)}~En3W4HD;m1#Az|NsxeN7X@?eblNw -X(FzwW0W~ecx4pXfbGnU3|TjrQouk~K1^*$+2d$sdt_$RG4qr9L`$JaBPbe89gdGa|JAYd3E9=Q3&6q -?kmvm7wyZT(t`2uE|1AN5WVj!cF!xYZvHvLt08yNzr!iz9nYo|7P!7;G! -(L|7W>-T};h;u8Nl=1qG3tun4H2D2jsSg-{j+xw-5rmI}I1t}CWpwen3%%dW3hXk{v>p_X~C%*{Xg`P>Sf&m-MTA>7!~6x!FQwtT)h)Vhd^y{uT?msqOK*%Db}c2%l#@#TDndP`$Bmo_C$uq;H+ -Syc44-LlsB2+&-(N&Hrd-~Hm(Dt-@&-womyi(FfOE25uaui^eBx-YCUdRhm+X0vNgZR9+E$A=VycNGe -;zy#hE#LFE?&BSMGTH~~MtLX^w=3{(;28UrMyvuyQWxwfsS4(B-ZRgVSE{@HM#TT0nmd~ofJo1b$B3% -chYopAQitjp$v>y5D!a1F0Em -rOh5Q){x&De!x=(*sD^VI5{yVYCs*U>1^bWSaXPelMSyQGPFYk^w{Jx_BhwK`2R7vgbHnY!Q#=H^`|1 -(m9w&=4H%QP|`qSYoCkFqF8q+>WFB?RZ>i<8k?qP2einZL(?%BTQCDgRf_q!DGY-LmRqL7apM4CdEiz -z7zWh7va*W{5{*Xs{A#&UM#NB<(EHii*hKp&~^UJzQ%`4`<$f8x8&8BcK{O_{Fu{gAzl}Yo0mU~HwOi -#vrC$)cYanB;dVsAygU?%H-au!?jytPRTr*RhTBHK6)Y%s6A-QSAmYCKXE#8JGEB(7Im-}{e>2_CKL6 -%Cb>Ww83PE_Gzq|~|g3^umhszIXv@F$O`CD!Z0q*55+paa`Pt)}>$6!C>1No1se2wi*dmQAv`L?`Slq -T3mq!=ir*oYL^heA#fgA~c?f=HZG)dfRv&Qcc)!r7=U=!bKzx}Yb{6V(M>fWbz{2Axp1tf&x;FIK&Ec -dRwBt?)}PD}*pkGIX~Tp-C1AF|@vTiv-wF7R>@0L_LcIU+h!N$AUE5T_stmPF6p;4KAjF30TDdn^C}l -Z5U;;h8f&RcpyM-BSxqTH#rmYc5C(tNfd5!(HP3(DBpDF86)T`+RH#&= -*{zw9(gzotGqE;5LyuP~N7RGtp*lhgr9;m;hpDMsxEjRJ~P4}u56 -2d+CV`DZ}qm}HPW(I@*e3$g=qb;*6rT%Zb^o&`$YQ_j`h~dhSw}Dl$Pf|DL<4lO1PEJM{%w;siy3~mJ -v>c2MmLxvcUoME@m!5YD1ef*eBeM6km`cRegCMx?aD|Ms}?AiOW>)v&OofPXvWSxxk!3qu>gjNfki_s#o|fXR29}|bv{k4M#%FdbKy -FvzTD-V9g0zs^zIVLqaV*O&_n(8i>8%8SuTsDW`&j3fi}bhSu=9C5LHkk(l&GJ -3?a1GLhBbn%Z+yoN3^)y6h5xHvv&l$>_br2HMgbEdI9*0`=sFrqd=P(NcUxk6Q#zl}KunDsB*^UnUYbjV&w0mKWYj3%?Y(&^5uPDsOdL -RJ1!3L%Z9e=~b0#4DBU`RF#q~q~0~Wrosu$Z%svO;v*h9uAxrzSZ$(Cg~#&REpRF<$!T@{r0E#DeyWx -{xjE6m({j^t(&*sBW$r1$Ata%rN$BM3(zb$iq{6bN**>F7H-U7K@v79taG{(EOY&S0ZRlqags&MFn-F -L9Cvr@s-sZKEU|4RNZUiiHaTGjV+H!Qoj-tq`o@K*i#2~VTk|80Q`V8^j@S*$wZ^J|`TE9j7mZ`k872 -2p2lRug5rV@w31IAxHg#;e0uIM9F-@1CLufjDdpHe$(#TN&Xw2GokJJ1e^=Wx_X%?)fEL{)*Wf0{_u) -vux>zCV-iJS&>xGniJ=okpre@y3qmwLJx3Puc2NEg&{G_Ow)2bg}PUHfzRM+y4d(aK{Z!g*@*pFGeoQ -4p@GcwIZ=7gmkRvkvjgS=oPm~lMMZ(OD6)p1Lah7kU*0K>pjN0{aRh%-&^#Y^jBD)I<4b41aA#U@QMzE;u0BsP8F6&8fsImnEWugoZ%0%74wF_74am};?iijCnb76a0{g+UJjpErPi|F2$IW848Kmj({5RJvBYT -1$UWWj%7J@_jVoR#qHogDOLd>Mmpk~$6TDD@9mX%QG{FIi>qF|u#F@?(%Cy$4)a*UJb{ -!S&=kM!7Y+1ry=K|<-2M_6B_kmCbi;lC=d{Yiu~|u^ca7&(Qznx&=AQpHQrn(;02)tnKNt;;48vp(t1kFD#YvCloXs7&X -AjbY5jBi?zmgtoI2;=ek??N*@)OBTt(roU7kNoVH9jXPry&Vq?yyI@;cW`0!#!Os -r8-d#{+ZC*DvY=UL%}+}N$uN9Pm$FZ&IKYBozhfsQleO^w_O@627*b7H0Pq2Yh%+?MMX$6mh={n158xI^Ug&@kph;`C3!{B&R*t8;x1eqk4H2EYBUFpUeZiDrSR;7yD{~ -mPKA`Q3voAkr63X>gAg;^Iiz}TtF|!yMnCowrCNH9rV7=>~KPzM=L!-HupCdQgYy!B@f`^23E9{vIkU_;eJw -4`5o-VPD-PJB7ozD8(Ogfr`8yypWbI3!F~==QT0jiR*6)zy&wZ*qg&-6aj-cP5826lB%UXwrnb)Gy@^ -3aZHk0ruV=c79mbz<)ExyfLGp7I2QYmHetOURNNOdTlG+d40C{CnP3Dkqi)XRhLY>%f<2timtA{|5So -;K7S)P-NvMS29r8ymq7!d=1~B8y_D0r_zCw$_ek91ltOn+X4os$$@u)?#vsxxGa^b}UmB1BCROVs>{d -Tf768w?Wy5f0nXT)t!_jsp?TS9F&a|DW$glkV2ACSWCE-39}>XhD=tFD -VQfT@TpQ`xySrb~&NU^B0f*NE|5x{zuiosv3r8G8PUL8fW%#)apdR}ftf_5UKEVig%5HdH!07G-fVk8 -VYllOT=bE$)rM4O&Wu?RvvWupBRc3?l_icrD@Ik7koFGdRP>u&?wR^q8?V}uZ5k+&{^&b7#@m(o+y3 -#^_dXUMf7~{7kGH-?*Y-<~JxBMoOOI7JSoSQ_dU)goJE#lboQt;_KbF57Awa2ifTq?16w?SGmAc?%0q -7w+KpHzhZR!DXx&u&^)+ygGRlL!9EzKF5Jj7a;J)le&xr!A@E2jF8T~)crn~!$Nz0X3{(U5CP-7GET7 -13G}3x`~bkF^%PtE`;2e|XTs$^}PKu-AviG|cICZVO9Gd|z%>nOqzyT40?~%8>tnSiaV_{{I|EzVvO? -eia!(&f`0UF??cadpF8mR0-BhGqequ>TYoNe*g=Iy9MnrNH4PZl;E2UdBuRRxnjkDfQfC44@ikz)LUC -pD*J`Sv60H>pj*AwCDsbxtXN8AA(k3g`nGtDPqnBgsn-P>pJM@2-PF(S9!LBd8=uyMXFEv?K^2xzYP> -e%9wf5pHU867hEA4z+)!caf)ucT)My^p2Wgz -Y}*|5CEPr`o+rfY+?7gN;~|Khn(-Q)w~7>8#%76xI{-R}H;FAg$MfIZbR*ez49FkJo{ll^FY2Mu}Yro -BJHQ{)^=#-Tc -QGLrGN;l6nBa8nB_CeamzO-XWDLeX`#<5t?*3cx-mmXv4oe -W*fi%Oh;T|!snOZg60ZZgO#MTLRJh`h8bnf~-Ug2pbzN4xyJCuTb1;SQNk%oCQtoM?^c+s9Ny002q#> -_Vu2Vg)R2$hVg%_kTl`jw-;?6^n)p2}em9HXBiI2iF^7IOTZC8Ymh6>UZ> -in?&4M9w$t`)v{K>6auhh>?Nnch4-8LLnZ);~RwhA0Bi{HKCcN2b}Jx9MOL0_p0HZ+ArKgscidB?h2u -$YlUy*yX)8Ks!2;WgS;-)kgbNnRswd#@25!)r7~e1+kvexilsGxFRj`HVm=W@+r`J!!{*Y8wa2&%tN3 -t)9=wvsCsOZ52KvBro44JTbU*Du2s%ttx+6_>6EZd`2sgL)?}ZHo^K5H~ShrX%8>%hGx!)+O(98mFm|}1ywG%GE5{r1W9nkdUvpFNcQ1dzcC9I2AppCYs{M=|QcQUczQ+4Z`<&#A#G -~>IB(C<6Vh2jG8xaeKQTZ4Vo2)JvCN5-W5hm{oe8q)PUEnD$a@7Uh#l=K*K?mV5f>;o}XbR(sgoN!Aw -JbI(Xou!pUg;{6oveOxfbbjaQv5!6sRWylhZ)>S03Me1Ra6(Ar-82texKDcBuT0*g2fWi+M*pbx0LDm -9hIUw&=v|0sLd-Ju;T~PVv@f6jPMpAljJQrz-l?SgW1O!UFGMN9ik+%B%OB&KhYkiDv?SfRlQ|$jd?8 -!RTtcVljvL9Oer3kHeME7DaK79SFdR0jBncE8FO`pB@XqW-U`pVD>izQ7a`z+fPfwNU2vrQwBlJhOZd -a9^ephUx~dDV-G&9PF8tUDjDtBQ1V ->}7;lgetV`9GAT#S}n;hJI=aZ(D2NJ;gS`(b=u+a|=^g77){NNlzFoRG(G9}PQd<)i!;jEy%Q5l!qzN -1Ml~QlQZmE1{Pkag;qymxRag3zh6~+NpS)e#9hAb*do~9w!gsae75~oP>Tb7ejCi)8)1RUsJpdS*k^= -R&4#IF31&rCc#4CXM!ZBm>uC~5{lMwpHON7?dwj80BQFX0)A7Q6iNQ2HSjN;v4mG!;%dsj#Ok^Ck@lE -rOpv5fcn3xX?O)_3DF(~_#W#e9XmHUM$v0G9iXCbIdXl+t(=Ej}RLgfuHGD(JEPO+bvTtY)L0pOG@EU -XBGqsh@i_wyVZ|Is$Jm~3Vkpwvs?0rLPK?;0B-z&Z$p$6gl5#SQ+eM2dx9Y7S$p>OR|*g1zng>y*ohs -YZ)wbz954!1$hHK8-mf4YJ%9>PKNSd9?zf|nEr(II?)C{jtTAyK;$_a)cR0=&)OJ&`2!AQ&K$no7pf{ -h?c8uXIQ&W+ml{68<6F*S2j#XX!#K@dtjQaN#EkuUS*kPL3niD!w9-N`Bm+zeu52F0zilNN^PXBAY~X -Gzpcg_>1ry{vshEvcCvK6cyhR-Wbu{6iHoBt;+}ukz7X3RYV(HM$2#2aT$RzlFO(NfP~jbX&jOcH4DX -Mm?peNW%>TzhBz+TuSH0pq^HW5cSW#Jd>d?yR*J7};1x~A2;Y*6V`(8bUiB2wN2{e$Ogqq^s1i1bc@d -znNo(+YL%55a()v}j+@zwjXNAiq2Sb}Q&7>4_(Ln+Jv<%*|10A)eP?(-Ogq)Yd%SMJI?T8l42z)e9eymvrf5>}3(9RCG-9mS9`EGW3-Rx`Sm2*Xpy(v;*2mIEZjzZ8r2y8M23H_d8m)`z`5X4{ -@Rp|B)(k~FE1GgkVTwo)v@ExAe5r9Zfsf?IOqAbE>Aym@APz+`0xcf5OIY#o<&t->uX?Y9cYxU?$X_9 -4uUxtcq>_>@epxZhftXPc#{&QoTGY>Qo3V%((9B0gU*IjDueA`VQ3A?vzvpeGwssRI#5p2t`_9SG)SuW^3D&D -t0LS8=PxWyZesHlx2sxaeUP%@TS+V+DwYzhT}4#hsM_b-fN5^VL1|5`ADN_;I&k0Njs-l8j^?Qs`7k$ -SX3Cpk)$@ynE&{gX>yh1UMG^kUw^A(pa?$$JB7C^}Eule$Jhp_}?N;94_sYmCZ_D0(Rv%C?V-dElx+p -$DKAqOg8nZ;&C{U~*i#c6-c58{WI;45wNfXzqi-MrMe0KmWyc+oG-fTQ)aS~6Q#d@)oYSVM*vxYgTjF -U}^Xwd3U7`_KUKHr8DC&aT(ce29SJoR*iBNkZI)i7%xRNTVT%-F7ITJt!GZoo8jijxR2m1!$XmW3xR# -&ZOJ{$g-IWcZ!4*?7@}{afY_FMo)bEmo#||0CN*TZW{f<|2n#C9hIzX|;H_ -plNqbyE3g4Gr93Ht#eZ>&t)pnQl^UUN`G`VFT5y8!eP_-uBGRd`YMCqBv|3u2Unf!Cm@x@RC+GNVk*t -7+w*~aiuy{)*f{Kup{5LZmffZcd8JlY!(jQ#z7%zyib9w>el+;;#*Y?1vG{oeKiNfQm@y-aM+%P_23v -O1c-Ekd8mO?%uukN -cF2vm7^FK%6Qp+IX|H0(l6M(@10W!{rme%BH-nH?`JR@rkfc2_}bQA!2NSZF0D^_07lZCxzG7ofN*$Y -OzII`_pB`sYWM*UBqPYp*U;0vi-NT;?@=LC&Ez@s$cxw}>>?9;v3IZzcntdXqS?*b -rWUIPW{3+OQ)Y-?uCX;SX~pS9EwGZb_3|3AQB|cSva`H{Ond7|@eKPKl2qM~NAY(1$oLax757^XdG0q -lr#VclXy#Kw!?-miMG;I@`wqQWma)PkK}-~dzpX6R;cjtJZ*$7UqLL5b`?(HcaY~B#%2MX(j69{)4%b -ftPVId~r8J?GV5#;gu^cYshEV~oh9;&`C#@-f8L!7{)0|?ho3MOoXHCAN-gVr`m)>2Ivl*4FcOto -4Vc*zO($It_+M|7_}oHK=O8alP!0&Il{XUJEKCK72UeHqkSAzU0$}XvSIECy*WpI%CkK4T-aEo+{RWn -iO=~Fd^uyVXRL{O29k^vGPv!dQcGLTtmOcrdB_ynpee>GGp#~EcX^*Y;N$O9@on{@g0g23tsBqhAA;W -!Fu5>F_IW<^|s-GE(1#;2N>VK3Z){CbqePTcs$rMe+aea~B;?= -s#F7g&M@fBFT8G^hLh=%zS? -4eFULKx*3QK?o;*wuh`aHo6qjKA@i|!<)Py@>8H?w9{~NOF}=u#duZP*hXy{ji&CDATJquU$KHl! -62n#%020dz#0kjg$~!x77cd@+NWM#NDzleFdh|~r#i_n4t*f4H&Ui9NJ6O-YKoeFXl`Ym;{^5$kYIj; -O@MJ&_sk_AgzuBn6nuS3$~|w(-+I=5m{vYb%qBOt#9Ui8p-sVfRTr{$u&n!ib>^3QM7qn1Sv&faXd9e -pb`n#~Y0UZpuQPFt&$*jn#fznn5F@AVk=GDzf!6xVRP=Qv6)_1F-eRBL_&T3>Yhl)4>-lK`&e)~bppC -ZrD6yDwWkq+Ra7h>{4;TI;PHZZWPZg`zk(@4K%E<7xeku+I -@xHbJW(3cF-%r)c=fek591t5-`=x&WmZI^W1nyQhE{P*)jy6GOa@;+y#-}mIv!rd;iTcArWs_}l` -t9T5vDcCcA2_<1#Xbnuq;Ihkrd6zzW1essKA1_^=t-3HEhYtee1^@QZg4{w7Nc0`?pfLCrg|xMAy5t?F`a5jFx2M%ea+FD1gVkUUXBmZA_@47yu_K7}lmWXJIUAcBEX0LAUbeETCd@X2;dKL!wV{uIzH9E{H%ogJ0k`sSle%prw7_N31bNR`%F!o^TDHtvqO*W&>|cG1 -S&QRl2dVhw+-}HbKK0=W$}SEGvMX{l>niZ^RB0qG?GBnakgzi1&?(+DM&lQ`xjVv@FcSp(H`Qb-t5&X -NmL*?a}JRx5SF$v2>;fhM{!EQct~bc3_4FaCTzGA^A~G`Ie?dqXu{^Yn6XtasFqjrL8J@*L}Jq|1*aQ -YkrbbUPX)AnEY<}g)s4ru3~Mtse8bTo~(qCsi|eG*76tIL`3Jk2+&2=xzbB{J&F`ZW%JZR)p?qFzPx! ->HbXs%OHo>P?ZDn7t*G&I2qAj5`78Lv;AmN<3K$CwE6JmUG;Sj%oD!Tn3yi3FwAIv_?EuTCn*TL|@>l -nK<#g031{1>Kt4LUKPknA?*wcucx+Bzsq={=B)Zt(WI0pPsFpBR)MN#n2wQcHtz&hp8^ax2Y+X$TlBg -4}+AT(z$*?R}E?c-z*_6-n#oG(ZHLAT~%r5B(@l|2GGSQE1C_Xrfw%7>`rT>=BMZMy`X-=s3M!=?h*BM{4;) -Y~Hvn}lJZ&@>0rxhs>K?Xhix_KTZxrYtZxrbHxp}lx -Ay;+^-0_|Kwnk0GXn6~^A)*%k#7=>2BVKPhTcs}3_VO`D$_ny;E#Hj!0+cdIQ$T}kFNI6Ra -xLUV>9d_bJXWR;5kDRxWT#J;rch0(#f#J#e0d4^goMgK|8DSPgs2gE1SIvx!a>ipP@P4!ElwAOs{pKi ->0zgdAK**kJYA(O|bRM_4B*kS={yWvKu|wqm838v#WQyWF*Aa~W9QSh6Tw|;$jSV_e=u07j!Z-@a -6mlu7pztPzG76_D{7Ru^6=NP0{3(o}Fp)wUg-0noMPUPlrqtcuyvf)}y1q=IhJxF5#@bNmMZurKXbO) -|Fi==Y;av*5DV(D4D}|2LgcAin3Zp4ZqmV`+m%`%|R#MnR;X?|CDEvU-SA39vgR$lm?x)b5f-i*#3b7 -QXQ^=;Ugu+V{wo*7q;R1ykT87zm*U|CGhb -oAGsC9`z;V@yNi&RhyJ=#P@I32ZzY#`-aTyXyhWkBwrHqPz)gG>c;4Yz&JKPe#)3IC>UIDSX&Kf*e6t -qeR+a={dvnIvvh&IzxO?x=~yYx4RBYPtTfxw0dS_nasda2~!=@P|(vK@YM)dEm%`=9#62xusHg&Pb0; -~5oV*=@CIV2ekfNA3lk|CipMdI==3Hke8kg!l#Yft^rs`7vgxd$kVU^n;uLU<5haeID{wYhJWCO9Gep -{1L`@D|CDCt=fHIwUKA)Z>6AV4YX0n-dmq{r=`CI{^78c@DMNAUqOJ$GB>9Xi~Q{sdIAL)|mcZP`9$z -^J&G^2ozcny`CB}zqHHvOgBa!3&SQ%sbgQi7U6PjkdQQqCs067HZ2*y%+{MtX`gSwy);z)KhDCCZXS$ -qJwP3EIHRR7#^GoHeWu^P;Ee1noh=JxIX}8&3B8Olpu*nF2>h&kRvJdV!0+PRXwu&_?;v}SK!vRL -+~_9$U`5YM`wvX2Q6J^xHr_n&)cqk?j3Ft{m!Hm3dEc{rDky;HV$q8IlH7E+$%I=oP9sQgn}v2Su8I%9Ntv6Rl3w(zEND?C4`W!T(pDVBFSWwLIdVeFy3zUEF)hg-W1rA@KAqRm`B6 -F-&>4$HEub@|D5lUkMzjsR=%>;Dg0^^}`xUJa&OGT)L!7H?U5%ov>68=Po-b%`D)XVg_#>N^_y))`MX -C(B@0D@`)@;GedGs41*G=6LB5f_An}8i#2U?(@c?A6h(jD$|g!M^d3Hk3KVK+#B8rzfk@*fk=y~J}b` -3c$V!UBeGUOGpJRxH_FXrVYp6BcvpJsTt24$6}_I%muMv+^uVNUc%maU9V?C(O59LvKiBXA8?NUEm1* -&R`hL4x{+#!cM8>d9>)gYoAE?DmW^5DflQjC}k_hI7y<%&`1zWq%(d^gwN%IDwn}eUhL>Do-g#fvvz(;3)aAI!9neMqrK*j$}F>(!|iA!Nq(!SWJ -vpaVcGgrQHM$T8K -VAl)AhzAy_6;?Q(RIxfDgEU30Qyw7?f{5U?4y8A`gp8G8pyANdm?&eX6(`Kg+1kk)I{#k~4Mk&3L196 -_b@I9>f{tbCLmhkq_yS4rvh2R1S_#&MvNQO`0}q-lC=2z14lK+qAvEUHc9lJ9X~zKvzw-?mawu_Uhf| -!M>gk_3Q8DJz$`Z?;yXy{sDnO!9zkqwP8cUBO-?l9}yKja#YOdF|lLE#f_g3pD=OK!;_~>otF4W()1b -0x|Er-QqyLqXJlq&&(Y@?jC1GZ&VTf=1q&DDvH#x>%^iPzY=3vg-T60ydYHTY6*TZyH^pMRKh-_{+2> -zk_vdhre@b4>|1|sm7aVui>8$^52~gGk-Rn_D0#vns4)^$1D*^x2zdxcMe{JZ`{?0z`o=KMJu6uv4^w -!c{|B2X}kL533Vk#(n{E4OJWtQbdE1q1r>ZzxndG@*ISFd^D#h2Fpk3Qc1$&Q`7N=kR{+52hPzWoP2`~2V+hYlY(dhGa#FTeWwlH*M6(IUVY={t(xC&^Z#;3(72+%r;gx%n*RUk^8f7}apUp-EBNnB!=PreM(je -@PV)70cGuW~)J?u#VR!wc-StYl>s5BwPuX2RZFh}rNtNqjyKAft+C+jUUa}ajQ|84JQZtjY=EWJ345? -&8(env8I{ldGX}TGPsLYfseTIlgkn)U5$}xn^Fr?1a#b#w2v&A#%UIN2n2x8Jq-O#Mu1U7*zSj>#qpA -+vREPjl{AC&Ghjp^yqCH75ofj8KlIl3?x2Y08)$Vg`#gS=^MgTxyD*om%gY_PX?LaZxwHyS~r+at3cp -@Xs9>|8qBC}T&9mb5)1+K%AQqy(G8bg*QD_fVT(dFu97!66&(_x%X$ixNWQi$=Iq)bgxHYG -}?^sv^cLi*dK(d&|uH7WY63`#AsvmV_rRtzIdM^GJ2q%&hdGLNFOrV~E4s@Kdh>h$wdGiPd21VVSj=j -aRuyJ(hUNG5WUjoIm`Go%zsjEE!R8;+znonGH?TrDj#h!}%TlPyWF#+ZYmd-qJw>0Os+Gj#@HS*k%ZB -P&^_$x2ajV0@4HEorRkCC0OQI!_mKCSLNaj&eliW>Z6uAWEDjco`W{^_qD_~<BgJXPxaDb(knW67D4lbVs8u1idpb>5WZ)EvW;T5J3me7(?|b8XLOv_^hK|}g@g?=*AMT>PYyOix?;hXn!Mn%z?tAz67d-DCKmVb+@k{OEPxsT -Z%6@g@kJQV*%lGc^Uk$1of6^|VQ=DV)-T8NUNaOi&ekD|EyWV1VT|ZrNSZ!Rk-F1C@+e9>8-u6f>I}~ -|$dMAvm8-K8VeT}(${HPig>2y%pzfSXnifsRIs -p}aDb;uNQY@fn+Bn3cfh(4GAVf~-bqRKcdJ@Jh_6)aiQ6Aa7#f!lF}#BUGM%Y}D(idsIrh;gpb+ -Y8aNKkE8B5T_;1DNhvdRddeN1m6?;3t_wHl(<7-nH4v9rSWZsr%uE@=_^et4*jbbSV#3LYu)QDD#(|# -3WF;HZb;HP78J(0tM6r#IV`2X`NXbmc7-PC2b?AJ9ZhTfkYO*eTR+64QD^p}kN49=4V8BeNy##o2tq&b(~e9DlAc*vglsVDWZ>giczRZjayK$^+~~+r$~Yua6= -%@Xe-u#`H)2#mSZtJtXkSaal#k*+!|Xm7l$DxEW*Ix|FhZA*cu9gv?n2spQDq8M5f@{yM_DZ}K6|I1MA!<&NXvXvcPAn>m&BAq9I1S4OqaMdZ#^Aas@tm+sO%`p7#= -NYbvLvBBB5Q{~5?oRor$no6AcD2Nvt?6@Y -UQjn+3{JncFbOv+Iy@{F9bDnhJ+Xu{WPGAPn|Ja#i^67t7XQ{? -|=DH<8ax<+x^careu4aaPN4-Q{O^|K~nA;CVOs`5^f|Oui47?_=dWE6XKY4KZ@K~Z{_Y(fShkK)k6t8LY_%|c=-*hzYq?Fy2;O9J1d>nZ(v!P#8~P6a_7XU<&>ed?|QSc!)wD3LX?R6gpFAPoWJ3cM5J4YR+icH42x{Na-)q`80(S6!udnq -3{8PO%ygzSV!R*3i%Wa6q-2I_DShMpQ)o`1`a3Fz!U+l`6h5S|nZhOt>nNM4oI=fMEwfTMNntOA%@j6KSVv(wg=7k`6ma~z`cgyFu)p< -Q#qPuv`@$-R<~-4OiR$`C;uYmR*DQ>Ae6RgWxc_fD{^)%shkA#jd?@+Bm+r&|*eLl;?^e>i9UAASJJ{ -dXAHVgNgE!U9s7`+z^5nyp(#LjcJfN;sGHiP}7++59i-K|}^Xax@q_fL^o$CJ_(mOnkV!YLdh9fPR7^ -~!C%(YY+p4g>x6?L?Zoh6UI4beh!iWZ*1O6ioJjao1Cm{CEm -p1ZzbtBI=HS+w!MxO6)``l%e-l_Kf+zOTWWL6D%~zqW?m-W&pYf^jr -=JoHPU?^(jPpWl5%*Td|xBQV>_H0+!Op7ipN1|@+A1uefo8g{@}sGWzvJ|0{&T)FWpo5oLdgVDT!ymu -jcTLvvgO5c!B?tnq>!T4pspM?r)Eq5=9AW(g{A@JAZPZ&4Vu;JWM2{fIn_0-&x%HiZmvL3(f8K!hx+u -9Xw1amV;exHE+Byz+Xxr?yJ8zyrKKs2Sr*0dVV=9m{(JFF$X~SA9{8C!RngB`6VL#Va|V_u&cU8L?b= -%xBR7QE}{kh0m3RpBfVIs;iMET;0xTOXy&$5KBQCz>eoM -&UYWi#o}&D&g26OUy-#`IxP#qy|%Qg(5kx2qzNBw=>mzkW;HN*8(mxHOsbTPX_tO7L#%*s&}=KAugQG>J`}I+ZO-9>!+QoXOJ -C(pW}D2Gi^HLVqk=xR9+khO)OF9m3vU6vRw3BiZuV;p~~LF!rKe%eF5LWbfohu@@FkXWLe1v$7{gvLm -m~W_@;Y_Rwz529$9Yx|g#-pK%s^h_fkQa29@ovyrDb8+(?s910UIa5niz&SsqBZ2D!+7B61R%w{uNwQ -3c6{`u$Gnl)?KOE0~|)~#E|Hg4P~>UZB=0ZZ_wvw@? -Bsa~dvA3iKtl{^uA$$Ov%*V3%d=6X9SFvKgg`MC>6@ALuQ2y?e-<$Feq5PvL|0K#klk(^CR%{vNe~I$ -HOZiJE|1rvc(Jp^4%CDvT4^w^vd@lelk8{sVQfZv4Q<4Hj^EEnDkF288KXQALAjEe+uP)l=44M`L|O36L$GoOBT!8QJd|?R -x(d&wtnm|Nq!}ZV!YMEj1S0WeC*?l&v}XQRqrvrWk2Ib&)VhJP<}tkKZ^2Cr~J8;e+A{=K>6RN{5vWC -KFUvJt~yQmFH!zVTmFX#!bpOUN)VnP2pb8)UV?C*AXK*E?AHODT^q|;)f~>Quj1^+7S3)R<+l8tD1Sf -7A4>VhQT`c}e=g-;O8M7N{?{n~2b6y|((8lc!8rwcMTyK -WrLsCwoU8SBZr6to+3dv4f2OaAT|u~ZCZC3DWf*3FG`^NiJ@UJqoboEqZ2yo)=7{EHXuGcGA1fIIwmrvYn=oX-@C7XKQtyHIx;3AX4nHA+sX+L|6refqnHFgToj>jEio7gWc~ -^G1A=0R#W9i5F@gwDg2I2oKQUr}7AQm$jE=*GwQk*-64>Gs{ag~YUXfJ5Xo`Pe*f4=YXIp%@+F9-2(m -OIbB8Ip;tg9fR%P?6yLIcCX20E&py+adY5@VtwWh`S9>52;X9UAWCq-r`^jsUNsB5X4YQHcRw?oC`&s -#YTiL!cNF9ZG^!8y_}!khf10N4NW;C^CE~$+E9+czA7mV&c%SF+nX|o&D%CJQ2{NB5KP|3`deNK`k6y -wTKT7C2@^rwejE&37EE7tCnLD!(&2&NY)s$hc6u?+*<|2gb^R3?4kibLPXQ^!9L+ZQFWsw`62ibB#2R -wg97VC+rcN+M1=*`i)PVvkC=MVoR{QPtMfz8ks(p?_t_Q)dLaGU -M%dTt0?ni|Pg>%-XxOCs6k7Z$O>`^lytJvZWO&f+gfHbX9*pL^~(_Tq~#vbAg1vi0lNvkeC-sqN0LbzI>Ve`pXqz8~pa$Z|wKqe -`l+%bGC)C|oTa#4KmW_C3A -4ys-9XM@`3$?K^hs+ts~g%Lho#I&|;TvuE#~Uaj2K54NEDj@^3n?oDZ1xp(#Q^zvk#yZ7zm)upLdD@x -F^MT-YIck9{5t69@N56BNRnm&EK+}xV?p*#=X*Rn;&_U-z5HFI-o+Qiwp`Gab8M<1IseI4QZF=|c^z!n=heA|-Ur$dDPtR_ig -1*jlz~|Sko8(!_Q!^HfNjOJ2H0Bsk*`+~xyeQFCnjgY;5RZr?n!D=RdpML=I$Z36vs~(b$MIL(BET1~ -P_*sZwJVs4fY0K3HEGg>G>cfzsZ_XzRVy!`UZ3DoawzjEcu5C8h -tzkZ~?=fclF|9pwgXRlqmc7?{J7f+u)y=C9NeHN8U?PCGUWS8LQox5l!#~tDI_CR&_3G7w&fr -zcd(7K@^5n^(ess`vr?0>M`bio`^If}k@gINukyC%lzxwJcOi=N&XU}pPe{;kW4V?Pf@2pm9InjFl*s -){(C@n3`8#;8T50mN%ui&&}(kn8+1@+og4!Blc3Bs#4U63{-Bg3bI}pDQQycUJjKPBk_ -X2)|m%#tC&pzWHee@A0{P>3-ekkz1bmd~XeAmZVQpMLs@mz0# -)_AVgAiG-v~UZegy8gK6maM|MuH&#XV?J0@*y`Ofq-vmtTIVCb_#sFs(Ol-sHdj`s>v%zx?u}@4x -^4ER}Tw>4?s!sl5#%99AIjpT(c-DU@Xkz+VZVK?$f6B>;bg4&_=2^=VN8;cN?3=eA(~9O19vzh}>$RXeIyis+ytoIBXcN?i#rgR0<07DKpgwR$y`k+O&*z_iF7QVkQv2tqhugPrb -NhqtZ_)D_#8Vp{_-F91s;c7D4GH=8_xJAwIYt2fUwrWe-@bi2r#k0kGmAD1{-Zt)95^5XaNoawzi2Bb -Po5OlpaD7n@`iSTIs$H6|HZlP6z8FbIQKokx!0%I$By&BE -mh-~;3q%Tn)f(GCVo`bKT2Xz75agDk^bLNZ)xCYO`Z{Q0#04=~9{6`(Xa+&jpuQ=Bp<2>jv=YtP&?z5 -k0*voleqM_Fg&bxoi`HIt=*VNR!^k?uVU2hA(UkOTGDB-WP6SM=!OTrn>ho9s;{7d3LXrMaq`<(NEL_ -_A+oLALwo^q6P@0~W+#697E{rYvt@^T*^pY9|J1)zcI;SO4W3*-nmHbe*b4xXcqAUBYI=v^AK353QF{ -v*GYXc&5e^AN%{kZ2f0a+7^h!awym=N_L(ZQ@?>r#^!#`XBO7{Sil~Unh#3gRiIy$Q5Kmp#yCkat66a -yHL((7dYb1b3U4Az!na}zLsbha)k4MFC-egsVzLToAW-q{yhGqi&ypR*>e!p!wR%B=$3})fUGwrU*JF -D(Jvq$^o;!xf05cKX!wrvD54>fXxRKSzn9||3NJK<|BV|rIQ27i0%%ZzLPtY&(hwcDZr$QXKU&K-E{N -tY%n9YsWoZQx5C6dVgzq^YdyexM(D04io=IkcmG*o?3Nx!)&JnN4RU+#51m9hw -I}JMZbU=Z4<+47$Kr```<6X9BK%E()U9CsjaPmJ%l!=(4o)*8qgm -!CR@NCda`(N7=QP%ApR!Nu#sq3Z;@i%gbhPgxdZ9EmhVh5KP~<-_Ft8WuLJ4TEz#F&$cZC+{e&~CQYoIsL -SD|miv2%$(|A=TPUKGeTF9_mq6Aks-^RuLrR%L|o<+F$KrK#cEG&7v%B}Z_J@nL@E>mz~&dmE#_Y-2Q -rKk0iR|Afy9;0?TR22Q{m?E!czbpjo4Zy%%o1&xsZJxfFQ4x-^hqTz#uL<6-2v}e%picG^AnTD01A#E -ssViwVm62TWGM+zEnKqm#-*%*U9ZCL)HGth^@jzHM7X%m0zt+zPrA|=?@$=%w?@4x@fkNhKvmzoCiPZ -kpm)E3?+8vZG_XXvE$#t^<%AHr8>hw^7KwfxESFm53l9w!=>5Dg271|0QmjA_Rk)<3|XWI@P3$#nr}d -HnIm`P*;5E$F!yIuu%v*Lw7QzPn&BFCiMX6Ahw06AjQwN_$>MI_V{SD1Sa%%bzA1RuB!#h=xLvqs2P0 -EtJqnVRkmg`xOoAf8ejke^5|RFW>ccbO^-)s2!(iixr%ftCDlRw`sx99il+VcjPh8JZ -To+3F~F*}T#QzaU32pfa?=TQ{a{wVt2&)JtVESq%9hSzkrt{z1jX#cxv^<`lKp$ie;~dy^s0*|Qv}w_vsUGax^BeWr^TBN|!w!7$UW6wgAmEubYu1Q)5R@&qWuBj(j~yI&j~+evgA -YE)$+i}_01vbc`v4l0P@fhA$dm#by7h~-)A=WbTI!!A8w36GTMNVawx?(EZ$ID4tA6|KIMw$(&p)hQy -_y#k6kJ`kY879yWXW$2Km0IHPfr(or*Wl_CD4F&0Xl&j=%`N%<{;1yL+;T>qpe^*0^>+LgN=l`11$|4 -ME;F4;L)F*|3PMIyX&&Ev(G;E*kiYWXF@`P2x!v^4SoCe<@4sv6ZL>TLz&xA=m5UJUzzj8*Z^m=2ec8 -ihx+XueYXAB1LJ4*C+FYLwjlo`OY0XeUVH-WG&(w(FIccZ)B|V${zHcjfz#q&TQu`1zBqb&BQ -KLo)+1jvSgTNoW2G4N~ywMJzfAAc(DdY#XHrfH&0NMoLLI)G>w+T)``}Xa%RPV3s-MiPyB%hD#z2c8@ -?d>0huLu|~0w1bdPPPT!Di-a5>YJ0i2^l~i1s*GTl=(#HQScP{|GoF#0Fe>zgL`Fu2(5=+gMgIm}1Nm0u5bXf%5_J -MOK^;IR+uK9923*t;>I3~b(TgwQpf{cG5qBH@_Ofa(!}hWb+&~v(2yNksC!XM>vqV2_e*iZnAP@8mbP -*2755`0Yz#VkG{PN3~V_fIp;P7X0x8bkY|HSVC(4gqWhUfslp@XRJ7UKlS6#Ci*=JW;rs2jzGfL{l44 -_N}w(S}yzW&S_U_d597%Rh8P{XVunEjVM2eae(6{Q2jf7xHb-cO@VlWC^m4d-MUoUGa~QUAy+bfV;ro -e*8;)&kD#T`XJDu%=bfoK-Zx^vZn*Q-MV!vf8m7}ggh&47y)!EbMvs9a1WVL{0F2nUw3qL{IB3{!{5G -Nw6|gGZJWE*3BtN{>qLIgh4i2e_(HazJ3)(rJK3kN{Y81d1ApK`?Mui%_1^```0H-8D07~Q{|WB<5q -E*V{ro5C3ETV+Xh7cy`vv+Ba)AB_eJ6N~F(-JBdQj$fQ4hF>&WEmr9-}dZ@M{pwe>d&|f5`6L9+mp@fsGv~t3BDi-qhzu>vX!YWba3i&c|!mcVZMquzjBL)|NZ*!|Ub;+r=@i-LuaIq2=mu>#r6t0raJx+S_V -*rNF6#ho|x!_;HoH*uUzr4ozkzeo0*V`3(ddZR{NzXj^hMCsuw`MVAP(0!CR=O$ -h4Asf--$VG_;)ZT4FG<8wuxKd9 -ZMEUmbKGc8b0X#wf_4B1u{B={jn8#cp&jC*Vne)V-B)@6g1sb4yYM4niJ})cU^bmtWr(T;B(b`Y(MVRQS8#E5e*6=EfCy#Jo8CEAUMSAD3MI!sKD1tl@U@IOJ -g6`iD(sHk*@Pdg-Njv_*{fVV{F;-~t}teC*X!;Wvc83iGOO$#dH;%l-wl3HV3gE6mqL*m!`$UPr@sYc -Kz3TaP~aXeR0ZG{rxFaRJ75;0bgOcyZ184gc)vSm7tY{Pbpdetm;on}DCmBKyhmWE^k^d8BfuP&j?PZ -u?ipXK078`R)BI_P#st>5qIy$9Mlz_*mepD`Lbop#P|+4DY`(>m8c)^=Bo7+KeT=}|Hu?3-UU$P@s;_*_#p`+z -kdBDP`el7K=k$S%fPopb{3yJd9t9pvAO2@b))p-%Da^W9`8Nh{R4mEKguTi<0tqMF>f3d6(#0hfy10R -a|GX^4-_AXA_K}CvLX-EPt>HRr_Ur=&LJBKA9iER|3_o0uHY5%e&wuLv&!J(!5saB2@^Q#0{%7Xmu>z -6@LiEZt!0B|IDOMHvZ`7s?6~N25dX<8*{mkLCmGYuYvYq??*r#KrbL4Z~-r%x1l -qE=dNA5o@DptqY&+X`SRsS>({T3SH|3^XW%e%=1lJC>B&cr9xZTF=KU1^5Yj<)cjKACt+H26&j0N1qR!1K+~bsZ)iI8SMgTaexQP953u;_*7uG6Adr@iL!0w*Pp|(pOZj;q}S_(Z -os>$%Df`#3%my1(8JPg%7Dw_J{_@K&fAGpHuT+ta`q##d8=rdZwb$ -zCowwh9`wGFxdh^XU#dAvI^y;gxMy*@7Zs$Aiyd&yU>BCUZ)TY0(&kuiEX=y3uS#J@Hb0mM)&<-&+hP -=K@W01ISrT3sh$-aK^f&jHm$&a*LIgmwg6mG3)_e6oSB%93ou8S>Z(<425NF;>7>#hb=TYX~p+S}`UE?vQ_!`^KUuVdGq- -G1!aOBp4WrW9)^oAI5zccly(~6E+NND&P&hg#%+4*o*H!J4e8~7#MSmAUsfilO|0Pes1V6@ZsFv^?Ymo5HX&F?GC#g;|7eK7V3tJGUCp1zKQ -tq;)^c|dl2u4z^{h7guK+Z#gCM37Iy!_88(|6#1?~p)Gr9V1)m(=A5i*I99tHJ@Sn~d7yQH+sxVcQZ` -&0HvIkucIYnKL8#hky6nYwUd1m)3{JkZ^#rvOYb4T*eK7JkfiihHT^FvPqZ@>XB;41=6=(91OguEDMqwn6kcW<4%I2O6S9p+Af -Im&_EB`9fJ<)FrM6?0`8jk{Rw2`jFtu!63*!+L8D4C~@z2B0#2IkC|rOQal>6ei@L!XtCm15{OBP$~?DJP@<+yUJ+8A+ -L`DY_g(yiT8!nw2@E`+)x5-9uV5)o6kZdSi~*S>zs}`AGRFXO3=$QJ-py>5Qm>Yrt -4nGUsN^*6F)zjHzKWusOnz?kP#>IlAs4!CsAIt}WcF@zR66> -fjpeWh0vIgS`}fhQx-&hDAg~jUGO6qI~h6`@ioVoiLP*vv)J^`@Fk)_wx4i)_TW!&+vZ5d$;$O-ZkDX -10ERg>ws|sXAgX9;P!$02mU(n_P~}t5k8ZAbUurGEI#XfcKUqjbJ<7j+s4<=cckwu-$LJKd|&b1>ATP -OJKu}G|MI=*+hkD7L7GAR2l)(oV$chN4h-_~3-L?zEA%_#ciFG?;E2I7gU1g}9b7p0#lgo0R}FUYAL+ -ly|A7Ble|^BS0q+Ow3D5@q8dx2u3UUkT8}xF}>p>p}eH!#x(CMHbf+~VsgIfjn4jvdhDmWoHF*qyO82 -otfuHXZ~SAwg8-G{UrGIU7!kSjw}A&-TaLRN>o8nQPO=Ef$XIm7!UqH>G(rvnlO_4FI!S3LMZD)qwv| -3Gcv*ubfQ#=ygYt%EJWn+e{&;1j{;f-eXE8tgQrIYFH^WX6z;Av=e7hxmmAhYSrF5i&YtLdcYm86jyQ -b3$@M@KEbW}6%w%$SBncfS%ANPLK`x|eo_r`%=53Cy4)+g8JMV}o$`+aWvwDk4&jq;86o$8 -z6o9A2Ld&2hz-?BkR27NcElV5i~FTX*4dcPHZTm1I={o>bh@btmK{t^CD{O9=}^8d|W70^5|fM|{moD -!H5xH#~Mz&8W81b!BHCh%h5&w(t+BPcoO!=RHv7lJwjcMbL+UJs^WdRXw-;C$lsir_DUPX)Ib(qYK|Y -wzlRsw~6saiXDOp=se~gjlGk&&T_|&-*@~I1$lkqSIs((;4c~K%l9yi3=Fv7dkPfXs9Q5By=p%%*c?P -8Jap>T8_-&M}}!-Y0lD!W%t1!`wtrTFK6e6_dL&a-Pd*9=bU$Y-dHtKB`U0p3aEYRfMPlYI9Z_mz{Mu -LLkED1L;CYhE?RV}Zqq*l8y&irdDaXvBg`aVqR52INplbIcbM=^ta!lRAB_e@oq=IZC0TLo7$y -L&gM$%|nMBk;G=uR4_^U}Q#zrg#57!fCs@We#%wkQ$hVy`$Lj)RJa$r*AX@OWPewO^f9T2Iw; -b*^5ow*YSkfv+F+UHymtM|U^lJ#cnQ0!F@SzTy;WG%zLgnZ>oGmpTm$T0~>kMHf?i?@2YxM^41pX#p$%}XeuZDFW@HjC~ED^93);DS&MeSx2^#J!C&QM4HGga+kD|!E^*2P -Z!Z#x{4kKPn?FmK4T4muWhre*P(-3tZmj_D<9OK$#U5y7GNK<6VRoRZaW_;W{E;kEo#Iu(0C7dNG7TZ -wNnk$P)?9H{l;f;au^d2o#B;&|BcxDzqB~Q7x) -N=Rm!qFv1pgvBXJ$DHW&Tt)S!p4&quILxz)PKy#lwB9XK&9Zp}OiPWKzrqDF{8l6X%0=fcPLN|irZ_o -}}1WMd!AGF);_nbG_73OodyQOlgtd&RQ+0LYTP9-R=(jcw!REeroHL5|KQQ>BXpIqGyc6J=nBn@Zb^> -~l9-5$+y*mic5?eu!dzL2W}h^-Lg)ekUz*5)MRy8dEnj-eJ9+jz!UuqgnVknM@Sj{l%9h$8 -f%@gI;?nmkKNN5J+nIJP -|wj8G{m87PqO!dC{P#sanRgP}f-|0v**8CmD6!Q6GCqI2rGRlNqy$T6)9*-dzq=w|uGCOGhX?KTQKFlb?nM%Yg86$x#eSuoG=$TefRUJIPMAQ|&anz$@T|;NMcdmY4I*ypmUelLI`+Yk3{7=ZC@7 -jXcDg`6+&upXV3(CEm)f!^F4^IPU?{M}XBQB4B1miD*C^1DInW{Vd@E>LkFO3dqv|dj_DN5BUASKpt> -V04x*%4{L#m&7x9Nfj0vpC~8HWs27J}7Bz~HXcni$S#e%mgvsQ}RGA_DvOrdY`s-j~AC?WWQHE5ra$! -Cv>13GDX*wMeCj+LmUuWw)y&UFrp)S&;dM(VRp#IMv3|-Y#UDZ`x)m8t~`WH}30|XQR000O8B@~!Wrh -HB4;JyF=0E7Vm8vpnYkpvME0-1zY0`dr;0*bPS -0~kP)@XGnt+WX98c-VWt@86FfnRE7g@3q%nuf6s@We+SD%z_|T;7`{Dp+VsPJi`C}uN(dbjafBF_#l1 -Dl?|rAmMia_^V0>+`BhInUiHY6&WcBV_OquH=T9DURt10N{OQk}-n*tdpM2`k$F9%L&TtuZbUrS>{Br -75(fD7Qye9ezJb(4ONc2PYd@*{MJsYBbfaf2c{V@7#miOvt8;h?q@~<|YAF<~>KdqR9^LS{;aAZ&-g|M0jaKY$-Q2Zc#6-ctm@ia)}@lSKmX>?=+1=BbGnia#z5U+^ltnr9Lw; -mdN9@YiYZtTqX&Gm?R95*~#PI8O<}=>Nl<43rauf2DkX^7YDNixqg*ZZkTBW4BzG$0-Q2udjOa5#sxQem`THU9|L=dHb}_ULo&oZyKRn%D7B0;#3r}@UzhAC7Dg!KKVm&yCR?}94+SO!&unu6EKp?%67a>TLW94 -2kj9TvY-aoO*e)uT>gjs5^?C1+%EqHte;v!`s`9<#@zuxT6hs@sM -b6TfN6jzZPT6EukcVH{8#} -U4V{!)^_>+2@#SW^xL?<00(l}{S4!b_I$<;dr>uYu9mQV)72Q%~%{j;x(j`$o=PPU?yQyh3jsc -4;ahW8tTWYWXIQ(P_-8Y;)WztD0tGf#aItKc20NcpHgmFuu?h4(Xe_l49jXe)={0Invg>0gs!Ms&y5| --525R~s8XqAlOt$Im|pX>&x(I2J?NFQ9dqd?GaAMGJr=dOvxv$WIo)>oc;Sd?`IFJtWPNX3lEa%yDbReTY~Efb8T%iE;Au-=-)+FAg>TEtv!DIm%NXE=_}!NpWgE7+ -W4kU)@h(G)<{(7xb3EUdYB^#O8e^%AQ-II<9N*EJi!B0|;lzF`bD!B)-68fEp+wk&*`>6+HNUmn#YkJ -|vaUGVTjIMj>Qkw+$bWpY|~n4o@H9VfsVEI`h(#v~XWX$z1|GT99!Ca90PoUkH&ke75pt692Z1iY(#s -iOCDTukMBElq>=Jh+zBqZ2~y!678O%5MT{q}U3#>yE$e14)E+R$V`##aM4kT)8vk$UIjykS3(?Kv!-b -WsoM{eCT4~_QH1E@!CF|P~QQmak;?h4?ttus&p3E#K@HHcx)fSN*P?U#5E1G1=AQQ(NX}U5y$>MfZG> -mbiJmmTPR4bE?$l9*teIh?;Vhpw9yYCbK!QJ!TCTA=g$(?aaSmc?Il#jk&Uh -hx}m-QnMBAe*`oI=#tAC`VkMraM02bxz_P4?=~I2=Q|vegFsO8HDzJq_IfUWpV^cUEhb5ozNYh?Zc&Z -Ncz}j%r#7^SFE3Es{~ZauT)QuRmMwXCyfnZYhwhIJ=u#5Pqo2%+!rqs+>DGV({KJvCjGGvfpu*UWRx1 -RSjAiE?#wu`iS=S#0n&=JdvzZ|{MlTwUc@E`V`EF8F@{c1v6+`S-;1DYr4h`oMpKOJS(v?y_l?SAf2F -thYGs62pNa7|@%Ri`ZApQIalykz!f2MD*ebo@ahNER4m$H}obqn$W$PVUlSv&=xgfUj`bP -m{y57{LK@G7m72M3I>yb$uA<0j%J1nC&?*+4F&^E_QO3iVNM$7W%B=2^nO*8BsE@8))cQfN^DUkz$S9 -)vu+A^&PU>WD)DP;lfB`MEKAeh8WO`^gv{y`8!zRV*`;nDcTUS3%k3`&bm9uuWm?@#Co5A9X=F@+_d8 -slkhR}n!;`Oj{bv2t8tD6yWu -EC;BAumG#gz-2xOi0DvwE097goM6$7;0c2^Pz#x!Rac)fS%|yKIpdKJ>n~|OYpQA(1^S~wlDl5e?wM- -tD-Pu3SF$uxJa&xo2vbR~+gDIz4>x1mB-t}g5({Jiozq7Sa7ou!cuXQ2WRUA$X#xNbr+1;nK;b53xFOkwdP9oYx1((y57R0Z>_nT;ZgfA -$s}p!X|ADh}S+?*jz>oF{!2xVLOPuMv)ejoibQfn*r@ih<4vVM9?CW=9a>y7NbpQERtQ -a3yI6$KVkE(AiEf~3tMT^9S<0hAR_CXM$MZOWobQdW|Rxw-p=?}BhsDN^)3wX_p#&fo#&@zSF>6H$~2 -X|ZlbSU!Jo&k;?K{GXO)W!F4$tshZV~1jSD6+26;bciDwW}gbhCh`_^KU-TSMKU97Y4?8x0&0jOm-z+ -$LOG6Bp`a$CG)EV<<7q_VPFGWi}LTx5>|x?lFq@J^q&j&ma%{8bq7NH!Gf2 -C4MOwV0N71ItoU01s`@zV(2c93Kt^%?4W2r -Lr7GJvq9Yv+kRC=60)%3?NLIhGF^y4n_gBrQ{_&8tI4zi>eT@+h%S6;2KV;>*=yjMFPSb&`WH(L2nn! -LkwCU^>ESv%1fcsR?8gNr(b%310VNa0xvmnu?(HHGCn3Cb2uqo*S6s7e{C3EEPDC;MvlR?ySU+9n`a_ -G!=0t*ct3SJep9vsJk!V~UyA_3{3EsR`u=#G^gh?Xz~^KnHlM%g~DJi&b6WNnXC_9O9wcbGO)th^ru= -E8Q6mQAs#ENL?nSs{w7ixp!`Vr}gP6oZv8|5~P3HR?#epb|QimqYBmndJ?TW`IxijerrLMRa#C0ctpX -J&%D7_+kf>Hm5)ssKteA7-V0MfSQwsnkOa%!%@W$p*ZNwJihuf={@iUq|Otzp;_R}@LGw`1EFlb{SE)omy#T7LtoOwdN>7hyWEe(UoiLAWR`wJD=yQfeo4EL- -+G%$81{zJb+k!=xToLrO45WqDFsOLI*i4cSvpiO-pm`*>M7i!F-6Lw>*)#y=#oz6`N?Ba@rjgCpr9qZ -16|IMD6}Sj*4F-e$?$m4m4B0KMKu&%k5^00o@B;)vKO7*N%l>xsGEV5LpEl%Y7Y9EX0V -^K{`6bEE|i{hyS8Qfjz?owK{ABy#ZP&9DT-8TcHuNPTBtnZ@Hn^7y|Vk(x(z*1H$wHag#vA!k0*;@n} -4Tu>qO9kqm5hmxk$_bLE!E(qF&|MHqXSQ(OTnG$jdw}dIwmxwKKzI?rK>39+{!s(tA8CxA>!mpUK>pr -Ru|8`k=o)NPr`f2QoghsPsZ`IfxHBwnozt(bOY!S%*ynca^G0R8SierJZ_jT7#KkH>DWfxxnZ@WV38bN>IsA&1HHgnm5HMM2GHqYvG%w(SS)tA<}{jc7TqXEBvE -!ZFUpV`x^?zXl+^>>^i}AcoPPjibl@<$a!oXCGt8MblpaB%4HO+&U{v_*Gh7N$yJkjdHlzpb^uyfv#K -dlZ`VbNZ2ml}k6dpwx6}S+6xrj~pkN`?!yATD26`|Qi%c4)_CV(PG?&_{7#Y@vQSU -(YC3;-V!@vu7Dw^LOka&NwTET_5LUaG2nsVa2+4-0q`k+#`G-*&LUf -lH$fKlu3V>_{~5rav;g>H6L_3mJK`tN*hrKl68v#K@W;iuf$(f6*RcHL1fxS|0^}ef%WOoJ2N5f9c7k -JN^^C4$1jxF=?Q|3HCwjdjfk7YTz{v>b?VU>(?Im!TnTA5CXY1WmabU8x6<7fM8(M0fFuAy3qUHd&dD`FV -!K#xk+rLs!72bN)WbGhyrfxotZhYk3mfm`Zx-t}jcbkz6v#Jyh5O1#Cn#%WOwzh3Co%AKLz%Mq -YeP^tgarI1Ke6F+qP7!6hDu-Y2qo8tI+@qq1WX9nqgSj?sq{fzM}f?aL|Z{ZY1;z&nwEcYIn(9J1z9< -G8xic#&`vf2!+@FoaE4#>wlMa3d3nfSPfmm7!|^^#(~NW?kUZ+DVdlV*dFOq%;XuD9I^fx#PmC$b=I;46u)SGZ^V1k1y({ -d90LBAGvdoguR-7Kxc=k%?;cn$af640zB@QEVYd!u6Q+%%LIy5ASYv6>GrrnF5XJ2fhU9Xw&6#N*Qm# -b$m;|yy1qOR>qH?VF3H87?g~!5>N9{9#SpF8QWpW-!DOCTK53Oq>p+7-#Je~pPEIcnQoonhm&FZfjcEw0d9bdQ7w&`Mhk7_Dhtg@{fDroWAi) -2Ha`+15?q)eWhP0H04slD`E+p@}nOa0qWV;LP(&7{(v$IXBQn>U;pFM%Lt5g)nbLe-25`y;;cqM=^z$ -yG>2Nqp?J%iFP)>I&THSgg@J2Qwm7-s?ffoa>IM*NYnn}5SblI%Kahi=fj99lIffhamukr~x)?~!s<< -rdmCnIS3Zqd&WYqwB^JrceLQ&*sqz)o7sPPMv@gl|divMxInLK~O7ljg?k#5#A=PVJMu0usQTdcA_7P -vT>zqS3y5KN~-!uuAp_(>r;&teUlzv(eFc)wkv5x8||Po!=IR?5`;_L(YF?)sE^7XV8*AjThS(7oOcS -IiluO$cB5Qj9oqptH%DuV&|N5aq%jkX`^9o@aDU-GwE@MKK?~E1U+ojn2;CC?z3X4tO=UEjpRsDmmLV -p=1mf})5YvcmJM@DQafNK7rt8!(ES~i*M%GiHWj3NC4h<)=zK&UUfi$|D+DjOSGa5%>!WYMJA8^82wv -@uR!czL+F81z&+UURTH1aZI%}U5i|1i~v!u?D721GG_Pp>?RdWw<;llT(mI}H=t<8{q5iS-~DOO5EI; -}v}y1EdKhrw;nV7y=tDO0cZ4*cdGK1NhNKl0J1cgM<*YLCRo=+)S^A-{m;@zjra)N6mVi32s+JoA@_( -@m=27Jqyd^P#~n%#QfBk5>^*M_0=HGGfZ~E8$x*MXh#AvC$B?< -94(&SlHUSt<*I-@`$YB9o6JE3mKy|QaUU(aKh-6ahVjTcFH3a=PjG)>C1jBkGMiJ{We1xrM?HHm(@0r{q8GLZM4{Jn=DuK+9URNY8+PS~ -6@flO%Y)C+@<8d8=_#8k%A@>Z?9x5XQ~|fSFIvgEoJ7ZmvJPz={4n7uZ6}$kVnmawCx}e)4otS$=OBI -T#>EWD;9ZDTa<>?ED+`x)g8J{iSyXF~#G3*BGox9gv@hW97N1`MSxMC~oq!P&{N~*OB%E7}9WgJ!iT(<*gBqc>*l{HFC@dB0xPKHwtSuvwv+$U&@K{ --XbcIuK7j7>ezVIece{Dp9u{Bkt5feNXX6YbuH{0FA7vySRf%t81B7vwKXlE*!7tPYlUJ^sN$>ekQ%? -oD8dW+orrA0RHC#9hDbypR0s4ckB7doa`z3zPFMtpJ4J*P}i-9m5#;^N}S?WT8467*g60%Xg~QAzKNc -fIPv1}>~KuayS@uyf(LAlYSwudj%;o-U$#O-e*?_u+^X!=T3{O0C4NpvK7>T<=3z^?U$7xKzfo%6|MDSLM+rz1cht4n^EjaX -!*KfROL*HgMf{<MapnGF*U)wS6P`JSek-PPiDZ -CY>D(sncbRgZ8{WHx29ly66xgb0%C0o#D=zuwcjFlt#4CLPk-)dCEvCa=Y|hpVSk#n4E=#onmU1oZev(8?gK*as9K-$&ZSRXu~Wd<^BW( -D6Z9o{=*Pa*CQLt~#8xz$%elngt?~TqVSi1*-L-!DkJwD$4+*0cG18(I3Uk=;0^y%X^uo75X(Zf3&0~ -XRcJ;C1Pk1Pf1kZSk5Z23S4$ejj=sBoXrgA#t`jJ$g-4Wu^Cyuq=_tc$TC>Vhb&brOPZ0TiDeN(8N9J -Ukj;KUSG>iAV(2K_Yzm-RX)~xdK)unq2%Wg-;pu!FdmxK$%@%>k1B(m?bHl#T-f++s2nV5|4e+qT-vn --S0W~PG(^POF&AUJ+DJa|*nQEecM^Uj*N28~^J4iHrnIKRf98nJ- -I?P%vc~Y<-FQwUu2KmWv7d++3w*txU-I;FQ1}bwUR$xJd}AGl=%5b)dhC{sOcxVNiSr&pJ&Ig219eYR*W~pa&kfJxy9X_lff`gX}H -`9rqqow=zE`$!SYLHD96d;?P`7pQRP2l8n)o_sDq=;;yzegtL`0aZ}9AXIYFQDI3-@mM19CH96F+h;L -nI?eu9zUu=Cv}JR9$FGM#clgr5L{OVP|OX4??vC~i_I)-o@Iibqs*22A)U$N>d_*ZIdvwfmWu|Aje$t -^e|?7p-cPo9BOaSOL&?{h{N_%zZ(`NSh;&Tt8@wpBAsZ#qnr1H)Y+%Nd(}N`O_NEs3Rf%|;EgTkfT$< -sl1zhm$9!>z8?0hc_)6Gfgzlx{lu=K=U@&43-JaZFyKvQo`MLcs%?=jps0+DHUm@qeVNeZVVHc2n`$E -i8m1#?+e*i?r8k^qPR%9!+t*O{b^X+|k1;zcAv{RJSLi@pbTf3(?Y{mlr?X5?8ukeSziA+5Et(-8l%8{&U7~t`A)K0Ph(?#9!^t()Cz6u0RHELJSx|XzaAKC%i2U)_c -H_}Xy`C3471q!krCQsXUIosD-7t^8gCO|(3kji`+1l3XMGd2?%B|#(~{w|Zv=`#lqACQ)`*kyfda0e7 -R`z@wTWh5;V)PP{B?l}A}!N}7Q{POY!Ex7^&N$W~1Y;FgN)&{8mDi*s4M%)>+V$T}xC0s(7YBZd_lO+ -g|JM*YFBd$b0@G08Y&&p<4h!bZ)#eQ|kc@PpUq*Z&maRO$!dU9gFU!+yQh~j&jS~=5zX{Eqz4ZLV@qC -uY1{>2>(kP$B04|?#A2Fmtm+5Yg%^MaO2XF}3)^h@{_3vK)-AfI -|>Jf`_y?P{78K!SkZlcG|A|RRk_zQT|Jg^)jY>#B$0*}~>O#c~wE04Mv9@-KJU&X^?Fg%a$NJ(sT+t6 -%Z#jKOdnI(v93{+S@Y7>OwA6t~6sLwGq(Kp@UJzVh#cV0)S^o&A%-6XzT%Rj!thGPGgKf#=32CHW?6<{G2B`pBhFhRR6K-M5H3 -NZJ6^>6qtK+fP$FIkD=NA#EYi%`(4Ui4_d#A1^DSrnG)Hsp20x)a{bZSHMLuazq{veooUHgxsTHk+WY -LoPtF-+@fpC-h^~slyf*^ehc}wh)AtwI~I;_Xo4dZ?P@XA?Z6cE7=4O_kLv%b~zooEQWG%TQ)tP -h(jn*#vtGu|v(qQcPaN3k#ljk(QzVVa6c;`R^fZ#aBn=HfSG>cCwjEvXJJDd(V7TiWD&S@y&ieT0-r+ -nFaGPYmcM{o*u4L}Ac%)KDvVV61L!E%9Ebk_W9agxVb~CwSA;zgwZF<{x`*eI3@8iYev#8{wX|%+SEtQ-(4a{XE)beYl)AzwrxlI6Z1ahpkCuTK=x# -eu4o;`ea;|6O3t~+-EH#yYHjI*=RCdQ^`|C?x|+4BwGCYRata%H9XVqZLb2s$8a37-QNFWybG;H|u6OGP;kMP~9uo2m{P8wN- -cIv#^<;7`cKcUd<9e#~SIF9US8?+-SLQzY_VehNQ5!YgAKjm)>UZ-~sv*$B%9j`n`(;LUP;y}zE^U0u -K04(sg})w3TYB(4(MEGZkEJ)PmWKlFHgNA5)g8Ipp#xf?#>Fhw^wBl$!1;`fO!)oy&3rN1fP3T)fdV^ckw -9x7gjgJTfz*gc=Fu^9`5VcnE|cX9KRN=OK^~bm;L+%gE)c1=J4subC5!(&&1(qhvgqx@HK!j~lnd=?W -|I(^W($z0?s)hwTt}a%mgr_Q*pEQ&XzgLT%_cNey%#lOo!VO%NacY`_Kz>tSLMi$N6RF(#>C|OOZvIge1toqv9rWlWtJH)}wDJtapXc~A*+m|SKlt~24GEPW# -+Tuy1_z61#$q8V~z#bRz0tL8?r*AK*vV)L0+c7pgV#xckr{sj+So48?dl8Jd6;wjQP6Ck19>~5+0Zkg -A0U#r(O--!;P_i5LNEAKaX#g$E7_qs*Hr2I~aGyyra;K5VVdro=>9^Y1@Da+Don}VN^+q0O745xZN?u -3%tEnc#T?}Uct1ELsS_uT07=2T{*^9YcQ+?T~p5JY_Q@k9aJTMMuguB4@~9lZ_c^Zv_Z56y=fFDxOk- -6o?@8S?GOjQIhcQ_hDK_y_EX42pXozg6lno0RnGbo(-I#+TY42&O3Z>U5{H%xn9yt_FdnrM1@ZZB@P5 -kLMQkO~E$pHpI<4^8gO7OA(J#?HjSk2Gv9+JGCqcLxZ3eK;Db$(AOcLKdFk!Br@Ny+XXlBrCZJIcDb- -@VG%q7OZdxKEd$~#{q9@lychS*->LyJgErZKf}wzWU$3HssmpH`ZO&IrU>bp#8&z{(QqqbvmT2|5NtO5Vc9$C35z17Uosldj&H5KR*P5KOl7pss`V(C -yR+J&HvDO_cUKa%JmODM!Em!lYXU_+RM6II}ITu1sZHIdHTrdYMh|Z{0Fw%&}q -J5O`?S=lTe`1v|9l`S;gJrJatIIuwtv~f*`dLDVJneo{ed+%i%OrYLG|H#+h*8(>)J5lF(&4}Esd%rEGGaUgXH{fI4r^gAP?^Sp4Q4{`}3s@1S -ETMY+LGuyLt>}_Jzv}O*v^XwX3s{L-uoo{^f!ND`52kQT -@mlKc0Xy8igJ}3i+*fUt`k=d7FS9pcjuxJu)u$iCoMBe<{gsFgt2Aj&F;>HN73c7Xhg8XuQu7r%%A%6 -j|M*ixYc}vL&Kgbw=V{w@GFbk;sKvgF!tSEaIp6Sm^ -d-x2Ia)Tlbc6d6F)B3#A)Y{dlttC;gNPuz7o`7F%E{$J#@q;ApaX!Ob=-PC>#pMPxNYU7%7c<%jxyVS -x(xke|71e6~aD%6?G_Y=l_e#_Tso7BLvd{_+gI -$D6#GuEXJxniSO@11I|l)|<0oO?hCTc>?Nc4KuOEt1^^ij;&xh%j;nm>Fu9^* -S?vhqnV7@rh8$7tb6Cu)zrtSIa7fwz`YJx8J2v8w@?K|&X6Uo^h^}k-Adm&G0yx}%5Ho(NpxXhx0`k( -&4#(|*nzays_YIz3{kOhtAQP!2kr8MW&S^x&m!<>WN3DxSaKdD$1KqkwCN*{wR|U=E-NW(_8KTxQYLMSSH}JS=CLUbLgIEoHi@%pMMa*hD#7#&e)kXvZ_RCbt`clsNg_$GIl&|4 -{wr=?n0X?N#86p#rc|zh?taJwEQ=jWY34z>YOG(0X{&_oC~T{`ry(Kg0Sf;_{-uao4F>sphHgK^!O9afmZuTGlA&MQ>9+r-+p7%a;U&^K72S -qIc-a)jX3V*Lz|=hjxDG{=tARWAj2!g?#~Hl!1=ew{X7tS_^#;zu1eE*Q@wT>AA^re36q^**~+f;j+b -5Fx~s7Mpe*nVJKVu2W+6G(2VklB>_orQ*3}CJI17#R9*VHp*?>>iTK3F0-G6DKL~*Mq|I{JSpUf`AIjwH>eDW8hTsc0TBnf7>~e<2SR%o4UT=q&9-7~JA2tK);2N5* -SWBa(t{|3-);h`V)COiGzyS&0^Fx>0^h18yZIE=p-|J;ADl$uM>F*A*t8p4+ -G&XMW5~opF%VjEaLuIYrF}i>?j>N-7!Cd+PuQymoryax{4ySfasOjkmt!XS*9=+ut&KaIJ(lY79gNX@ -Tb%0Ia_nc}dz^z!^V~=mVPvE=l^!5J49y?#3J{t_zEpZU(P9N&-v=DU|ZfoA}w=E@b_Jm -Y~i9-AjVUl{9JxVrR^?3sSz9`gtnoY`x@H4iaX1iD$X5_ilt{&`{!{+eRTvD0~Y3hM*)V7pxY3`eNt} -u85-Lw;Nt_k$cE}-`x^U!Pv1v5cLoAm&*NHL-8{Er2pw=@^MXT;hF%ANT#nQqUY3nXQ-2^t}#F1;;WY -6~5Ec7&H~fZ|8WagR#7Uu}0n4`R0ghT*BbacY0Ras|6Tt`+ag1IvABR|#aSG3G$6|f7B&-Dm>*f#P|m{e7gulC*Qw_akTb#` -8<|i1`JqEX%PuK4?xE&fH=*qpw?P4h5(zo_9hIjwWWQMmmnc)r8hpyE?#^*iUpUm;*@VbLPqz~=o9Pe -7-c-KJ28#v3GvNwt4-Lf|^_t8BGmY00#Lh?O7m*^3v`BgvP?n%^A1Fx~6cwSPwao;toQ$Q>*)!0(Cld+g%7m8Xap}k_rnqEszn!$vzBFJ{Q*80OTNnv>4Ylbhxz7h5# -sVj8Tp*f+fv;GgAB1cObfHHz>5wBgeSzD%6B;w>gac6!p7o;!0+A4vSh2?i;EH>}r!eeM+wSxJ@v -id*Qtc$o%X~oSvR^_?<1_a=D^eB3)760o+Iq&pLz?ID-BSR$ZYUE}~1j;*2G>0o0g69gwu{ukhx!9>* -Kt)K^p4W@~`-1tQte|I&4Tvu;(t9y67^c-r}pNs#CElrQt%Xj@?tYv)1UnzOi`7Y?VTP%|_zx+^}fv4 ->L;SclQe`PNjNN-^{!=Crq6+2&m~@5Umj0gX<+lw(roc}ZNe#as8}Y`tB{0h*afT6#NIn3NUjm;C{9Q -k!jrU)`oj?k-83+y%_3oL!8{{C-B!H+IK2C};zFWtTA>08txAOyPERUUz{X%`e&AucBvd*Hlu=h6F6W -z!MMn$u6k@w@Z7x1wdPCabtQ}pdekk1(cPSP+@}M{1SEdx|Sr3w;7GMhxRFDbs33r=Do7M4vO?)kz%R(yeW8nQkh$@OdgaOF;IpVI1NRy%q{V02}H_1^`Z$l>qd -6xgYMA6+^kuLmhOrfp8^r8L#JQJAc^nLZ8u;9&KK<#~44Gy|mti1_cdaKW;h_x@KppU+iEm -hx|5lpKN6xb}9wffNl+gX3bdO!KRj2!oyTY)T7b|`2R8e~_aeM(y96DExmYmpL4x2#vP*`|wM-w@l(x -UG-MdRxFv7Yz4Dd?q|^oQikzY0m}-jp1sAk@dw#1~k1Khi04!(l;1mObhdy6LrTQUSMyP#Y;a`9)WRX -!?=l8u2M5wj?x4N!~xZC6ARdg*MF7}}P?E?p99(YZs`H}#mSLFCd~V($ -vZUX3QIXDrVRhu&2UfeiXOaiw{3(Q09~WD=A^;>yg);+k3$hS+J!;I@ -#Q%&AJdAZfL3w@LD~SvSjcwa~viZ>%Fm9J!1}D5_=2Ql;5Qd1^D#tH6T>6o#x>wc;BG_d2*VR|M@oRC -7a4fD>9$L?d;CN0Kd2PU8D(f1{|96^2JE%W}~Ytp3$Xv@Vd=qzOH -y%h^otcdy<01@v?RI7Tlr*5R2`J@>qmYAvH-R;Ov{SL?fT8Y9i -f2Nv&H98kk-at7O%57NI3{OYQqE~8kD)eQ*3_F1@8C&ruS^WBziw3E!vND$9F37SS!%$Q`_R4h}yQ}E -1p-0N#{}Ec`|4r`?U`NKe8bycHMcj_G=^Q{%wrMGz=8=ZQ~M%y1sni&XxyfCEwl6&K@UU5hEdcJ0e${ -R(0f!%eLXR6W%kFs5XYDatik$Z~Ozixl6WpBX9gQLxIBq(uwx -tF>F(L=IQU4G4i&#KkgcFIA(ka1GG~%QCi4kqQrOQDy`g72xc$jYq|wQK0Rys|9}gXX{Cft3Uv|sLeY -}!uItNSwA9kQgK%0ar&k))DNmVwxG;fiC>+v{3PlTJ<0~zeRe?>jdjG$0&CcrflJTuC&}akK -4vvX*->2F-_#x1&jVuPd7H=+ZDb2wlY`CxJ!nFRI|a{8VNMb`=rU&&G68s7!r5nzqs6y#flpS~rOWCa -y?SMIvMywJ!&PQ@yFtikoqQvPrg-bBN@Zf*i3QYk<#ObXUS1745pN*b|AK@{Z?WR~iCFtXMoI7hFfw4 -=qzqIzKSF^d5Se2sGk;Z_D+Y4io5aWqYy>4Q95;H8elRIH+`c`BI3C2-B6X~paGH5%*x_d#ZeAeCk!i -fc)jzqR`hrduWF&Ps?b6P+6Nj0NB5HGgvZPK+C3&Zg;Srwx(7tDv_|-`+U73TAe&rFV$0wMS2k>DF4) -T*Mm+tsW4fFo-$razAz79p1m%L0is9zcS{4vnyuWR-biwke}LiUHJbLxCH-LblwizPorn&ivUqrlDm> -Ux{|?2=j^`5Gv=OiG?QhW(r5*6}jWN$!3nqdMTWRmVa|$0J^s-s*MRYI?gG@aFAN?P~LP$Vt6zx+C%& -_JlH*pE87^%$)s>vsM+ixDr&z>)dKz3KB85&7)}?=ZT#4tJEi?kp{vWtXECv>D< -FxN=EfFV~!9mXQ}_yqX~UougRv7uBc&qEi9lCs#A)Ce+O2yG@eyqKZBI4Amxj`-9xv5wz2e%?UFQtjv -47q=Q|+!iF@i8f_hz51{(TXStI!j4>Uk=58pbZDtz`Epo)+gnk((Z)M};ZS|uz+xhra4HxPbGr4XN*D -MT*=_Own6f>8WL-nc?=uDz}v0tHN+`f2$yX5bhAS{?Gll=kmjlcOkkjb0=1W}+d$)GU-sXGotGM5oaA -CR%l4{!o_yvLhs&_9XnfP{VQS`uv--MDFh{%v9na{_qFgNy)q!1-`#u9n7(bX%Ee3eVi -(job**aOQ>Xl>`3nKsPhEQTB(}-N(6WqZMb_iTCGtpc4+Xzuk@Zu(i==LAgiWa9}g%a(=hWis~h?!k$ -7sa;J&Dx<%KQ7w(hP4jmnG+<7;j17wY$)gVyuB~Y_8K#V)oNe2XF&K)G@K+oh{Re12iUzJg%X~07(#!92dUgqWt`p$&AYTwzRiSl^_OS`CeQZ`**|l3u`OVrCFWDL -((N!ipJ90RI-Qq%@eUQnBSJSWB;=S|~&2xd?c`w^t^SV5SA5E+j?Wj%tESX=Q=SkX>Vn<~Yr!S^G+`@ -eY+XG~qw>bN`PX!^kn8V|lL`&4xX24_MmdgY@0{PoPyt53sbl4e}4m)w%r7`Rc@nIWB`qoc~d70_9S* -*9qY|O1KxOk@-ON8?K+fS-X&y=?t5955`%3UuEL`t<*k>MQmd5YY|1vVg#2obHiZ)6!xl?P -{I&3qS5mrO3lQ%QTV;nkfZKAKDg->;tMCO~6>*b2$3>GL>yv>COEX9n2WG7xVl>If^EWI100lA`8j*K -p4pCI@EDvoVp?v*sO0?+-7-@6GlxvQgAYo8GJtoZ)Dt^t2tyz$*h`_{9I_p)a~Ewqr=I1S!oJ^ce`bT -0Dq)E##|&D{FABX6Lxcnk=Yh(5)+!QS}G@%$*f$rThw>B|s|qhQM50K0k*M>z&Rje?RzhweDFSQt3sa ->+GY7o5vG4P2&SI_Jj9kAWWUJ|qZ@2vAiw1=BsX4d|;A%y6F$=Jj}Ho0Q=+Jl!~{fpnRs -ph|PTL;=J3CD$v<4m;P-%XOYjYPjKuS&aoeJ=Y97jaO_!lbdsEsnPM~kI7F$3fn)3CAjN$P9J`2d?3< -zOkuZ|w7~A750*;*tQBii+nl^}Dk*FVd4kY|`I=j$m6diAL;CxGhM=xthG9I(Ds>q)?k3@z8d{P+;FE -(YgO#F7*|KGY^Q<2+ymbrd`))_9f)X%cbNzIC&7g8&}Ds)K~_6WAJ_;&Y+-x+7{H4c96T&8R_t=*`6gyaYPO^7eKa0+ -w=J+hy4lZmS;bnsY&}3E8@rO(XF@{)Xvx`uu-_&{Jm=W$tev;nDfaOD_)wp=*u+o|nvM! -s>niJny3QU52U7avnlsq!lEXE{F9|{u`3O(#1;wa}PrSU1Io{V4gT&etk46NEy~Lt_jnP>=8n?@|U(^ -);CMgc(a;>taIFb~HUz*bHsVV+dQXJY%wOeb7|05|5@95C3tttL6WgrgiBigW<;twDWcqVp2^sWoDH1 -Zq#WmjHFdS{r8M9V-x5x)guIvY)3zL5xkrq_rM+bdU44;r`V0R@3RA1d9G8;x96P@64-sR=e#7 -iO2CiPUcTD3a9%6NSu^l5nrHw7@27{u@(*|Gl-})&LF$vJg|Y(hc{qNgaA|21xbP_9&x3yv@6f -<9D@PK?LTJ6tynvPkv*29qa)fO#p+jGF36eszg_CdcoaWk#ZiCzHyrf~ccJ7{a%h`ioN+?3y1Ui73qM -$?I|4sPe9H@=`6gU)RSR352w5R$24$1o0LN~%pBpL)L@eC{^)gYysP*yl{Iggd=*rx6NQgESHhIH&55l`<9@r68xH$Cizwx2+= -#HPxXJR35R;+!KOAjE1IhCBmH=%kGZ%0v}Dw6ZN@L3>lJIkbCZ)B>eu$^7{%>*vpF?K!@1qvg%8y9%K -DIpn2tOiybi?QqCK`tKntkB`7*s{+=SL+x4h{x}~WwKNKQ&>ldC -xwLkdF{)zvEUk?E_GE43Snr)r;4|cyMzqs**rwl8g?ogg$JFfo1eY&IRX9Mr|KE-W+MezvtQ@H+T!ni -8Q{r&+1Xv#~yfR}m^p%uc0a?9~KTvdpckh>oCW%vyO75euMEVU# -B%l{p@?LD!9c!P&Ui{JMMLO%nDd@$wlKWe9g#GuR_}*{C;RR-WGC6{d`~keu5cuOxJn{R@rJZ?sYrHc -*xS%sjw#Ga2o#g&5_)#+HYDpl5@%^%k?wryicbRD6YF%F*dDzS?EIW?~!qUg&3Sj)!H}?w0g;P*hRyQ --E*s1mwcT7puqo9ep)U!EDZiLKB*hloTy7|RUf18V;?8kZJ37Yadb{EwBdr=Am5d~Puueb^2gH<4UM= -y1LWBN2+VZ-kWo^he0K+RD!0u}1ght(1}A(OpPAH}aec_WXT!b`h6bxX_T@X~Hy?H0urUfL(s+qE=r_ -_03kGW@(}7k$>a%c45UT3=rw4xTLhFWHvmU#ed?CM=bZa9#J*_sy22BdkS<4~*5~dfyTzB+X@e!QO~cRgX=xJKp{0=Bq_t5%$B`N9$2Cjr9(Cn*$=#$Bm!Lm~a%~ -BIM_aj~1bsP_>q>CnN|{h1q@wS%yIIMLxzMsrzS4$Dt8q_D%am55p9A*pU?UDDT((&Xbt}V`S+80x2t -A!+eREb+N2D6j+XhK6GLJG$TooHBiK~v=)r}VD3dG~6#8qEsEl8CzjeH<}K)z902E5yqGWEhggXkG^*$Qz$y5sGi4pbVvMXtc_?LD=VIpihz2ZFxYiZ<(h-SOV -zZ0GpYhq_Mx2YyIV>~|JJxlaA5A+NG(Cj7f<=CW!)OMmM__Ep{kx}*AW_662A>HQxfsBqU<`@Q7e5KN -V-J3LxCZWUPI)h3e}2S_IM;B`W*r8PU^Eg9S5(4H@&51Yegy>&}$AU|hbwlhW5(z2*auJd(@AymbDwY -nJoZ$LGv_B$m=GJRwNx*=>j3=`>VLnw`)yFLJ2xCnDAWzdl+-{^V_og+!69GS6$_n|VpbO+tGkJ)#IS -E@^Qj11c4iWzN?|Nb)W_Ou>qM{$Y%>@X)v@AIOp3uE!jD6Z&6G)IR{2D6E;Yuvh^CG&)qlGzQDz7Ej6 -v;?Jn<(d-we7Z8W1izDx%fSPWD@*V*-AvuK2*EsWov&OQ-iUWY8W@w|t$VUuvmm+QD_N|42RH0{qJWc -2o5D-m#L(*)L81)P#x<89hKaR!`)3KGCiC6RV(1x@;Y)!x|M=WrEwoGOIm^O{@M{%Avv7-MOY1 -=m+trddV-iW6kht1CAiS@p=l70|Mf+JxLesc`)_xO7Wx<}5&cHpS6Kfy7qZT$G=j<1Xs9R28U@?<$v$ ->UvH$y2ow{F>Kd7`gb%A!vbz(Tgwiv)=MSJ?&zH5^GQKNLKn$m$B1yYYe{<2Ef2xOCOtA3;v4rP*#rI -Yi;x8uct#N8Xj~nqVQ`z;By~+Zm(v+d5XJ&WO|o9R&FeV>O;?6g6Ccv{K^$WWwK8F!dM2|Avvp+K!(9 -Z&oxtf(}6UbcW{xXXlZBA$%y>O%P*XO&E_=7PZW_!484MUqP81)$Ruc7(f?Dy=vkZ=CCCsErQR_}i|~ -3%9Iixm>kj8*20U&8eWQX=naI1qcq>NvNeeT{K?l$lhaH$){b;VOA13n1t$;vPcn%y#wvmnObbMr6<* -+4#L}L?AGec403IqHs&sYCM#W(To93~s1K(_?HccSy_(R1mhe+{t4`~QWkk!`lAV$v<@${uxzYq0?8Y -H#y%?28PDZZBiXTIMc~chot(WFz}-+HNLg)4jd8!3GIGgu(^D%JAYqxk3b3GeAciw1fL-qklHBtYd_e -h_v}O?gdwcI})NEdqUR}Ry@zc{7hbvM4H+6W_dCk3z7=`q}$Hf0P{KvPB2b3MnF|&>Q}t>-@Hb$9{ -dmmpKRgzXN2CoWD(c{*T@NWKM20aeaWtPZX!n@I19EWTJ%wqoF&<1M&hk6PlEBU{8|C0R0or17nGFBKM_h#5++<^&82Lk9OP -P`f27~9AE#-;86`i$>@#>T|(2B+lumdiC~&=a-l!v-f}ORgnD%=Kn?tcT8`?*zN%HN`K2=L$L*aO&@cLRk4%YQ@ydDb@!t -2!{2hhx$WW!lJ)lZ9I*+K)mTc>B(VvCI7?!Z;uAD&V1m?`4PnXvXBwEGG(JH>QWO8j`SE7-;fO(^kKq -L62GF%1VgYbDycx+B2oDbKWYe=izi7N{e!6vi5uYEJi|XWQ;`7s-G(Q2OJ%n!`!nYgaD8}I=_$kI6z_ ->1q>x6!>8N%ti+m7+9XMBQing{>8`B}x5F83oEL9cozv8nj}+nCVCuPou;Y3y2y_l_9%o3=d6znhBUc -`W6n3qO>5!Fde1caQug-aia0Zuv61tT)weR~}xG2Jmmt``N!|{T~VZq(+TQ>}7a~YLhKs-YEBO_ZM#S -kNZS{H8HIZ%H3VtqfC*TkJ#b87~XF%-mirB;runDwkOyqN4zGz1%Lb5?|Jrnj{Tlxzh~I*Y4+RK;+Z} -p$x{LpJ?m?~7vk3%$PxkgpA3)~^}dTAH!%Sj%!GK+H#H?-0%69FtWxMU -JUDaw8FL^01XgAYJDy^4Bi`oJ#^ZkFHbIv=A2-WUy_jmdHckuOj&h0tRdCvXz95w1C=|RsG4T|Shm+l -}TJR)5p%q>o>RFo69$kiF5|@j!u2U^)+3V>q -M93JcobDjk>>V){f3?POSC(*?Y!>Kh{OZ^g3I`f5%-$c!(#?dhiQz~cF9zen(bLnT%3AZCaJ-t%KM5{2g{5V7yMR)S6uLSb$18Op|!#R?!auo>hO#|^CuI -Zc-q?pB|NPi3XR>9I?LziXEwb>nQE=R8K28)tzJ&`^@|NmzC)>Z-@G7E&2oQjako^@!Wd`8FthuuboV -Zk`bKJUGQU4aO5+>pz&}QWal6$6DSK+>=$84pPng}dGIujQqZ?#(>&)&20nLw6i!Dw=_ommj=;T4gC* -o;fb+;N-H-`@5DDuck6OBB)4@6eguDC_0U`lWPjz20nbxKX|`9RNsi8Ww;d^vHBI02WbqcphK06MgS|BNPjB;atSdp{pDFT0UO{*B~w -AkEaa5qFlV7U#9@EIaLN(y{84uMPJEh~w1-G#vGYH&N@umzP+36KD*5v}X7|RJS|*mrv&{&XN?LZ{NZY0Sp&Z~`^Q_p@h=p+zlW&soJq~*Fx -qMknfqbiTfjn%)HMpm{=SHNvOQX}>pK@J8zIDv|-m7mN`_*r?I>y|tf<)EgZpflDh2K{-xjLb`xa|SW -H`^h8)R5lCc?m>Cp*r&HEbRqXsw4DR@rp&>%wL(AQorOEKDHXS*IPsqDBGX&7LVnty~V@eQ#|;#5oLO{I^Rj|4s!FWdisw}uSNJcsAV9M1MRPUd}dVF91dQ9V9``BSUD-g -LcETq!Q&DmH;cEAs?mRAvYyR>=@Zf@0!Gs4_-aq$&vlu_{9alCAU;$Q&g~APbZ*ffOkI0!dcBuMqlSm -9GU-rYIF&t+2`m0;gAzlsbV^s+GM0C%GuwD!fW#m1hM`VpBE=oWJjNzrd*;DXRrebxBz!aFUW@7kC|? -dkXvn;d2B|Et!%ja5{^qqzb%|@FaoLt71y5z-i@G=_7DG*U=y)Y<3D8v#?nJo0o*mC~s`MZK2Zd)3!vzqgi+i7D0` -$87pj>SBka;HVMM!tguOd%@ASpmas{NO&?*iOW35sri-xotFW=cMlWn06*dL1=`L*C!p07pFk!P)*p$ -J>PuMJ4>1}{u`Q2mOa{5YdO9V?rSdL%mZIWPlN?69OY?Zq_9}ek<(->XPN9N|$I%WUH){*&)jlLuEgI -Sm*tYK-ZF-O4sSk4g6(}2J8>PThXMs0rZI)?vm{FJ_nxMP{_H)u(v_Zr>AHQj>8?snZ^Rd<2pY-{r_n -ufbRTi-g}&Zy}YoWJT5)sVmH`xe8JH_?e_xVxdK>~`%;e?^;~XZmB>->C9suf*NyRePNKJqCIrzT$+s -C$W|mQPyMTJrtAhL2^Rgnhp=I*zuU^oS -O|x3=W>C9NoVD)@70+UE|7v>Far4F@q`5wUleKg6_4WKwG;P+I$o>_S42W3y?xbv^PdL(8*|+ho)+pN -x8)^H!ngTQlsANXjo{o6N3Vo-nJA)PH$it)^h!`DoL`=+t!g33}%F&Ik;EOe*sXRx|Wv;a0cbYQ0tUG -rYXZqc`k0sJ!(G-_mde1p9mZRDZ2*R2^TD+1@$KboYgHccc4c>Y4`e1WxLj!|Iz#6|GHAP@Mr)r&fOc -lV^R~Iagq6N{vqCr|Lo7>>iZvR`?>0Gc3KLjI*zc^judlh=Hjj)0!+MP9CU7l+OI+y4Ml2t4l@7Fju5 --d2WL8Ej{SbwDK6e{O3Rg@BM}5s2xyDpQ9VV?zyf5BKubvrGV6D -k2PsjA%eF4L~JhNM&r!@Inp0o`>X9DKoo2iVvOI4Mk4YVUaaEX -#U%7lF)LD^`QN{bUrC*qT<*MDdGbLo+ao(*+vMKY5EDda -t&Wo}p#o}S_nX%YG`YVqLvE?`pVa~us%LGnRGz_*m+L~fd7J4~{%o_ln~S%q$*}s>PU0e3{kS+3(cN$gZQ ->&4iv4J-&Sa>h5nx42nxT@`8Y@~X;xb}I%Va}kUy -jUhIxAY{7%Jc8rkk8SDq3>H?rKF#uA%Z-T84=Wpj&J~>2w5?R(q`OIeMBG4KeIQ#IKwUE$#Bqev~Jg5 -5?_1*3!_#)qc*5nb~m8pC8(bctjM7*e_JI;T_nSnqN=Q(?kg2&xfYF`cq*$AxV(to7&0)fTNdUeQu0^d3~S6pKgXDq2c}!pD -jhyEC_y147$|5>MIc0lq9qorE980FBnTH?7Amc#Psia^KpAxBxsM>H%|dB% -RaT1z+F9y@@8k+He;=z)0GuNF)aSfFHF3CjRKKrSkmJc>&Y*nPajOOf}QKS#6G)=9y~Z$EnFJ)e`FQq -@=qikSLWGx=4W;Dj&H>mGX6?GcdpUT904#wVDJQ?3AGpka$EG6)TgU2r^eGt{^HOVWq)YqWE}5@C+g< --SB^^Gbqcjb8?HP2eJwvg4=b<$^{-^aZhgH=5X|UOZDl^Cn!03q8h@fI{Yo}+A4Kv5Py=#6KbkB+iXh -t!DN{F0~*vkS{18#l-%eshJ%CNfNU}`8$VigaAhEMru|8;5$fkbYxCEc?%JA(2^B44R`~hvBTWr&dfw -(eMNJh^s9qLhj-$ifw4`sT@)#<6==e-OxI87nP|0<>s&A@r+~=Rr@B?+b5vKBsi(F|`N;rFCBx^)!l} -h?8Rt#CSpH3!NbB`+byodI(+OoyUPu;ptxSKtC3QGP^^{npj@U^rp3E>%bT(ssk!SgmXs*&_Sp|Ll+k -MbocOybKj-TP=&3aHuYev8(o;A5LwXLA3z>T?>TI{PKojsa~~caS~e=K7yGomu64p_?<_t4ihWPjUCv -zV78I!(Dow7j)nqwR-wz7?3*Y;O%k#jP012G4l*nH}P{E$iI=4Tl&%T;GGx;6S=Zwnd&HMn%eP>%HVdVy>QQUOK0jso2w59k@$Olh(Rsx3xJkj1WT -1wJ4aEX6HrRly@#9U^xNBV -9%J0-AxjNIHKeuY29&%hFw;$!T|IW}bg6#9qpAkfJ+m9d`+3p01`4XCk^1x2v;Xx;!+D}KH)LYYvwg!<(!HcR -A6j~76FY;6aF8Bs#kt7&N&eO4|jIO{|SbwCax>?u)g8EKmr=h2t?O#iVz4rsNtBf@@qKoqmWt|{Wp*P -n?wI)THIe~sSzFh@8MAyu+BRK`%8_grY5^KG~CtXd&Wgxb0={oqve>_N1nHdRL<6D_rhrJ*fSdRPY?|-ivJe~>N)7W?4I~%*6w9@x=fpVU(OCdtaZ$J0kSDe -RT!TfI(LEBD;nzwd5rGnc44tE$@)z>L!U&tg&B9e8HBHlr~1qLaZEt|VmuwI{jnTjcWlS)snm)nA!~7 -zZRPBi4Ge{8hKm1GtNx-*o?w>HgGO6Zq7hNW1*SKvTu%{plh(-8sn4x=o#9TH`b%)2nw2QvI4z>n^31 -U-IL3X>_h&jMKTUuZK-dW`o}73`fKGCf5Y{0*V>R&1*qoYw8XDmPDZGPjtgPpdQ|XNPE=_w4P=D4c~9 -CLAkZMSBtHXz#f01cL2K)C+Y4mgW>)?YE;?;L2Nl`x;o_yPOWS*RMPUB8fAnNBrqr4{UJ@7EExG$X8F -+(*Cs<%C0c?tp^3HS7eWm8*V4p_-n0B8zwBObs#w+|n>pzziyoP)Gh=ducA(XK0dEglKW^RimyMFN8>2fbJhm -aXIc`cT$< -*CCAUz&#=|sl6WS+q9r7sE`FN~_wVJpiBRe?>HS0iAMaxgTS;iI3?cQ=@a|evvEPplQVx(Bquht`DQK -$lpw|ncq=T=DmH*OGZ-UchKbCE7=)pS`!eHuI?Qd; -tE~e-9(qx_VIUZcCGG2=&B29SH>JitOMrJ=&;Jj_4MsC$JJ6BnQg5J|LSR;)4R;nH_=O#JVPjZtQZ`T -f7F{4kuCA)Vg2dah9G2(YqaKK7-&t|XIL9XV+Hr#SGY7ebB4RAM{oE$lBesw2qTy^0RrEpKjDGdJwDa;uwQkZqA;}j0lU7139X}BR$C(~u;yW- -(;PtKlryfsDfm!~KUrA? -%2(jvPx;XyLOts{c(w7@{iX9-VqAPs+KEEL1v)xG)fm%2^g;qNaQL&OUD3ae^IU(S*zuh5rcf3jnJIUBoPp)W^_A-c -9meK`+TdPVxzN*{eWA>E|DoQH(1a(k=COBEgI%Mt6hYT&$kNR;n$<)zALdX=F%ErO;X;T2P&_50Ie$i -dSUh5&0#nh_Sf*CJ1(keXhiuhtfG`I{XVF1f;$FDo<_JQE>~5h>vXnDdqn;jcqS6+F@Q{sxWc3_Hwve -MNn$r;GAeZ*XN?g?!pF)_cdaD8?uiA*5n}JJ -;)cX%8n+#Ko@?Qy`QA}wC;7vmRBD9X@;vRmdo{vl`Schl?v?*2X)pl;dKx2)9`!Rc?(F>dyQd(&~3-HGaYw!r6r=y=H!8{!TeQi -G|dCVUDpM)Dp9~s>C-5nOuPm`Pgs!lpbvAYsk^z}GA6g1YY>0b&hRo4;%`p2weZ#GM!6a--emo=;bjA -+r1c6N7@#KYK_>1lnBCQMa>`V3LAN5ol=AhmI8twb1XP_e{I-@f2?dLVJ?-#G#V8RFL-j7!+*MqgWlE -!Ch&g$Y&S`XW3u3}hc@00W?|svvf#%RkUb&_{^a@UCRPV=Es`rYKqu{|*LubJE%Y#q#oDH`%K#jUEQd -|zC2ckVsaXtJ88_Lm%UiK!L^87;4P@~+vdUeLey -Rwa5au%~aNGgsMK9Q9rjAW!NhBq6}MUFY34d_PwYyu@^N4;|ZV5sJ{G&+sBrOr}Lb@xq+VQZ|(eca;y-r|0P*2ZXyC*M+a-cU -J!D+#)}w&I9dbN!9xnp+0Y`P$5COF1b?ZVBefVqecU#qB}nFNwlHV#O3;XLvbNUw_3G&n~M!hFXC)!V -^khn9j7TA%L#k6rlF%4V7OJLH9umopi{MyE<9H0=7u=A0%8ap+&->Vz;L%TQaph4~b3LWw@t{AMK8e_ -Ln<7hqRrZX*#*n^NP09^PJe}F;wp2I}LLTm3R4x-JYp@w`Zfa+cS`#^el=o?;K9ez?hjaMTV-IX?v+@ -Zz=}*fqYBhjNVYu6hPMtm&MHUF5xyr@dp$;rC03JXI4}BK^~0Jwu%xsMG72R+TE~|nQKbkeuxg6nrXu -bV^Yt(X2Z^8i~9?{0OqN%y8E6g7n??ZKPpx?-7O9CsS#@4%Qt-dEuo)|L0^~d?zc_s8?|`jwp4yOP5EAT;QoR{Y_l5#P -FD>M2p#(gjs$bZ9AG*&y2BU=9W{-n~6$5J#8L6bfA=8kg+WdrLaYwfc$DpowerXI*a?qhUN5rnPoL6Z -}InRU&QDRHBF@|4$(GLox73N6lvqhw3F7SX%b^?cvRbnqE$j3C}r1*{o4ygf#JIpd_!t4EVh?O+sEam -R1V*i`V)n8NheZtyuC~qs=fp98q;4rR)|!joTNHoB}HCDYtDN-Vd~L*^Oy+QwW{^2Qfb#}kCo?c!=Er -c*0!Y1i7hFy9Yu}74oaG(rqF1qJhOCJenssxdZ8d@9&JyNcyICCrtMFiSvrmTHiv%Z$xL@&=gn~?xJ6 -3TP+1OQ6g($^_6(?x=Tf*ggSM|=|EK!<0W2oGQIU318^m_6bsZ -Q|yt4S@MK4@zIqPShBtlUX_|7uc8t4H5WtaEyh=bKn(+HPV6n<~yUW5zV~l9{$X#2(hsj`y&P?e1auo -3u@=w=#KCUQ=~c>|$B@E*5gcT=f~s|3$8KGT59PXQ=e2_FR1vCEvU{uHidW2UldiIiicam$*rkNLJ%FzsY5M6}#5J4anh`?V%yJ*#ds6QzPl?T}ZQjkSc|Mz2A2#!7^v>S+Kfo2mJ#A0m-8m0kKs!iP=UwRG) -D<~a_YWp_Gc`h@;mO1tUNl4)M`LL4&9|aarOO8^2GfQ{87+p1^aTKNiR+cTVliZ|#n -$yCoEFQYvA){U&uaw7|#s*abosI7^c -v~f`nD3Uky@v1)cV#~KNU9fb=2w_g<-l*Fm0%$vkGQ@(uXomEa_sXsckkZG2ih_XgET5C`}bV4s&57# -2ZVVU|#d6{!%YOkBz%8!N$rTSmFCpTVI#^Qr3nOd>xeUOIb-DBop+mHi^d3ho0P`q9Y@aU_kQ;z9U8I -)4e-YpsVdvl`}D(F{SKrURTjF$T@0zoXD_2+lLFJ8!z4|yF@0<22s6d8jJyPNF{p^3qJ%QU9}}ZtA}374L_R94Y9Xm%uGa~pwjkGdbMh=c!pz#FZHn%;x@%~7OH< -GB*M(JW-9zU3#)Km{TL)C+>p4-2r8Ccl%?+65LZ{m6l=MEt{6tcQcP+~2nI)x7JD -#{9nSTORwI`b3r6wWI6ygeoSg?qtgp*0sXvf+fI`Qf+a)j(RqLTo=Wv0P;VyU{9geEe;>#O_cZc6+zO -F1=R&$HAQ8ACc5Bf0c8*^>#1Ehi-3&V@;Q}TxW_>p1NJ?zw`$5WP$aODd8>a!TMF!++!H!6Mp$2Gg>@ -sGDm=ObX@@vo<7PvNhzt7gF^~P&^?+xD|w>~r7pVDSnX3gkz>wQ-El0M@-Y{jy~Fy>0CnHsE|M(J -5E%)QWfCu&;BR}SK8ppOswUNt9%@!^Z|0Q5LdNJn#1nqFt9`V&d#E(l|sNOG-%#6uPXtTj_K;Vc{|l$M!m3UvG; -o5x>GlR{c|yXYPB$iEsjbf6%OIX^e|hZ#d#q=-CC*as(Tbz){s;AiU?n-T{`w>{w=@rv@edxW*wlj;5 -h*%*+HoZh8O$n>vw@84A)X!ft?T5UX}vuzI1qWw>VZ|Kie$bV+2qW2@z{S6*8%i^tqi~~xy7irK$7qU -q6qBWP^Y_=m*dUZfuMc|FVjOp&MI=br31+%NP*S=I*OikFA8XQuwAPm)_b`GcDd3V?6fiy(IU`#4;kl -Gv4-2t`x%zC}feN>tIBjuC9j3MUd~a(FR+ -{Nky_UcIw?t-Ifk{27X_N{!b+>9x2$eX||EZJJB3U0_D){+OPl>};i*pa+!AHGEu4J3w4U3ow8ZPgNd -O*1`>38IhBHXjzP3x7z1^$K*aFFI9etp^B$R+zGBdrp9{7VBN(p!lNFTcm0GmWw{1J?|%8N!;liP^X~ -66-Cw&u6mM}nTIB6_h5>E(o)5YPWRY?lQb+j;Y0V)OX>}Pi1XK8Ui*D6rrqqiSg8VTBepdJB7jLIg>y -IYG{rjycqyGYvtAsQ%eu;ubIwd_fS<(Niwbn76UEis-UKONt&zHP&FI@AZ6O%WqZpw#I!$L -%Weu8#Ns&bqBUqm@f18fN9_AE?pN?7RxsRiJJBY}8(n|NlF-Zl6%Ew6l6UT%Vhzq -PjI;4};h1PuZ0E#8<61r9Y=F@0*F??H1s%|pJEXMHgZk_=c^Jjj?l;fGy-l@*~%rQmZF=t=2=-+{qPT -kM%9aK~IukPcHE(MK_rZADTW7Zie?&Cra-%>(bmpt7|NjONwT^sXnP;IbJ -~{!3Nv&V=>6*!YDfMNdWLIa}AF4PvosajV}5yA{5%4INsCHJ0&$A9!y>BHZ+Qo0nV>LKzrO?Yc~_($#hllT5+Dm_%d?{6 -AS?h7V&qq2F5Sig>?^=nh*GXK7={wPXOd`;VTJ$ukT`N&5g-#ut=W!qQrC@JG{A2V&|uk3-%gAES#^7 -lWr;ii0+F@!e4inB2Mx|NRk1SxCKN_gg3E55H^l7<3dScVyj+yNlf$Xs)1CMMERgZc3!Ugt~31a^f#p ->DWmF|U+y)`}nM@AwRUK#$XY`Wf}0{I?4lg0I=cBglWBCT_ge++QnaPlzU%cJQ)c=SMHzDo0PyXcAWAt!UKaPS6->9W~5q6sc -%5?WB#?n%St$2Q2RWYSa(WBzbDcT_cs><$E7N{7pXT`0G#|uXtJG6vt@Mto -^Xw`M%g+46|+!oUG{WIi=i~PtS!0xc*8$!@ -fR~ROwA -{I*A8a2j0F-Cl%aY#x1lQAL-}K#x68j4D1SoB6XFj1W+~*O^W78I=hLnPody)Uo(s78)NjO=r%P;kQd -RI95DBTR;r0BW)4w8EmCu6Q5v7dF^LhU}myfdYtnOL#fN#BWdXm`vG*#TyjTx%wn3iFyC3(Bb_&(Yl8 -Pr2|A;lBnyy>8NR`Dye2cP9?4X$zuX!-IM=4O2M-RN!Dy#4qBe(nO466i7FtCVLDqGtX;Fm!D$9Xnm# -VyLvW+2foA^Xg7~KX$)AZ#xl%p)!hl^X_yu1kzTWEtZ+wQv$3t7OoFDSsb{@tg$3(2j|2SB2F67z1Ce -Q3a?lmixekv71^hpkDJ;!D4pB8%D6uFivgv(en4o+kdp& -V7ubc@=b4PjnFxslW7t8^ssWDzll-H%or*EFO|_W-3o -^z(7jSwd&AkDP7aN!=Vw@nj3Unq5lEJSk8qMXm#)RL|>tY|AzVEF^nrz2~%5R6_tQLzaw;CBH0J{g@} -W68YR^%&X|4JmB#gfBe*8Ty;kjAj_|%VQ4ndD{lX<@CpD^T7w#o?k2<&vs5MYq|lH -NvT_Z)hV3WB(KPpeDC->5-AGa-iNf6Qs)CqaZ>pj67x3BIA>lAzq$mM(?aPWw~J+?;j;LB7Y_dZpo!b -{G;GnFqGzLj(-J^#-bFFGezUWlEMWU`{>q;Ijqok>&l~n?6p5E|U;flBN8qy`W0r_%@-mpKp>953WiM -WUSV3|1LNF+K+!qyR7l36WVj4YN>%PZ*XqFj2Y;(cV+e -i^NVr+TmnE!|@FNKuB@7rKU@r-;k#M?%1rn~1@L>tJNVr$Rw1_>A=VX}mo66Q;Ir-Z8|+$7;P3F{?nlu#cdV6=ooButXF{@B#am=m~f7gs(_gC*cLkp?AH1_!Y$lt;hO=ZDmu4Qxu3? -$X;^ko$yPl=9G&Yr)xvhh_STS?5Ld0leMtlzZQM^X(Kb(bdI1^N+vKjdE^`p5m*r$W?|)iO(z^VSO!9|CD;^vPcy{?Fy^HW{Z8vAH;XayKI05*{nL+3{E8 -4IwCwfJ-`0rJ%YPwx!%mK5qkE!8@gkxO4EBT(BiSB}loE(<|csMapt`%$l5r^R$sH3*pBGo{cP)#lyA -;)UM*vqmq#8<;ho`IqgcSnDa;_D3|AsgY)9JEToz9l!dT`Je_Uxdz3f7ixI-f%SJJm)*__Uh#2e$n=A -8IP%i=$snv2yxGeUOsBhWxjc?@7l&>rE-R2|rG|-tT^T*+J5t1(9(xbZi?%CfFO{|{%91br%gYmS -MHF*6hj~6_r=xzNExl`hhTdY?3KsI3=-|}zylup79mb>4|7Xh2R2@~)7PpM=JXVjQNI=Gq^GIarz(NV66)LYgC_dCT|094XD&(%eOhNSeD!sy4mmo(d@xwl47n)_(+Hw$w=X)ciF{#txZ!fe#yljZ@^ocgUWmud2l=A~ME(tM}J-`|D#q -BNh7W>uQENplvj`wl)Xq45Ug#SOfV(^|bW7KcA0a{BTSWhStN2uY^1mY1HHw^Cx3*}O$4<|8a$mznVGYnR2_z*ZkKIG?`e9G)%_uNI$1U!$kd(ZZu#S;sD3Jhs$Zpz`p$+L(o(k -&vbM3HfKm=jFuIP3LinXbi|9~z3d3gPI9-ms98PDFqflayOM%N#>NP= -Lw!C7SkHt)vFlCh#bITbn33Hr8hr&}B@<)Eio%#NBe*OW0or3hiA)#U6oedF@UAlIQ>fR%|XRqFU`u6 -K@958TD%-|tIW3L((clGcQ@d+bGB_@r&=Gx>jV^hYBzivXRX=0k$GHJ3kJ!48{*7Z}fr%j(RbJh*B=i -GSH+<72`TwG$m-BIdv-La%>>792iTfSl?`~UrCyy7p``*)?=m483-p#Z}_`?{``L7pBC2mKP~?M1-~ovwBWzH1n64-e(CSB5}<4S^ZSK=ttH^U`uB6`r@wCa -^ELUp{o*9cbYE`%rRi-=cUv3&=(YD(zUuCZ%Bo-edUf?0_u86u_pHD7zTe#c+Xo)p@X*7LY<%>0zu)x -O<4-*Kho_$2{LCN!^z5Ji^4BfTJ^#XsFTK2V+xAypeeG{McGm9Ny=U+1`}Q9=_{N)u4j(yMckK9EZ@= -^IdnevMdFq1?KRR9i@h6|2Is4h?O2ZePbLYSOs`2Y@{{HQEP0cMAzW?FkkC)W{a);1yga3;HeKqC%=dQi^UR1ztIV -pf00LHa`v1cJ-ap`VRm*9x+^13u6{wm0{k!`wwK|jhYuFS^m;ul5$IWvCX-I(<-aOlRgMV!e^vggyUV -);1|o*4sw!l3LPB|V`D*x%9h#gyyBy&WNp?1AUpK~YtU&aKF^Ie?6%NctHi -3&EGSSQu}2*&Is?ix(O5Ib&D2m)e|8A7@tT%tNyBT=t^ET;W4=5kI&?7#(|nyUpR~*u6Dfxk#APX0(e -^ZgiCr8$$;dl@7gJj*Dzgh_TRV%q_{Y8B6lD5Q5$az6RMkzmDf~aR=Z+zIGKaSKHeDEM<07AQ6Me3D9 -4>I0qPVgIIwWhK@k~4JE9!z_u_4mPLidwy{Pq*&&@J1%*yqsXZsxX3WWV+8oBA@vc%w{KCTGcw6xuL$ -$zd%0X*6q1fQD&{0yn*jDV+{I|wqb1W__&f%GctU!q2x4TLpNaSf7G95CF-%KAeBK(p7aZ$7P%-xOO3I%JJ2!|<{NE`?arlF{d{~2QIuq1$pNFeRBg1v%7wDnwzxztB@ASP(N>o -N8YO0I$Bwb-Gt4udDgAEtH6wnL{`|sQpPzfx`chH_ls0xA^)IFKZa^k2orgY%I-1gXrG<;_MYj1xvb~ -#^S6J$tx8$0n5%#==S5&TcetZqLtDbeu3u9fALRr`8hPv?DQ2PgoVy$>oAJhqaTRsy0ZvtNIW7c)@W1 -U9%CFl$R%#hTH8AgTLBm0D~K6wV#C#f^**OKk+FN%8sjN1R5+-q2`-__2^tof3Ku4~a`oe$TQ9bK>)J4@s@-zn -VG-~0`U(HxEKK*GKzMGzP%fmM_2>f&+e(aImIte?3C9@Vb5?zXMgilxl~Izda!U^H`WPb6V2b#BN@va#n|}M0_wv2SeP!7>5O5_m>0>6Gc -o5wJ{ui<8hh18*LAP$X4mxz6ZtBj|pBfjHWn63e+7eTD+D1$f5#Yv1^HMuoR3UJ3{pD$p4-H_Bhnnclc-d3cgt7r-8Rl!ai{VIqlK6oC-e{kDkLuAVa?jwE+s4I=9l=+irJ+wK>*I_@{p*4 -H*PZpzbzve5Xi<3w9h7rfIztv{bRKmucGS^IN0gf|q!VccpGae)R&IFT;6&ZPw@UiIfDY^)n4i=5;B~ -Y!>S#FXXc+5uAJRzme`W~ke=x8Ak&&HPBxpyDx}2A(cVf(n@3xP9+s06Y3*q5J9)yE8@HbQP=ZLBmeS -@BtE8z$EgSNLP+T)(6Ybg7*9koHXRH4pPwYEXJm=G3|)RV=0)2lJMzI$D_+Aj9U1rgbiKK+jt_5voZe -K1))q@|s;!k+yQ&wZiw!F55kf%bp}{@H#BRF19WHay(Y-`NHE8;Nof!Mdh(zAvOvU*D-NpjPYitlsoT -g69ZkI38-}eWfg$Jy15gCU$nT4VT~zXF#~l%^&1gS^uO -w)?arMyS!%=aUAf|`eV_K{Z#p?evYxfJ=a>kdR`OC1}EL_KUkOV-yUsa@1HKOhqp7PZug-#K+n3&G@$ --=W?dY-$5`N%1Jxlpw&;zqMQ@Zx)aPv8E;#%WL^_{BIybhP&bk08%bBhHvuJ}*zR-X4%=4D7dX2y54> -R@_zNn9V>r-d=MY%=%D6jRt_379V##->+g(Y{qrJ_cLvt -Kb*zav!kN*z1Y?vtFh+4Uhzm+NS`olQ?HljVlnP-KxXys4uCs%j*@*`yJCs&D0d3g@b&2|2nB{_LgN}!NJ^7KijpyXiZm{~5 -+*(CAlEUl=dR5MMnOuycesjY`vbTga|{7aur&vs_cHf5)ChkmVT7vbRkCY@j)0hJUMI}y`+epXwKo$? -NS6vs`pgu(10Z4Ttj%%ye;xwcK&FtJ;OpB#tNWhYV2W=8_Fb*t7K_#|LfaRHA$&r+6avy-%u6%;vpfz -schv!8!@soA#BwP=yekqrS-5f~CM-C1-)A)?GFnpM1{us9E8nCvo3N^W!6C%KAqiGrorNeeE~hRCs4wM^ka$40~a5T8RsM -ehIq1ay|~Z7ulRw5H$Ig2uS%R-K3&Yi1mh?BA1QLCDRPebR(H~R+W?7d`jAzKDBFR0j)@FfB&Cc$TE -eJWxW*>+=Kq*2WBx;su1t81keav7VKJF)Z__Q=PBWGQu1w?A1D?cBZMkn%6Iqf+Pn^)pC3gsi28*&_l -v`{&lo#e4kw~4}$BmCt}%@?^d&98NLi~KQ`C`ymyX*T=M@4x!f&fkuD{PggL;xLD~*?2tvZB;u)%2F4 -I`$}!imz^qzU_bk#cyvGO>vI2oKkMs1zyJLH^ZThE)j3kjq17jU3F(Xjoqeah9J>v{TpT6MbdsTqmylnpJApm_z -uZyC+WXj^1MpIyQO=Dbgz_jNcSF{SoobZKPLHkQpWeRwBIWEJ0jiRlkU+$LKd3LeC6IYAAaihulE0sh -W~fd|3}0B|N0{}Xujt4_lbKP|0?+J{Y7;66YjA3hZB9UqSSpXK{s`TPI947BAH5}uK;UcwI~JR#xR64pt0NWudW?v=1s!q+6+CgBzdH%WNEglpT-ua -t0^giZ+yBwQe2wuGq?CQFzkVXTA^5;6&c11=vEv@l`cD4`-@y@V$utdsD7gxe(CEa3(T%Oxz3aE^qj5 -++NSAYrV8MhT-OjF3>zw0W_BEvo2W8zodEte3D(!fg_6mT-g0E~CF%n#&|CkT6@qR0(4xjF2!u!i$$= -{1VnmxLLygu5nk)_{-M~{1awFqwoFMCM;7`Z@f93ac_f`Db{QTul3$Mx -R6Dbd==~pekQgy(8>8Gs~jgX&~e{~WbnDMWHE9LKPN%zoQKsgI6z16+x38SrwzC-JR^AA%2HVx0hd17Kw|+BDzF_yOEFNbpZ^dW?{j9gv>S=mR?Q -0H4NZ2EGOGIKFJ)Zv%#2h5Q8`2KWL#JMb3)kKvma1wVjehY5bh0sb&d#B~wy`K!@KlYhXl;poSS4&V- -a^}uTZ$D%-eOJM<i9&jm!LK}cD16(&s<`Lk@MD!uBr?VaJk48 -NJer7b+nzKICLD!9nzZsc-MIJWx$sK{&~EhvjwpKb&xsije -yr(C*-plaPxJ-55WTxC)jy{h>PB4H{&aS|7?Qz?7;1Sx8rjHF9%$OuMBu4pgtAl892dvQiVJ>1FkcHK -J3>6zHO3a39uR8Yp`ztjG8ETumav`#`p~O_XF-X3x3`PykM632>6@@`PUu!2$(!c&?Go-lJHOPp2_Iv -;b%Qyq*d5=1Dq}KIe-h(krw#L1H3C;&|e1lV!EJ7@SMa64$Khv7QnCZJ&CZ!DU2=8LS6zd2i%h-=Gm-zHOkk^3a(-F3}j>GR}GIllWTL9m^0eK4i1RyQ!5&eWYj6H -LsD67u``rjn$KHyS(SQo`ZA&Hv)#x`Q2#LHNYXcBHma)S036-*p~smVH5lx0{p57IP4n%LyI9J3 -JW-@Sn!Yp_-e86{~F-B+ZoG)pY?!49Kt>pFsKx1hrJ$fRjIJA1gt9+{1bf534Y+`0AQmF`AzWxR^B1v -+5~7@0{+o<6#zb3CS70Jls0wMu%5PxLPYzr_)Upz{dd&+l0IZel_5RO``oL`1oVO{z<^V$7TCQ5 -Z`Lp*8@KN1mXo=3+Q?h;i+v0-0`IFUkezCx%o!ecLRLp4?=Fw0^YR+^FP=x1B`r5TfbLfW{k4FeS7iH7_-l|e`~>_B^>+u_Sm2d_2X}}z;SgZgodWL$IAy1xlL`3fPQm9 -Uz_GQ0&vAecyoq$d{{}$IAyM9}fZyPI4ffvx7918l5DY(paTf6jm|BN95paS%j-l+LzDEP@I40^sE#O -`6pbo-*8DR4}Vr&!kF3SJAqTba5=D#QK0$TWgAM<1QA$SDeX5e*z>idERb`rEtLAJ0bc;b{Odjv;*fc -_NrNq~DkL?1?e0LOeJ+M;oQOYofoUIzH^N3u+QB<`n_foFnWN}M3wnYbFf5u`g7WKVFsv?n-M+7rA(; -so!PIKk&7PVlhA>CFCli4*j%7dV~0A0=^uSrR8$AaR1LBu?-diPL%PLlP%Q=TV7If^^oD>X -H%zF604j(z}ru)ft?`#aR9z*ckYlW-s0YOXs7b407T>?HgLw3_Qb(sA8Un%R0<$8Pe84|&dvjMl@5OW -zytSN=wf7{Mk_p3G*?p3Mpi3z^I15*bxqj(_EB!-fs)>8GD&+qZ9LwY9bEz4zW@mo8mma%-!cdxoKrO -kwPvL*-%2uz$&tquh8@{pwU#W*K9#s!D!+AfRs{tq2Gx=&a -%bNZ(#eql!Zs_H&^h**Oi@ptj)h0`!Kkvr%A?u%;W3LEh=~B@+T6Ca3=p;@A(Pg%;|I9gfr8xmOtUlF7~foS?^yy0Y#v{& -*zU%SI$I3)4`{c{(Qqt=-^w4Pc3IUeE#@?@EP#+SE-yw$g=)(e)-+}mw~MO-PyUS`a}NmgJ);Wnzb`OGwDx&^KZ+zeX6RyG+$j&J#^>XS@YRS^@*J?%_4f+*Ae}ds(Q -Y;c?;vE7~}F4{rjsCLH$+cFF*DZpXMh>eg+{Yl2Iy`lfGji;Wv2jU=|k_#}X0}*!c0|naN~g>FMcQcG -IR!V>jGz1H19Y8`;e_-^^CzO=61{En>IcdMjJJcrkN09K8KlzI-`*%r$}i>CW-&g%v5RVv&Wdy)BL1U -t(g9I8xcGtH!cFm#4FbS1n{)H`v*}d#13uCvIc0J5+Y{Zk3JPr?LrqRW|w!m5n>1vU!J9miD&FrkqsS -w9_gp#W(8{mCgNJWx4e#TX;@ot5&UI)z#JP-h1z54?g%Hd+4Eu*v5?;*``gK*dPAz2cExMwrpW9z4Q` -q%U*l!HTKq?E$r^ERrXS&%3go{b$0OJL3a4?VRr1;G4}S`Z?lspPqGg`{E&Th_5^$D8D2eR@G)HAm;^^1F%+V~t( -n|#7|L->IRpMdb!A$%6XgH~f9!Y@VmH3{xo6`qZ+# -~^*V%~hwyhI{DTPpGQz*@6P|Tu*{lcZ>;Sf&#i80>!;YflH?nl5M&88Kk#?p|`xR4f-^kQ^pJ(cG2bg -;7v`=^=!e4{%nFzlS;mZ(y9l}3}@Gl_z4us#2@QCx?4-oz=!Z&)uUkwUVK%o#6ehmtL0ENAv@G&SfMy -l+akt+Lkn#!7PS6TDDD!cHU%6>Sedc*fd_~8gY0pX`3d@jP@f$*yl{vm{a3gKTw_}vJ96yZNWc#ltby -_7%{!uLk_0SG??;jc#c>kxhp!rzYYYZ3k_gx`tqCw;KpPKPu8r2{dW=f_<|9wtvVO81PcG)u+=khi3nCQLNVznVM@9z1Y ->bWhJpHD#F6%xMTue2us|F7CSdtxRTQWoW-iy`y`~A2C8uh#5G*IA}732mOqU^a&aB`*!Ua4R?5ml^% -x7NB9XQ3Y?ZPzjxQJJ%u~xF=n6*BKK}x`%aOpWe%el5PtpyQ` -Yqv8J3Lsy@){1=pH?~hlPdp$)p&_J&XT9zt?3R=93u6JvPwLMT(RY$89uvlzOr!h_fe91lXU)$_w@5C%8eP-Vk|w6 -b2k1hsmkuPWbhF9pK7UMnL~tjaF477PiN&mp2`EUd?xt%;CnN^@>${}GF>NBsa#B)STC4l~`4df3Q#u -C)UIR33K2c9Mx5hs|jl4`v3HJ+1CHJ%mD6Sc-)t%&n0+t#Y*?H>xw5$m!C~J)Q(icB#MC6z(6Xclg<4 -p9;+!^-QCZ?sNU+yf*59pgw5YsKA$F_0yp%2ldo5r?rW*L|Nvf4PSYVFDvL-~Yy3?yp*HRHLJ?R@Qy< -;vNFHsiUU9;ayIx#`oV^YO?E+hp(9N*y=(H+u%rJFWzloTOMA)u04P;1=>05dn&u(6ES8e1AO3t -2iPNzJi;D*^ilTMV~?>XpL~*!6<&DZ1wI~p<&{_XSmB-8r`aPIZ*0L>Vej6(?8uQLd~9&$lhf>zPd;I -1&YWQ$kB6N*caDAY^;djs@ZERcu^)f@k=@&@vgcqv_JdD58$W>YjTJlU<@#K7bW73E-Gh$qDHf@|$VR -F=*fjM3yIp;Y-K&1Uo>R}F|8DdNj}9>#GkQBZ+x1r?{51%litrf-KNsO|NBCbO{G$l}Ji;GD_||^zKj -W1Dj8p!vj#D%}?!9{T8bGioSM=U1dT@MvJiRa3%h;<|bgu!!`bTu`+z;if=fK#(gNF`|kBl%}6&_Fbp -$82e3cryN{o~`}<5-`8!(!w6hQvq0L+9}DetiZEj*SluiR~vXjKl>;MA&dBk{!u}?pn>u9>l++M^t(s!GN;&}S{;74aF2Mpjww$i}ZI9i1BmtRNAr#c@$ -$iv?~ame7-;#>wm}ZpIJO6e(A`6RR8|{NvQOZO28q(!NF)*_%oKI?w_6rKuf`|4QLYoSN;4Y-LPNipX -5s2BNcz+?|=XM+30s({pzc)KKt^^FF!}$^U3-1=g$J3{`T8%zrwuq%m*KQ@ZA3W``tR7E^geoaq%)u( -UJ~bp&&W@Bl4rXrjEJGkRd|`0g|jb|H81*bLY;Ta1DOId%ySId-q@-t?t~pQ~mt&&sFrN>bvj0OAA!$ ->C>lG%)eD~M;cW0vmYvo(txyneEj(F-|gD9Yvsg=6BC)pC%Q7ygNZ90#0%wXi2MlGuCUNmk-p@2@#4j -aEiEnIGinBZIsZK&@1v-LNkrq?Yp)$b{DCjd{~K?-p>E&4T?K#Ywr$%u-)GOBRX_XeGqtX+PCa()823 -kEFh(HzGYIqh=bn3R`PQvlmt)9gsi>%!YPZ|X>(;Hy#<-ezqw6ejJ$m#=tgf!UY1F7uB)e#{*&IuB|5 -5(`{`bGD7|Yx{Xwab1km0&7zW73|t*!OS`RLK3>ih4%&-q0DaNY^8udi26ojS$MlqT)Nn1@4@xo^Mz` -s)^yyB|PP`TqOw)o;G}=I`&k^Un59KmGJH;<`Zokj~$rzKsSC>nQ9$%0I?a6qolS{CkZPYnvAB1JB+MdG7su?dkhx_}{Z<&syZ;K$M9}O2h8myE*?M)0Iz4aF -VsBTbx5Ttygx5_KpO#EQ}0rnTk9d&rrKf-@gQmMl0W6g!Gj0+N4y_6aDdm96DLk^oYFvT0F^hYCzMCT+sj|7s_mqzPB@~fNe5Lm{& -iK2+oh@_YE^am8>;%pv#R=CQ`1|hD}8>Jb07Y9?AUQ{OiavZjN#Xzy`=o$X&`<{<|J2259I~%PB`WLM -<0E}Kf+1oByZxE$^oT?_$K*N9zT9gRn70JYU*)SO*yKn*B(;U!~;mfUR522Gz|Hhst$ZbRo8u>suwR_ --1v|1kG9_X5&zn!<%RbBGxdb(0hO28AF1l(6RMi_4&+a1KptH4rmBuY8j9aj)uxN8ntx1H6LxsFCVmn -B&CShJme(dGCJsbdsH8L?AFfCX@j~T@cx*2nBzKZIoDyl6__q50+B?_isH! -ZF7t#!_S!TBz8LSv?QVb18r6c1joy*& -z|GV$L6ZJE#CK&9rI3n>R5{@5!_(9%$c9pCx9wN)9Cdd<05)Ba}{#)ekzlhw~Byt-V-gEU?WhU0@^B) -|2#wK01%hBgvI~|=?iyP^8fDQf1=kn{WyDnPoc^UL0C*e4dd*nJChsA=dBS#;W4mKpb%PAzas?Q4|D&E&{XbwX -^F}24)!rNVS6!TV^Lo@PPsHlww$`7;2_D^yeQF8U2M~XcoEWuZ})rlZJe -7TA#sS^%)FSpRq|jcbLokEu4Pz4F95WR?7r~o#8kl>4?R`*fy)5Y%1ACY&zcQA -}n4EKJf7(Dts#MS4dgN{w=`?}+wtxdXIF8R-W{=`s~ISm+y*9KlZ}PfB*jdFM}6$qOZ^mZ -P0G9VEeK6$<7$(ZWG6}aT|W)q?LIIvMe`I9#aezis50!@Sw`k?2JK%P -;63?C&qZ@i^%pL`mOvA7%<>6Xn?-?^XIo<2*=SLmY;t5Q9jwbT=tg_l-+at$_`hbH+l4Vjf-K0i{Vj~ -ql(E%vLMsJz%Vg}`sblKSAAyu@2kFFj^Dy_^}kE*yz|Z>IXOA6Kr8x)4wRIX7z|$dIulPgqEq2HR;2O -nzFT}p=H~xWsc%Ph{3?F2}h7Bh6B9>XOV1X1C7Peq$4@Y}EVPKOsmvlg%6+;9&)7JPc`?P -rR;=O7+xUN8c{9 -f}7e_@M0+ZdzD)#t^k3umH#=gyrMX{_@*OMkCky{;cWetgcjapS&FJ8Jk)TU#r4+;N8t8#YWHdE^m!; -)y3@>C&Z!9`bwW1p~eSKVfl@!+-&MiX7q#S!3VALGo4|^nWX_tSLMlV-z|u2KtOmT3&P;R*6<1s#8e1D$pab3TPB7RRj)j -R#*=u84Utcvwc0QP>{@IB!@Xs4(4wP+=O^^>>-74RnJb6(0-QoH}Wo4z5m6d(7WXTelGiT1p5hF%OR# -ukTcg-t}EP(;N04KD8BOD7g2>dW|kB>%Is7H`T@*FV|yaP*wq42-^h&?*n`VS|o?pEjK=6?LZ0}uQRo -%h^xkD2JS#c<`7SIYG1(+wZ+8Md}#aX>Hh+nO)A0Y~%!9YG($^&Ow>%{|DUeP>yJL${EBm8F{5vuD4J -o(>r@M2d@x4IjV&{Wsotqok#!ndjjF80-Xt&3nnkh_8`*=;VkDfz2yh#8kXrZONmTTyn|vn>TM>L=JH --^dp;0WQlq+&p{V8=YoO)qrU?O4wS^iMCskTx8Vb?b51ypNU~*h!yb_%>;ZCxJ%)F-zM(YHZtH0O!qB -g{%dfxw`e@z5GW7ZR=btwi*dOYKsvibJdV0DH9Xiy=)|xeI4E^jid(QvRjUHfsc%Il4`61Ru56}U0g6 -m>~mG+ntC&&prz$Sa+A^zvO@Cbh3&lNA-4ci-*geaI5B&SQK4wA -=oO#d4%!X<-uzd6PX%&`4+4j+_hUb>b@(GM4)%8I)~&L9`En!AR)?A3wzYZUCLSX*wtt{Dv#xXJ& -VLW>E%bZ+qBn-|#y0Kogjro(ZO#W5?*|+7B3sx_uvpqPK3#W?^8O3@p+)t}$iMpUGMj(3hsD-BZT}A5 -@Em-wJvn%WEuxn|4+<>Mu4|l&ooSbTZ~e#SQtk1C_@4NO$Mofx$QH+!UV6#cUG@NdMc$zwJy3aEa~^3 -o^n2@{YA0IiKVZOj62D;okOTY?zLPyB=Vb5UgRSqv2OeYdv9;JS%_&S@LouIk+7124ZhLaxmb`my5wF -|21^Wy}WL@RxXN?h>l~?%He?8B%Gx++6icb<-&!mjUGx70oEIUn@Ta*yI1JGsZs?y;+TyvRNFaE}S@ah7`&=h%s3>(A{(`OaZ*e@|C;c -JZ|nD^l;%`3IffhUJSqrlS&G4{U3&R(FkkW7Ovl$;imKQ{(+XYV)}bo7>Kax&PVckyEby;VF^A!y?J= -I6XFM!SodV>qU`~Z-~6}wV|aw8o>H*UAlC+L36vQs?(>iXBu;!RD1im+NJ+dyY#-s=d~K!PSO~d&oEr -0Gg{+~V-r4g`ef8X>GKV6Yq@WKBl5?uL=yIy^}lRq{eM>*?$dHd=1UK3kCcVqsab$+8Z_n_L%=eR -IEQ~Hhcx#+J@6Q>sYrxPNLUw5e2+XFj2XU?4TrAwElLIbfA`2+qDyN)lyRujt-r|=s8Gwy9Z-7loaL% -)-nHvJuH^7Powv_3h2=Ab#6FHExeJ$Wwc5=XNqHs>L3@(%iCBR+Hbee}vUACFYJXf=+7$%9$nd+$T|J -rC>&{_E&p-zfPa?X)Kzm1wI{RL{mTbJdYv1fSXdyzb)CGJh9*M?5e@A -R%uTrp$DjGS4sW=-<;UZH`y346hyzD}#ji-Cx;p>O@g -2Q{j@PF^T1k>-LS42&d+PIZR>f-cQ=uMa&m%IMVaW|W_Zt=)t+-t4*PfWI8!GiRaD_5qXi{$&n=ir7G -_JHGC{!G(1q+dl{b)#F`UhVc5&?UT)NX%Yy<&_iN=Z=c26yJMfu)H6ExLdf)3=+% -`e4JB@`(KCKw|5$(F!iDKiKKW!Sy&>Xp=&*UUy>AdY*bD3tuQBM~2Jb(u6OrW6BWn@uKQVT3adFPPdG -oT_heeAP8M}ww#rI+Vkp=bxS!8W*&*{scC|K0f~1#KgoI;3z36nKEX~n3rQ>Vr25<$)*lmQBh% -P7dH1{&pERH_TEPJBitu5xTe1EEtRcyn?ldqnI}ebx86pAYD@R%?EK)aQI;<4mK6t?_dWVmtPmS -}rn3EuFpw`r+*(zys_8=Rpg5f!)StLg((?yBGO7)}t``UtV6GUQ<((YIAP*3=I<|OpvRtx=L=p{dPl} -t^3*j5br~7ti9mA#7&zv)%cuTp(DfCKkU!kxpOCRJ!c$uCGal2w -zc@}H8tRG&(^428qM|pX9#x`)Ts;w)+FZLST*yMu;53W1QwaxmhqqfG_|44M$82IU@pO#gtR+(Bcwvn -2X?J1t)+Gc&$vHllX0HO*JxUXrI<@-jE%QvD+4X*Qx8*#aGsC}sJNLg^_t4#z}2f)Z?3Ja{ -Z?(%muuIqeRSQrb*=19eSQ5gy~dQMo_fkWukZPd-|rt>U0uB^5C|B4S|0|VRj1$ao=-n*@7}%CS%1)L -G^zZZKo7}{k=LN+Aj3Xz?t@Cu_!(aj>es9WXTjKHXQ5bPUMf|ujC5kDlwWXRViKcTFJ?w9r*J5e6Sy{ZS$+R3@A=qi=;k`?1-&9L;j^hHaV~i_zI)%keXY)Alyt36>Za4z*`2<2rhQ -LWcV5KvoqSz=QBmE@w>|NVYn}Lo67z`fTf0DCbG|u%Z(Hl^<5x;}#CNUz#upRgSSP+|t&984DDypQ|K -Pqe%6!XOS6^&;ett&wn5-F5McG+7`Ek(&c{%;_$4<=1PS5X^ojEpdO8%7b(|V1alHET&Kf8C~HPKPo= -{cF>GxF_kUB*RU(>o?Q{-6FaDk^qbUO~S3Rm=`v?ONwNJu^RJY(ZY;v>EPWeI_qsYJskjF)k%9voJF& -V?suL%ZuKZZz|GL`3cUU8HE{HQCa+ri%!oUoKrYuaz2Ul`~f=o#o6NDib0CI*TE^8=NE^?~hy1A#*UzSyx*uMt%pQ(axRzOJEed)=P819gpchw -7T@n(LzKWAw~KJvT+q9J>`$8jJNR)q0%fQDw^tvk?p_m9)3+wECb=f -1Caq?4?L@Oz&9%qPeqHGA=I`#0^7r)j^(Xq1{VD!5|7f#|i~W`UwxX9`$FJl6fBY{{O9KQH0000803{ -TdPQKvO&$A@}0LYsF02}}S0B~t=FJE?LZe(wAFJx(RbZlv2FL!8VWo#~RdF?&@bKAJFzx%J?otq(*NW -3JMUOS%p`kchM^J`*z>?GILaT!X2Y{nAFAt@_L+yDLT2LJ*jNXfptzP@?o+{F?FEP%ygv0qs1dZULUZ -<0-u^lHyrRy@XznO_emPBz4Q1}l7~?2butlYDW+bPdDXS> -PS@3SmU`#etXjo|@LpxhbQ)I)yn_#-@M35$t%_v4tTOm^RS2;VX@#)Ph45YnrDYY*=VFR&(u~*bEkqS#c~$m}{66&F9KJnx -dGPiidUf>r@c7`(;n4f($HT+dQR@c@3X!A01lZS;9OfUWYlx%(F~~{{BqFK!o)1rvm8&KE{) -4G2HRm&jf#&MtP9|z-m48u0$2l%Ls=#gei)rk@$=)mqVJ3X;KViw|GVhW33hNKx+RT -03n4n03#=W9(7Njl5?!5-Gmi}-30?|Eqkc!S>wB}Z>gqtmm)S4V$_mi#>Tcf=eZ0;DjX$JGo*6~Zh70 -#-?N9r&N(+jx6;pVkg|-ah;?nJ50XP!j4@DfS${P2jhk_lIZE`MX#AO4D{o(@7tr+qejP11)Jb%_@I@ -$V;=zs{!nJot?5;@gI~AO5b}xBQueGvG??H=kza7m=L=5y+=mP9q2v(WDLV9uyb(s;z#)1W>hp5g}`7 -C76QIZMBtBnnDNLr-h}cEKze@Ei;wdYD8Wd;qR5WnuQlD1ocR3+rkrrVAhDEgPZt@|Yz&O4nu?hh!Fo -(?MHG*dKmx%h$2I`e1=blF2)NWmm~1-we!7lc9zK8fgKxmpaKkvyMLG@qDRgHma6cWr{V_WI%bSDOuT -Ng|!(40&6T0~B_~^yS%fsmW=&y(V015wDALyk4x)8AYrJnDHpRyzksNleu0}HPb+jH~n&W_@v(b*wXC -JhvSK7{;X@K8b+ -C-{^65*PS|3t@>5;p%$+n;mEzS!;Oo!|}=4;fsUwL+>B>9cbYB$@w7=E_E8do*$hY|8kw*rseY=51$_ -#|Ili5T=*Z#hr3^0{Ov>WA-#ME6Qzp2gl+5SwX4S80;&^yeet)iFCTsVj}PaM27?dfqab`Z_>BSK^e= -CJJUNEyV}JK6UQK@E$DgcUS3a@*tPD$$6FdFJXS%Aghy)GXTjIrd8hhEEml;daT|lp920284fQ_BWJT -6P`4aj(~l?K`PlbBQkV{HS+OR6XeN->`qiw3`jurH$c2748>4$b}jpZ4z{q{!DAUOb%=sG)}&I&OqR4 -`dM#K!LlKy$xKb8kYdGuG4NZT;?bf1_s=^1BF-syKnTtXt%C}jJ4H?FwgQpSJSnCXL~n8@77CF1A@&6 -U^;K`ciqpumc)YVTmO7={_1)7vv<*=0 -||KcC(uFkW#qpLmrgDsY;boQ_=aiMBn_H@~70QdiX#20Y_LhljDc_hIBr%vPXT%b~fxUXlG=9&cqJuY -{bfp9`X#&iv(l1WfcSv|>mEG{5n6d?dnfQrYC)6CZP-HW}}G?}-Bms?9u}+@ -OMljZ%e+$Cq8R9$jbI4U|(Hq~<9<;exR_%GY0iO@Cid0YL3|narmomL#lccqDmKRn$yG=>?~Ur{1%tz -Z--a1bv|OsH8pUK=4G58TGj624@ZUW_cYy{q1*tO`jG^BmGAp@@NIY%p_Oo{wvTu;WGeFW^4Xt(5@N< -K1Tp50i^(_Cr)_~=|p(T5@dc*l!IINZ9346giatt4cIVFGW==$aGfpZ(}+6*CHR9~hVXbx3I}YR)=&A -G-(Qf#dTIX%LIg=@DU983{#Hz`>Bl%-H-7^qiB{G=?oc2VO;*#ul9|+iy`&_jVN)BykO2JYa1qeo@Npq`;p|Z;ESiInc2$L%p|kbeDOV1e|PBff*dvhzq+0RrxPvI5OlgMr>0aHre@ -ey{XB)GOj6~wl`elpg$(rvh+}y0REVQj_3r2`lpFIn{Z6NKSDc%Rknu@x;G4kb-)1Yr1f0XIAlEAMc| -!LfbrTW0Wa$!yPjlG-pE5Ugco^n33%GX`f6G;Nv~}yY3bMx$`P7#M(RJ*Q*o^Zn$m{~_)sIqX;O4Qgr -gziX6W%yI|xX82JTZf$p@FWvEXa8Y2Ilu-PZV2#iYa{q@Z;6po*_r?W0V~ldt4t`exG%7Q)F_Mc{Lrj -Zq;a09^{cxVhar5wK30n3LUZSZ;OimDSmW!3Nvh9*bmR7*=jn(c#HQT7Xefa~PT%tk1S!rC4$7Y7=v>|cT}Gn*BzZlSPU=E5i -8dnC=-CR1$b6o^Pe0244?XqQcjL#eQGuUA -SUq=iqtNzavK@ZUnFHoj@daV$pV#JX*s}cif0qZW6)yfO_PdaDYNqW#bkm13NCgh`t)gCHTl}z2$P7h -lVi5XQ~GvM#BF+c1CuBvqDcUjB?lXJ9vs&%y6fDL%Ui~}P29bMkYG>~7;RKui*cM@Nh-qH#-LE=s;%T -w<)SjCRN7Fn1X)`aA$mFNDUoe)Gf_ONM4{S8Cm8NIdr<3=3tYg*J)6t!dZ#cBQQV@9Weq~Y)e_?kKwd -;xBuyu1d&*(ZqG&Gsv9B!ZB$9B$;XGTRv8v4rWPyk)8JLh(`Ykq<4Io4eIK?Yvz#T>>)j(8dg~)dB`e{9JAe{j!X(k3LzR>gR%diXlQNoS+hjyw=e@>{@^`E4 -IVyy4|N*iyHDLh(QKo;okm69h1-TR=@D08Ot%;tzO(iZ -G>RJQeOOyb9lnFwg6g#2nFdzkM*4*=){=0r2<=VK846{P(Kbd$>iLx0{6WP*C&IDWciD1`kPL$C#q+D -I09LzD_8CWenzwQqe6-Ky31=KH;-;BSM>Vpi7!44TyC<~zr5D*l|uLEGEi}*%R1XsQ$A+-cdCC1v!QIMAaz7g_ -x58s@>$E*`)Gx2k2r%F~@h5!A66|MyTU?%vNY4BqTU=(IQ(ROP4^~Yl`cI{3lxl@c+P#+EU^cxA-BTY -)s+{YNP0B$BvXv{>PQ}Th5_$J7kt}L4{a75hLkRS}?q$ujM1gRRW{@LM+le3q`@}cfoD@3o -2T+O0km2y&cQ({$(*w!qKcWV&&z#u2G8AV@U%{SfKU1ZcH{;gou$S}b0uScgK7QA|W@b>VfQz+b)MDX -F5G~h<#yf|;`Z(k&`1Npl>bYs{UNEcs~(xGPg>6%-O!)(eG*igzIKo -r|@F-c|#uyok~T344P3xxHL*ldko456E%NVrH+bjP8f$QJ$?eWr#wt*!{mz5CHGbyx$THW}ZDwPLp%Q -W+T07dQsl^T5Y&0;qt@5#zn^<6tl_eXQuLl@RyqLJbFZ86hBCurqW}Hbe$7i(w~;wD*sr(k`8aq!;ku -`BBI3(i4brYrQ`Ax=U5D+|;9nKhn{mrd!h0C+VHEnSyEqXA0R81_r_#z_`_m1}ouK>pJk=s9~A7P5*& -W0bZCjYCEu`5#AMu5H5Ivjh^3AeJ45FP~YLJQ*+-+&3AJ>-s$vjyWXp$Ansi)XRwi8Cur_1b(jV4h>; -8-s8=IJ$N)h@fxxFu0{LH)Hece$asu*FRW<|jFlYv9NzfgP4a3osbZJ}Qq)DBTO_*-Lt!?Ij6*if>&D -lkkRk&pp<*?>RP^P}*Wqe-~HVcTsJ)+=Q|IjT>hae$3U)!~qs_U>a&InfK@!N)Ignu -)--@~`*f#8nq8${mOO#aJBp?x0R4&a{&SjlI$7ywnbh*Ie1_B-IWe2@YQ*)6{J1p;LE=WxZuGwr49UB -;Stp2XHs3zbCJAIL~{pjj(8`9&l6!Nf)l&|Z)B1kc*vSJO2I0#puN)Ksq&hRLZzheR0$mMp?$BhO%FI -!e#Dn3_UxlAewt(yy+R@kp6ntWU)7>#$}gf(^ny-<-%>G>KE+<{@|?to8A+0fj!RkY|;ixszR*K_m7! -c-m@MX;jvT!h|1SprGYiL9~kWw5h%3ipjtT7R;Y%Fg*hT&HTc4U{$n -7(O~ae|zxy_2C(QIsftC?2ukd1AiOw-CJ5san5aRD>cnsbF-p`Ps>?)VL`IppL^beY4~7Dl9(NEh^7< -LKh3uTJ7U29L8N?+X^$os7_0REnCH3dDrZ20qoZ -95mONV_4K>R9)O4rMr{4XXo1fa~&?w6Q?OqPaJs+)0baM{ccg1-lDMxV!*DvBZ -8Ytgs$6X;kU_q-tpHI3V|@7VW`$mb&Olp^4_5X8d04e!7zn*1kS!68_wghAf#vt{BP^bJD60Gr#RCql -MIIY_6M&8p-$N-fHB^Ve5tqF*GV~jxN{Ud>`gv}&~4(KKseAsx7Z-ug)8*mI90tH4WfDs -nGx1iMzNg$&hNJGXq(m)~i9~h^hbjtIiLp^k<^8vB3=+Ev5`neWBGW#W -YITc~3`{&3?l;~0_e0BzjpwyyzFJo@OjzkNCYJk(^RT@HpPQqPbVypV^gpN7ACG -zfQ$853%?++z3vPxc-K(C>Y8p1%EPM46|6@0zwhe$3=dx@L_Gd`Q?6Jl|V68vghZ<@=8xZIf872Ndh5 -SfUtAD>jthYerAY4Swcz%q9_jX>13oYmIX1H3$_PZeP#R#5J#t>U|_ogZyQ<;lGugMh8)Bip6L}G8sF -xwbyQh)Y{>tzh+}SZNRTv-XbP$qrJQU>8g)(g$WkS$y>tg?!;JU!7`qjQmP$h -oLi_?JsdLOi_4Xs`ccA72gVK$^#pSD0)*Gs*{ztbzp{a -4zzL;de{o3_k(8L3l1zi{`vy+Pvrkwj>_LfdRAi2{Uz$FDd{$X;!z)RpBncNcQ~cbpjRGD-~On?C+P*j6Ti_sUZxY6QIb97;X0T$(<;gJq?q(tmNx|SB@1F@1#8Eu#KK6KEsKee`=%U=qZoHv7H -b9VI-_zCm0w6Gg_R4O0zZS%4{~PxlE5w$TEOcvGq|Sr&yzD-a6#`!qw9Pe~I4IiI -{R6UGN<2Cm2Nlza+N{KaweOX$`F#By8#(b=uR`p|3C^|mUOgG->sfmVl5KB9BW$4+#HIC8C+Avo%!v1 -b`O_v1n^Ck=*Ica*zy5>x4R1_1T*MpJcB~W|&P)i0~#&Ue@I1vSYkDMwwuE__um2V&>e0o<{Qbuxz+V -=uyw`=L5-@itW@*lbw0{aoWG3abvW2zfb5kmWWgKhFLzsux~ZgTLbz692(Tn)ciKMX?sbb2N}u&YN4Sfy-r3(E(}FsJx5*c%ao*)h{9FGIzTX< -4b><%&bc;0Z>*rjM39F-;6%HPxc>&BLGebhk(BT-#DwNv7ByL9zTOmR(RpUge9)7-uT}@DJCV -wkq$ucTjMQP=+jpA>Hxo#6AwtLdE6I>_O%I!KflC*~*(>x8Epx&@U}VG?VKe3|PUhuioa}nzC1svOuL -aH^sIu2_UXrPX*Z}B9?O=%JBX@S`2?+e>uI`Abf9FX8Xizf;&T_-Xh3wE}r|q~2vwzr;Qd{ov-=Gf{a!8=)M<6;)mK8e2FsGBy -sW-|k_BhI!G&QTV>KO8?8_Qk7C_67u8bvj}LrX>Dxl7T%17m%LePQPXM~oJe2tBTm?+j -T6qQ2Mjy%(sWy3*790tk2$}Slow@+>^@*onQ@B$HDh3YhF2P_Z^Vs9?4;>nsV`{+l`Fd30t_QXo2CTD -Vsfx1H-2*jshq~?5Slux5!=vv(Wjg_tFvJl}@pat5EaP)FqhsJIPh -^Hvbf<}N&fKFHV~31Mph(~H|s$d-{4}!Ea*h -edBuv;+Ub}o+hl!-&K779_vChnmz`#Sh*!zdi`bv=g78?MX)+n9+Ebp6Fv`;az^!X^a&%54b2ZeHUZ! -ajrCuKH%de-jC8O>p?gm?hlfNiNxAkL%|B-o&-h;`VsP=jY&>I?;#kp&H!wuU2 -7#J&mpHzw_z^^O0hJs7mDW+kZpiQqhryY)mmRxK3XmPLAK%#$7K^G7LfMdvW6u%o4r???P| -BcYZlJ4qHjd|f1&Mx%J2YMT;XGN)>TOElAm~S?sN&3vZ?j~|k-V^>V-)GxqI9#;IWzlmfz5Kxl$~hpAY)BAEO1`0k&;*b!k|rKVSqeegLS8JkVt~=sSFB^9 -y+?DM6gVW4|eZoatR%2_91P5PsdF3pI8PsNdIv?VC?ow;$^;I9W~&Zs={IU3}zq0_v<4lQK=0U1wuTM -=PCUM`F9AjQIYuWIXRp&iqm)1R=Y;I!u&s9%imBkNV&NiDgO#bJ+1r1L>k;C6_KnZ# -f}{+LSp)LMYcBx>U!Uab>mI38yXrW!H>wZVOyL8%7T!L8S$CKkk*BnH{#utHIQC_grhMyt+R7(L;j-j -Euu$3HEsGM<(Xn>{)7D_E_S6B+STqW8%hu=6Eb4SS`2l`suj)D6&?#ts5f?W+VU&(u)%@B0(P)>KrnF -Dd+YU46O+4oVf---GZ(Mt$D?0B_;hA>`#%nd@-A!lFDCSS$!@1U~$=XBYBPM7@)PM7U^Z%J#N -D?<>!V}9`6VUY1l~El*&Cb6ka^@Nj~~y;;rI!NNZL#CXWPaU{>x9nc;wwR&m;l38Ez~>a_8Dq&44&wV -kO#rZO2Z2a>KGx|k43a|{t@dl{G6d|5H;V8Z~HHU*xdF*^PN9HY#$bV^qP%A_&aTq1PV4oa{^1FmH-H -E@gqECfYENdH+AgDQDQ=}}-CB>)-X0nA#u6f4~%Ur>c|t$KwQT>!m^I=C|AoFX9FTxV0tlToVz((Z(f -Lj9y@_eE!FiRn;jR^U7+|JjgcO@ph9Io8QSQcA}`sYcjU7*OnUR+gacuO&4ai^-U7XqCh3`Diicdc|< -cj~^Aaa&`o6)STl*#M)?Sa2NYXvC@YRtZ{Bu~JqfSLjBnYoK3C( -MwAu_=+K~txEigfnb|Kr$s1_b&+Q3$jC}+e4Uh<99Vz$y3@M -&lL#ICfNVco*%pMDq}9ltuETv@Ui7sy_4av-WeJ8P&tZhh+wR@f)2uTsn!vM}daQ8^T_q>Xr^XLhMFgnnJPq!SZZ;wZvq-33h -@@^^DW8yvXp6r=-_I3ID@dDe?lS>S#e6mG{RoJI;aVB^1lh>Etfrw?QQhf2Q)ADWHSRm)8!w_zpYhG| -P8+RVoN=hd=<_Vtkqa;Poo;@CH+WUP)&JQpm5VO8=|&pgXy+?`&dG71`VlTRS>H`K|^IlW-VIwz -sV)oFNZ(hkpMjCqqZajjH?RwB9od!uEBPX -`-2) -&odNIQQ={gWs3PRh0JU#?|Z1l^A-SUWr-|-=#F@hy=;IY4I^m2ghkUte8+0v^$w;}46c^juYGYXj1Fx -~cwak@yW^yNL+*19w>_F&?7h)#g@B-n{|Wu;DeK| -Re29B6w~YemHlwX1cdBG(+TXOVHWb|TwWNk{%$i&1wbmbC!X327y+Hdfnu70A#}Jkm>E7u`VH4Jnm7# -RPYDP@k(K5+b^7SrUyhf}L@lc7|n@RJJdo!GfeSjDn){{_re1fA{Lu(VtlnTEw3+l>h4Y%D;i)(;`VT -y6w3@{uCHNopg}<0`#Sk_hcylF)!!Ud1qDXXsPjBP=g#(O3(+FD(4D}(6}y(R5@ZKLo}8~*o$P5lbw{ -`+voN03UqpHrf2c-x|XKB9NSUdQdMdf*wX=wYM?u0-a-aV96Uclvn$^@Q-h_Fb+7`IG9V}nr1cSGGg6 -Za!o+g&w)*-U91;4>=WzwdSkS@OX7 -l6^s!Q7It0HYtfT#m6FstNT+CO8Tcu)wZb+w90K@PItx4-|6E;`C5F6V{>q!Brbn{s|L^x*CLZD*qIB1VGJsnnFXE|JFfJaWXzcqTH&c5cSJ>@+iQmzlF-DS22fANYgJ3J{tmiPGH2$A?`HXv~V*f8rLX4G8#I^ -*~Awf}33+=AONX0A{2L@6qD|LD%n&Wn>brw4D3p1(ef-X8pL&PPgZsRV_UdGqxSi!gQ+rgTH-YyBirb -fPV7E|CQ(5XHRfkaUxMe$RylJXtYab>bzJkN!H#Fr&9pa(t);-S_gzJNX)e)|1@69mBpDBcWI>eF>tx -K#mqVuWf#fU)1V1-oiK6gt`LW>&tlTK<57eP)h>@6aWAK2mmD%m`)?_XZ*te000sJ001cf003}la4%n -WWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y-E^v7zkHJm@F$_fS`HE4_5CpyP2R$J12Pm6(yN0 -Y&#SYc}Jubb?j69>~7~@B;vyr0oD^tZf`i{@Twk|k9ElbU#qVY2FVA3b7eSpPiNN$))=+cf9!dWW+a- -E)*mQ{Vz%UGur<1X$7d3k!qg8G)emRx?WeOTIAO9IZmDwS%OnlA)aSVwNRd?WOm6nf@}gG#1N7yaiYac~8Wy_KJIwl^N+HG={s2%*0|XQR000O8B@~!WuZk~a&H(@b -%L4!aB>(^baA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4gbb7L-Wd3{sCZrd;nz3VH81cjX~F}9w -D0y(Tf1_T(=p-E4}AjmSEXj3FZqPO_(C)rW!rr2~5P4YcGKFL#9yjy^@l`@ArXsKR&iWxR#Q&`!ibLw -y;$X7GC{qXS?_D6(o9UZNKovrDQa0p*)Ybrs?nj(O9i12l@T5osjg3biORIqy3?jJYzPy2_*T}*~PHk -nNBh5Xf6M;>bHK$%MYR#huBNG-fa-(&06$jI%BfM86WA_A;Wk?%ZXoC~cvhb4T^q>xACwX-MgZR;dva -|lVTMXCF^_GrSunEhakk?ZalgcSi0IN`$khKAu;VneX$>ucw%8;}*&Z@crRD5i?eu<_bJ1OggvXgd>&xe9~%-gPm#4Rf3IX88W#oe~#2%q$sb -9Ct+k?pFiVgugtty9AsHvq_3pxGm%qeOL%2s>dWJ-CdeP1uIlm0sbLOfN9ad=Bc-Y7#c%yD7EkW~9K} -Uhcx}Z2DW*e6cq*A&L?|O+c8j?+FqTviP56kr4{`aeAKW2uK -)(LQkKG-CuySl2n-d#PX=J7X=&8k}G<@TBB+Rfwtz+X;IPfpE?YJaHn?R9IC7c+DAS!e37l!+X> -FUTt5+5mxiPR%1;5s2XWI<0&kT_C=WGSw0JD>me7CRa)>MstY7YKmo3$sKy4u0xbf2}?Mjm9#2EXdKO -}We3mHWD?io!C2`jf5evSLuF0%@}vi9I=K>%+4X1Ap>h`Q?nhE`I;lv&H+5Z{NOo_u=LD=G=U!J9}b3 -uk5}xuW9Vdx~}SH_3@3Nx(T5QTT%;@a+3Lox5de-J^`-_(^oHRx`XQhu-6XCnu{SYZ^oJCojuSd0mw|Tk?+1cuV&%LI?JFd29}7+`BAq?AqL3+YG{# -#DP-lbJDzO}D8UiWyAGSD=Fp!73|I&~A@{2Jm2TW*SC=Y>3Rw3`iY3-{*TfBZU{zbbB9&Y6e*Bc4(GX -RadNO^`$iyz;v*F0QsHG*1rmJDb~-LRaOez8h}JFaX0IOz$GOE{v1QKmf-;>Z*#C-XdRuUrKv~|3j}V -2%*(+5Z?e2-2m`P6Kf?Z0w+$hon*IZDH_-ENh|~48-IzeflTA~v=4P{Q+PNugxoxk{pMLwz(O$Wqr?11eW1;#}rtsxYQAzrJI?{?)ea> -QY@&I$YO{mOXm&KG>li6mb%a=<}iwXSpx37EMO;%&e~M>V_OPu4HgcR4JxHpeP9`7?Ry8YpnZ0JS8GG -o0;?T2#0%TAvLpEEJ1z#!e+mSg+)Xo5QO}W{UI_?eZ<^Nt{yd4q!|1G0u0m}BA(omd1O3{8S@U=vnfq -pnhSk&dB+wuEr=lyi|#Dhln>jnQ-k)^>?)Xz5?=t#6{spoto;m%8;vIO?7+e%_km$B_2YGh!A#Y)vhS -e{&m8g!b_{t4y9heS>ZUS@qh)TuQS2$r?A;|Z6)8TRW!j#d)5&UmowE$2`W6f{QIo(M8lw+#sMdnVciX8DmpG;PJ5($)tS;`8EY1!H~ZC-M`vC9q^$7D -W>lYxPbsI|`<7?i{od94ygBmP$9qSN}z65Iva3U(|fp-%T4;ZU1B)o1sT-BTAN{qesV^|3i%>U%MN@{ -NA-jCdtkHn=~aA7WD^slzZ6MO<0oWE6R?p-trzq=rka;Nh6DAJ+32+uP)`@b`KkTf+H##pvY!G{FeRa9 -a|JN-x-OwnW7{NxGYbQ!J|SK-iMhIIU``IZA}?>6a|+nzg4#I-*mD}c(4xpW3HCfzcv)thm0JL_UBuv -mJOa|0x`A8-f(r`4vtAkIh`{?nyAEU*4OmuSh<)JDgrmjR8?k^eB?0GBtzfk|WoM{ALb~?mc19(hmanu7Ig)x_xSjTN}TW==q{^pi% -V^IJ8q>r^SD{8c9|xvC{ZQpi_MIo2cA68{`qfpcK7( -Dtm?FjKox()wRbz~Jl!sGooCTzSvzzEzQG=Ybz3$ey#KuKUraEtQBOM -WW^0Ov(HSY+9D*A_MxOC%^gj@vzO%{7*0TybdW^lD_sBa?Y#;~A -M?Gu+Mv*`@WaNT(WK`02Xu59n5MZzDzpWN#M~@9EVr{PZ6Yr%;@q{$SAG+bytV@ ->8t1$tJhc8;$Vm=N8KBb>CwAmTs1+hO<@!SrFE27tZTufOQn)}5Lk0|E!d7*eOM^p$lAM%u&PHlv6>g -afBwZ6IVOhRY&YR^Y=raVCyxu$W?asURK#kP?c0mxBQWDo2x>r9iE02SOWEH@ -!%3$#f01s9K#IGqY#(WO*n3y5C#-!u5SbiocE1%&>swbv_2WV0RJizai6^-XKYYU2Rk7YHlH!)mfE_k -E4x*QDE#gBaFZONQWdFc&>&f*L~0s=7K*RVeYSCeV5WI5{eO@gY#i5n9MqOica1D<^0K{q}pgX%ooelQ -sEZ<$Qf*u!nibWSTu>?2K5r_b|Co%HM%G1PFmRx$E!aa4A;yCiahk>_<5jgE)Bv`s)!#RwV_mj(Ou?{ -u|bN_fC*f7TXXvK+i(AKxV##MWb%Sf3sJsAH{=vF%ws2GMkT0@3bir*bCJJzXJdQLEf->tEhI;Q7MSa -*y3u&PR}hIpOo`wkZjOYX#LkcocxI0h;#A`}5qE@)o31FvLONezx+A8O0yrYUM>_&+rZw=sml+ZgfO! -&1m^)?p{`I?L<_+uIpDymFkx66{6>@2n0rD@6|z{F#{-t0c5E3CcT;) -dcxsZrrtdDC>Z;i6r>gUA6x5MFv)R80fVkY7DV4_q%6dz9birI;!w*&dc6 -L?sURkE;Tr0jF}a1v@5loqpd_oS%La|Zo-}#t|gNEgiSN5Gt?wkuTro=4Q3mWe+c>!0Pb(S1j54*0Jb -~b0{}4?0U#c0O^4xG-7<)PQtWZu=IbP=gpg~JO0a=vbFRJPm%8fq6oREeO5j>cC7d@dw(E!Yf(5j9dG+oFSF#YuyTex}mpT`!0_y5TjY -QqINT0+W`plw`m6iFW`;KP^-pfu-`?U#H%nHz8}%c`;GPe6_8!=mm=_&6{tpog~*Jj!t@$(ejEs_oYH -D+(__m#K=7?7@fSOFAs&h3$HVjolndQI!kRGk+Y|m21mYf~jIX74J7y7*h^bz)3L`CSkWt#{sjsnJnS -gvk4{qh?veN8m8par$oavI{bbY52fu+2ut`r(w8*`?~rB!Pi>OfFw -roa0x0w3r|qOvzV^kcdh4^4&xTEsoUSF`7Llgg>gW#WB9)4v}*te+5YX!!TO63_PP0airX`N2HgHKowG=r>GT&Gu0t1qLo^offFY_Cao2v(Ulgx)F -{M49UIHlics6wd!*!xjDGif6g!+)=)`celn6|Amh$iVM%W`yv*$5rJxszmnKBibJkU{m)J-}Zfxel@G -m-zmY6`eK!F0(ZxTkxH5^qN2$7NX33>;!%?qQ>$!@#X7h=I1BBOj4egC@AgQ)CPRX_?^sw$W2k=Q1(I -^QZR!K$Q(9%7J&h64gxv&MzK=3$jt5h$k|5#CXQ{{3XR)N{Nv{-CAgCnS|`-kM|fc%gc*V)$IcdU(8% -V_+@i@MN)9|_z-)|99)M?vRbN=g9frNGKpKTc?vxQz*IVo_=o_GGE -ruvybAm~{!~Q8n>T^oJp?w>)*XS}Y2gV;?mI^r6v@wE1CgEQdb22{R@hMbuqXC^F*<%UFfjW0@{aNr% -t^ELI`RINo1o4^&inb`Yd|(eV5}hZvwFrWp~0xVNb9@lJ$;^4nO=I=a+B7!w2d)MZL6tEh-MfJV@?k=Z -{&4D2Qw$v%~Wf-;5&&kDvV<3-9pKr>~OV2a;KZ@{%i20?MubA9`Q|1l~LKc*}%bRO(AnmP%Fm*ze1gs -i^SgeETj`34;kXkpIkUK#F=rqEvCqB=XB+%X9nSkCA~$$!PIWE4jR)2YF` -(-gSb^vN^Wd-^@T&&|8j*}T^R>1r -~Tr#fOstoZEYL3@jef3A#4|C;Zy_alixPHyj5-Twsv#JL0b`t9QTm#_Zx9P*g}Bm9$74L;`(t!U;h-= -dydki6ThxN(~?QUnZ7@7&z+o*=4odQHTOW>h1KYpseB>E^HnN*L;km}JIB&UkxVmOFwB+n-+@0e_$P^ -#3Ap3WR4ewiaSD7InqGYVrKti$A>n%ge>9H}C%Z{KI?9Te-Bb{esERGm}I$n7O$~!d#7W+}Y)v3l~!? -I%M@@@)5JSR6QOBi4$1@#UICDF(h*jEb^Y0bo1F)XWS2!9H_#?@CpNAJhG3Mk -CrTJdX8{-Lw8Y4H;ld;08w$}!IUObw#%fF6+F9^Hu5=Ol2)eHDgL|Q`JRga)wB$2)-+pOw*?_1T>z3S -rUz!M&-cbG5EE@w{T{mRk_Pmrh?HLrY -V-P>CI8Z$3yd((7mtvV@hadq-!MRN(Ea-Py^{Sv>Apk4m)VNi??lK|%?3>?ES>&w6i~Z_(xoKvd#t`9 -BXKV&`pOI>jBK6D>W2t|(~*osL{2{ZTa=b?fBY~d`S`=z=P&;F4`n0^dI67ePzw1;NW)n06T}8M9WRk -&^q#iHr8pA7m%>{R2BrN}T3s>Ff&Hkl5H9y^bSyRLdqCVgK(}@UFEIst60q>-q7nMVscpo)W9*8o5Ux -P?`FJ;a*G`7(UBE}wOBTogh%^S|L6<-r`S!*PAoqHIxl(?&hC-s7~PwGDmu3kd~XVH!77(dOue<5$DcsQizWpX9SCl1uj?9xWPBSNpC*i)y7^*w@4QX=$az@&#wdU3T%HQ{!Ye -(=_2(tT>{S~aSm0}KSz|E)ztW*sD3@2k@T*9o{*eaj65DiD1%Bw+S6R>Z(D!P{M- -!ycKvILo@%b95^Irgp}V^f1*(9}Hr9le*!Ow)9#*UHAOcFXkMV^7hvA<*&MEIMHejfFI0Jl0>af8(WYaj$WsYNe&+&{LUtUmGXG;CL@Dcupe6F`sa^!dP1k;^5GO*(i9(djeVD -NJQ=GfUIO}yjivFCTglgA702R?%9y&1;w1IGn6MD>D*o}c*oM9=46qv;-2ZnRh1*(Nt_?D`Pr*W?p|@ -BWHG{BrDZos~j7)7mSIPrF#w{^X{@@VN -u9$(6FpJh=o5MDR0M2)MbWjJhG)BOI>B3xOZ&ASY6GS_*fF-B`h7JcsZ#L`YYKKv&tE -dWOafLVowf%4_ZIb88oHZ=fI%j=EU9^%yO@(@_kE|#QhTK#|}#`*q=Gn+DIiOr}11Ca0ctqW(`D>d^r -7L9Ga*A{-`Z^?MYTepeu%?ze!PRwEF0Psd6!d1;y<}`E*bXsZ8lFIshN5#CX#mD|P|rLaqvoMm0Gp_Q -peB6MkX*#d4KbhPwl`YPbp+`x6}6ufa7zk&jW;+~8o%8E#7UC9+n=u90E5H5@@%`<(2xtiu;@EW;t^< -or#Qh4BNRIc))nubU|XMh~A#6F-{_xFy`hHo>EfizIb9Kk<3qUUzit*sS-!jj7_rneGAMp&y~0$+Uhh@4JL|NmpB+3X0XM&!(!b}w -L=YLbxERXU6bGzRLTS0><+YsxHy$e5bY`{NyqQ`a)sB!Y|)i(WMb6j@x$Be>KLT|Xa4p?$>ZF-A~8?l -QHu3{GgIiRMY9J|=PD%XwtAI*0}llT&*PX76SlY8D|?glF#8Mn`-9j5Hj{ufY70|XQR000O8B@~!W@~ -Phu=^g+8RA~SJDgXcgaA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4yxb7OCAW@%?GaCzN5{de0ol -E3?}z)Hy@l}L2rxW1fQx6iSi*4HHVv)nX$wpXDj$YM;9T7vY)_IiK&%?tn%AVJ&NcJGJPdu=2V7z}{< -o&nrvqh}))WwSWF+-7AlAHBvWYyGu8+sjsWd3?Djn7=n*8!ujNu+s%+$9KgdOW8P^7dK(f+1sp4XJHX -%X#kzZoU?a_dj}uJ2SIULurQsmy`vAOCx>r-IXyZV<3nh-*6a0lqlgQ^icEp@1R#>me67guw$~VZD$s}kG!r~u1wp|Ja|txYCjl1wIShn-O`?~)f2*=Dks%;SWo;gWm9*30WKcRv;8<7Ifo5 -r`8K&aL@-f{jG;sr?`c3tV#R8STyFn&$%c!F(g41z&O-EX}@}B|N==m6-84n}~4ECwkp|{NF&XX0-+Q -$$3%cDYM(rTeTTSV`C$X9<-Z4A#>dOfZy_{EW&BRWy8tw$zd42Zcf-Qg|rktlNT7>B(pAjc0-id{RRi*?3SOBJx$NU<;1B)RdY?W -u1dAMYVpmP!pq+w35E78r&2ZV7U-~sk!J3FkG7Cl0sw~D4^oXmQ_TsFY7(d+GtAjxic?ho9n)*g@+@k -kK_LcUUs5%e!hy%&#zr5y?pVf*zz8d#Xi@ZrO#Mo-C`@{Tnp@;NY4lj2swCmy$fy -@3$fF3P``>zn=bd^kMSmm&14aumr6MK$B>GiHkCW*Qysu3Z9BG=ha(1*UKcE0$Wti*VKH{tf(K>D3bU -Of}D%2%t6s;sXdR=8OUedY#K&a_#A{`bQNB5+$|DmlSz<^RT3Az7kESVasW(S^_oa1&{%%)n_vcYQ$P -(D8Uf430siBAAV;K}44{QqcL)XOkD}@~WOhpsgs{cJtJ>ehpx<=sAQTf(z)CFr0qP`S@7ZL$_tU}qgK ->asHDCE+U{Z#)XLd&mgyznI$=o6<=QqDMb|4rl(ko)iJh -w9njkuXqWnQ%a8e&JCu4F&&wJpeG)K4@wqngs$>AmNFryMvSP#?32Eh~j -(_W_{*c&lYm!x*si6NMG+x_pG&uHRbXM85~IS>a$)0KkSlQc^;L%~sfJ$gabrB$`rv?XLE+$UeRraj0 -N8=&d!PdMKw@G$AM~qlvBT2620FrdcVo6S|%W7efIY7)B6K91G^W!i{y^MW}*G3tYNm` -IY^i5ECm#<^#)n5AV7rV -Cfz(c0N*;VV*n6NYTF# -TI19*mS4}ZjMLLvMiOZnR5m+`@gHk{~*b|A{BD98;WuV5&7jvgqI03Y#C@*Ai?IW>ybYPl7bKC_!hijAb>P;fdG7YsO)>f1 -B`#=8Uz~qwMTL9gPdz{ZH=kZc&lGGc$Oyy5ZFkbUdMTsI)T)$8$ddl-gw!`qSEuLG-|Wie!kM_&h8V9eUA3YCErLZ)yztBy&_(ZN -(!AP(vgu)0%IhZkzfh-fBz(Kip(Ay)|MW7AE*xZm<#(7^U!g($zp&kD?wNOeAeZo(K-zQKFe=z)8Z`s -e14xby=RQ>{eN8Hw#eC;WR4?=4E1oFNt{b7#u6%u^$}Eh%tbA)Q(x~9v|=Tp6>PrsJMIo+cU{UPu@u? -`lTUoJ6cu?fz81sm*zuH%}m9+bl{E}Y%;qA%p`-5MPPJZrL6km00S>^7 -@-8Vt^BwZ7Qb%c4oi>G;*-(l!MV*yW}&Vr}29(&pX()=_ntF!Hmi+au4=)2Ii(RHJ#LoAvLWB^nLXMG -)Xi*@@bt!09VJvln#1E_qvPQy`07y$1To -VHhGCT$u$U6yzG?+L*pJDK_M7tGjS{`~Dg91{fFWUjp=OaNg{{;q3ogNB7?i#(j)Z2iJqwztXIzAJ7vrTxC8a$W}Z -x2#%*Rt+V4%S_kAE$H=+Z>4_4)T!sbbA_`Z$N0Fj=jY0yhE8;MxFcJOo4a)%^kZp-CEE55r1OjZILLg -$k*Y`*=s^@vU@&}}%9*Phw(J3)@IUoh9uo-G`t-gnB!}e$K?X||ldedj0pFHu%e*<(2o& -(Q(#s{dpuWT_^ELRecQq{f(T|u3g;UT*05L0Y00|9*v-aFxhpwNUU(3()7iUrWx<$~2gTGf5L;!z9>8HLI%l=86 -1m<$0*DAjz)kfERgsyZ;<`87`!sF=Jk&$p>ZXR1Hr=_xLumRC_hYDYrk#s+fq8eT97Vw1Vas#Fl=_n&==x=FF`T098q+3( -a6hGO82;3-h4eYuwh(CHH;jx&E{c}P^LsuFLg#U;l5QcqXHLe_u$i_(~iZRGanmT`UQDwIz7#3XAF-YIvG=C~YL~DyP^!qQ8vbJ7THlA|?mcrv;~(*Lg9zsZCBKLV&z7* -!n5DaLw$=PE+ioxA{`mt8GZF&NCAh9lR~nSsbgzviU8-PsiVME&a_0&56X!td(BGQRc5VO8@Y%A^q5G*j9B+RfC~p9sp;415=ofmR$1Un)1; -Ss>-tp7)9Dfdf%_SSAfD?VkqPo9#}DH^NZv>Ins|SLJvYp$H3*-(W0)*%eOXc@kb)>0K3@nZ@};5xOT -Ijh>39!edXF-%8{RDcYf-xe~ygP@4h0dNR5|%=bhAKH$_F44YtJ3VMoO6#$9T7&>Ci&~K(@;sWg9_#b -k=msDDUo@cmP0j&dh7BVb(d^A4%gi}IF3+li^l7%zsO2n2VU`*@b;RhY{`0MyKq@y&pZ{-VOiax -GOI;1Nl2MA=x{rMN^L8mGW_ab4jhQ6%SO+bHuwADulFJ=jM*lF3M#J}}USWgIwOufa@mK>Yu6)?@xtF -+gafEU0}=qG1d^jl$Z84ukH6T;1tByBthc@YxZ=#l1^Ojur(Wbn|9l0Y7$ypg;fDFSH)(|9_#6Qnq{e -X{b_z=m*|_J$y+rhYDYD6OuT+;#ge+arGa -mDBPz8Bi9s+tCaFzAZ>FV6`79dbxS|Wbbtpr{%QB*VBeE!2OqtupIHJS&C)+66h55RfA6 -*i$4YA{{0`sjAB;~4y|y?r8ooLF;BJd?bw~Td4}0%^**`e`YomE=RWHf5<0ES11*^N6XFNanbf8}FTW --EkqMcrLUb=z6`}OlG{UZZ47_P9Rw-~%#Rnc4DPGe>TwXucW6dGUEvKC8? -^c?@J;H%TO>WExE!goRIjaSztjXpvgZ2uBGW=*t7pdT|lORb`+mLE}8L$ -*tUhtW3)RpSeyMZ};eRSf{gG(K458Y?Cx3?gtIBp$yb2nj%0b7A3Vi85MO$;lfqyQ9+g4-s3x?p3+St -MWx@1ZJL+(D7yn9dT^F3!T3P*_qvnKgS+%#GP -6{>FuG+I2fECay)inf26RT@|f^&p|CyHWoFV%9M)ZOf=61(>z`8kwV;1gHnt*1x3jEgIJ_?IjOWfhiL -hq>8{8MYz=ov$pT}tp@jNoX)ZvK?gtHhY>p(1F?FT5L}kgf{7*e!=l|np+J*%%^2Ak=Sn7ykcl1{-;j -lbNtRvVc9ttic41V*sY-^eqj2?{It&+mI>M-^tW=0uW!W-p8a0^8z>y;B16Ea`aXw?JmO_xGl9?}DC! -?H`oQVZIyhAcwgxCCA0~E|^9%99wbYsGtt3pla5atGave%ZGpbe*U8);RUDM8^8m$HZxv7!8hz&V*SP -f1H@NK;j6M?+&4vb9mj+6DWrIuh3~)F13H5erZ~Zu|b>&S^HwTAiI$yKYce-SUVfL2j#?K4LxUgBKcl -!(hNq%LKH6Q~|LIRllqs)HaH=3wObHkHN!r*@k_qC#bYL(m>N%9$-!lq>vUUB6uuHo>xbLn-!61ftl1 -yY&7d3n+~uEf8YY=s^O~v-3J7Z-xdW*7EhPrQAq<8jZArx-AK`bvzMyG;!se{^D>o35-8C}5~rlno#p -{mXm0eCS|=_>x_@9!%&eII9wxUDY&EB5t$Bqz5t3C`Xsy2|PYroGyl+Ce55DTwO{Q&2xEp}&W4qfKXy -dW!^co8-}0V@hi4?Bju`NlbT!XuRRk -s0vK?hT+HQUPd=F=>zGbu`VyOb*9+vO@|Q7$CUZX3gaXtY+l#aJCk8FnZNAd0FE4VzoHFeTXBtUq~cW -MPWls*#hove#y2B3b9 -qzMJG`{QNCJHzc4WY200}0A%M6(z$eWmg`4p36hgse>Q*+}j% -V4UZM%9uda5cz%BK{9NFG4E|?i3?BgCRpi9Z{>ILWi)W93(Lxmila@h;pRR=ZZlWy~Gyo{81C)`+GwD -0ve83%#3M{6R*b)u7$UQa7ma0v5QS^tS(}QhE*Rr@SMB!NE;Aup#!_zyqyIN6wB5>g+r0H**BEFAoLC -y?x5vX{>MCD!Rz-X9Wmf< -+je=U&nH0kAIr&Od#^#=hz3!qySK7mu^mT(9WfRgi-03E%4F0 -@Dm7dHQRyWaLJG3nC19qp%uOl7IA_MvZf&b|s9s|Et`mQ$%}bo0%-~W-TuHTvwdD;`Ma32!kVp^TWn~ -o#{Dfx&9zYxp}QEfb{+I@$&)nlK|R%AFkWQkCu-=c6Ti8GI?bl9C>EoQU~44GbhFei;yk_`eG|Mge{XG$wt@|vm62&2%raIP=M)*OLgFS)M|7PR^S3sqU}xw) -Fju+{40iP@WVf%kCR^ZJAEpIQ@XNvbt)5zRD;YDaC?>&U#t-`J)2C17>G!7m_BgE|+>_LMG7{nJ9+Z;~i>IG_1S>Gfbz) -(xG)jh~wC_zY&2^p)GIS!+RNX5XAsj_4Y9kAAwi1%&@?my&3PXAB{milHAY3RG@#PisPA&ywE#F(6~e -x#up1!O(W+(C{prW5mj|lEbu%=Yyvf7u2;9gU80137BeuV}pm;io*q%uhy9HiHBj|h?iT! -mV005(ad%Bolm1mfIfXR+V27vh0>#YV6v}jF|5*r`yo=AfEp-C{T_f(8zm9DQhULl|>GTO5NZIB6LHt -}4O38q26hZf)TwhfN!vvHXMIede?$5O4Z4T~wO4eKej(`)c7fyeiF0fEF9BfRyv0}$q~DtbNJ*uF5+a -&&-BpA-c$tJ26e#a7frc*zqQ%>OLN&BtFAC`tokcCR%m5p -EI>g6R>iB`K({2&=>nJzJNo -PUgAb>Z)7_IF4@im&UKoIiERdEp=4+Jwonf{lp2kUB+yNO>^o-)^2hW-U-Zyqgh+%g -GiDZ)R`ci`Bd{CHbB&;x@R18$&!|6uFh*I7iA8+Mgb!9QKZ@qY;PQZ8$?LcY>e|GcacuOPIxFQ!*HKh -RCq*p7|gPW%8B@_0SIQSoI)2V`dFbzey8d$U6gs�T5_$T7GC6d9)BCC?vG?K?-Eh$lq6^)U^+uC94 -m-vja+^ZYsnWuxAGRCA;AA7c?u6Ry_byLEhhE}psXWw1X0OnTwp`@ypx2H&l#Ul@f6WT~X%_&d-j_# -qwHryxo)!5ybj9~Zu}NZboNnGLSPd1iW)?&@g*=*#8p+`D?GEWSsqBu8yGSxyR*8ZoP%tIxeWTB|O2n -Tgw8E5qyi#v(k&MHo;$490u|&zVJ%=>y8>xZ^TbR8}9Zbk-DLth^y6DZ?p`fQnbYB#(!SsD2H2K>F3g&;cqy`%1W`JO4K$WsT?io0DAwm`{4OQZ+o#)Zuk -e0jJ*c_^RRw><&eNRieflwM5-82LLKn9aC)`oYf+;e26OU|ycKwC5d`?gvuCe19^5vyzxON_C7>vxaJ)yU9Q-<|f(tIv -=(FP(G+`($cUmi5H-CJ**Ac6$JL6w#k^94<=4E|DwXB|1f+Gd8W -7YkhSeSV)DsV>T|Z0&*4>q4Ad%@b-Q%9{u|2)B)}pPr*{o@k#O -1P<&U;95$O9KQH0000803{TdPDDZfmJ(TOIWJ9p>)zuePU@$QoyT@I>880VCDAfBGO0sSaopY -g?swh*;*FG?wCCRQ({5vl1O@|OFqjz(W;VCK{j;$dRdI2d&Xd97c4PC8f%rUM+!pEVs*1YLd(rOB&Te -!Z7iIKnSypi}PUg`MbNKyVGxd8gO@4%W2lIJE^~$J7%B1+5Oa~jA@ZwEUT&HE3=2;Y_WfWZ{MKZpPW< -{J;$+RCumqn69QGOXsuHs^rz>_MEqBy&a7D-X&8NkTLRh(vNHjCmYngE7aJgTk$UYTE3H*t|*jcF8@W -j;w`031#8$?`hMs<=uC296Un->t5oZ0B66b$ZfXG)>|;V3;9XC~>agMmK47l`kuR0X?gVbb=83SavdB -P7y0rB$}t!DYqzKWJs`uWtsE=2BP1OuJdVniGLI7@?trjr{z^Ynx@#ocv->25+6>I4C-O${+bt2nat- -5BgM|}C>YrGc^I&{1&(_a$sm^8%bTnG8fyTIx`Q|?m&+mp1Yq2#+!X#RbASdo{3DrE{FIuy%;)p`26| -0+WYZLTTkg?ZUqFF)oPSQJmrO=cmRHaV#tUbRF=L95cjZ+Ky-qPLE$4;`3*RfbhYy<3n -znI{f_j;OKQfdU5dj;MF15Jq2ih3KnIg0mi$Z4*4lGe*hR9JijKRvlPgWr7^g|mwq!n>pML+ -J0p+0i+m4=`SyokB}E>`)B{_5|ym95N`J5_{^P2>yP1j$d&+34<4h2gd;K9IKnfaqce*An?)Xa#<~lW -HgG>YowHDQKVS~PcvG(8ylTY=PZe*5fw+uyeZNuK_Ul^3M5`!$5j*;ldJS|QVy{A#>Qy$8I}@M2eA85 -=ReMp&nf==4|peUBK*L+ox%5moetE9m%tYasDMv3AN_T?vy(hRUfT6|X%DMSfrDWss`ei*;MX3o;^A< -6XLoz|aWwpH@6qnw&MP>7KD&L{FbSe)_}$`j~qloPa`kC+k>3Cx%ccVutW9&jIid+F&4 -)5)OU8q=2bTMQ_>U)uFY*fYV-Ug1XJew5@V8A!ijpWNDSyY12VNv7-m -xBV(V<-Xtp5z&TfE}qEl(*OOH2W06w7*NUX?{~8nE{^yDta>5iHbNafpMMW6+nc6OmM#=up3f!#4RG> ->_^>$N;p52>4z%zYUDRnqx2%`4j&F5^lLDAJpaUE?y2|HM+65TUdGfqSfX2> -mug5v;ILCn6nDAEJlWM2|+}Wje1?T)=S|$&Yda$TqPG>Ngvse3 -9Vfs3!yZO@jveR1$6B?=9Rx1!pR-@eRTl3w5}&(q3173#gN~$B299*PTuj`fL()WJ}y-VU@;{Dk(Oe9 -iKk``TXebhfwwLa5qqCo@BG?3U}T`kxvrX$w34f&-2Nra^vjq`RUmUsa}J+51huUT_lsdn3fx_PTr1S -?>Tx-$Rb}UqR7B`6FAZ=okX*2Nn?W&5{MtLNglm-EB^Xr2RaYj>e240|Y|QE)UA#Pcj{qJ&URfRIX;CDX(2+}Ev(pV2=vNoNyg8(vho% ->W)!A~6yBXlUabT7Y(1TO__~d6@dKiRGtgj18BAq5`HTO2oe|fFz?FQ?W!ej`*#`B-fboqzD@|rNCa* -<3>^qa!IJ4t{}YZM;^s}f1N)m|LcEj|ubo2EdRRbJd~ygYh&stZ5y3!_qTnY%5ZG^A^N7pet|yGm!vd -|C2n;|jnUqvO+)S3;HJ&T+@60wsuq=Xo|GDl)4GC5}5kH&vm*R#nbH+&t$t&N~)js!F*4u_O`X-v9JM -cjrrR#AqcBhT9;F45Q>r1^YZ~K35=M0Y7>F>R4Bwt*$iT -u--@cX5Hv5NcCm_Egtm<|Fazu3n60!ncE*B)l?QNXDee(u%fWsFfoUe0~YlQRkqXYd-*h_!IAE!uI2q -+}HQu~owhQZ=$we=(6CH+V^L$J8J()y9RkXozp(&=pk#zKi+70FU)iU6i>GSva{Y}E1EhQ@Ea?%*0op -gs?4w^DnCO{4=NYu);t$0CRT>_(;NQPA`kS$~X94kB5B8$=w5AQ#0-${p~MIXXOkLD+N_adm}~9r7ym -y-a^6Y3~}v`;I$0on<=3w=@2;M8-(J>B}1U;c&&5m%#2}!p67J)wICtb&jU4G2Xpm?MBl`}L=yg6#xa0lkb39)rG-UatisyrGY3h7*^zxYY#hrY(i&A0DifthTOT -zl&k~?-uODe*Gz+9-{&J(*J3mYN=U_oGCT=0=yuof?{6fi9=od?a_-Uq -7sjGOsRAeNjJi`psyuglF5>+AQ$JabcNkOg;#!szg@hS3PY!YGWr4@Z_f@7UT8cbyHrdIEx*ZNkG^>O -?(FE|P$6KIWP^-R^zi-RbKSI6lo3q+S|(_*G3vak5rJ6CoKt$@C8i?# -X3Xcdf04Ql7va=gTL=`m<*%_`tgzJ3U(oM4zZLjI?Vp9KlSfH@yNjF}i);~)sGVR}%6`D#WIa=hqy>IO6c@DS%o4Q=iBV{)HCgEvgnp^@O&$__yS+DCy3f -n%Kvht#o-gi2k=XnNOC+ri#`q8Eolcv61q4hkAdB>{IGENryfvU=88XTMf!B4tgGgPEVs%4Qy<%c~+= -VSCB>Wap>jVN}@UJn%alefo=JV=j-{5nXtA -t)2{~Nke}H|FqkHEpEiT2QhYw+v*BWC+LNZBpq^~*nm6qO^()uG97~yrdlmg*m9uufuAaCTM9JL13__ -~-wad-OEgzOA17Bumsnx1?yI)=sSnztU?=X%e01V+lBOgq(b-g|hi4_79eDDzrz?s{?r*rk8a6rgA$w -tTl)(m^PJbdng-UfhDL)hGMdqYlj0&M0{R?}a;<7H{Y?gGHkbt6wJ+~V_{IDNAb)G%g2kfWa@1 -qw+rf~_2$v9Kx21lLBNPsU<=St==Lxd8A2r2F*#{Vv1U9`<_M!+{pQ?DUW1D;Qp0BjE$R0s$*5wCG+cu8RN|BEzGN=H@B|(F~@+(DTwu1thJao0!a -lb9hB_TEb8#C9K&An$1NhFqQlgrXNb^xh_$LsqoOTd%n!*nDZogf6=26;C>253_qP^&=#VvK`@fav@u -OVS1w@b%E6LsgQPMmbq)p;$`C{a1Rr0eGmt}}SEyTqbQRqs1{%1Ls^Nw$ZJ7x!fU@okJ+WD|DkrlU@n -U>{^U`%FcKGP&GoVqx?!z8@|A_0|De~~~6IEpR_{rYm;qJ#C)6ZR68Lw_-9BxIZ)ag{;Ze2(?U)-Y53 -ldegEGDoSmX#7K_wk6*-2E1}>L7vnGTB0;b_BJNjMPtnqZj|trK*>fbne+_*BhKppnVoYdXg1W#ThoU(%SOcv_qbf$h8+Lhm-R+9Wr_T^zQ| -bvL>xzj-z1gRM`!BI)PD2)C;et(zd3q&s@^O*J$NP9v0X%7MIDf(`%(|zk>0QB-PrF?( -f=2jcTmc&Ta!l$;<@pL>gcwWNBad2h7v55@AT|y`U(g-@`}EE10l ->U)ZExFDGIsDe!#Udui*n-{S|?B;ov@wC@5hhCe=E#Ks5lVgakMi@KnN_lgE -hfCv|ueWjEL`86s#=#{cA?D%t>&I$OWt_;E_Xs**>8|NrLUat#YPU?UrbC{D@d?+)dX -@IglPd_D!RD-RVwgJC2d-kYFk(QeW{_uKH-I`#H?@j$ku#SKZ0tNXYLlt&UyVGE+jg*YYpc!SbK$+tB_a$gH?G?EnqvQPMIQg8 -+kv_X@Ppnagm)moE%L6TTQRqA$PLru!bp}NXZGeQ&QH7$YoJ*Az8s*7r$2|X02230n#vZ+i1VB7Nqe? -9a(-+)dMkBPFk4D`xnO}k?8($~n{+$@|AMt5*lBYhfBkrM@{B(5o;`HSB7h8viJyG7iJHxlpzxda4*i -pJ8&5TIGgb4KC3&GH36&Zrwvv! -k;{O(yIq!GSAC|M#5+UD%Q^dmQkMMO&&NrgY3E51lHAMpsEzB0k8-u5bQSVS6or=Pa|fj9(_Hhw`4`5 -v#yd1exO)S;{}@9#z}RPB$?u$ruG_J3|3Jl`OEt+fFI9qRn06(retTlia#erkkDH)@iP8B*&BF?mO_V -#ZkcqA8xXt)B#R(b&wfuA2w)6#T#ZQ{si7BauR%W~^ePtjMRuhd;q!yUR}(T|mOKvdyl9MnljYBql}ScPpE^V@qFgIH!64^?MT@Y}k-<(d%>GZtV#Aw_2|wCR|HFiomtQ -tygaiBsKU-VOcX(R)+mUv9hd*zQY>rmBVqdg^J{Fo;sG>Bta2`!ut3(&0=5F)J>DU+tGhbLy+Z$prTr -AN#!!Ohi7x^woPGN$X=5Ggw;c-HwA6vcD<4ac0sx{c)zYGyA>c3-w+tU7H=8f1jsg?|qZ|yZd1^-V<# -*2o#5WiK+`bnrmUUOJM1z|za -4Y^i$D_KyRuXr7LOkqd~+k3CUe<`jQz!sxp;@_FvL!ec5saWs -1F}=kIXcRfRm|NsPrH7=^DjJt#}Whlr`zlG?9m#H#CqBJb?4!CzwQnn{<<^V!T&nZ0|WE}^2guV{q^B -@-*qg5s^0JhAO@8)(c;IeY!pvqgVd|aVUlBNdFX?Ps@9i;Et@D-I; -qQ;mAOhG1mt~ccWi -#0pf?RhG*=PKtdm`$duG)ecJnQcN;C$s8r1GLg{!}1pwi!zF|k6n*z!IZ -r{AFFw)vJ&<3s{4`BW2`VK1I6H{8A7{(1+Gc8UcOZ_p9fa$85@Ud`Dlx8S^^&=la=tpCUr;oiwSS4n=6y#lL -%+9k2ULvQFDz2!9H{BhrP5^V8KvFr9N@y(t_$4k$1S -+QoOHo*sB)nx*%Bfiqle8D`|?8sO}W7s)JAk%gX_NO)YPvhh{X9=dClutGpY&BF&IcVmWru$S#HHpY& -is}e*&}y1tj3dE`c3yUczcfIY5ZLwg@bqP~#3>ESgzxi0HrUDx06;r-a8}(&*lRQUeZ*(ctRJEElwK~JoIf;IVe0|Ftq*e -2IH%Gak#nNaFwUJtw@n>3DFHajRm!5E;PMQtzY8qE@C%{#vq88!&nlC3oVla@NvL1^1XHd$j3yIRHu? --Q_S5cHu6LJlGDlYD`c%dE1$Wk`ws#u)yRZ+fgxE5tv1obuaq-5Jal&Van_Rh1{G=_9HK?!f);HR|GK}`TYa>t&eQhnA*fH^nhvmn)2d^& -tabXXck~df;8tv{7xReEw~wpx1B}Q}vE|b?qq;Uwdl!#DK7FQ)Zt4HMm$ -3h1?yuZ5N@FZsAj6lj4Iz3=q@vI7O?cu9-eyugD|nITQ>b`;$lXT8=WPhN4`)>$Lsj^ -iI6iRQ(YKmyTw3-!?ydH_hnputXtRc#xC+TZYvA^Lsu4tHl!*w$!m -K8$dF&>#a-Eo5yyqfxij%oX~2qrzsMh0s9lHTILoF+dD5Q+l54f&mjHO=LT-4;b1TiBZ~D#(HlE1C49 -ZL~Ri*K9v}!lwF%iurRiS<|+amdGb*fbfi4M`+>E2U3P>RLqVh^ogJI(8n-9aG1#^~r&IKd(_v`vav! -Z7c9z4-rBGxkJD95IUSeO#*7M8D5`D>V0rYuqz_@>|R=*CrXHaPKqc8SL*>HSMA7w%!=4{f2#wDz!*R -Mfa$BT-@m_C{&UDE;WI$p3Pm&Xw1;rFD-WixcnXQAu}tt(%A4Qa-ac?<*B%`UlsV0+$PYE0 -1XyHS|8zawMT;$?ycb|S6u{H)ATb0GRm&A_`PQ&~I)IcUJG3dr$;c2#wme)+E^P`6gyo$qvXf;&I+9p -N?_h{cIe4!*NcG;88W%|f&N&p2fDUT0$}Lrn#}#VQUE6-M>(~)vwpi5qd2@rUCOyS{G$-12216AL2xD -CJI?cLFV~s#O0mPK@Sm>f^Ke~qIHtQmGA1{f+E`WdXgzwB&g5%*KYkDuzE#Nwn~U9DHT@v|H!9nYz~{_x|gPBBeBLU+a?# -W;jyao_!zM(p%e9R*9xaUvN)t7Gq4|O~v$9+dv};8XsvucK8vk)w|Rq3cXVW3MlFb-l9#bG8ER-Dj<3 -|Xt?%seU{J8($+f}XcJS%6TlMOtT$qOHICR7zYp!j<}PXJEG>l%@9ws3e%;M>&8;Y|qU*e@f=3!eJI= -wCIkOV11y6E01^`>3=X2iRmRXg~@w`er%#o3@`!!qoCm+lSp*1fg{XV -ee#R*O)~x6O>ug6eAaVc=#3)AMa*Pa1jmszbJ5B@r2vIl*8MsTrF#U?$mT+SW$hbB^_iP^7>mBdGahGBfO7tkiSHKo>LDX-UDE!qjLoLE=#dGUO8B-RqlsHYQIGvZ6XKsmOsW7+o^=Jm)GY+$fQCd{cJ`^+b@T! ->fj0Q)n3@P`sq++PuUf-x|zbm_ZgU@&&N~pX5=&JIvq=WZpBBB2pZ?um_^TU~X)+(EsV!p>Xa@7 -rVLBUBC{hh@<7LItr`P@N$5Apq0l^L6}>yuecUJgo&kH1qdK=Qk!g|K2=2N)Gj#-m89t8UQw~2*rClYl@-{*8EMTfyveyOF@h{^5R{kAs-wd -w?ih7seX1akb`80)uTmIUW=0BU -Of3QOpNNnNfh3DYHd(bkh7xf~-<_Qp|ogmHM2%qb^K82Q~Wuc7l)E403w1sX}Q~V1DD8Z4E9!FR(ZsE -EOodR<~W%W?us{`5C-ac(x&>vx}LCSrz*_1DT7Uv0yAPs=AA;dfvAhv6wIhdG_TW>_ -#BcgKu^z++)W);_aPVu -Q``-W852%Jr<$0ga=k@T;0&BWjme{d4;@OfiAy9h5^`FEfTlq%s~N*bj2&R)(OfkGdW%BQJkROwwqxX -}Tk%@JfEJ-e$r&{}AN%$qRkvs;aVY2>b5JPol?^^@IUC80ShH@@e~8fB=`?8bn4!<$nXaUjS^lMT -+9Q=OZ2#gW^c=h!@M8X5h@nKehx1Qc8b -di*m+WamhSs>_Hl8J<`UVND()K|$Ev@kGhs2$H+`*EWe&_Wa-v6ANA$oE`gglwjg{CwB#BUuT%;zV~l+RBM1L5^g6refF -UqwKiZGO=3&AO%IQ;gCb>(i=JJlsw2bsNk(dA|XWjqm%!|NS|a?lDmsNf%1>c~k@Lg(d+gJ -b{j}Qs4%+-5X;%pVMa2z`L!CQRe2_IP&IIWMiM2VQBVrqV_AJdOwl`&+AFZfjB5@ZmzZ@Rv5X=9 -7ug}$4<)qYa*}EVdNPL&7`<6*)5Vdta$T<_o=G>M#q~#)^KbVllj2j$R_+P7K_eEP=3)^{ScYp3#UV* -7hRM-%`X4^+C6U^kEjs$(ns_B7+%L&(&sMSzd$Mi4IXirL^qvyI>5_a3Cgl+}fBmpMqzrnXT|4d&3bK -^jgMu~L7`C|&$ac9<&v0~TuP@743c$6N81AlBLv5C=RmS@40!nTgDb8@e_cUY%EN6vs`r-hzXTy|2 -*PfBO2PE0|O}W0cwWZnA!`+oF*|lePtZk3BaT2=zq}E5Kt(9y%#Ymw>^zq|1Q`JXTO}8Sh-J6zZY}Z% -)`?!Znf)-qB#x($aNatqD`>?I6?|r0%e|Cd(Z*}|OlSh_>ID1` -rwRph}Xi*BM2r*CN_9SvyFwVey><=dZbexONfT8C}y&&?cbNh49cCyLDr3W69&`8mj;KZ^w+FZGD}=U -k88vuVd)-F>o)}+Mw+J_Bk`ZBOd)xJUD67zl#}dQv^y+-hROSbgl0J(eExsMgaS(ufSMxBrhWF$ZA>% -$eper>{3kwwGh7_47Yc8cAnOw0hD0N$02$lJrvb2SOBH+9R)GtQ*wI)YqZarE8vtC6!;=>Ray8b35B^ -sgDe6%67H3Bv$d9FM3L4A=(86y2`CDwlq_?6Yk;Gmon>@2El7S&s(ntZLaCxbG%xZA4so}~d3Zp*4ja -hEDam8*T^Ow741%pI57H_Dj_&A`L8A#(*L<6_h(Ewwq7nB3snc8A-?>OI=V|HNof(Sjr2b~fk@)J-Rs -I0{e4NbEEHje0@u1iS0M#b?oOgDI{#5;%84BoE4!Bf-j>$KBoIN+bP=C44Vje3Jvc<5zS)|a(H)kB8LTE%@JqXltMT{WaUNK+r8<&;HYP(*bMDr6sh+ECTl{DZleRK)%ZzRzxFfBvO=Kq&;o -hAo;2jVa$0&YWQFuAMhwX;QJEh#`KP|?VutU7gJ7c&b#EB_zNcu>xd};Er4`-FwHIdppiq12r)~TfH< -W(B7J?0XXb`IX}x{A#^7r=Y8kQSy*hY|scmG2E%AYj{x@#b0V~wno3-vt^L~w2p3t9wHfQ*?58dOsUDMhctc%dF~R(gMV{wFxH;V -8>7LXEGzLP-Rt0derdI)4k#2Cm$^oq!jy?G-WEc(Fi0B?2O~7*6mFs`1UYRg5e*I&hkpIu2{v}*#pJ> -W1F6dmBe3F_h$#IJ^g4GVh`224D@;U#3?hg%M73F4R;?oWyC2}7utQaH+<*-(?xXeIaFtVo1!eYjq1>wBS~~T1pFG~%{eE@5nOpDs@Ae+VglUjYp4-g0+EG(16!_j~l4O;F_l(bp7o+@-`BKpcX^eq6i!enNh0yZz`u`3a-ot*E=rL(7l -SEy9l6xzZi2uB%GQPAhWi>fK>E>z`!UC{QS+q*}22g -_}1XVr%xP96gk{SUR+@(I`pH!(NtreEA6eUs10uxQXrmaxckwUl<}# -Obsys`s^UtUeOqba-&MIC}DlC9nl&MLJLQ820Z(SwE*h2JrD^MR;&}y?=o*424d!C@h$u|1n;bMKlqi -I;SMKq=$A)hy5A(bECaS;5g-nar9MgnUWoa7P;3s3T+J!W`FWKs!1?P#6&QNcUHmP9hBI`KWcXst%~d -2b&miI0RmRlVlY`bl8Z&}-9el`gRMqU~BF3Jm6e8IjzTQo|*#`z_gh@AzSO#F#I0jQ>tfAVs3GWV5PK -yZ*y$;tD2ppJ$4w3G@33D7nc)AYo^M?TDiGmI_$89828RJc_3vhyj% -Y5ip?pI=(?Uhz`7m(QD8R1P*4kVb7?_?5Vu1(|7O5li?u33S1(-&I3h*$*|yP;h+w1>g@>G8qY(fLT;tn3BaHv=ts4$)r4@iLuPm^Hv+G4;%=_bpTZhG!Z!At@|O -q2QEMpR)W$9?_CF5ki8+jp*0Oj;ElE%I$I|Dg@WKal>-2yl7BJGO;HHa+WeLdC+J -FoLc~6mSh***mlXZML-D8k0pw|Ow6NN7f7e6409O -kr4g5L%RBUT-j8#p?YbbZjqo5!jk}z1l|t&G{CLuUQWW%3Tk#b*#m64P{y;V=-S+aQi~JA2lAty~BiN -oXm0pEDNR=I0dQTo+^#(Pf5duUfilEY0pJl!P1qd$vj-ZK=C=_6+nmx(LM2XSuLL})X0UrAJ&#&3X2fbgj4juG -a2TKe<^3wScBh7mRof;;chf>u61-j@CdzADdblMIArQ|iDQcd52vpI;QcPEbrO;Hqt8pQjU?K9}+JO-m1YL--;gs&_Y}Q8!;)VgNe?M&Z6PYlSfY?nARO0Xo?fa@N -eiKou1ZM7__=?d2^6&rZH01Xq&b6b>HkE*L1z_$zLr?(x}BVV2i)FpM(QwptVVkt1%;RDYtiEH22J5x -;KsPmHYQfjG%Zgl3>q$$Frq3(3jO%x3RX0O|?>Wpi5~NR@Qt;$djne5ZEs#t;oOwGv_Q0iKIBt-V3R(4^@LKV{{wx1&{u -?s5m}zavnkGsc#1jDR8f@aB47d2x#avt=;NfqV=f#v%x^3fy7JQinT!J{`4S_Ykrj;&8h_Z2hJ)RQNS -tEEQEVAk8Ez6~eYw>ErkHV3vtnW6ihp;PxTq@Fc3{Keix9-r96+A8n5@a(z$y3+(JC;0Y@rw!4p+^`Y -OM@MlXh0L#8MEno5X>3NjXMi*n-8>jlqnzN_$4EF}LxlNseVA=JsSyp_SUzoIpDQ^539L-K4qVC)Hk> -$bvDb0xHO(mq&-kFV6jCqNun5EqZO9MSD7J5W!VQw!5FTGk3e -o`9prX=mJq~}z|I2fVdYafg_O+Jt|#YjNk!{N$T9(}Z!P^}d!mvO`Ew#BZBB9ObZxNbkpHcVRz -BkOql&Wwn_;#Rz26>C+S)%qK=;iH=zt|D7M-vreSF_jD}x_j{?w&kt(zvN;LJ#bcYv -Cy1%CjF&CDWy|8(9hfTBl?Grm}IDJ$Yf56^-;cF#d9KP_u-90}J=yrIw)9>^?t{MV<@?mdp_hVn$`!K -{`Z9_3^A@ns45!M-#VH2^7A&6sF21d%g+qkaHo#FQD8<8@KIl$3fjt)3t$U0rAht6C^T;E+jcQS2%6SX;8E|Z!?WUH<;()Opu-HBP`ntjioJJMTTC5qL;}FDU_l|6{V5QxDGJHh8{;5YKF}bC|ALjTkS{~41fIwFk9mv--u|Q -O-g4#M}7PH+2L7Z1^hIgn&C&Ojvg$n-E{*auW?`RFwAVok6Po5G0k@vj(yF_^yqX;+Ed_I3*Cf4)~Q0 -%X#%ZYPqk+Fp0bZt4>Wp=LXQHg`USzosFzT7uEHIuCLYQbUaF89yc$zxfdnvOOlLBNPi -B1U8AGM@YM%e{fI8MIJ}M0`Yspf1BKUls0f&xY+~?p)6i=*uF -Rz`7^X$_)6^~DTb}CM;)bb#9AbQtb;iAdn+CWymm+WoMiL;u0kd^q!3imCmB{Qeuync=%&Q@|VwM^qSL*(a9< -@vz@4$<v#CIQN;Om56MpqSC^dOUoUOgrN2+qezYz$$T$?2} -QIkAMKqfDuV&SzaU~48u{nm>7tZpVCDc@%=z_V3EMMvgpm@qh>@@)V9*__7yCMh0c@D30@l>x)lM79p -twt_A#^N<4F{EV?>5$XAKmtF`C*8Fz8|qSDMlvVNQD#ck@SVh2gIO3Qxfnm~UmO{I1FAom?t-qrp>Z> -7NQ>9NF=t1r$5fQwactr#hGph{IIaNm12s)rXNP4z+>Vp?Zsg?9=Tr9=WKf2=yslJ?=^o^SXFw9#`<) -Dc(A9Dn-c?K$390>Tq%oV2IYgc{fuNo!RL(s&xZ)LvmfLJdBkeV`*a3)Q>K)K(+Xh71 -UJeQc?^uwY6>75ia)~-A;7m+;Dfx>-gO##C#{YbY3G^#-AMH0w2dJ38!5=wVTc@B#NDYIvCwCFb+f~` -UH8}@$-88o}fL|erc44;W3J+@vT(v(k@Ht^HaERFp>qX2Z@touz%j_(Frx4zQ*Bl46!DFtPx$ffsDcW-0;9)s -$+OdOT+-y8G5)b%jO5KfI~dcyQ;hMjEvByz==%+RzZrM_{Q*n*Vf$n_JpI{db{`??nE!b>Ky_(Av{81 -QK#A(3V+CYDI#^QW^&@{&p;m8lybc5U;rAn5U~HGD6GV^aRW`~O5|^lN)N>3r^gQ`e)m7~{GX4Rm4!z -2mXK8G%;*!)qm4jN6WCX@WT#uEh$Mt+C=NS(eh3N|bvqnRKwCJRvk5#p_Zp>?*;Ly?YIJs0ouh^N2RYWIwiTbp~ZZf*$CK -6@336n^x(YNNnCPTKoYseVU2*6xG>U2e*v>J--5H-yRenp4z6TWm|v~M&{`e-u-EFz*GKTC)h#>(=*$ -B#umC~A6=rtVD5DC*R#AyBPO5!A;zmbsd@#z5dML@{WG2hbXGl>ZYuf3{b)_C)Yu!A}(0O`u7Zw^mJuMaPNl56y;`*_I$TA-ClPV*)AGOt4xs3B5btuX1TA! -r``Ue(UT?%C916K!-e2WVDLpxGjsp&mpzB2f8>@$}_$oX&Az1m2i7E)w;03<2pKE_S0=R3R9%gXU95t -zBVffhB}zh5KiR&ri=@a6shy_dngl#jFfjH7qNJp}_aG`i@h!kaz(qbb+~6Vp9K#d{Lx0={7-HObT(f -mMR)YP(LpA?r%{yEfWH}qM`3H5DW?@2C>*s_O|p74+^l6IZ)PT^lLWlHx7i^?^{g}2#?wC>7oUJ@$b7 -^ZPmw6eYdf`mR}x%J`Q<859ShCW0_{WA+?q&hW(ccr?IsU^rtGJA<+gkefBTWsJX5f8CBWLs+{TAr -Kui&53O4`pR3Q6)TWpBIiq2z*!LsCwra}sk+1`JHTaJgUe?0GDTS&FKE!tdtWwB+};ePhJC;{<{Gp`a -4dm+SEpoZ9CN2iV-K{Dg6tKYc;q+2l#TxZr^`V#(BfkH$LMv<(_vI83aTe2?x$zkL -i&tAj=B}23`_c1ysnU~Pix7R6j?$=F(!T0>Sp3v^j;x+K5_^Z3Enf@bq;W(BNZiW_vfs<)e16;UeB$@ -WIoaFq2tj<>uW5yiz{(|Y&-Xu5bz}nRD-c_!uZbq0SoDDI7ENW5*y_$5rW6bCB;9UpqB_QDyJ -G*{7qhKF98ho`9H7%!q-=L=3L^!d>VXR$`mvS!+QlKaF90aCVYagCoVws&gB2=YbXC-{{xdROUgdn2x -*+F&o}C$4O_Efw!a^Z&gq*sf(k=pEJbRy`yS*+6~}|~fO4x%yeOng*0=^0L_G#JPOS$ER7YaxIaJZC- -W!3HVY-a-jn(w#&(RVj#&QB$V~WZdpE0zk7OFubCq|QE(V|3HqKBzZ@ZI&`so?+j=WzA7uQlGm@tgg= -?(nG*;xp#&TgTIt#qK<$@HtT0gW5UeM)}u{``w2~?ezlHZ|t!393Ko`!9OoeyR(uej;NN%69?) -TilvDVmj13lBMb;H=lX<5Ywp%=Zm#u!DAL@sx|-D&gVZpRC!Xk9l%dJSVTBR}b4>=}4A{|Wz*H(yx6w -nCz1I@A+U#n!$QG{evsF*-q8Z_ZfZ#kw)Blma*m%0Ezy9H}l&XbefZFtDunbT6`d`g62J0{l7)g)NYs -Ro19{?EZuz_{-keV&n&Ru -W6=KXHmC{Rra#lj1J~=t+yz{Ia<>VgDl?3WU|%z1Rhn^gp88$9{nN1L7xD-f=pd}_B)iuKe{yPL;gNp -*MNz{24uZ=xJGE1Qk8%InE{2xvTvU;C_Alk*xfVIu+wZhuEZEwcCG@;O65Uxlo2OMwwa`=n;fP#OG~o -KaQ-=QV=XL>&&JK#zf=2Q8qJx@&p56LNzeY3=w^94a7K0V_Bgt4=AXMC?e+raMfGWwQ`S+GFENv7ggdr(bhJW#Zn%C;7@#6Wtl)*vamPgSk}i_iZV>(G=j4`8e)0SV8Qhd0#R@v6Pbf-CZ -DsbyB+v8zWJ(R{NZOR1cz)-OqBp -^7l7p=c@l~86&~s9*4A{@j{b|4Oa1P@zV0=vJ5a9BmTT{1F_vDI6Sd(v~j#^=oHk%oyuKFY@QNvrc{? -IT90bNo|=|;$0JHZ)9r=Ho)78w@cAabxk;iMOhM@3kt1Ds#4B8%;|UAO>qq9WNX6R4xyxtdc{#Ym@(zGiccX?l5U<#iDRw@SmAQ@I`80tCDwlU95%Z|&aGDLMG?-41aC|4qhcD=HVsB)v@e5|DCYuoMx8 -q4AOC9hV>O>{dXXcj)kK$mxQY1pAN#q*l60?NyE!ah)8k>&W~e$6o{fvt>Hhq2Z{kjJs?WO+AL1@dQQ -ksm@_Si67`MdTK#HTeC`|Xl&dirw5J -8M)0LMsv#d+Yw}H%17iyQuq90keasA@+a2A%6{HD*6S3_7EqpW$sU8r@U2-7*-3;Vg*QEG|Rh}WAGG% -CQ_3_+j#+Mcpc&!6&2#0lx~7tNdaHE5WZz$QVMBj>*zxF!WGKfg#%sMvvxm -Fl!xqnP;@dLX@ykjVB(a+J8XLm)KkNhs6hD5)Y93`!wn=6$j?O}4=HzJ$*Tp-!EtRe7#C~mpnYfL(sft&2<~{sgP0L;Gi#C_5+ly8}rVIxSdFGijCM0caei?FquDivx(7?w<~3~9R648=8SfmM_{@sM9q>^}Euj|TGb?5WKC`d -J$D8}m9ezJvju<*7&x3Xm6#LD=!xpI@GfPy1QjFhAp=Vh{wW+6 -9#7N#~sZ&p0_&M(!?e$MrMi_J~*WyNM60Yf)N$Y3z{bS#!@JA{M-<4S-{xhsJ> -S|!i=L&)Evv%EfVX -4~to#t7G1b0k=gC}wVTTpBHS)P|`6$Mfi!l{r#JfPl>|40pH(oqN;%y=kXG+HyZem(?ohd!*fKLp?0q -*qD*c%;dgnOv!Zn-p(%n6X8F5`k&^$-J=lpgLysyjU2vpEymvau=nJn(ej4hthN6=h*1Bs=Z2DK@_o` -yr`H6mjZ!Ue7%ZlJUblbj^u4WRT}r}`GVS0+PF}wau4e=*0=d;NBe@o&B0*a*2-*A0KFCvjYS@>mqzI -Uo4yIGje&n2@sK?hFIwj6-b#_SC#MIT}JnQcE=@1&}XixQhD$c3Cc?Cc2iKk>cL}e-l{`5%eNT@(9GF7Te -}yp?k*-5!Uc^ojUsM;vAT9Xq}RqJPS)W9ekGZ*dl6^Ti3>9~qnXmz<2cr?O`+%P{0EX??qC^o^pV?4mQ!iHq7R_YJL7APgS=sLF%#| -3w_g@R+(4hr^OI0f$$$|NP_Vmydf~fAblTP3sY?;XiCI!7Wr>d)t7gi*hD6BBDGld4GzD}E<-99Q_5Q -{iyTd~2p>6FQ?ZtuvuC-)YA_l*H_B-iy-TwxUQ<=}eo(_}+*#~UR?GUj3E8XMC@@>am}5nu@Drs)k#h -bnNlB$8F6{H2ckr5v;Dv9#^=(fresm0JHvQz7l+uVU(zgSdsGm;o|5dlfn{J95yyZwTdvBGRnQ+#*zK -TthdQ7zaY!5pug=#-O6H}X}*7nk|RlSA?)!*W!Q+p=aPC71xP`uH=Xg9?k)kT{^IOye12~a0hJfG`O) -z#I0X8?+o)D5tJL#|}SKXIi}9UM@Cm)zvVC+DPEYc~@2ri${L3}b)OX?Qx340WkoJzQWYGI9_toz&=4 -Q#H8+hKQ%HCCK^M8SBU!ieA#0PgS>W$^E$+5%`Kh*tmBb_KbYM;yGU^7r)q;Gs!4F3KP~>cu1HXp>Xi -#s?e@5A&H<4c4HrKI>sp}=GmuOH&Ohc?9bz3;>eczsEjX@hWKJe>6LLrTDe+7VP(?a$-mpNBTsKeFLF -8Tt43&4Elp(l=*NQIKd5L;b4hWvEXV@{wt&oEc0w4nfWqk@HTZo_9%c=s#Rtz4bOr;Kk4lg^FroP$U@ -1&~wLg!q$J029_o8@Ui*si2f`Qw)G0zjceqCTGy|(mvs_(32VQd`QG0NEV0WWYU3>O2EZ+Li2%hVcI$ -k@g33XrYGS>T6)fJ5P>X)s$=cyeX1`G&$OlnqaJTPzu+q8XvAevF0<_jJ8`71UOv5wby-VRLWdb8unb -yucM3@0jH28|F11S57Z$GVz*sT7oN!SLE}woQum&bfjFM%p<(CRA^&-juP*+E(=O;XTpOQiyRpKc%Eo -hT-(iR^A5!=adfhflNIj+x8Yqtu;(pf5Rv<};ds^Mdl18Yd(5`qAIKs~Csb=d{Q(G*C6Miy*5Ah>kv+2(t(@V-55QXfzVkL)64c2 -6)YuZjbyC%t@>c-5PA)z_aI%TsxCpm%*+(YIkL-hGr~_>5lx9{A`K+DZb?JF^k`=U}>mGtJ-9_E|M7q -YQk!LJ0U1O+UBbZte;a%B$h=3koY(uuB(}_Y6v>Wl4*v2l87&YIm*`tcxUOy6tnZ*2F;tz^V!6)%f9FG45EPItL&h#c1D4x;j!{6Ci<1I#c@FN -jKULHAVD3ELztCBz#Z2GGe53ey2-h8h}2T|l!(JFw;^+ookb#x=H$q^o0_+0a5Ei+oK@vZqp6xkkbXi -!~}1A_h})thr5Ig9kN$Evr5f1WJv}LF{({JPj&v+4Nw9nfXi!Lo1MNYsxZFWjR}^;~&t;Ax`#W-uW3%NRyIN_p*dMUsD(-@Y%V=?RTc(qE?(Qp -`@L_7S7Zz>JRKS7j7WkN>)>y7)>{&fV_k1b>ti4Jz)*IBhqq;a?GWt!|?H)U!?6|cfd5KbOjIkQ6lPK -v3+e=liLJ6oE%Zi^o6ehV7+6f+x(dEMh8W}<=H@$*4r6C!^PwaEIZp^yeR99&T8m|j@@wEge)1pJ{3B -`T{gs~vqn?shfK7&!oDGURhP0Zw+_9;Oe3~U;9uJ!n|Ey;o4x&340xI!_Zc*;bpXS)g2wp^^e&9dDUx -@(_ig=TNf^D7yTy6zoFD(5&@;GH!ID?rERY39@ox{sr#PDnRJTsKcxxsz&Cx -t%sX*j6`uENf!aTB0go=>e5?y*HL~h@uU}$iIR-M76pIT}{c9I%{8~fKOblCaCr0gGPTQZk+HGhbDO6 -ZMrveq(x_G>8sZ3j~%8sTW@K37a=}jZTG?hF&ibZtg#ET9%~vFF&@IDoCRt}u<2*GcAbQLh2m=XA0*kCAQM8H_BSc1SAn-!Yo*NQHV%dJiytMyOmh2>6i`Rr7!~Ec^yUK&t -z%eSLN8<+J0TTjt6u{`{x28WEcLjAa(hDJhnXPv}a;s3p(Vdja;8lR$a5Iqxb@>>eME_%kgRP{f7;QU -*IEna;sot)9-)Yw-{2Q6vf2;!*Ip76Jo?s`M~@XLahji(7^T&U6_fwt)12_cECdL;(~Esol-_ZW8F$b -l2GnExS?xMTM9zO6%#V{q>t9(I!LEd6LvJoo^rld>jopboA8V!AE|629{=(cA0tAX-U9#(_*e#<77&G -f^3ncFB$WZ&db^2_|Y(PSU+^SAFxi`>0GTw-Z|?t--gH3K*_D%!fTq{4gQ>|X{72^7Yjpde3_|)9ui% -ExehG(bgFGL=1#^6u%dbOVX&|s%2LXRU`%^L}(gn6=ULIxVlSSmGzNnCg)66LIfH+P7DairKd2>LF3wa -!~yGg=Egw7GbjG9v_D0o`&z*k(Nv$?oS^^Gom$)A{&tIFp9q4=Qj+aD>ZKsI_^*wcFG)YWMNdb9ZZj^ -eLd3{WxB2TH8zlS$JZX7&Yxt7!^xv;daa?wu!Ih+7YHwQ;oN*fTb$YHi#q+UIMN$oa8)uRIWv>vIktm -%5&U#q*mYd2V%yLnW}P~lV56z!x;6so(pCWvR3L$&oasBkdbh>BXAQ8b(Xv-(E;n=6b}c2Z9sQ= -g_(iGkrd#Ox8R86dy9)edLabb=EbZC{9O@D7vpM|S-j?*aVx5}5qz_SXT+xh?~imlb(+S7q&NI`wSGU -m1%0@yDP19H&(UjOr?xV}d>Mx3xDe$|Z&O->nq3XaVC}@M!KG=T(JH -ZRr27uoR9XYxL#X8oM$rOE#=hn9K^ZCxU#k02R4v@`^aj%4H#*K;aa^JQsC+`*w#FAJg1Oj?s!_I;xZ -jc9(CWV94Wu)U*y=)y>Pd4||Hr@B-5pO=NDydzlX#niGx?OVxLn?VBrgEJnHBFcl9u*O#HWwHp6XQ^W -i^a6=)i;MmZN%3drDF0yad2=D@t2n=sNqIe268xp`sSSa%4>`G!-S7~7lqRhmM}9Aa3;B>k%C=k4EqfNnnDdd6FK;qtemFDXc1N&=S79p -*-u-8Gqg6}@MSw#`dn2mjpO-dtq#P>_=qPMI?ZCf{W=4jFT-Oo2Lr#Y0HFj#X8fnDY1$&%K;w2sCYjeAEXBq(g11}%O^-+KwFwzbW+1T^7`ebeU__0 -&28{4vF&ZkY8V3@lyc_LaQt~IXJAJSD_>#x-MsS58mM|V<acxP -l84{Fu;Bd)5LNFYc4dvcHA_l%k_0tf$=4+1VlgLOmv?yDNP@9%1)ATJo#jR)?xP=!-2Rt3_=U@AdB<~ -iHh|<9iTOuuKAJ)1_d>Nr533JCB^%3XtI&RJG%Id!Kk+L%Wb{jCF2HOT;Sx>-eKCGmqdLtvXX9ZZ0Mg -vbxiRxx~ksE{@~tE?==%$#PnE;t*zx@#h)BsyPjS(D0UA#tANoBf -)kRUJWd1yeYy*YQe*&_K*6BDKNRMjvS8T5cfLq6Z6Dq77MOLebR2ssnBTM%BG64nu0r9sX{TRkQq -NyTo5SJG&ZFJ$(aQwm8x-Vdmll)dHQ$LSocZmQoGwl(`CVTLq!lVL!xua8@hDBP2Y*=zmTWV>!Wz}tpd~u}u+`@v^G{;fHN(HM4I(Vvd -gl}3;7{kaJ>%@va5wZgi>F#SfXBYhF%`MPt7VQqcY-|KA1;B@rFXDlsTq(6;ae -TrEZbt&GEJ9x=S5p3#ju(PZUM4lOxqD;Kq1?j-n$MtBUtcb8d3{tnZ`&{s-uWvI%#sv}+zeTSra+4}&CmiJ40tF4nUYQt5sDP}u!eIkOgYOa6tCvs9)i+2;H)1VYSqm?XW*>U*M^`KsQ!o6~ -<;Hf4-Vf^Iy3AooXCpCMkPaGjveU%s4O9rV8Ajr$6v8BZ&u}Z9j~0?jYl3b-&ia#74T!iNMuh`v?_ff -u?i*}nWJGI?1&g)WAer~%g^{8XwnMeMmV&`FXmvF7=FLb{6;#$tBy3&YTdSXj6IV^Z8WJ#)H -P-liV~6YK-MhY<2LHMRG-!;Wu{m=Ee3RC`5hE(&~>r?lhhyQF3j}n|Ni=HMHgKsRIP+_*Ra^1pXu|0D -MqORbt+b|L%*c;=Xw1PZW8M447N(k3ly~yafh+86iQLhC-}ur{^CR ->YsZg+$GCB6hG)l#qlaHOi0Gpje`V}u9<`n(b-t;>rzwk9Md1cjM&=NDGtt|JF&}qxja)j&ZVLE9SJ} -!c#J>ojD;e7WIt&%Hlj7`mQY8M6zt0~y`wLJ@0|XQR000O8B@~!WbsBC3B@_SvK|ufjApigXaA|NaUv -_0~WN&gWXmo9CHEd~OFJEbBVRU79ZEP-ZdF@+mbL6&>{;pra%*N#zucRf1uh3;L;cHc@Y$xZJiYt<=1 -4(c-o6(HIp>}m=`@bLXGy%+;v}-$;e2J>I2WT`J-47Z-li+s!`p&tz=^loMUfkR`i@W=EKRCSJtd|di -xS{%~(=OgEHjDM@)OlDfnsqB~mWx63e7QL}8T<4?m)`S!wOGB8O`TGI-mF)ffv<**R$uUef4<&q{z8H -$CpF)Q{Fe95YiBZr2oZJPchzzGlz^N36^i(6K(lVZlUY_q6jvo-GG#n -b;3lgoz3sP`mE0d6(+&7%O0H<;dry|W&X!KOjGxuUGGY_F>o+gHqW#HtnP?r288oT=m-0_ptH05J2KP -l0a8o&J12PZG}=zf8*d_oMRR2OnxD91wSYCYu~y((Yp30&Y4xVauHa4~ui7@UKUWI`(wl1$hy&^x= -W<(S=QDAySF>x|8-BFej#{^PDVI0|MifHtx@JCalBGkfVh^Eq*%3N@m&qiV97o#2)0t6PBkYEW3C%NT -R;4l-kj3I1TYJ#7ou$g799wM7-;VhyigEK2~aEiioFKCF;nn7T)%5YNhB6U;CL9f(vwVu?2Vd>n&Mmm -RKsc(!={W)=b%OTCa*%MMfA&#**4H-BTt0cmL} -qQyXoyVDX_^&dL9I&Y$q2E`uEC5D%RHkwBg8U`SVo9tzCkr3#4?Lm=10WQqi4Q$FbgrcS!gCV3u#arV -;SL-C8_0Ld1f}oGDd?kvoU6j5l8QA8Ox3E*xl?c8SQLYY9=L16XMuGQ|gtOJt50t;+T2Q3Bw#1o)8DU -a*JW^!PMMhm=lJ%MJ%Tn%Yhi_i4ftrg(W9ga=Y|$f+e@GuN?)HBB}G)}oAaU!(7g=IT$BlQPv*LN5}2l#niA -6_52+IrbR3op2W!d9zFJcJlr~7pl!i$4E?TDHs3(n$OiD7D?Nt!R_>~#IXq}dr3+Ty=J+z0H_8_as@?gHUO|N@R>)$#jr-B~4suvJ2S@oXRs(S$PR@^j7IrbCLj4%MNV%t5T?pa_sIH2WEt`%mbwkHS9Rc?iI5;nP(S5ZJ#g>N||Q)I@kl4MHTt0K*n)m% -}pYBXc+&BvTpmed-QKbdJ7H?%qB*z!jwT|PY*_%72szwf5Rsr1h8)4K4zxwa?GF*`*pw*vKmak6N|`c -2R8Zx;sj*3hHQX^c6e{>}QXUZ`gm_0+-}`6#sY=;G4@hHp1JpLS2*?w&z{11#9eI -2q-jsoA?jI^;roT!r*t5N3r=VY5m%<0w5M@>hdzh>DO6Ke1ocTC`SfG6+7WAMgZT)Fr9u?9cCXUSlX;M)Rqm&(va0li)*3&WwzME -;EDn|K_=sx_yYf+ZX0eqOk`;5p+fsIe&;^G6ws(OAeMeUu{g#?1J1mil_@k~31!nO+)BmD8DCl08c?j -AyJAn4G^|FILk_{nqf***eazXD25woWCrF+x5fX47cKB#qY#kPg18|YswHfmF$TmXNufNa(K9(o;Zhp -8Y4NP8lqbCo8gIZq*`THuU~TZ;#>}LzgUWCKY8&uy}W9FOwX$8AA-~1r`cpSN`A#xZ^XX%)#X8lvjfi -6wNxTQTy#z&6@5MQ(w%SCpD#AUR53QQ3%JziQ8sdz%f%q>&Nou_emZlyb?+#KvsgiFbH2G>E`}-mn_Z -)O|4wzI^1eK&y)eji>xWhQ1s|GQ*{9;mjo51HrH^mKQoIr+YwuIqv -T@atk#3`<$5J94yLkych2wcp!jr(zW9f6rI26*AMrb>Fj!Tphgb16su|f?()pLo;j~yJ -Ko_~G@g=B)>Gj#XMP~J1J*bFgE)|=d%^!^xN>mipzXFhG~aAQKfpfnOj&obBeI3Ux^GDgw$1EJuh#t? -UoL3XA(r}gW3w0@`jwO#gYHnW84Fv1r>auxX59~>wE{<@Nwrv?Mt_vRr9|*QUsKUNjLL;9x+uNBmFq{ -=e+L-$%u#=D9ReQETrwsCm9ekar>>11F0*}0gW-0{bo@rFm*v5+faQprELDSDCKQ0 -^9+joeLWeeVOggMDW`k^cWi&cwwLd@tS8Z8;@+=6Kgzad2uvL98C`M9&9dXXQdIx1)M>cu1^IcQN($M -%lJ>oCRs^78pnM?{~pCTb-_tuMN2@hHutiVe66`^K%G3zY3()W7w4xwgCajoj^+XMH@Q?I*NXh8$W)OTw>E0AVfJtIhlh(Q;?{BK@+0VM4*f+9JHkh#6*LNfEw~X0F*(;RVDP*FkuMQVVHnYON160G-Rm2uMil -8wNSJHzwtp~Qiy>=QKKSI>3mg*=1Ms7(GvNpB?_qpct#Nhjv`cQ%uZA@P_UpmY6C?D_(DJkqeSEp1Bl -F3Qp_iouV7~Zgc*QkVMrB)1&aVbi_}E2*hM9QSOPUkODyFwV+bh56c&stGg$3`!WULUOHCu!7`ayPGs -1^q${0-Qf~Et*N5=a1Um3PnpT*%1rK~iw{{p28ERz_;6oY$ -pg|DM4*f+928b^1PMoA@(@dq12`VTKMvqHfa6I63WER`2Vfk4@ftFO6bDiq;BcVA2^EfY!Ueel2zZAn -sxi|we6QV>SZb)6e6Qhq4c}|{Ui$#D_Cruk6*X`jPz&6y$?Y0$*W`8`qEDDm1${ycM!P@_3~CCVI>Bh -bpiXLHDZpxm28M-Lvjh~n7@9eC$2zNdNR=3rv~Y;ku#$kQ5nOeHX{#Gp(ZFTGuSQhW6jilAh45>DUjz -IaY&wmn%xi#HgE(mjqz19k1R*Gz36>^=6zv}kmT^OXGytR_KpFtj0FVYqG(e(3I5Y@^hWu&ZPXk99IM -R?K4HkYw`)Pwcv_Wh%f(ArvG~`>0<x-AC -xD}vt9C)Vo51cSaI^^8PX*S6NPN(cSP>`#rH)uJBEk5AK^S2oIJ)xy6#Y2t5`a)}^y3&18?>lN2ewWD -I7JhKQUi8V(ZaaSi$TYVYU$=wK^Sy?1e$=34GO$20E>3+E><>nI1jr7Cr^jds$=L5M>>w-yBe}JSeSW -FZf%M-5h@KTU5tu4d_7OisiXmD0?I*KMLo3wB&|Wg^3g5u&=8;@Ktq6rkQzcCG@=UhV#?%?P&Ar@V%R -7Gg-}F7Q3Kkc62rt8vN3677?DxCTFjC%s=#{QPz7SOi%N}Q)Y&H~>~6?Afi8l&2zb$v7aeTE8R)gZOE -8EDz$&Okpr!L*8fINmK^3$F)Doa2pcbIj0huo3pbe;kr;AA_hLAe^ByB*m1kXVPF9ojp^nj=B|E@osInE1bwf;Ll*-D%7e((9*c|ULd*QLu -k500auiSnyW)rP*%mfMf|6SdwwJ>;pkoe8X)A#E)j8@;rb#N{naMPNU2=IOUyL -EE^TnT?DMGY9%npBjD%gOI3EyFk_fJXaJ}x2KNwq#IuR6?_K9nA9XFR(}jt3fSr#jI;JIR3!HQ9iW*w -1(hk@u4*1mn9R2X#`T}y#zw13BMvic;S4#xVvA9-WhK3pB`k!@aKnm(czLyEmYV-NJ;mCttS -`(R3L4FE>xh-S^_1G_+Vh)JswD&27HEQ6H&A2OflMCfeyAkN+(PogAyKG}9$#U5;13iev|On4GTMAs8-$KBXR*4nV&a@ ->ZTH@6DqAAYi-+pI<32nF7vei#Hru%oWxiEi#?$Jgr4ceZn9^3)uvYdh8Nd^7NV*t}m1x6{d^lDU}d- -9PL9;dHJF(}}TR<1~DwE@Er(X0dXV3I`e{r~CiuY4-woe2K4&-MWpD#!in0k2G~Jh>gSQDrj;$4EGnW -UcG<+{`|dvzV6?=n!B$13Z}gJ1Z-K6#37sST=?fKQ;U0AQgCX0+x~IPCcy{e>e=?*ZYui-&e7F-_`)AtK4jA*i^_ZY5*#vK=C{031F!44n8azqGnl<8(=?fGZOLaie_W|=C -HI%0pse_mXV5*#7HXm6IM1p&%4$8;>4&o+tBNS*$JbFA#jvkx$f7Dvl6Sl|zI`qVUdB2CUvpNJd_)^4w;X)X1OOh^^*hfhUiUBI{Fh_GF7NjUKfM6~#0Ln`0dY -0hGI9DX5Y6!loIaFq2B;wbNLq9CCR?QZ2-bbWYXliY#($YJO?$6)}6U(U`>>EE+2pAiauSAU7NeciUN+ -aBw-$GYu_ZhNBJp6a%zy6u^6d#2l->$c~*?S*c8q1#^SwwJo?jc$9R+m3YGk#0NIZO6LpM7N#jwo~19 -s@u+V+nH+H+f{A!*V$E%v2B*+zeR9lbIG3Lswt4Ys!5t>ygj!{u-Z2J3=9KL7>KqqVpYuxWU3^aB_)r -M>sge|SX^>E>~=U?CH1ug!GS!+z@Ig6AFwMhUs72RR(X@oprtPJSrc=B$dWYWizt;46kkg*3=3jK8r4 -AD%L;Z>Gr0?dUN!MG!_COC?V85a5>>$QHCsotm!rKab_kRUD8t>Y>kD$R$?86I9pI2Xn!_DXA|I64cU -dGU@2{Qw0B3(ha31;~X8Sw6FJGFI7rVeS@LxFS-p+tM!mStgDIoP=mQ>L+<%igN1Ojlj5p3Mi7EddF@ -Q1eqLL$qv$#hvvR5$EX#C==t^UrC@4=<%Tv`tOurepXKKtd -1?9PFd9GSsY`(e|YRpRo<)vzQqgviVkCy#>`YXt+fnbSVuO}X(*g>!rb*ezXMKzn{B$ -=+GTh6As8^}(uJ(7~;t89y)TwJT?EFs$}_ifez18gT9I|> -5Bs6q%^|zIvL6(AmC%~u(P$6I;R>Y`?Tls3a>~mgY;_Lepj}SQ)0CECECJvEh+X|%94SIUL#$oG<$*Q -rq6_q^AAXo)(Xt9I9L{xiAjDelGCH&_{@oZA`gg-Ij|gd -iNrWde@w%2NQ;caIXat+Ss2YHLRzxhEJHhU$JW_{OCv{n$D144fMwCe+}T)odbgs9Zs6mihyH+(R&sE*j7$;x9oMrU^h{BZ<+LpJN<$U&Gu@JzbNhfq(Lw?W8VVxzMI199P9lzbVH$WzV` -b!Z>o+9F77*BK${0AKi_T-#BY%thz8Ft$1jnU%hm$w)LK(77E#V_yPW< -^sg*^@VA%!ll!pKexBxlpXT&HkE~H!Lc_ahkF7`}!KrV%jX&_CC7T2STIl4p^M#6|czNiSsNI&f-|Yz ->wL&&p*SsYFrSEab7NdPQWnY1ZPVkpr3%*gAt&Z>lGRCw((ysF3vyls>rj74_IF6jc&6yX_bRv!Q&ee -yU}cxWOD$KvQ-I)Lu1Pvtw)BY6j418v!d@9fK4Nu(NbC7!126Tvs_baC1Aq}FZqz2MX6j4>CWq@it4) -5Yw00|dmUr_CCKv_w(-q@gl)3uS{T+?buxNH3q;2+kvZ=O>vyQ>1OefoyD`vfh0%q6Z=$;Q3|56c8j3 -^iQBrYs0c)UOV!wABWx_tGG31~|QRo6JZxwV%kfevy>&LRker&<}T!AbgH?@`%0{Al^98vIiJpkpPbj -;{FD(7W>o6LA+>`U74qIInn1S;qM}iV -)!Cs32|Ox@P}mDsN%mhFcKFB!y;t5LM=DW(`G4ROlgvFR%4tJ;K(&;&t(DvC~DIB7|r-kuxcQnz1{sM -yWNfrq10dkfb|wSBoVk=QtUVqZQP!Bm#n)~C;)4G^qRfT%O$}39lSY-Zi;n_-j@G@f$8Zzu=+B6ih`n -@N^}NnXXwarAWpz^#O7drjKnd6>dNCNrKT)ea>RHfT|fg6dYU;ojnG#gRRM>$;LJbvuEC% -Z0$W-)*88v*&*jw;?3LYo(gwKXzjKNC6{luu#&>;0iRL)XfQGg!Z)uRu;;G)wA*D>QjWhKP~!0g9xUQ -|*1n!!3F!}cae*aGd1tLuY4v8~ElZV=AOGSO?2Ei -~;7F7l3(-fPB{h`6qYXiJ80(r1GNO~CC&7Y4yJz3-5d<(q&_Efgn -I~mYe0U2|^%ZeBqC?SrUR{0Vnc=(QEZ;EyoEd@>9Or3eo2A?Ago6koJ$w9-y*nfMZX -^$?B29ouZn=upm=Ma3xkh|ELn6#VBR^H52-%7k1sh4p3vnSGT&?is{^)~1j!79>-gx -n|rB_TO;=7j0zD)-eH2Ry|b~)hButf)GKzR+B0hN@7&Rgp7qK;%~`XKgtxnQM1gR?0m^~hHO_uGQ)5* -5f0MMxJkEw)57kh>))QaxHRyNnE(RH_Fn9N45_iZFi@BsXAtV)k~`D9HmWX5{ -5#?y)s6i6PsyAzy***l;|<=r&4HOmvNz*sO*9(+_8;ax(e@6fg`29XuO%FeA+!k$MuutY;>7K+TUv1_ -!xOfxT|hlPAw#A3EaSrVTSvid;=*Y=7VfKqM|<6I(X7*#Rq~$>nCG6InFwoGa$Ci -d*=yJEMVX2b;Jg%3Yl`x_OeZ_RN!{(9pfuUN!%R9wN$Jrmd~|YjcILBUHzw3{-VljydX8!SE$_gBmi4 -9HNjCnmc;xeqrXZD9B@AHp9VBO;O!;1s|GGB63X+=U_Br23unS%!-l -it!nH%9zN-Y^V=wm7^=3M3#^Ra2vm!-%0Mn=NIM3=NYxtJkC@~;;i)I}!%DgH1 -1DnA_o>p|I>Zq*y14j~^!(rF=DAqXQ0{*S8sTc?iYgloVWf&!(sBXougS&F+-zU{4B^uA8L~QdC=0Bi -BF5ABf=+agYMTXyA!0;b@RKO8W0IRSc9Z@jmyU33fS^`sh(2{uz5YDT+IL2Qzel{ggZ=9eU;w-aWBv{ -*neSN6pAk}v1b|DPU&dvgPR(;+EPlIW@7r^_sEI*tM3bMl2PGhmLtO`+Lz>L9RE2S^BW -HF{)wNoi0z*MlFe5=jwkjZt(?&*5?+u$52xO-Pwu4#<%)hbSC}VdTSVYVlfgMzekemvD(K>dLYzKpB* -ZE8oxM5ixnf~N+Cv~eH+DU9v*^p3JA_((Qbxn@;--6#26iP;^Llc(#w2``R>xo=#9|d2G^%i^kFWkJ{g7V8MJ$Bjq^5yQw-Tgb -v9LQmT*?iLkjVHCqkRKqY`OhCKgiPQ62o~Mas~@YYM;frHoo}5Ol*oglOmWS;Gj;kYC^!!ENt%FS&Ly -8G_HvhMsblJ8Smr~|vi5Mb47(3v8E*-f*P=A4MyGEmiJq;ZD%(N6i6e}^uQ*x_EN|M1E5E*N8@Gfpk- -P}WboBCA`|LFf6X~luP$j?_63}9Qgd6kP?6)~*^!2g7}DfLCin0b1tkhb+B!LNdU4fRB77@*9}z$rgECqiYI -mgawBq#2G3m1JIOm`c<>UI>!YZ0kq7~7ew7RZ%T@(#)xPDN=vfC1`$n+i1OJ!#D#}m)r~w+1dX6@E?5 -hwsT!p~$h(nqsxq1JNF;FrkjRr=VPyl^v6$b6Q;cpYs60(X&I2FI=-Rxbv}c{(2Y|`d&_ -2lq(?Wb4==~`lvR}~v0J)0fM)379v_}ONL2gF;LK7p-I!rd@(b1|Ng@U_&cXIQ*N|_F8&ONk|I}SgxT -51hPQH`I7Nf}9UKdBy0o&W#InRh0|hhzqp08Cd{Q0#7qpt1_>Naukse5+{5CwZAHl57H61gOo0l_od9 -WDf$85x=%yZv_H7Usa>M{iplAAqr)TgUon+h*royGy4C>GWzOo(09>_$&Bqtpjfh{Kw2eI>$E~~4~~= -v=7B}+H^!X-%NklTfSyCs@u -BT|FY->E)s_Rt)U`3%i85myU1-P^)MB%MW89Ql+5mf4_EMlA|QQy}SOb}Bc-vT+Rq`ex0O>os+-Xz&h;+27=0Fb` -II2d}kpo@u$74TG&+Yj(=D!eaY-@8o^HlJ(t)Y%T4tkqjaqW7&GVi7x)r -uOPhzPvL8V29;@3Mn)QiE|o_5**?`u@-H*J9IMEv4v6BM%|hb3#z(X8Bi)(c-7>)LWp==I(=? -bWdfzW)LJYlHSYQIr&RL#xilopa`19r6S`e!RD#$f08}=JCB9Q7WjheXq%9_25K4uww}wZwWC!g=uQg -pz!S?(h!w>ZA^Xist)}H1tPH`EKU^=veS4L3{bZdD{j=r$ynd5bnW4AU{t-@puK$|0IREW!9gWZ#Y*ak#cBq*E{oqLj&$V=0aJJLRrwS-V12?QV^bNN`rEy -)xBJlxmsK!yZ+jNXD(f4-E?z;CJ0CSj&vTDUF2(XKGrH}w5!mB>mD0m+d(Uk9Y -u(b^Wj)?^xS7`W#A;l-z73GEkI2{#E!CLPy2td1*Rr$)9d=bZ?|Sa&Q>-F<_gs_BhAm$ifH2dQ)GCV< -V0QBm!W#?;PyEL%O$q5{ERK=RdZC;mKjnHs}2`17ZvBAMpVii1`<5d^) -p2?BKHZ}T4!KxqtpuI`IJFDJi<`#L%`N?0OS~JBg(#M4LG?UcV;iN*<_e)8%5=!u^7O<%)s#8k~ImSN -lp@YtqinoS*WP0ASc!cb&Pjz0rRTYP}8CtMcZk>j6Yd^G)%i^HGWf*TI -!tJ;#*kw7LH{2aN3tGIpnT5l%X|u$eNo4m=-YPZuU4T>uV>+ -`=R2$-2*<^@Nfq7!cfR$h)qdtC%e(+da^E-hHZ&1Gu(p3JYI9J)u3=qK^rB|5-*aXhaohrPR$@$J%#Q -`tMt-9@48082R^Okn2Aj+t^JR5vfT^Q3%jkvLA5mYY7D>TvG76C5N9w}7h9&}Rh4I!UhX!IfT}$=mQ; -dp`R+VMAfqGw`T)i$TUSd5c0yHDJ> -zbDU>USdTUGG11AtFCPs84Sma!B<7y2CV*8s2m!w-6Jb++XMTxSr!-h28X39XZRCni;^xF1RWprU4t3ebzpNf)vR(gVC+5-i%`KQzM0a>Xy3V>q6wrtP4eUA*(uH#0RrCv3$I -9PAI%%UHfvQOgeporsb@h$T?KkKuy@!#A#v?lc_Nh)65P`EBK4~ppLDqBc14}NneWSpe5)B8;mT{&J= -!k9M5}hQVh>_Icq%1V|r@dD{j7B|KK?Xk2Eak`flIrM&UROkv-Iv^9zvIt#FCdL70axTSn_WbUK>r`? -{v_}M-Tq~>ZsEy4q42`#TeRxip86bYD!k#mKq?bR_b$HS@EZ=?DDOf6ARFI4XDJpWacbx$028Ru$4@W -|8eX87Jdp8HpYAN2OoLhsx9POu`*YoM%3zxTB#=vW?jINiwOyo!^ly=EAVfqqrg$BU=wsQHCTuzusez -`w(de~#!LOzGF5iNNn?|#=5JP6LE94U_ixKxpiO*>4JePMPrdWAJVDMG}RqG@E*dkAyJ2)ZvYFSYxX1IPtZMQ5KJtPh+FMwy -->X+SJ?OD0UF0Poed&QJ${b&VrBc+d=-jMcUFh)HO}%{!OQL-f20t5G3&Lno21BJ6 -iCbcY5Yqn5ol%PaZtTCiK5xt+p4xhBfmi6Mcp-BapI!xL$bm#e`!;1`>Qnp}ne%Ef;|MG>R)T5k8W4ByF^g)|d}8ar6Sl2pIr@o#aX -gp@jpUXK55*5ksad<+CbNaCka#mE#8~9Bz&mWLv+@Pfy1Dy!aQK^VuidONe%yD$tNjgdM6Uy6;0Nu(t -cj3Rb!ptDQ$tW6a0@J25aU9+-ka2YZ4qJksnv+cCDm(dUD@}!O}9S?TCitcr!O`{u$--}ilYv|IF-nO -0gwSsgljeUb)-Gqq#e97u!TV(}&ciBn|JRHsUD|Xb2CH-GDGTvoq)OwIZ?U-R+_;#Be)0MGAcqwE&ib -AZ4$+(Hr->s tTWB6@3X*F$*POByRRP`UG^m`DPi!%{9gm=q -K`kk8{-O`SpYrd^$IT_>I@>lQsts9gCuHpq#9siQX)l`~!mi!}o5fF_&YTRSJu0Nx -Jo?eg>&QpAuF0h_>w!O~AJXeq9$zO6w%O;57CRFqaDN;fov9X^k_^Y$Ep7Qu7~42Gvn}5x=)Ix}NjZ$ -A2UqC5A#cq(tP%|RRj00UVV$lu7A$^4r*4O7LVlc9wIxJ=6}Tu`>6e>tB -@vOFt&0rG9()%J>!bbrRi(C2G*H1M`QpT@=dK1DsH=z^y~Cl;y!&WZtSI2=iCn$Ko(THQQoYI+*all4 -wZi=ZEO&e*;iU0|XQR000O8B@~!W#71fszZ?JnBr5>`A^-pYaA|NaUv_0~WN&gWXmo9CHEd~OFJE+TY -h`X}dS!AhaCz-rdvn`1w*Nn$0%c}uxwTZMyW2-vXD5m6X=eM#HtyZ*bv?c`2}!IeQYA<`YMbwV&jAP$ -B*B+Ny<&1YjVu8NzpSY%elTLrJ4pyjPXl5y0{_HCE#Gyi6#_LTi`n$|h{ivUEchWby)gNe%}tBGoSK -1YL7S|s81+IYbZF`CCbJypdm18*Bk|WS^EnMZ|K7i+L0K)^nK&VopVD`y@yD~D&dW-N{w?(`7IO;4LU -VGF{8?5ZpmP^SH-pYABaBO5JKj7BSr|}rCM$e*@x%A8@as4H>!fHHI8>IofX|N}Nq*p8_FrPJJ8yx&dBzchHb -M8jZ-?w{LUAIO_zp*S>@DfJ!;m62Xj-N@p*io3YSiRS<%=VDurivt(370%FM8v_J&LJILto5wCSPN(6M65 -gOQ5EVNj|Gg=P+-A_TGgesX6$0Ab`0K#LVwEzF1#P$g=heRwgT~OOtVQ~oIH1MOzloQ}g0xk7yr0S7- -3e@f>sBNfN1wp+FKzso&v2dtsD@JlZ1^5JkM+`_Q4MkwaE-&ZNcVUhqj3YoiWg!}oGR!P%d8L0xG(st -H03KXk9jaOtnt&x~t0VFs90;JFXu`Cn)K)d(-f>+yn5bXX}m^rI>UO#)e$jJpP@vN=xFZG2gir+%X*OVv# -j}CF(l~Hai}UO`iE#ne~e}~G&n=BUc?~duu9n -1HRsM*vRcV^hnS0c=2N@N=g86P!~(8Q7nREsV%3aH1~r!6$-s2Y|uGHwJOWBrcT-?$wxheki{$44hk) -J*XAO`$N<;3FH}7PW}KJ1ov&D4s-XM{1BKn#33i-$#H5KW5LF(fKm#HkI(#`5c(o*75NGFVciONR22Q -CkRVdca-Ip7hwjq>X_?-H#_BUOZ_%h3gkS&y3N73B4ni_@pcc2glm(WA-&jSlmBC@oa4c*{jt&jZLUy -8HfL4|V$#|q}ti$Z@`u4KpzM~icA@K(!&n?uS+Ll1_6qdm1b-M9#^^Wj$%CX%hetvN+4 -i6@6UL`BGNDO41)vLNKzuX>rpiBU427TzzKV>2erZcyCd95Xb(U541bqtlp?eGfO*%2%A%^2~3}S|3K -Nxzz=D@LrJknbjN6lzqyLZqP=-r=2GA#Hj`TYKUsu9!$P7Vgg?@qruJ|^FuC|rd<;A?=MLjaRp+k>>& -Gbr`s_#Dd}Y8h_)8X6yMt#-w33^an(2G#p&={=PWEs^{ -lt@xSNz?-Tw-BLU(gD)5@0OH!Z9Z~oSn*572!ze`$wm*4!OEvnr)q*K -KKiEo(lPw4TdvUbLn4Le_jKX}y%+oVKNPDr=reT4(Z`^R~3k6Ky({!~~*U;SFW(`|C -G9tdI())lQS2|w5QD{M^qocLAxv+mjll~ezr1`i{G7aAzziQ|jFIEo>_DWKz+dfs^zRQ~c({_?SajKfU -ub1DLGKBjNf2%P+c5zoED=nyib1T(>(|UGcz*`uSHgY4-N~997D=0jGV|vCm8TQ-G) -ofYUL0`>PO*_(V1iUuJ0K+%~E642qNte1KM)D+8 ->iwA^`&ekVz?^ZALBx#8HS60UHwu0nZm1%LNAIGc&~5bV4XD3=IF+D4BH>!|^LsTxs}xd3=SQF_%Tfx -n91=0OkcCm~V|EY*+7}6_&`^1agMYFVx>oPBP^4n5YquS~?vwk2NzL1 -oBq||8b6zOxP%i1g^vWY>tfx6c=!A5*FP6&oEnqOCVF4qZI=>j)2L2fiDP^gl$Rz8~}K(31E~!f0pg1 -$l(lfwv^;=G{)qJted*-Gn$(0`j#%(HM-1e2ouK6J57c~Lk*uBP>N0D4)%Qj`A@$tTYZFkI7t)bJOo)r6=;n~xxCXvAA^jY!qic)Xh%Y%VrtUwdus|&c7Vw_iKNta+uz<1GDMc4pM -#2qS5VTue(Sd86&lPzsD5Mic%S=APDPChCti()wMl|{ce1`=`SD=%SZaT2Oo|BLrL#0wNGo&rHwgg#2 -dKq^h1!{F=nM#b82b}p>Wf|bwt$uLe}lu-e)hA$QAYu4S>0XVp$V?sR)TOl~`Y!?C}90Sq`MT|gkPYp -}gAsJPc>XJow^x%ToFzc~!?VQI82e`b?|B*?hG0qR;^>}EKL2+dnowr-If*!^j63TYF@Q}y0$ori02DsS{yho<(_=0!ndkR86{f1$R!>ecICbXP7v{vc()#*PH -R_Iid^_JR=Rc-YMmBUjfJJ)9as#b{}XDkijOI3)PIf;aZjn1808W;gQsl(>G -&)C4%=2C7jJ@CvmIwxj7P6%IW;vXR^GY{C#-R#wrney9el#3n&T%+=24e-U3SD7}QspB%E8fRg!j}QS -kIZ_zwN#^HgxySdF_p_C;<+jK#djCBH+7}R -BzHug1PM~vu>m7@9EPPv!-m&yfpmzej6KL!N%0Y5Pf1m(;jYlx=L;5c4z$G-mZ_!pm0Pn%J25h@@a;< -G`ugr{Dfin+FW38_BJZ-L5_2&KPRlV$Kqv~_l1QB+E=zRpeK~2wV;(~7yp-kNnXpsb%5;Qk1nj&GncVkO`yZ$Djpx@=Tc&51u12HCROb -L-ag?_Fw7s4YpnuVEzU0j}^?N#j{z+uz%_Z^lxeroHCfq(uJYC0;Y}0{Cw@2#aEH|J25j|~c85JFu6+BfWD{*=q9`k$e?DO -O@HcJ&QHF>y_4|>r(K>eD_>+je^k?|mS)T31{dM@3`z~-~9lF^KKO4?!3y8kFSLz1%QNL?Ok+DKl8Sh{j`nI*_5+tf)!ui;zM$XYD+f&{_D_d|5&_#B~O7c`@h|wOSH7AYF$ -f${hSAL{aLnU?71%4;(eCqK3t2mZhjL!VRe)HZ&5QFy!x@xJU7tW7^$S1N!E99No}1Fav1m?>{ph9EV -!E?q?5zLlq&Oo{N=pu$A$*Lo96#V6 -qoZr4LN{z+_bp^?}J|0+Yr-T(RA0H-eM2gXQr_?Iwg3-Q!2~IY_0O{ODzF^7|7<*$oSJOf$eV6~(@Ebx1a8|nnjPh~{b6yr -%9*rzdn6{=zeLi!A8lVEY3A0Jdu3#}Pw$PCEAj_pmc422m}xd-as^{Mvgg&668~9sWXC*~sx5cGB!KM!YSo-yu%+rHj4|>}Gy^X9Ntz^~ud{k6>Z=lzA+Sl(Hb@T -ls5`;r5$$9VKHvXdWc$8X$8ue#)y6j{D^M}tsYsACe_vGV69$5&p1tHopNtSPndHb;Kj&XkI)>Jb3oc -f1WUh&;v{MGMMNl85R^I~C3Glk!Y{-F-HcQnVne9*r-4(x^M$|I}iGLx;|7f6-de^1?BU__WZ~oQLnu -xwqlP<^zBnPAtv6E`3`&?TJ$x4aVP{H(QEps;|fw%46j7EEe)3I|CmW2>6EAy8*vpG!r@^7kJg%l=GG -)xR;~G5CHgzp`7O^t>k()pWLDMVf} -c*f7VsrC7~O5s_}oBbaI5j%=gvFMHS@;5qlGj2opI_POY#jBQ#gHOr+1CJJCp7{2wd^x>0O)I_uKR|swBH{}8;+ZQA%%>0ltY$t9;*WJ&547J~&x%9q#CjN4tDU!=gVl^D> -}Zu`-(aFs9RFXQI -zqYiEKUzWinGbF(V)31)4@vpgG4kbfzi|C;Ug;l`AIw`yOybddVu^zB1_j*1HF54JaYAA;u|t8Ft}FI -*CGJEa74a)l@#nDet>#Q2FeYpe2W<4i`V#*8HN7L3>^z7D;J -1F=-dS#IFO$CC<&0#@+E4M5sQA)yx^K<$GkF{Gc(Ncjo3~A+JpN$#{5oL_>oI1k;47dv8H^RhyyIpl9Ldm*R7XpD*BZHRufv7Fh7VqS72czZRbB?Ptr$!e1-XZTPJq*>*PuE_++qBdF2~s>n^HFPgJG=chU&J#1G_ZkY~8zTsp#hZT -oschn#;#!)jqi3Pu6fcK&b<(J62>rlVvqovMp|_aJ(3&hp`kIzJOmC>PqMAZ9Pl4g~2z@BsN?`x0W*S -bshnt>z?KX^bf?mhrNCG_Pwlqg8{|ob+5t7H)-4t(tmINU8r5x?|2EU#d>_n-9c5VuBu<}&boGIm3-K -FB+5)f>6HS$DcIy-B>}6mN(`bEpImjk(k?b_T({QGG>-zqxH2TsO0u@38N^Z>flAe;;sxM*o%JdE+ -+<9n$h+{as#cNfUsT-{mELC$D(+|_jo*c}duZII+fBsPz}uFJs>JXWdVU_+?b#74&A2{AOaOn+q -5O>|z9+b*h-24sw9Y-Y**Q=P+4G!(4Vm3#)d_t)F?VNpzqB^ziQmt;SOHE?lO`FO#=e(KYJm$E{_B#L -GB|a6q4)H1O`ZXe?^^1WUb&VVR{6c(o@$>ga-L7AJ28M%$Ux|tqetv1_cKhN}ulu@TH`?KwWkC6+MSO -}I7vttiH!tE-?ag2FO}PJ}i+exN90VjE-JV!{a%Z+MK=^gB&1V4#>SY?K4N`(j5NreE7eBY0Sr3ivy@VF@qa(LirJ%$ -?GC9e)0EZ@c7UIDcfO|8Q9eRhWMVl;8oEtvru^(Wrj0gJaqKn*+Kl)PL2%H$IJ%9vqhmGNAECqEa@)6 -yPThiOpG67XZb4h$CU4&v4+(D%)IH-Nq|+{AAG8AzHc6x6p?CcS78?{CQy-Ot1`c};IWxw0$aM{eN1mESh}+>JoQ-kK(Vk&RqL~{O&$M6&P?o~q=%9oN;bl+H9 -$$N32!!o65dnlWxDg+v){yLKFEHt4rVo7ul^nw2irFL_91U_m`0oFW?mXAO@AK(gPP38d;IICl}k-4T -S4Z7S+Fk!9<0`2gedn$=bhGLhMQ~zU88ph~12-SpYqAJf9E<|omZHJjKdp-#$D2C$!INX_mgI^8NdJ{5_$tg8ma -_@vw;zh1YrZk`=F!^0R;neixYh2>qiKHHued$MD7>|2o;UCG>MHz!n%RVE=*@5DVg4ftYV1k7Wl9HO2 -`qmo+c!Jc4cm4Z*nhabZu-kY-wUIUv+e8Y;!Jfd6iaeZ`(Ey{_bCKP*GIM6gA0;VKbHiTUul7(5* -mI?1LK!v~;%F$fQ70vE8EoeRrg6OMYoHA&4yA-NWO(Jjbcg3&`_n;~Il`4suaz<3LQTt{R7V_)eje57 -J7lQfQPcbcuN-9U4*D!C=Z5Ze63@n7`F!Q{gQwwbEMFS^j{k)F!iXwb669a=G(r&a8(6pr;kB7FCAMA -ZEp@3Kyu{Eq#EnP~ucHmCLU^p@`L5D#w-!ADxjXoHpzBbzokz`!=t%!h8#6qdRi-3B0R>n`*PLptOT -lS*jVZI_%UT{@A?y`QqZ7UZc?{0Xx@CRl)=bq!7()?qIS8H%D5k^pX-{T?Vfe%usQ5NhB>STO$x^4Ry -OWAvBiv{BS!uzx;_~DxC#XR2{smr<+m%>kO^flsqfuq)4W3))Y~d!7by{-vr4WiyJUP!fNUT!eR+pc_ -&$ea2bX$cIQmVvywFovW?QPz+x_xv{aZHrj214pe;m=8}smGvt8-sD@s2;h$?;-eGHL{o+SWJpk7y$y -kRM=m{fSpI_Km}8A@&H(?I>9tP`rhIA5i^+D?Ys)INcK5fozC##OpGG*PrYJ)LdtTs?gLeA3Kp_9+BO -o7r<|ZG%@AKmM}C>Nwl{A8+{))}r}_$8A>)kAO{t!Sf*YaHlGjoEs54P=nIH;rCQ;O~XxCROA`#cUxS -_!nIM1qUa@kh0tArt+9|)rnS*Eok*e`4!qt!3Z#-w3g=1d9@my)E{NHvL@H?=S0hrrY6GsREAoORg;o -!Q!wJ$JXF)t5NgNQY22m7fecf|2aJx~`xHgFnsUKx1RBhx;Dp7e1-tN4T_q06ugyg(IVq0as=7P`2aF -isDf#0;GkQ_weOB_wLW&)ucM9Gj|pQEoyYccl1JGj0EF9=A#Z+I@i!*VXE0}G+Jo9X=Ig3&|+-j$82a -MZ68V*hLt@&HD18WkMYJde3Q({SkPIO)~+2OplCv-V066wd{!GZZDqs+5LeP_4NLpV|)b*7nz};3tK%m3 -|(>8#VUw`Idm#&!sI=vM1V@`V-iYo=0f}c@Q#C_Ry7J=U=W-?bvx;vg1X1#R1TD# -_+oW=K@a=@anH5$*69S!=+_I@I4HKb=gN8OWLsiws5X0XzQWxR+I!LV9V?xNsVS{`=HQKZ5GlNdd!?5 -Nnf=MLpNYijI_OQ18@;6dlZ9YPrwblvqIXYrbd4#90YW^E-N@o;c(>sQDmQ|tm?HA!>#kaR#xdVl!Vy -w96NYa+XJ_|I{?)1AK4I*x%hYPzhk2g*3w0bt`&7YVav;i|+Pw8Jf~TI{W}hendd|r13T^QrE0HfJ8>NI4tHY)xEpuTcl6ud?*GDd=W4%s2#V+AHh7-G`us-&mkE9Ph~(@;Q -v{e`@;qy5DqoBlE7_<0i1&=b{jYbpL)JYwd8ng(Kz8OBV6b@vYzXLa@Nm}C@WJ-coAk4GxaDKbNbf|g -3$B=wY_7xc!-o(obFkbCEMzjkFn*tx@v2anMpEB$xJE_9iE;4eStjieS -ri?xw`kg?boj?Mg)LBAP@)y0?0*{u6w`zwkV4-3xE5q7p*sGR`k4ip2lSn{#O5f-V36eD38+Qd9O?&K -Mlg);;0BSFU}u5YRcqA7A4C^kIvq|>iwzrE=@x9xBBZpANAD#9w%iSANVUT^L$nC@wXMU!n{+Mp275@ -ME!qLRuzWc`gt!4H?il3LGLyyR=v;v`s&rI(-)7Q*VRVJjTcA3f#zwGMoGanpV!EqLF&ruYN-N0&9cx -h;`@WTodebPC@6ET=~E5rJ^kick4p3!&Q!I9x9rw=;AaO(cpFDacn~H^v}NUzM>Dw=Y=q+HLHn4fZa)!HJ=!o&}snRa|HQT(ULO_&u2s!*6kzN -4LYHKyTPiMot~@3EA9%7HL`*2YI+w^C3=?9Sj6fC6O>`M&ilriK#Zc+b9K4N@vwSS9LGb;vh^HJ8EuA -zv#VA>ju(AZxO|z(#X6By)>hIyfk`oY@Et{zhRzoYiv(>IrIFM2^5=6X133gzXdS` -Ri^>W6vNTU{tCece|6;@MWl9>7ALuES!b>kQ-EXnCi`cBpjC50_;-INFqV#MwJvCaGTGdQblCn?E~r* -43spd)+O4hK|q-epmzAR((|qFvCy&H5wf;NN&=l}{e|h=ShqEUy)Q+>T7Bb?0?x}^dX1&oP-HvA8PuJ^EZX2l!|J1O4aG-f_X}k638?{&aBMnpqcQrzL -$!Z>a2Jw15lkXI#~KOn9rYS?RGRT@x@_XAj`HolhogU)PbdDP>c7v4j -y#RFtq>FVE6r8RB$3so#KZO^UEUf5Cc&g6WT3TlJ*L6K`>qCtH8LX2{X&Tz%iaHznTF= -GZL_L(;z{3Xc0kwTqMcq!C-X_Ba|v~KPoOH-k;8raiQDA$p&d06e17EzY#Ag8DH%1$@CR -iyn&dbUeRNyb-6dg~tYEK8FxE%WUvWOJhjV4MG<1yL)H8K!&(V_Vy(gtNoJFv9CS{g42`+BI5M>3m1=+*RHww^|+ZJ;Ne;RsDF^NRPsVO;y|l_2;{XaG?)ysx -9<3`y&`g)tVP2UffpQyR3`%yu7En9p2Um(`2BJ3w*B$Ozv%=mE4QoX{sZkr4CCL|Fm0-wT^y8-L_VnO -4I6ODG+nsQ*(1A&)D3PMiCpSJl?5YZE1Ua+NO&%JqW!lwvM1WrY#RcwFOMmUPVlHr{cJ6aeMW(rTe;` -xoq2m`{Np`2lUGxFE2@?M32)b4r<=MA~b&oRdas&sFoT6TuEwzYRKPlNlvvr%2e_Ll3NNVDYCZQi75kfvYZ_U -iUXVd`e}@nCqT{fO##zOJ;lP6HiL6vn~h -6l*c>2Ur1@-vF_a8BHM^LO&$hjIKM?QJSo&X@yPW;4W+O{)|4yr+YS=F3uW0Y#?d;suC@bz)hN1pz+vKW{q)<&$4ZLbcXgF4thGf^ -8(AuV*EVOA|J2=>5OZN5AR9&Q3%Iq1zI-BC&?%#s$ZG8J^%2szYRVz%hD!cl<&py|B(=O}V>?!eNZ24 -B{OP)Hy_&SdE%4k17)uLQSS9TbYZA)?Gp;h6P-Nq8K-`mtyrF%yD^)+qF5YhuIb<0k${B$VX%N1FWF -*zs31*Jj9VU-#V6b=o#`&w%%O7v1`rRdY*)4^Z50l}1Omap`B#rodlc$8S|+E5B+os0HI7_LATMsWHr -SU9zp159DsrC@}7e-WVSgnHR-6H15drzie>52B-AD=y`FR-s%`-VjP)PXGw_1us|Ma#KNO&KX&%ym!_ -qyxp&x(z@t{nCa1kYXNU|)o3~GbwRjA(6LWke-(!bJo64bm{>1z}EOlc9_g@Lx#|MlpR7HY*&j%zga@ -alhy&9~otb9;OH;&${R&6eK`rqk&+cNM-p0`iL04(j7?-YSCXKW{JEGWpHYU0~Sn_rKBDhVV{JldD~v -RQQ&78yi2qy{K6+eWfBvzJrwt|IK49r`%6BYR)#=sD-u2(l246tk~1PRkb~ZDF0TA@Ym_`li7iZ3)-A@e5_>c2 -l^O#h{aPp6#Y^>jBVfwWRDJDYEElPe&C^n(Pr*v8Su$<7d@?=W11my!h)!I|#Bc-_zfRm?bX@_h^oCr -z3x#sqpe>pMK2MPGvvEel3|VbDdGRhbT_{t2+03H=PcO?55bGb83@N>@({Rvi-hNfN)P^e!5406~Qt~ -%gsKj_1fDf!eAdhER>78M+JjuPmhA=W)H!h9tV5WC0x(LJv~`OVI1W9X38R3mf0S4TBPaTG1NAG4~5= -2J%D5{%d5d2{BRF`vF%{>jbW7?JdKea>1KyXT7;A3lo -c0)?J@_Jg&U-sJh_jB~2ym4$vfm>5WObscvQIvW4egJy+YuUR0Rdk=i*3v*(X@@v1r6)1CF6)vG#R*+ -Y^?YAbTLn<(D1qF0{%9*Qcz?;qe3D_NKOD2hExVdCvER!RB*bCaa??A=GzY%>3DPk-N?e`$|Zljdo_Pb$)UR(aqevI&Y?Wx&~>>$}=PRl*& -cDv7`x?8(7a?9qc@}qU(bESgItlGeR(C;xk)T#deWeZq!q-N$)sl-2^JO7_;zpD;;8Ft`s%kf(6HIjWoTk!%R|Y^-n=IAQz?SAi^Ro^8d9klEaWq>0{Z{ -|o;^JttQT;5FsHkF08t_2@K39O2st)nh)~)5a0e-50%y&zz&67>6VN4rDi$$p{Vwxy-L5GA5=w%CPD8 -pbGw!P4Qb1&53gjwRnYDbxtnHsz{EvF)GkRMy*#}?U?RDO~TxfLl_ -eb@2i_5$qQXMZcFUc#%`C9-l4bY-Ct+fEr-j(W37%T0}qB~7g|9)Hl7Bsq^I82txt{OUB)kO_6wD;BX -FL_OL|DpZ?Y`)R&@wDhq%`f1KXl<~U)!z-SZo8f^8ejiDseiXL(K^x|l2U=t(>IPQ!Um|6AUvsn4Yhu -sBg|HzzPzOg>)&tc--5=-u>L6|Sc7h(pcYL1^M~rEp~$Zqou!KMtCuy*sx7|~L;{(np2n_5EZ*Zb -yIgV(bUW2Aq{(b-fUb7C{ofL;7FD4}uzT9~0#9$lc{ -m`Q`0PXB&e|88mYQFXdlR41#=&-e9DLlFewO;kAnHA!%4ejA#o@K=RevGSTk|GcbzwiIQy&}*_vNA)q&Wzo?n#J&F6BofDb6&EZJ1Jf;^yPx7mlbnXhyTESIbx4=7o?*rI3+dPv#Y3FD%b3%0Z5I{vl_cvt20Noo@S -w@PUTnak)2$YrYEd&<>@HQ=(5L!w#pmtsP5}jzMZRs%YM+`SMkubbdM=d7c7+ZiUu|KYK27r -Hy*O3o=-Kn$wXW!yPQ{|ZxS$+PZIHoki?%wM0FUFSqVr= -d&WxwBl+5YMoaQ3*`<5X7hTvd`4+Rxsxb8A8jtr@I>3GI(+!{7c`(d%SI(~OtTAKgdd!uArzX;cim%eG=T(nm$h01++w5n-nNT1e&vKq9*vl^PeM&_?W -^Vit?HF^9#LweM?R&L5r2Rf65^Y!fRILrhY}P?WS*RijK%+;&sy1JH8xVM9Q2 -Fdk;*~|ZiM{*B&+F)bT0+TM-$X(9btT%2CQ&5NkGWQUL4Ke3Aa0NTB(>^QLNsa=msu28MC&pxqD{5%J -`SQ>TR##-tKYIrefLb1(0y2i{#E^_;?q<0qMlV|RiOr0ZKP>ns^fsJfbw##HaZ|PM}wANh!5@8r%8N| -LiN4PhZHfPY8HYjUZ3H9O`FXz^!6gUcZ<|7Y0T>>{4h36NJvyAhrv?YHVySb^@}=t)PINllb5~T+2@b%d!NolGO-mBgZ=a+AKZ{ENEYt!U#Xqr51nmp_EPTzn2Zda4X!%^Rq8`tHAlb)*h0VSzY(h>6 -ZTeZ1+#J@oHNeOf~KAQ2j|OtLdQ8Lp8KoNUgw}YB)GD#o8I8MEvpm^_$)0hDHabqo&-;rnyGp+{Ff_S -UX!z+vawbL+{$zqS*cJvr@NKD+j2$nIHqj+1Wd#`JdjjG-k3+n;9}tY@EFX&Cv)dJ8kC1sp?s61uoAo -PHP1@K0HQU^(+`@mM%Y@oSs#j^E4Qt&UP9Moc6^r3C56gI|*RZD#<-)7EHlHI}1h@3p?h(bjKVZfwgn -s%-Oll3>Y0vdZz5FrtI;S`SVj<`t4Tf&tS>meLKtg97@H|udni^d82Ys`fI`N~-Z>S}3)` -i};6&w!w2D-><=x4Qi9|YsR*_53uGqs{Owe%%))&cA2dRzTy3dYx-pMh`CCqV-pdSkOAJV}>n0&1|5Z -We;e(Xl~oHu3$dGN}?E+A8}KFrc@#4Yy+foOPhNFJy5z^?}NxrKx^624_VS2d$7s5<2UE%Q{nE!44TV -vw`2Ky<#4F`O367m;jgE7}14C1ilT8Oh2;FDwz65V_>o*E#o-KTjXHq16j~08`b*GRwC5 -a8M&!Ju}TjEGos&_VUSIi>rHrV7(O&R>z8k+heIQfm+wFPRLj+yGHliX(v;I$HvwW}nhS;mjS4S5jTY -5MJ&H*EZP+~=gG_C5?@5Lxknqy?GS+e*h%ks+1v!$?Sr=^PxUS?F@HB~%0t0KN+{+*>P{4#QUh3-OW> -oLysHjT4J#EX}&C&ECb9HMK8O`uOtGJ9qQ;T9~I+eJ$QBvl>P9*k2%*e4sRtLktqEVgbd>d5<{zY15P -1Z;Zp$v&sk(F6|e_Fj_`yVQ_>4zzG2;HH3gbO=PU%*v3)3Rdf-9K_**5Y8SAF&)f| -Q^SLWLV>e1D1B6lHK00n472@WGnVXSmgYwC9_)!G`@)Z@CPOa;rTO5E*pdBXGVVV{C@@)SBWU5M+!&9zw?bBZ9KA1+{H#Q6f@{t#Vm>FFq -kRVt(i#z?4+Bcj_e2^WlVT<1h#ugs+W5@V_0{ORR*t0-s3MDV%_zPfR*3t1%3xoh4-sRBNrgV}g8RFb(^A38{g_n|Gu&l{_PfsJ -BD+!4Ny(-OZ5l~1m66oA6ghGPfrx|woR+ -f3Iw+GCABMKm9hSvy?bq-heplMF5lF%8Z%OXW*r#swx9LFhFCpkCVVz7fSA~8Qe4W?yy@pvlk -09wa$2ZXF+EjaDDWIRSFof!5a(#-xT+s^yR`&%E)GBl*fy?AW`$uN#=n}YzhZxxw8%!(|)$eBY0zK@i -bFWSbXnD!g;MyzQ~Y}Q5?;)s9ZzW(HQSn;BKGg(HadI{XF9}-Dva~c7}6?%{oB+xHEj-KI(09t@Oo7E -Sjc)SFAKuY|-6__c5WjbvV5 -YS^Fgb0&X#>opC@NWcSwfZy<1#$pD>0KcZ4nnDbRK=58|fSTAFM8iCjhejf=?XfcQeZ7QZZ3gglN9f? -QdVDUE&d+4*LSKY%^M}FQB6(HDu~o~FMbi9ZCW1G#2t*4Dc6vx8;`*Rp;@L0d4>TsCPIVj*0)Y_rU8I?8H!?4$) -`t+BFtGy1a;IKa#bqGYPr9VLpVs%Cs;@q}Bhmdv3YoM`M=d8GJ&dv+oK@NtHQhCMtGy&YKr3;45Y~Ww -SbR8W6PKsmL`-^RVjZXfh(^WJ4f9cquF;HQ~{F{FLMfS_E^;Z$+H1+&dta?T#{_1TuBxR#`f0c{WXaW -TF8sv7b%>e(k(`%y>f9>?zv~nT1HNw59*64r3&zbx!L$rt?UwG?zK;4`Jk(gES2)SApUiIB)b}QhrUT -}~HfvXGYv%`70utbT*S(Je4-M7AY@?HIbAh35VNaQxO-@(ylYJgq7K|40wIF-^=FT?5)t`PspkzC4dCa|1R^xC$k5I2~_S=dF~l@fZmj)XIVs@$=@v5j|y?~a(rMKE -E44to?)Z1LTJq*$URauL7`be0)RRGs4NFqu<9;Ib3oQTQAfC7iqt=Fm#%LSvP`pzVa|*;^cIOmXn=mX -`)ISKg|Hq+E-gKp)|@w_&Udw%7_A8N9Xh34T*`t|pGpu*H1a5vrM4Z^hmkB}y!^hV6G^F*iMbCs%6>* -gLtBB0BL-uB15ddB@^16YO2M^z_9$m)Nl5X{jz(k$?37qGTV9j&$s%%Zo5@Z+vN=S(DiYhBW70c#FNA -xnA+k9%-X~@6zv7V^@YFSon8oQlZpxPfXu=L_nKN?BL$vz{CrEf;!GDhm4k|d6R%}JHqf2BI`sNr;L= -gyl5-ND|~iHxXy?zx=6{u(V$D=iivdC*s3GjC}osn+9hxXO19NzElxb_TcQD-np|Ol4w2 -Ipf-`PWNN;FoWwK?Vp>j@z7RDOCzJ>1i1IHGDHDeu2Zt)GAl-4+~GVZb^p4U}uw^31EONa797Ak8?c@ -xKd2Uha$b%&!R?DlpTa)lqm8y$e?Oluyq`oO89DD!P3tSLdi!UCOlMU$b -dYUye<|Ok%b=vRsvI$)#oJJu_h8tekX0Ouwo2dE8T!Bu99TKra|g=}p=-EZ6d?k_%{6%?4UN?XH}71|&`2i^g0hr1h~w;coHs~da=wfLzdz$BEB00IDV&O9(f1rqB{0I -N*j&A*a4JK|6*G4AeK3zb1krF}{oZz0z#s)x0}DFqfJOZD&<9*OWkxEH>-%-&XMFN!7V-BTpVzn@?>A -wxJqOJ1kXZyqt>42$BSZ9kM+rQj;_92}RhN$?bk+g0#*8I&<^WT;)R`+pyRA -Dl5fk#0HN3o+3q81wa!PBWdt1w4?DV?o-&=0Fp+RqS~Tpw8f%&2~_)y$~&2hK+{-TFX4qpNzCL}`e3b -2IbwyESUl5^j{)qeB|-EBt4pg&&{@^ErUl!h7V|D0|hl@eb>IuD&{2B`BBwzx`mL`fRM5u^nOPuvxQ%Z8hZqSX+5hOUVdVAkJBs&Cv2p%*_PW_7g#?;)U~-p ->3I9=qp638_3SpnYMGQ8Krhb&0WklUR%FXhaO3?WL8i3xylx_3M<~D&V^T8(iym63Cv3>f;XKP?#l|l ->5gsY=9&M5g*(#VL;u!|IN@^Kg6jT|8dv7+h($|VO|BIQRGkteS5TO@YSI&|WNsHJMyqt$m{MR6$*Z%aPpM`6UEB ->HV{>ri-#&Fe>3s2n3CLYxGq5GSTz8HcA~?A_xk$#h}5{^^apYcU0a!NyX3djIN@5oQ=ZS+>)d>rbsK -sTNL9OG}8b&nL?ghCuMi?wD#KZcL{?*^7!%|4%Em!tKfptq69V+EoNQ4OT^A=Z@k6)u(7l=}9=Hs#31 -%YYlqsbb -ndVY95B+6ZgIN|jlg@uRtovUlP(-sJ)YHj%yiCj9Dh<+&F8PguH#2rYl&OB)Qe_wF{zlE4w+h2Tt`mv -7#GeAjG3LIIq0p!y=MnJP%LyA);!UAq+1-VDa2*Nkid2sYX{@V&Im4KFXA^&g~MqvJt-eSimhuosgFQN1X|}*CnXj#(9Q55dBbF|6y>H9!bG8J&F+Q^pro<h807UFx`06{37sb^;R_nnc3Y;L5CO+!BjpB{&0Kj@dcA!Nh& -4>n_{sl%92!5=z|nX&)TuFvSok5GSP4gT0^#8}85JB^sJ{D~iFz&*pCIF}jsJ%195g=zXHUi|_Iopr! -ctP{YgYSY!9Y$2HW^^@IS90mN;>8}~QpUhO%jT@!>nH@RIgP-NL5$E7POBW3eF<a9 -ME5>5mVLP0%#M`cV10{aBc<8*^d!dM0r3K!WCkD*ZZ5Fup+ -HFZp}QIau0LB7t3|A9n!9_l)_P;;QB7Rm?8vrvd#VV!SK#J6vu7C;3SY6(&xFP{4}^vf@_p&8+P$dixjphU-VqY26Z!q9AtE%C4s@irc9mOMoNy$!h)7^zJJjlf -2*dWA`Yp8&GS(mN*`8o@8ZpmMzVgTTK>Z~hRpV~$~J8tMKI0PfdLfoM20g0Z7BTO@XPd}d2vY=5|vN5?1r4>IU~fwM -q`P9C1TV(GwG1D_tfA*pwOXhV&DY};ta0K)N~!o&AfV52|XW6gzLGbd8lte8{0d@o@XBN#)@QLJ@Q>Y3-tFirX;6J{!@BxxJj4xjc`SKG_5uQfUPI$l*8?MJR}f-Mm7i0cj;}Flx+(w)q|wP>qt -Q4SnVzzoxc4TnW=C3hz!xQ=(}c`DhP6WH+pb_&*upxd8^bRXcqxd`Nuv|{4Grl5(^SV&sOXr85;F%W$Tg3z217$X9Wwk7@BzU`1g -CmZ-_$=wHr%|~AOA^DS}Xwyd|gI2m+xHo*WrcZINrf)?r8iMTBy(giS_-kn~Uj^N=84 -gU!EA;V+9Ck)R3CqD1q0NiJ=$-o&;xSBVg0iQBF0G!!*Qv%NHf2M8)45w~+45x1S45w}}Ki>m9U@*En -;cC7II}?`9_h4tj;`x3B_?+Qj6Q=F)QH -vYhS=er-C!6-EWR7CITY*=o1ow7hi!RZah}~M*Qs_Yk?B!GXB}|IKgKl9!*yiZMR;qz#reyLO?Le9wC -V0I48qP2dm9a3wgoG;$Pg!I4+To&eqp_cDH1g8EHnwm-iHgf^PEO5NC>04en;wk=$HYGH=`lAD8Y9JA -|g6r=QI&s)x&9 -+zz%pOX_wG-364Dwun>K6Ye!C=_1VbkCRHknv;HNwt59Z2LIJ%NJtS8mkD3})koyN6b=1m`4v$AhO%> -(^4jcApUUjm}LOHgf@UO1y(wWSnn+;DpalsvZ%2X9b1~X)W~dfPe-g#*33+1;?s@lqC%&atOL0c@9ZO -%Ru!2Da*LlQ)8gL@J0MG+|VWckl;BcTtIEaLP`^fz|Cs-7aV24J39)h)=yq0iCejTP8h-KCs)QIIp(% -;xayHomb|Wd*1B3sO*oPWqz1q@^!4qN@OqPlzEhYLHZOg*NEKFuBV<7Vu9KdmeML7 -%}0OCa?#uwz6EU?@w7Uh54k*9!$WylF-ehe!16ZeVwJKp5&49;yt~WXZ9nczE3{2%GRcqMZsf>%#a2W -JIe1+wTG^iztUyO_BK+*xnS1tUMSqdZR|eUHSMyU6(UQG(H&uT5TtS3OuzpIn7wj -iQaazYR#0|s`U1{29pNGcmEj7S#%UqK6^I#VjTbT4p+^VWgZ7=C|W| -^+8vABU6+;tAla3l*P1z}SYoXT`@l#jC~WJ?^Ywe;Y1@Ooo74rX3jMT3|01a!SatgwDEP#1xS5qoBOi -KvFi|@%QiwQK%p92{UB6BA5{(Xf?p5JdCN)F+oM6s6@WNjB4~EY2<|?uL{md_!jEMiO4sDky-n3#8n{ -~%h7FrSD^%#DG=h=kW7ra+ -utZ=EXF96`miiVChTe=Lj4rIR%>=GQ++d33^ljrbG6LW+gJT-nEA0*>!;c*xfauWu{?qvcG@S_qyE;* -~-Q`9$HJU(@~*AQ4HLX2abk^b3zKRneQYA -)fSh*~5jWp9Nb=C!6fzf-SC@unT1_P~8ME;Kd@sgA$85m|QFboC?GOfhKH&jH+Z4X3!VExA4X91{Qnd -F9!gND$v`wNQ~x>u_IU{X}jk4>DJw%V?rR;H1nKqk}HIXp$_pdh6W>d4nF5%qaQP%_#b@QMdtZ~VXaP -c3p#UxjqM#^3RQ^1hTNCXnG-xlEn|V005KJaV<6^?7!pH=0zqv|7%^%&4JCBu1XC?X0znLkz8zADV@8 -arZ=OI(%-I2t>4SA# -rKFWpC{5QXI43D)N#825410S#RbZ#gh;*K7YvwLOO`iAOq?Vi%6_qRXS8#fKw27|LbrL2wwD -_;*0Ta6+05-V#dEQAZ_Ay-)WnD*#Q7{{*LF(I}wkcHQ=`%@AXP9W -L*6_=<$pA8@+Kc7zvC;<~4ZO1j -0+)f0Ys0wI7R!ryzJQaD4hDlP5U0FHgeh}I9a7``cpfBA;V$TOXV*dVpvAGiuzD$cb7IeTvgnh(M1hP -o`UsE4n^q`o;D`wv8=vW+n}DjAbSN4|h-TiQ$*;?3X>GDZZ;F*#K&)&Ns)mAJu$>$`B*r-gK-}7~Lux -*ELpcg_OmL1JBGo9iV}}C^gV+t;O;afDnq>kMl4FNlD!1b_V@8U2%!D!FHJu|0VQL&Bc~w(LE_NiU6a -g71v6Yeq-CS(>x>sy_7cihpSJO+1TSC@4*5aBm3SPQqiiX2z<6cj^n#XjT5c(xN7qCbl{y-gKA*9(?W -kVrHgYuzb(Sa!fz;VpkE%=gBEWZYYgS~j2mI(5V<`%;9SD_2ZK{6=4h~-WhEVYnO6c9Zk==B!xwX<0f -%f-;A!qf2y&ha4(e#&bm*W>(@)!4?nzEpL@L~C!8W9lC*d`7xT6AS64n>b5OMT?iYTOPGQsSi^!107e -I#38aDhJ>)*kB8Q$w|s$OK)t`6+wa81=@+A@$W*iLFiQ*`;lMF_+;;3KLl9t{l0g(H)wD)s_C$lZ&S; -V6B`cE?5W+!fcAxeJ8BNO}_HJ?Ru}ebkW@jG*+vWWHSiHr)$}@+6;j}X$hOXz9CzuPT=~%$YX~H;JA3 -_5!RSe?a@N;JU=9P3pU_Q@)go-W8SLGwP+yl#RpqkhKPigJ2Pe7=yOdOg}5i-BXuGC<9zT%MKNIFESW -n5-~bT2(Z$;?Bv-96kmwp;~qxM3mJoNPG6=2OQVE9f2Gut6+R06BGJNMJmGjx=};4)N%Pz|hWYLQpcE -9fWX!aT-=5rPVx?NOFyFgsE@D!61xrg>3Efw~#$}A8X!;7`wZc+52cZ^zt$b1M5{JGs)MsmxJM0K?n# -bRUbB~2Lw^r3OMUR>9wU1K|4>{C>YN@1cVeqO}?h$BMF^#!JH?J07V7Ib4R%ET_Nbzv15rSA$$lW_UZ -D{9AI2=r<164vT=X;aGeH}UO6N+>MWB`h>feFj`>En^P+vmsOlXm!t=s#JlCZ*TXZWJ_q*1m8=k!89D -rZMrgCZT}iV55t{CLQOM$vodQ -7QfH1Sr@qL>wt-US>8g6OLrpzi*JJxz5F)l1PE~x^hm(vRZyD)zTJo6Wb+Qqm*yS(Qm_Yt2}PtCEQNf -QG{p&&Mo@%Q6mY+`n}jkE*6Ny-yNk|+`kWmcPzjkqYu6_;R}Uq^^(D>3Ue}DRPDJ9H)ez;1AsIN~v@i -+2-c?m6J*-2K??4Ja8?$3cMr=XQ%mo&CBxEH;q6ZnK6>Z);+}}#Dr9c)*64B9`Pf%DEgar~(2dY8@FF --6#O33_+lMhQ?GRRML@yZM_k~4(Y0~1G>)DuWoc1B1P*X~+H4A5r08w%`Da56Va(#x~B7@P3Rv -kc~g6{_0t*dwn|j3@qSv2s2I$n}leh-F%AKM+`c5F -!emK+{#LeEe6oBiGYk`k&0Ij~Pjel#{CF_k_8yJkyg4&qHpphSsj1*MhU8xe7B! -jKF9^0qT2~+Ux_K_qGtdfLgm@UckBs+?ZCb%Nzu!0^D3W~f2*PG%p6#pj4Psf*qkt2fX>X`%Zr$W%V)R+;N@JFJib -@OZ*Zll-GnG4JsJDf14xJ5D<9GT6!Ta8}fL>vKZc1%8%DwCiwks|?|b)b~`XrO$vc_`p?HbV>~XU@hsA&dF -l$`UFt|vah;4!@GqUl>hS_vtF%Swp-2xwfQzky|1P$ -Wawyvh}YxhO4>&{#<61kQGi}nAy!>*a)*QHm4nf|sVJ$D)~R!nIs*JiH#y8!WHAPZocDDY#3%p@q2_b -29nGk6HF%yTya%H;hC!$c-7MHt)49}*po>TuwIkm6I}V;}-tTBHwIXPuiABcM22aLQo17cpcwz4A3?I -Nz6`ipEF-{D+wFp+HuR!Z#G$wcAGu@D?!*8P6a%3A*}ReXoaPe;8MJ2I%P12;2BQuoE|fr(+#G -`OHqbKrW~V?*$xfhD&&?^W~^U67s4<-phH-sSm!=%X$}G99nCR;d0E8vRi5O+Ld%0(f{I0S0R-Rt9#b -{E@tP2r*`$ujjn@~#2vxwTLuK9_HM(@p2=n?au-+bdtmPqIu2L0|}`lPfS1s -2!oreARw_A|TML1B;gQJRH&#D)<73p+MX?5qyqEP?2Hj5rR?{Mhw1o!|9FQkiqmBrar;x8Lfc9bO&%j -a7xoe=BR?p1?rG6@^LH3Var|ie65CRmsYO5d<9E^eOSJ>AEgBsTXbU`VcR)kINd_`2udL}pTTt5+?O{ -*@^n$K%A#0v$nXsT=o4Ls4CZJ*#-igcpv=Y#z|#bWQ8hw5Ld7`O@j-sgAK1dhunJBm93!jW{Nd0ce2o -fD#SZOaA{%BQ;LtqWO05tg8)RXlXr9P&#Ghb*vQFUHR|sy%Dq}T7wmsyS{Zk=x@E^)DDq0`3+bBUH}eVDl)H1OR+zL+@auOn1HeER)+3S35^*Nl+&jO%yt$DFfyTP! -eA~ymcN|qnVPu|{L~!!c#714a<)U!>!79ODjk|VtiVs@g?rQ{n -O(_sf@pqF*qQ29sE&a~n#4#f~hZ6x~MOqpoI)@XUz>33(i9l^}NEK>}-&q1WAT_~uazYD!xf#?dKA$p -d<^Z-Y9uFBda{xyTY{amc1Bl^gC@1L=Sj?o55n|+NusEUbh{0lx9TH|mr}0PrRA9Ifu1(%eB}LlE8Os -vl8S68gIOdwfjP*&etlUJ2;Q4iAqpsajw&&%%gS&RKF6JcG$9V_;>MO&CFok|-c{Hi -SvU_5`!xOB^+UMSOXy0?urxT6C5W{Rrz?;UVJ@x+T9`53sc@9s?mZx(Ln)|IVlsU$ySz5D?H1ZjE`U`u{9&EA -H9V#>aa6RFb_{o9r~EtscSJr23*(A}cg#d?U7DwJ43M$AS|8^M6!1wTxIr@M-56Ml){V~lX^py+G^ri -3E91&tCR76c*-`9uYt^(t;7goB1SR4H!LRp9;4r-IQcdTQgYt0C!w=0m{%!OJ -r{37h6LxQ{qcTDNg2s=0i1QABy(^rzxOu=Tx2BUzGf-U5y7H$x<&|Vbuk)Ja?!WqPMDVjRj1r$kL*w%OCSyuVkq(Uao=lphN2KPVWWdBDvpB*oJC@bVopNJoItFax_!b? -;dE@%f9ErEZTc7xZoJH2~F~K==XUt&pnCb}mC#AJ7=Mqid=$H_avc6;&NCb~2qr_-}Wj-(*AS7IhGaF -LLj)lYgmS3}j_Q}_7aSUIIW1%sF>G;PiHl;8iBo8F=`V5}i;kf=f>srL48>#5J>+~FLJAozsg+tS)@gw5uv_z)j{(2dSq7NPqgqa0BW8 -IWWm4u3ePx*N6aM7(3`P)XlC;J!F7kj;k<3VA^cd;A+t!A3!O*$QwvSA~6 -ufeyE8;+JUo#WQntipy2E;?Ne^a<^f?+a8?q%8y(lnYx0LDolZhC|iGk$I))>K{j^wwlg3oGV-D~5=mUo1jz2&+##`rieB^;m%bomss!^IdyTeA>cl_AJ5ggV#cC+ZA#5?-3qM2HEv8 -d!2a8U^wrKgeToy9xxIEGQ*JHGwqLACBWV>Kld?|AUBy1P_tY;axVE)!iqP4e5XX5qN&3?+mu4x~JsR -os=5t3x2fuwgjG*VNGo>vQi$BKN!{2_$sp0MiD+Xx6=)mPddSwHcdx^L6<#fo2_;t$#))_x$k@q($C$ -#@1-&eMj;}5AVgEhrq^3S}<&81HZ`B7+hNTA|rL!?C>{(k$w4vA9Kb1g)d=P;IL|dMed6Tpc&bGv89F -vc;gIVTAwN&;Da1rI`T9__@yIH$m7<0DXfo#+b_2Xfpzcx>(L|S%&GljxDJ!zr7|6!ufLkx`%~{ft1| -t&entQ4)vME{8U+gK4)ptg9rv4hPhJ8xXz0u%017s2=msZ%jT(uYqe%rjZ0XJb8#gc$MOLs$3+n@R)W -WFU+y0VV&RT6E*sGTAm4QwB4Qz^br-N1o$AB66ftTs1g -+caHBR{k|HSz<`(^h^aGfKf)`I(zo3f9W+l-iiK6N2h9@`LQBMt&IcsgWPG+sbcBJRA8z52mkL*m14H -MS2w`m-m|xiu?F9^$P`2>fUeEAL^}ug9i9%qm*A@hApO0j`F3a4;DrZ=qw3pz+nr}mmX@+xNRj}>$#* -LlLqoZ`SjtL+8FESK94GXz2zmdyvX$Hyvpl;`ZsjtZ{Xn9=RJluZ2Vf+zvX|TK+EQ@zdn2P=+Pz%7tv -kSauE5d(Wf`hdsokTi!|$9J@4K0qNJC2>oC`{$zMc8xXzzGQ$^c?e|x+tip{s*d~L2SbvOHEz`mvYiy;HC7F48>zL2U)qKJe-1Jj|NEpM6^k>+$1{UX+JH?{*a?J -+;f}`DKl1*9k0@Z}7q^fMA+B9wd_OZ(R3D55QaHB6PJT-qc -ZCB*~7f?$B1QY-O00;mj6qrt5)^6wxL;wJ@&;bA=0001RX>c!Jc4cm4Z*nhabZu-kY-wUIXmo9CHE>~ -ab7gWaaCz;0YjfK;vgr5x3XWWRBcHXDWHPh6;}hqeB$Legp2?$P@1x4cm8p~G~ak^NRMVYg3ZoVqBYnH}8v)rr%rP<{&P5`QCbgVuaUxo#fW#5MRbrZtHvW(@J -#}nvk8Kz~`-{FG*KE)!Ouvb@M9!>y7FzT?F#PQ!23zmQVW42=Xfhfi%ahSYL*qi~3gW!sVQJl`|2a_l -)!}@2g|0W<0P#l=@0O2hG+Ukm>1Q@_6Rjorm -#L@sK$9B_<`cxICaOZPQLl>@psYX@eEi*gTq~{xQGIJJBoIWd -vgjgWlMME@EUzV#;dGgj=pmK^Jq*6*1z9viF-5$>4+6WmNZIP*Vu&yfcm?eHL4ZO;A)cV*qSV9B6zC? -Do7_99QT+tct?P|Jz?v6BqdI=#Da>n3vd4rCtJ()#ni{_mV>#73t$ykjj{-UL8qofOMy0A(XIkISp?> -v1t0X21do=b(l{(KA_F?w;d?*COc}2~HDj`ZmjZMG%jH@1xu!!@gBX)QWy>Lv`KmN283eP&U_VK4tNUHm8*jQMC7C3 -csH2t9N=Evs5!#~=+*8t~bLh}(vzb_sKJ)v4Uw{#!B5LLzb*#BqhOH4b0E1WP#&e3{AJGnd=Zv{M$}U3GHw!-1)J -4-BomFaU@R+Slez@cfJ=gwYE5a1Njk9s>j_C(G9GiA%n82KAh5*RX1<$7!xgGOeytuI1rHYqAP1{F+_ -cFGg00blHNox$98#FTN{rUXnQ`d+sjakEH|)s9&jQ4vCZQ1Dm0&m%J{w#zV6p74un!N;9aR8-z&A=PB -PPqXc4;9VQ%P9$NUJJyXrQG*y0k`d@QXD_a^+zZ7bt8T!M?|)K+VzUCd^}eG(rK-b9gA8#vzW)Smj~C -_X?7H59^AFNt@Se*v!$aY4S6W3{Zn0sTGxbX)mS -SKjMNd%CTX=*%8QMsJKO3*(d97wV7r0HgX7>!Qua6$N!h40)zpyhtgcc0Q?;B8myTiqsZ@21&hM?QLP -bs=EI5r9~%0UP*n&|#B>s5}nfvp1#f!Kpq!@4@Z-12QRu{&qEPdB*~-^%RVIvbJ(a?VBJPl8`8-U3JwybhVe47s?1qcDk{7FQ(WX+Wt!r;VBLlUyE+cqgQ#)!jRMlx3ftG -m=NPEX6xLP0u&Yw#9IvYJXujH-9TUuq!p%}p5)oe+9tgtI+K<$h-R0}{itOhW$vM2~T8wj$nS?GA-Ba ->9@_Bg(QS0#r^6DaZw&JXHVQFk5EV~`FC;BCMBy1#FQs#1s*J9g1c3}BeBbZDQ(eH_?hb=&R0d$q~b@ -PGw{%cQK|wm{?EXyu+tgZs|yhXWhRsnI!4YbD`nJsTj&49;mS!7`ra+0U?WVM1WfoF(hU749{-sAuUs -%&%bw-ESM1pecYfG}z~Xm8tHxgB!ZgZrj`22i#aVo}z_5uzpC^QH(7XH?u+ehy`U>z7o@8SkSgX>js -#9T~KFsleR_uUX3ck$_7pH+PxZ7MV?KjmsjuAq$)UV(4?rYHfh>!+zeZhT+Rl#I$kANLAr!kQ6we5 -e`6R>;;E}W{DcJ>Ra7H~*l>AgY9*#2LL16VQ|PW#a=q1c%#z3u%L(LACCWPBNVlf{2ilbzK^6F^11pS ->A`v&SVo5UMK1U@o06)@W1`VJSun~9xBNI^+!ulzlfz%EFzholhKwnU&P$VNeb(qw~7AOhShW3~FvM9 -+7D8X|ZN*ba1%yc6gHYY)hgW!0|quQo1iw=0bssZ7UBxBBjK{~TAj}oMvYzpgk9lU)17KewHfE=wpNy -xW#*zT8;D~uqC(OHQ8WWyB6mFKaEMd?a7L>xn}(u_Z<+<^ph8vH+ysZaPDG(2&4X^^D~Ja;$;e(t~nX -elw?CXNa}JBpyzW)P^f|nc|i-0v5H -b!fo+WYl1mfP#WFUZGIR-<~4UU*gXOXc -k6YWu{qHc9fZfB;1I8iXUc~EScrmav=(3$#S0lKo86Yu@$93^L^cCTUY8)+ulk)J1_A@{xVxY?kZHV{i951bXCaH9m=mps7VxdL~s4vNp9vL=&t;xsd?RvjmR>qGYYR#-+>2(W~ -z2Maqn_LrSKtPUSv1g%BT3ltzB;tWkSF}Tm<>rvy_kxLO)fI!MexOxZuB!uuxDEt;9Ee%8>^F97G+Qb -;M$jIX>VC4X+B`1J22odt(Rua0zw -7N5H5Kv%tszwdW8KRk2(ig2&%p~eevkyi+`NH{^u!4U#RAU$qYDpc~wh7Vu}@boM1#vqz -(>iuy6F9rj&;%$q*&ee2Sh;1u!~PBwR~m(q>_2jxeWQfphx607J7F)Xxu1&xw8hGz!2Tq9^3RfAOQ5< -2jpW&>|fGF{5P_Js`-c2m%Xt~i0HDiBJz7qlW}`0wy0 -Oi%^7W@{ep3ttWbde|QBTZ_mt%vYIg9K|X}eiaE?b=yA#amWGV0S)Nj#RX1QUKVJ?9uCC72IM*;`Iw- -9to*pSBBf~`ivVYDzBglPt8S#z4CN562^=cuI^%-!Lwxe^{QTEObsm0e2TNK{<4vV^2%yB+)l;+XKGt -qY2?BpVwD{aq(GbW=SMtPjV|i2)(CsL&wZcv97Z-Fk1ZHtVXxjj2kdl8@#I7ZPL1;hK=_ET%8#{*0iP -{s8C@z*#y(Iwecv~G810h^J)?R(Rz*h7KJ*}uUz^vt1ngO_l>ni81c%Qvg8Gf3Gc;Zk$t3TAnOYHIhx -uoXo20r%^c_0Uatn7*<3p_u=t&rR}h(<3F{S#Jf6Vx8TVAKeI?YM~Lv=t|Ke(Gx9vh7qBv4w6es|qMb -I`oDVN0p(g5q8Ol@-8cnGXTeUfVMpQMT5faSO^nr9+zlbiwgrJnM-&m+<1&`1-UlxRMQPScXf4NU -l{TvZY_Hmwz;+gxL8p-rJV|{66f3!_t#OAPTZp0LA`XYH2VP{E05!0C4SV&sIUiZ@;%^~A3oqa3jJ>! -o9?{|>0rlZT-KZONvHg#9FGUz>q|)=#PTwUC&y7;NIo%-psWiZI<=sDViXkHLtRchFr&aQe1^LBm0a2 -AJgfSngay08?5ZxQWs!4KFA#KinJvr1gw4Xqdc;q9*-RSly#YgSQrpHLMxl1u5yf01SrsE}lpv?n5pY -yN!jV~6q0*B4s+?VD98s{$NLE%eC?ixV9<0ukbw;W-6?M%iZVv~4eDtV@lX;lO$)iV68IiXUi95J?oI -iOIJo)asKRN6B*)j)%=XCRwmB2w4NtS~;j2xl -YFuWn|2oyQeJotPku%|m8>C@ef^l6WgLd9YdE->lUd_G25VKMGQSnm2_CHR5K9_B1gk~PVDAc$v^7{k -2!ZW-NRXt$3*+k3KOcsWbLPrh(*_I_GYfXB34g*g)tvl8uMTxR;y`0?Q(MnpdT)8i+Hhqai3N-eehO` -oPLEqo(d_%q04kGE)Hv7Vt$W{3t7GadkbGOAX+>?fTS%QWDNgA|5BqvovqS9lY8lA{l#Ui7_sI#Kt06 -otPXJ$^d+`kUT$K{|=@aO%NxniW08nnuM9suY{`5-2W^Aqkt*CG9Bo-O=>=Xf@1Z)X#zRV21wm_|H#z -4_yNS`p!3Bd&nRah}BbXg37cSevWo*|2k(eyrzE|=wKmX#w+%2Et034SyznCIQh;9R4t9$ui{9 -VL<;mEp{Xfhvaz&GUpi9cZUJq4zLBKD~E?wEKno4=tN+Mrd`aCGKc>SuGX2uVqiV;(2sIp$)2;-O4pK -#b*97%gP}-^J7*WY90<`ew`|0f8R1Z|D}%+k;>BF3o^{d*>^^|vUfFbYQVlT*U~QBVBRdz6DwP>wEAR -6KZmmEy==tx?q&p?ysFWE;o==u!MYT-ErWLPcizv>Rj~%awyX%1De);#r4%5ZV@07>xWGEK?Iu+vn|u7ba|it=P1}DNNr;bc;uR -Z6~cO`^$0q@3Oa)afzqK^wOvJ&{iBn?YLU6!mml_D-`rmi4Cy++x12!fqT3cTR3*P%0@^w#V7f@&?JC~My+UzLHW- -hgbLtfU0aUQx;|ji)nKW%*V!JIglCo4O@;CJe;!M57lixf;m>GGae1;~W1;6M`U?+fr(`Nu;p7_cdnCS>tTA7NI8NNiPhZ1CJ{evDI)P^ef8*C{iu5`M=oq*q6|GO5`h*l!WSp6j*myha=~zFgH@ -Ja7h@|3O80-HUDP?2=zF=w6b>4#$Rw6y-sEtwET^Ntm~yTBR0n-D@C_^su@iO(*vO^CgQwMx>0Tp#_Ypj)j%*QaRvD5;;wV|vJn`<^b#eUI*>~Pny -Maz^tIpokZG!9Sl3KaNbmq5lG}OGpJ}Pgi{qLeNqyJUL25u@Bdi`r*C8kS(gIQJve<%jQ9~_xDe33|6yUjpiDg?KP%uOv -1P0Kl^K5sQA$cDX~*~(Pgtu6Z&BZXYE{|3g2p-Yt~{T;KObM4#1Na3N&*A}kIUSUE}@o#{*XIi^ya^b -LA4KAd-D}_Nv?;hf<8R%_>z-&5-Q_?I)^%U(^jqmirwyM~i&zYI6Z5sA2f=f`8-Vs7t9I)Q5j2@UVfo -^f&c-JNme-lKX@%kEDJfu;N%}R;c@!YO@i8bww$Eik-UESCXvFhyYjsz!#$JWAAmCAKj0+ijoBw6$qJ -6HEmCff^Mg-Iea4)gpQ)U>!GmI6k;a_xZ?@ij!bnl)?U+zTlg{~JhhGAKZo$>5o_aFvMAs321kZsh)H -l^Ml4wwPjsJPC!k=d9Cf^d`^dE)U6Fd4L+Vy+z64&>p|xFmrl+?EarSl_r1p>=?~q6;JM~UB9Vkb*+l -_HvzS8c_O8vwd;}#?A|QZ-lr-dsp!$X9@am-A$=Sy=}#en(4rqhsdke-z+ -&SenehS!+6yv(akt#^X!HV5scmRZshIUfj{)_MDuMdj{nYZ*c-tbFCK|I>PF~Dd$hOUiDE~1H!COvI7$Ve45&!fBmK_}%h$mq4}V_kSGC`+* -t!>-;AJH|8y9s>3JF(SXs{sFYI3ON#`^YMmVU_DJ+OWD2xqE9TdNRTDXM+N*$*5+-1hvrMEfv`a?A^h -mn!FFJmDh`$lY#?}HX41m4=wzsM -OUvjW|o4XZdTl^^*l`;=$-yfNMI%-&WK({vDBM@n)G39fSk#vXsD;RDIbPF5)RHov2N-+Gt-pv@cD=JuiH@EK8y(eWlV<$ -Ff^2622IK1bAMys{+_biUuu@CfycT~|NXUlxTxhm`+*Uc4z1y87ub)*zfVvh6}AKI-5jYp4;1@U7*nn?EyOrAjVo14OGS+b7n+nhCKpV-k_k>IH9NZ7IW -hGd2@AqTzqs?$*L^|zVS`Nto+_JK)hDDQ5rAUu@|SCjm^>AIA~kh`zCy^Qm>Ja6F6|Hrs9f~1G>KDK; -D#cKsUA=$jepi74znpK(0zaLc8CQ(yAaN?DH-$NRb>Ud}364Qp|QhG+DnO=PhPWp!MLbL-(7ou5D=qy$Ycafl-%s(i`rRXhaaA~f78-j|DkzIToA`J;J^7Kmt(eM1N&yo=-DfYX8Ac}jv -C7o3#YA`q5GpRl9v^K9{st&%uxk1s#T=B$kI;-ewY?VnA9XCO#CKM0-)x#KxM;P6ap -F3$s!pkP_7%MrbteuhCDJaC_<+13k}x$KW9%48>f%(c^i+yd$CfGQmh+~rxFFj|g~UzJ`0((O!$) -<>(Y{thD-dju2oaf|XT)No!SIVIwT=qBSK+2)Be*`b|TNlu8DAn-HGO_EXX#S}xaU(MNaipMXW0zaEy -6C+UMaaGKd?yF+japt@(#!4f;Q5&1kN##`9j8^W5E^JpLRit3K@WVX4X{Riyg;=`}&A``Q_W)J3gs}h -WDo!E?2G2~fA3rOoz&fRluiQDh+?}%o=IVuad_=A*;)griJWdW$=Y-IGoSsZzP~5b16Xr1pnMcxY=i0 -1<^{E+@u&_oUcwE$~?;FyA_eG7xHK{%UYnzDTiW1`Baj>)dVi08|5nQ!VDmMowM9ZdEO1520=LS>Sb6 -WM{3eG&uN$TuKJM89Rk9t{9Vd-A$x8Z_rlTBinfiwJb-mdne2?9%UOGFfPmye9{zuJ3(NKtxaT%G2$E -9C43Pu9D*y!|q|+O~iqhHTZtpg<8ndTvDL=uLX68pRVARM&M_-)^+y_h1Par^`jcdk;%04rNxtwyX|8 -)1;#LXN2zrslLsYcsqQxFM=(LRYU9c+lq|3_)Y98zGv2}Ae0mRqH!~h^xo~ZZb?$L6&W6@-R)g%5zG3 -tb%=zUkm`$;sR*a+#cPWbqnZ_`T0aN}4HPTTw!@vsgje)SU5%e#1_b1tkQvC82texJF6^7mza~+IHh! -#++O3jq62`3n?$@x(FVWSBF5if=Lt9&ftS-7XqE;sA77bOsyM+O2x749lu1Rk2&GIJie$h#vyt3}-k! -$Jc`?=+aA&#wCSGf$iWJOu<>(R?Rp3N}rj(P$3PHpX*Q3j7i+;ms;6p!v|hU-WiWsb$e4QE-7up@7_` -l2hT&~Dr)JuEI=_V$)|(mOJ@d!^>3&R{WE(hx5|7~Un_IV -wv&!Ef2T$#}vq_l5Khu5Zfw|UklAxjaqV$<0Ua~nY -0)jp*c6F=*F`&pQO6y#(Fo)gnl3Wx(qT}E-`Mvn_;F_&hSsoQY!%i$I(QAz+f8qPMFuR_@cc8Jl0<7$ -SkK|DF&R8MtG~ysdFV;=Fj7s)xaVHT=wB*@V>NaMm4?OF%s0HLDVl{Kvgyo6@eY;v&_1D|sxULbpv=Y -9|Zh4iv8Yiyh+9u?|!_SwrIG;o<35&OkJ8*T*TLhw*mK|pPF%D98Sble%YunMfTCT+crl(eE>$!yQ?) -YFJjsAUby%$U~gnz~p);nRqX{=blppR;1xrx*iTEm&Wk5|`ZQ0{qLzzIy0rgVKDx)iH))8H1k9E|#Fi7qJg4iGP(+->t+L0Mc-!2!1@{?9^a}#1EouMb26_@mvK+W{N%BS|r6}@?6P|+vTRUH8U&vA>7k8C?Axvp|??AvW11MXCqK -WyCaK-bA#w?sdewv3Xe05X04a}C@yH0}D>Yx1wCI(rskjsh~(pVuL$Ae%3zzeSp5)fUR$@glKU;H)QR -`#KAD0`aVt`I#Nzr!pPt%LtSw`vBL;pCe9QkW%$BxK;mrI2_j4K9vaOUf%otBELN-^08QE*80?WEC8t -_Q-jTYpq)i$B_WAwavkgb8CI^k0h1rvCOg&3-e^{d$OTzfIHflJBH-jl7(bD&O0`sDxP$QhW1l9;GGa$9yjdV%d#2hla3=xUIIgp>_ZhQ$&vCmC4x -%`O*+IO{>a|Hg2&64;xgX!cPg88XKYQ|>Lr1CfM1{ZQHfniqbd^*lMK2v{&=xo=&+0jLTrX6~zcQs5f1K$+9o8>u2;y#qQ5nywE5p)6L(0c8mb7}BU$alsC(q4C&T^fwSVT#2Z6@) -WN{?VuPp>P<~MZqGx-*45d)O%IV#G~0GqDTd9GPLq{8UqY*F)M$bD*}lsTvlkrGY~>{Vr&&+{F9~>lR -d@_+nwyLPfHG5u1fr0h4R;3&B)YD^uW7TDd|C48_3pp8=QM`BD{hGR?E -OvheInr!iSgB$Z8ft+pa5T(*mQ~gbRHxiMbWkyo?3YY=?mOBz -rc$7p!8c+GN^5AhMu|6t`A#&mZt~nZQUfDJ=o5#5!QK78omdR|4sXQB3}o+^<^)^(c+hYDr6G8`Ah$X>NL=$OKCT6;3XTEf!h9h9|R?T&XX?k1jHN2F^K4ia3SXk= -JW}eyZ-mrFvY&f=(7>~fcV6}mUCRYjv8fSGhMkMcQq18NnMwQR)aD|7ip{DiAw}l@ccaf{^B!fklE}J -}?qmPr&_)o1vIO@eA?FlEf=9-H{G*^?ZL9{K+ZLquuWx*evL?ycU7whXuf(}={w#M`Wd+gx(d%;IWfv -X&oqzq7<4R?sa -+_0SEzMP7H_9-=HH=tqj(v1Di4AjAo@7(y!iw(R!;wrtT8c`_kUsYoF>X_>~_|9dqJjKG -%N9@!CApy5s0K6lAwE3~Z?SYT9<6$dC=&s|!yOKu*h<5eq%N>^zg=6_d1s#78_Us*?5SvNFwClOOH)t -V}bSw>w)!kMNzY<3BsP?eEAxb|&$)40625Twn!1tbnQHYl8GkK4*O7npISciXMpTi*!YsJ+dF;QFQ -Y9MTEDuzq*f75BNS&}4g^H_Nr(x9Z%eB?Tg#xvvZL+#&?&cJLSH=HPQ%K+DM$xj_-(YBj}y4)^KZE^a -UG4x?Nju*sa}G1nXg(nXLGh86vRjKUvZegES0#UqjTg-&=3f_HFac#pH*v -{B)j$CeB&sia&wD7`7T5_bDCkY^DIh}H2c$OyX;EHq@z|+)#6J?Vn$zbSeX2B}UuZvCg=3AmDg~y6yA -a*ueMM17sD>VudH;e*fAxAtIlKaj^ILt?TaXKO;{(drR3&*6Rcn1a~cxJs5zCLZPl^1Di>{aUH=z1OT -+*Qd^-d1$zG?nZd06u1`A6yL%=sI6}$e%DG?mvU9MOMbZ5=DqchpoKbE>9>-fTB -d1F5mkE1D%G_3>@Iu3KV*!C7AFDQ;xioU^B^uCQh-i%4=IIasZ%Kg3_2!ina*~h&+`Pl<8n`@$e2xQ? -E0Kw^1gVr|7G(nLV&h++s-)mk_3#@W+;tY)A*`s_RJo*MW|+7$8c>4Li%VGzX_yt;6u@u+=!s?suiPL -MlxFt2E2)z(m_-O&W93hikvDPDd)B)vUvmG_dIVAXN>c37Eiuv)#%>j*_`m!l{39YGe3^+#)EHjEm=o -}NY*7?JNJ>D-@?*AJ!3nmR;dyl;}^UB&JnQ7A*gv8ox|uFL1V-Xi>fLCx$LU$TnVQ9e4jC@%RYII{gBE{gy$7L3Hd-NPG@MuF1?`nc;mZ8qhEGLrYQd_2V< -#az?_2ZcDyeo`^2)9oX70lkFdme|E00LGbV-I4D8H49AAaf+gvX3dcJk09)JQj%$aj)px+9f_2f}a=E -=0NRvv9{6_e855dg~qCz3{z}eRU&#Md%ydWLcDDzMhlMAf}nDz_&4rkfvBOHcbmG8FiHpP!Qo=CJN?F -ZkzgqJQjTupD07HrNFbjAa1k4U;NdPS -?gB#U$5+LE7FSLhC!Y?x83uA9WZrhx>X&#l&>AW^g6O99CTuqT$H_4}%W$nz+8K%jyxH8N!M)y!W!^B -2|@xNdL9-d*Uk4m&tbDG$iY$jd{(=~@t1@jxJ;8c*lG7Y -B7BJn}pGv&dPGl^MkIKOuwD78xVnW7EZ33sV6;p#bJw&8Y*D#uapPxAI))A{`vbQw*+CU+pU{jc=~Q{ -V{zMrZr{^B>~LhZWoEZXnpOvHx68LiJ(w*3#VACS+C3G;x^ApJ4|n-z!d4x4E9%XvN&3Ta)4Uy7AFWHx+BSx5gU}wB4Th#_Mc}wWhzb%vij%$9Lc9?VEOutkXyB^!ok-4V3`q;wx9lNDGA^%=tn7JHtRvp9 -7caKnxMSM_I(ewXRqO3f9x*DGdpx{2s4^*A+P^j%=~koMku>cQEz~38#z$5W8wi%~f7f2u*760;1Zy& -mcIU2rJfBSjQww$7W6;wJ=_icZvAKcZlV&!7hxU@q1f4I48Z}oO%3!x}!0EAu!r#mZC%W29H;?8WCx) -!{RJ^ZxJHxJdnyITccJR+}Hm -JXS$a{~wMM+(ufl{2y-P+tPefORAc7I=NtNL%Wx9d|decJZ5_;&{Xw63~42yq9d=n8JHHlFS5L=%8et -*w#&EuUVIO~%%0i4$*4|Kb@^-zCd&XUvP!;6=K|e6e8>WNC1fts*q6T4k-NH=y8`u4_~`M+bX(?d=Bw9D6g$E;E2vd%=@YpPLkEhY4;kbNK2tYxNo{c -rv`clE8ruO$vD-7TNDQ^LZWkd7i_Q!3x&p`d%KoCw_T>s3^YcfzUXB}xjXgLTS~fz+9_^oI}UjSh`&+ -&^o|cj-FuzWqOmKy#;vdSPzJ58Zo8`Ld3lWv5EC-prv7NCfmu;Yy1nvk*sP-M?6#7sn_M?Cxh|cTZZp -g7vh^!${WessFX1>>rDs?TXVHod7l`ca_)Yb7~rc%zDqkdv~e=(prl?ehBu?yG0jS@Zfvm>DK%2-wh>C7($ctu~MDv6_{83UB`0OW#xPFc&zyNs59}!B}m?7n&MsZc->IY -db{F%w-;#6Mo-t4SKy?6J>Wgowr>psYS8N~DAk*KuQ<`(jsMDQtB(h3yLHbaCIm~j$$HAM+8#&xRKDa -XfZuZLnTcXwr_nCa+hDT2k$YRgK)q(FeYSRBfo?24w+;GDma}-4QVd_}utk%1CtFH&9P@@x^Xz8^JA6 -4j8(boTx{PP^C&?z)KP|J8n49Enm;PA|2NQ-jukhH3h@eEo0i*ba{!my&$&v@_PTYSxL*wqyy;sr=jglGKzA#}u?DRrg{2rP}T%9OpNubnjrJ1AMe%| -s29<}F-ECu4=V`aI7As(N~$9|9sm}dn7{q(4r-ek!Q(+9zy`Hmxsr_&{@f_QdCoQQyY&maCMA9_G3s? -{ae(KZqwU@kwWWSfMjPf5-H-v&Nj|vc_Bb>Q@7;3rekbw99wa%<{z*EY8_lRIPt^*3G6< -5L9@*_xyWjodsS1r%)kX28&Ssq3)FcqxHpZp-7bkxUUVWQUOPkifRe1P1W@H_ -2Izv`xf+JVZI2|N>_3KLCLLN9)#l|Iv6Ixg(ly4GneCS1|nLCO!aAUAV&Ib!%_%d!lbY55G*4qeH6nTnUQP(FDxe3}M1+wo=T_}4VrxE)EP!eb2n*CrDJZaSH#n>xvTk9Ru-4W>io+ -q!UU;MO%k$d;tFFc$d8m06SagjbO<=Ie_kb_ISmIoOdn-@XKaQ?!4ZG|JPwt6Uc>+xXZjcrlujjA0Nx -V6@`g_XD5?558|+X_Jn!3lAXL-mO^fLLp#Y;{3%XS>T&e(VAL_3{}V!3wdycQ2EwcJu0NmG0yY-Le(i -(Sf2xoGzOKa-Ty`anYQ?&Z}JA*pf**Bz)EA{$dLB-3w02Y(et -?8<_TL0VJ^DovVAnDQBe=0n4J`l1;)TuphcN7b9LXcogsq9Xv!9x$QGV#`8c3;|4^!DGkO>LMBwesA; -<$j(-AZVpg0 -mebr`-8)~PdNtd0as?2&{iR2HIhaIkRRywP=b6BK@C*fgZ=u39mXns36oy=sfBT8x49jp$>=w*` -Pxq3$l;k4Br@HVtTn8~(~P%b)_5nL-yf;K13?^Cg`Uo?--hgPt7nU<0e`;JMZVj(-dpPyC?{(3TbkTp -@8ISqYvXd=e5sOzI&C{Y=HM~m+ub428H4PB3psoh6`KeQo`YbL*1Tju(MqH@F2kh*0zNH!1 ->s(c+22it$;*l8sCnyI1SGM1pO%&(D2E&=}>;chC+aMSo58&UotXF{7~6-)*w}*jqQh*uu`~ZCi}8$r -9h(Y65CQpx$x*X{Wwckv}MIm&9Tj|IIe#+3%(NPy0Mt}ZYh){%X#_(Pm_TK>)(#1tD))lj%x)mZ{?wKDVN?PUhr -|KCPmj?pNJd~dL}|kkz)l{+LLAl{WvMru$(Y8r&)|tSHg6-Qtdl5eSsz{rDRj6FblshTX%NBqVOKNM3 -=f64}hb(;(yKK`0IlQ59&jS7oid4d7vEw5UdD8KZ*-pgAAod!A;Co6wb|g$3qMUd3cVY-PIcn5W&HaD -+5%`>oh>n!uvd8IRgP`QVum(;~6W5*9XD%{y}i#j+j$F7~c;yZtD1c(asnTI$}(^z>0aA8d)N+<@JIc -4LGL;;i<;i5eBo_c`dSS5lnhS2Ll8y0S9$`v`-_58Vkz1qu`fcH7+~Aen@tG3g3$}d~%M*b~z*G-R0r --hYBpci&_lrq1sa<4lW^osCSyzpC*haXyn}-3Hn!jWD^Pk8QC -nG#-KLw$mUnU!_iks>O{aElvlDx0h=e566v+~#Y;|Y<`#lE$Nq~eX*}F5l@=%t@gY(9D0MI;7S0o7LW -l`oV2nb(gXc$$nzneZ@;SP=7qI!5)jC*ktVB -K;OyXqa1-qLP6@=3oZa*!16rJN91u8hfA90Y@V|$rXf=ggdRK&(?k?BDQX1klt-5_TQRsdBC|A&8BN| -6Mb2j+2iy`FV0i~PX$W-0HavM4(SkOZ;GGv75dce<`imZ1OPMqFK;wHrJ0d|@@JcH%WGv_-Uh-}=fQg -WzPJ-Xdv|u%tR~ZYDLqVp*^TxlWJn>s>56RcWyYU9o^NTyrH6DiM48&SxJZ8T4#e)G`$pEffZ`eljfh -}mbc^aYvvis%TJidAb*9lywaD4;Uw{X3N>pQsq4A+~R;wJI-#WsU0yvgC6!8N~mJOTVCfd2&Wp8)<7z -<=_3UwkLP#R+h6@&>N&;i7N>jgt_r2ri&8qRagL#^h`w>|ao{$*AfnQC&F~pjc@Q1^R))=ldoW=zVsRhxT%MNM5hyr${HkB(P -1n~h-M2~u%9W~Lh|>p_`$HSsA;}=Tg5F-n#TiN0` -02y-nG|2}6_05iZwT7tC0%7_Bl2=lz&k6#v4y8g_RIPfIK2m7h}fJgi&dq=4)qBXP*^ -{)qUWRGzt%$S+k^(D$x$nur**CvTeu${EJaFSmxpv}RlPr2|dL50JoEeG_HnBNC!ASyHYbzZH_5aXR~ -rg~b>A2u$Y11V2HxyKU(d1VPM`&ZKeDbGlWHDv8)54B-%WYr1V>+MT$#G9AifS)!S&Ad`I2JdZT$ugU -4{uq}Y4vpxK^L&?CsO$pa|OVqBXx7k3i4{d~vWydtjKrX+&GqfxkW@yg_+@{1($c_h(7p(BZY}nSfgH -3R`iUEiOU7?NVtosyj;_PK;81cZ1rSF}24x6+oowX>rRcP^c`1nGcdE^E0m+TRR`*J$D9S)7T12tem{ -HpSR!NU>JPNTqVDtf@SQcccphyiwK=X;%a;ElG%h@p-lg5{jX{14{yBrBmF#gc34G5qIYkp}kT$zuAq -G+`t1r$5#3d5~s>&x@Vk1R*&k`a48C{VQ0?|S~6j0vqIcJek;2lUr6Php7*olO+5EN; -{t^tlXG<1y(VM}2`Rgx&k>RT7CCEx_2_J+VGDA5H%XH>}lfTgzAB->2F7#>XSP~Wd(J{vc9#(%y3=|i -oa{0@fFg1|fwBm}t%7HRUz?4psSVJ0F}5Q>TbrWN?*BP5R)yheVzxVRv)GOihrA2O&RK^wX{mfyC3H~ -d!6jjpQ^(i(xb##Ev62j__6;(V4yn~U@8;;;Ox^W*H|{8-&MmQM%68cE}ECb|(xSG)+6qG=oybRniPs -H>3`l_jGQB9;I8Ngh3Y;fb;v!^mOcRy@BP -K-}XG=O`1rI?lme>t)o}k5p6)UJzxnPB<7K{N|@UVo+T`Is<2~B{ZKbo7$96EeWAqRCl1fsmx*cZP!% -}oq_zn463;#merRLCN;Jbl3YHDgP<<{*fFcUOh8yE_P<4@;J~kVP -2ZWT^q2Pek)bj>Nh{jRRCPexMs6@2ijaq*oOUWw$y|ofGm&FtXrlC|i^onl>71=1%zTr+9Y}uEaxB#k -nCYq^y)&!v##o`Np5+erd;b^J7B`F?o7d_>^fgULuCN10bA}W^=(mt{;04piDDD8 -=ZMk{PnI8xa_XYNZ~A+*q=bc2Cn5qNXtA_W#yP$!;Q~BeZX}Jh($aBj5Qv)Xn`vd7Baa~L0+P -Jz(1O$;tZVx9FWfE5LBue$3Z8o*y-5rsM3y|Ed{L7HI^?cn#k}RZy<_6WJSLfwh0;(W8z;UQ@Gp;Dir -A3Fq4e*38-o1{qm0O7LOszipu3OiycJ|eGRQF98c -Ysa>FHdxWf2z?0zowOs!!g94LW0>FkoyKhKr{g*_HDr!wPvJQoZxL46kPM@u^Vq?tVB_Nh~5S-gC1A3eBC}PQQOfJWZF-ELqetcmGu(z>$3z!M{89Q;=&`B5M -E11(9Ize!0HO8Wd(xXx^IVzQ49F;<-o*F)D5=4_wGFVuoJVXjaeoO<>MdZooAV;TfR7vqP8= -BSD%fYJW=mx`0b`^&bcU@dKV#C$#vmfWo+xJ3{^F}l*kdMRb%3QNv;(01KOpL`!q?R&IWq2HWjfZqgS -9Y@3-K*vxT62cUMB;mg6Vd>$<%7H@6{#mkSw4$fGF1>A@^+a00M%R7bQ+tGI${dxTppog^ydJ9g;(fs -XCk-MwyE?A>I5Rs{dHo5|VbP10iN1Ci$=2SNp9Uzl&iCitowbs$`0Vc$-u$wt-9@Mg` -MyVEsjK%>b49h`h&BDI|88y4cw(1lU)dE?oo>t2j62aJ@Tf;+t(_MJ%+ibB=wq?4K693morVQ{Lahhc -=B}=oa)LKgcow -J$f(-{C{2cnt`gi=^@-0{ohB|QKs~8Pyx!y<@rolxlrxHU@KWe*eqb^#kF&U`{Lm@@74kUSrp8ac<<9 -tLUi}lBJ~7UtE6A6d;NBcPjr;#TdZ^kZTF2XDwUpF82jyTg*_ruS{0QE2X7y1y*6S)=1q}ZYssjDUw?Den;75;c&_0y8e;%lrnd9%VBm*J$|6Nra-Dde^y -J|n2#)P)Ti0p{2h|(kMBQD$XlrH5SOYBM48D9iDjd6*gdGErtgGUR}hk`{Txo4cR&V?=+QUg-aR?=aT -f{Sx4#Msz1ccP{rl>~Tj!XsY-mvf5DUvJX8v%9KDIq$>_Fvt4Wcdf>eGTZ?MWO}+2q&^pOR{`2Q|?gD -BO|z8cf^fNA;5Pq=&lPf_efm$H8EjV>Az!$T^hEsAX&;pUsip)OtQo>QwWSx$4W?_)^P9|A&m~SkmQx -h0Ea3f2f{rLiRdS+q}Gia)!Z(4A3wGxiL6U8X5F>7|!_hSTAW>!buMYe#ST) -9uJ$pku8<5b!8^SJD{&mFY5f%SU?}J?I;>@;g3_!C7wg@lJA7}e?97*(21utSiX8k4M7LF>hKwe>9I% -^A%i05J?Za=r?=!a&Z`XY4Vh3#?cDbjw1O2u*Y!<;!8gCx8{&y4Ht&6?bF^VhmH!#hrm~$sP=lLf6$5bTnHlWAyXOB*IeonU(O?ns#U5>OKShpQ&88*Yn3O#6?rl_o(q*x{}Bpt -0YQZtM+y25ufM|?dYhtLvw0CGtl((h~x>9esy&8LL41k7^^o`tJdp1xRLN&@409A`zi_gHSx}z%Pk0_ -1Al$gVt=hD{>Teep- -`0mK%vRVD>?7e05G|TL-x1mSS@%dHX2GneNspLUZWu!`(Ahy011JrCSFTEjgy7WYFs91b0Ok81X*>4lST>V5wFnOy$z% -g0~HPnTC$Z~ym_{O$7c{pEYl+J;0ZJR`;@6aWAK2mmD%m`?B0uMegG001EY001Tc003} -la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFJE72ZfSI1UoLQYeU7mXf@S -O?43EZY-GiJ^89uJTvPeH4W#5Er47sv1@GhC)9r1K-AJXHqf$@J>+!-IIitym8 -1#ZUZbdd|?}6b@jSo;u0|XQR000O8B@~!WXpG-gfdK#jq5}W`BLDyZaA|NaUv_0~WN&gWXmo9CHEd~O -FJE+WX=N{8VqtS-E^v8;Qax|uFbv)GD~NQlaZZ7*0Wx&BTZ(q-RuqC_Qz>zZWRUV*g2VmyN|w_&O^R} -p`1n33Sq?kU+75AG)Ea2l2aaGi65J3`mvaLh{UM>?8yGybp+oH`A{!@4+04-f=dg_lB1e)()A!`JN~z -Wv5qM_8YPzgf3Q{c=i~Eg4Hf@BB5rl%YfgvWeq`n$~9a{K}2dM;|ZJ=kgv|m33j}ud_8|V*?d|Y)TX5 -(;ecsuOSM_G1cE%FC4Q^6W!=#i`JtAR{h-;Nr!`T&xhw15P%+(|7LW7?Zfv$4vPv%#tJZ$E}f=`lHKle!E=B{X-!)B(RdBBS#ztUUd$)yW^ixR)_ -H(OtEcy)aRqRvuLo?w$is=Edp`lD<30e6=POY>#5q}S_G7jh$ZmeNrAeh+x~$sG77_Elb;KL75k&~A# -nE^qQ_Q%B}crmAVGe8iXO^jfQTP)h>@6aWAK2mmD%m`)^BovEe)005c<001Na003}la4%nWWo~3|axZ -9fZEQ7cX<{#5baH8BFJxhKa%p8QaCx0l%Z}SH47~d*h@51=@CPighxBpiWlwu63PG{yM6E0tBAw0t{f -br+JMkh#%M&Hej5rj#7<$mU8+nYVHQ0U#k-_XJxRFuka|NwETC%}cFnZgB7PYgC(KsrKPBdD>(c*>wD -!C!}wv{X+20PUHh`tT6CVRR-8BeVFeZaF&t#^i2LfbE2C#9ljoFSU-)%mh~Dj-FRU2ndr= -oU0Pe!9;>*AY@fuZ@UoT559x-6TVJ4sRc{IcHjd;8i6M^zCo2x)!h3XTp}8qY`mu8_ZUM|o2_&54naQ ->!w!Mc#QdH%pEz#Y6I#C$Bb}`ggE?f>OCMUBS_~5wG6UpY|*Bv+m -DC`IW>cQn8qN6Fi$Vo9pBgaG?@0t(U({dDdG>IP_=snwV;8W|d2tY~d%oY4|UJfAoXH9zA25zu|_wM; -6DAyS}qO^QT40#35p5PtPyG<0FB*TN%7)`b}|G(mye -0kvmP)h>@6aWAK2mmD%m`+PiZq6M7008d>001BW003}la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~G- -aCyB|%Wm5+5WMRv7Cup^Ahg#2I;2H=?8&zvAZTe7FG`aFNhQwTcd3U($xiw}QJyT$?r>%~gj;7%AZ6Q -!-l3F0r_Qfo*J1IqEcfQFvQlQjkOhHBfO)D+Mu?Xxygbkvpd8BJqd>FGT41Uv^BUOUXjvIBXn!;F -q!Qezt?yp#v!amM$K5R`}e&tKxtEX!)GydU<(w3**!z^lQQZIGcLrSPa*maKxB(731tW7(P3f}I#2l& -Mjii$!A&t#!cK&Cpx^z*jHwgd#4dSTyXp{Ht@;iQT={5G&!-d$xq&gCq0gcX@VcjDkuTNue6JH^|Umf -oId$i1hGHVXf*T@&R1D+ug!COD04v@v#7nW+2NaDdUi8Yl7kdTn5EQB_ -m#)>xF)?rUMewc0Ckzaq-dDWzJ}~~c^beyP8#{+BovZKG;5r&30OTQJz&V(9syONR9mBKS)+Q9Qf*_W -X;IU8$NztlIKb4Z(*BK5d_6@}@@S_uthZqyS1raAhK^=}gOM@eEY^t*xi#{WEcbpyYOO!gB{O9KQH0000803{TdP5=M^00IC2000000 -4M+e0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;MtBUtcb8c>@4YO9KQH0000803{TdPJplk -5W)cf0G9&*05$*s0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;mkojAIOAw8#X4gFeKZ7Pvi%$ec)0-TG6J>5uDHf-_zS5Ihc)Mr;ZAj -0~;tj|61-Oc4%;Z^6^y09qK5aQ&%)-;`?!bR&c?j2M+I-*XUhi&M($c_aDG_Prd;Gw?i8sznbxlhFKy -BIiQ4E*w-o4I|IjX3*Q1xGC1N=YL!b$hPc0>}9CF&1PG}n)`WRKDzOYM`HU -&48a#~)HiZ8i0rg>%~xXdZjGrDx&B&4L-8D*$bFHlPZ1QY-O00;mj6qrsTfcwOi0000U0RR9b0001RX>c!Jc4cm4Z*nhabZu-kY-wUIW -@&76WpZ;bVqtS-E^v8ejzJ2;Fbo9meua(+gg&6qYri2JM-D2ERV=yhuR}~RbZ^?#jueX=fEcUQLWsb} -TZ(~SRZ=y=YhGaE4=YPvpk@xT5hgY&KB;pqB(DljPR*HQeNnLa?x1O-*yx@6aWAK2mmD%m`?M+KNl7Q004mt001 -)p003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?fZfa#?bYE>{bYWj(Xkl`5WpplZd8Jmta+@#^z4 -H|sIvK-^U@1NHw6Q)v@sJJdbqVcyl38aR;kOHG9(2%E7rd3_VFl8V -OPa#(>qKkS_0Y}h`J8oY4an7ribDlHI!0j2T2arsoaV&PMHz6AP&6Dw9Mu^u9+wME5m<9ElHS*iOzy_5*)GSV}Hyc_?rC~^IP_>|lO@xQPN% -AA{ia(&L81!j!LSo3^a+9B7B>nKAkBY3REQxq$S<^)78qgUn(!k{13DIk`*y73n#a50Aa5{TGFsa)Tp}G%t*6X)AN+8yh2B-GT{NoI1mPck&9K -P7x3|HGp0JZoRdLU}IqTy?#7d?P-{KuQ*FtKj8pGzU0-7H7#v1fk3&<1p(#*hlXV{r^SUPjZVLB$XN# -wkr*4Lu~w$rT>&`z$S0=~4RYbxZ2^L}|=k7OZ}A<@Im$DPe~){KqzChSKp7TXiQ@4?0&AtCnO9KQH0000803{TdPLk1NplkyG06Pu<03-ka0B~t=FJE?LZe(w -AFKBdaY&C3YVlQTCY;$TyfLbdO=#keM -2n(5zsR1sx&DoqbKjt}TE)3E>+~0pP2DK%Bt{me2J_=e%{y)Wxf+D1_aU2@VvpE=5=>+GX@nKx8$BI74=0xwg0bkBNm0-9#p -LbEg`3v8Q2hE$X+LH? -)#{{J_F}w;#@yg(9J`#EvS=UWH9lN9(=rED5%H2f)3BckZaLfcsVkX17cACGe=r-nMm311zYHfpz>%724e@Lc>t?T7z!1hr$$VL?-)#Hc%clTT8;G%vDO%eNxO -*7hQwEB@$hC}1lvPwSh(A5cpJ1QY-O00;mj6qrsIb($*W1^@tDDF6U00001RX>c!Jc4cm4Z*nhabZu- -kY-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^vA6Sxb-GHW0q=uV9^n)_~w5Ns~j66exn^*h7;;fHW{@kzN -atM3jXW03&=oiG=H@0VxH0TwUI5iCzFWBa`I{RC$80wHOP1(so?x=IM;^#X1m1DNu>-_;E5FlZOm(FyeBF-diq1Gopo>LA4GktK<*cTFjY -$-ksU*x3UrX>kOY}-$J80ns;pW$#QK!^SfE!qCj?AGZEbK**B(ikEl7&2qaT(mJNuO2AMZJDqeyhsiz -X^GN1P+Zq3(soGg6lKU88+_NYX%5}`aK#Z)28AOaor!MS~NpiC*o7YfibN6WT$BRQN`f^Hgjf+xDsgh -p{35gf_JmPOK)@EQA~V)!1Um!+(1Vi*a816j%UY$cg0b8Dp_b`bXKTpRel$*a47S6&%_9ufIGn{eRFY -RNj| -QEOf`Pm5sCmoH!5um{N?Ju8}u#IDf^BB7?NN|AFbi#^7D1`j -Yx!#)(tpR9w9hmA5Y19Ar2ZMXs3!8%%7Z!rv-V^KBe`;P$JW7s*eg0$cliX2lY^__7S0j&Y#J$i*fcm -QPuPnvXzunRrW0TBq52v#VGhUIVy3SlawXIC7F*{BVys$i=IpscUtYXk -qBx&T|0_Gz7BQpwt0~fl53XryO5m=zCOrnSHQ;&xVASH!8ru~ba0Q&h?7AHX0jN54LBnl4{1H(pGK93 -4c5A3S#8w{zDbNJmj)K%pkRk^zQq1R -etzbYL^50%1VKyWQ1tb8@QX|ZF+k!bQZJ|tE1@HIij5`tFZN{NIB{vO;ev_l -a_FqAT?LlPuZ(wuHk@noPpA6%fkk0JCEtCMq)-+39W@Ns())c4n`>Tg|HpVoD5T9;Y#({+9Wmw4Ry#H -Ukwu)02VnNM~oa?~EI?v}}vyxO+|EAr7sXi57CV^IA%IeTM4f5%YESmI%&(zr-emL{s)ngg+0*?18`- -fR>dtxPjuxS~9zQaEK;Gk5hoQ!_7fpH!(Oo$eohfw;DVMrQSaY*eFqd_oF$Y_vd831qsdqaQSaN>w3Z -fgI*!CQcGA@L -c#y}aUZJrgd`f@BBLr<;>m3{wbrz{X)XY)?y0=w$GP_RRThiMc{v!zBLY&T?Psk3kS3grjy?BH`ZeFaRe0m*ZEN_~LV_D7V~9- -v$FL6Y{^3>``9AHsX>A-X3YP2mOJbOZ0{hsvkMr*uz#oWc=3PDR*ry1t<6OS=9>*H?6XJ%y*k35}yGV -g-KzA5`fSQ9BV_nFH_1HAit=X@urLC_1?xj%q?&6kG9{N -y6Ek%^ca^ZtTK)VW}L@$SB}~he$o8s5TJ=Q1)1JPcPV;&)uGR-I&c`ss<)3<|2aj*FKqg}mF@8rxfEi -pr=KFXOly%IcS$o~IKfQa0|%T2cEmqPYo7j>q8=#z;S5;oYl{8QsFgaF>UWW-<2SA=`HSz=Yc$ebL+Q -{*8fcZ&J+{%iP@lTrD>>C}3%iMt9dXbzJt2-yeYrT-FE2?Ye~Qy89qG1?P-%Dt4tP!1q=}dI4=UGY4q -CBZ$P6a>TG~+ob6H;g>h)BqmHI7`E>86FJ@!wwdvwA^!u5YJ{YPMG(eWgOqjhO}6V2HZ681T*AsmI0Z -XUI4^!SfhcYaPaE-e~cFFyjPI+^BQP)h>@6aWAK2mmD%m`*^!0Z{T5004+)001cf003}la4%nWWo~3| -axZ9fZEQ7cX<{#CX>4?5a&s?pVQy)3X?kUHE^v9RJpFeYH;%viub5Sul@wb_+S}WE=fufNQ@5LUX_FV -H?e;83rDiCJ^?Zfo$X3qxzaPN)xnuTFw78&6LTp;s&Ep$KJ`?h_AD6iKd> -he&dtG*XK&<{ly?A|FW+iR>`R%7Ydg4?&!T*Pn_^dqnZ6cU5SerH5%kmhPBGxnR0lco~7|aF0Nt@C^z -5%tsM>2{tk-avxQaurxYM6fw;Vj2!4-(eTh@nb#54S?ZH0lO7#xIg5P#Y`^y4zwzMz&4d4&2mkLL{N -Fuz&-jD~op>x=qxe^SJ-6#K$>$ -~-Y9<+s`wnth#Qh4vaimg{@0C)qushlfS(i!8a!HvUxT(_yrywPJ}!OvOY0P!%MTp+~VQfy~oGk`+Fa -zt19I03NFZfNxA%ifdm_8Zuf>&{2gaK~z3t(`@C-Wc4bG_8t`ATlo>5kmuf9p=p~|8l`e&e=_-^W*K~mC68p#JR}_ -@Y{=wx?J964?EV3=s&KbQnT67S6?>R&{Wb!uAjhDv2{8XQ$zdNP(15v}G8i-CknxPnFllf_eLzzY8pG -1sSej>lkz=CrR%Q95=vB5M;>EWr}=D;ROgG~i6^Kd9>US;uszxN1#%m!mjkMe_LsT!&*hU;_p<2eX}nB_>kwd3P-PIlQ!ud4AltL-LR~H5a+4+vNu?3AYbc&XhRLcI^?NgS-P?E(gvP6q9H7VI8QKvxa}Ggf|X{Hpu -ZtNgz+ZqmH=VQ)XsD!5Gx!nhYW9N)9gmNvyA$3VGuX9ACvh|ra1itxDnlgmQ#IAe~+U}a9+yalt%%-&qCG2qKt8ar`Lx<)K{&Y7MOQ(a@+*#b;V -_@m^X3L)K)Df!L;VNe0nrx+h$QbU2uNXNv6Ylp0thP&YZ -#riwhbcJ3=Utj!{gxHEGg!^X`&G>2@Hxygo|y4S!gAIPz&@K~g!eyMd4vU(!U7OqR}$kZ92g~M~lq@e -oRWpUvKj2*dp>}29N!;OgC$YuqQZryU*oW8YMdJy~wMdpF3#1svb4$0AnIH2@jj>7tt$`AoHls?x;hh -qe_lcO`po^mqJGGNm7A$YL3>W0KoabeAg0tdHL$Sx3ZL*_GN21Tbns5`wC;dM%QWK5bGZs-k{X^17$c -tjXWcbEKws9P$2K^UjNnclh!6KI+=o<9L6Ev<~^L$RNV^Q2nK-Sn96+*Pd%M?`t9c+Mo#uCkSuT!&l7 -Wa*G#0j-z-1HP^SFGaA3hJR5RLU0a-wbMFfA0@mlPNXq0au=hebl;Xr* -W5zeSOgsG6b2H6Pw6X9bG@&geP@si>@D7%I0%Bxl8EPE@yadVZGGovAdnIDOIAY}P~`Uc8zk)PRJaG1eSVS2V^iEtBGgQ -DVCi70(|05`B8%m(79!40hznOlQ9T3ZSj#iTXO7) -daT8&0$i0P}v>GglxZLrVDu=cHJ*YM7len1;U;mSU{pP~3_I*X|wv?#v+>lt8zvs6Q%JJ&IoA*={-vf -g}5_u6P4N+#ASh=NJu)Bq0OqIe=2s$c8pi`ye$GUe2t*WddF`IXT36484gB?mSS+0t5;+Oz%!89RYrlqca~$scLrlN4V+#eS}8)lo!~d$y4fVYzOxcB -F@eJ+fzzeK^>!e|ymeH4OJA;TO9K|_V(4;5hf0Pr8#tQ%qGIJ9T<%lP44xCyH4nMrf_1?`0xLbB2*`T -UndrSUDSOBMKWAC;GL7DqMXNcxhLUCp7Pu5@Sx7;>4^<~y#6C8$r%0U;(udDO#|iZQ^YE6$&`}$C#6_ -PSSR3SDYIMDMMy;ydX4z=gTn|u7Xn#PvhYPe>P8XJ8Ar*1zM%OlkQhWDa?ww~I$WF*wpae4Kf@2ipmY>dtx@yy&85{{rq)8tcUar4BTRBvrOtdXW+t4XNjdONmCB&u -F&RUi*>IhRBG8?w;<+a%sz{xfF4Uu9bc^yvKnq~Qq0N=6C?^?F~e(Z4%i{Z15FZPj%!Fvn;};4@|HsV -U}4Ist)3zws~x%qQ0_fck38l(*2S;mjOpe9-+=0TueS@jAhS(i0n8Ra7gCr0U07A}SD>x+6mvA5S-p8 -#Lov6p39&L-<2h^foU@{x0rN0pYqVVpwBq0rEt$EM)qSWEp$a5LxHZXC^$cYYyS5%?)k|I$EG-gz4cP -|fMQXB%j=llGO_#dq5%*Wx{>r@5?E7{h5f3wIaWY^$sA@G`XLc(Qi5j*;XMj*;^W0@3yL}6n -No!Trv3utxpm$P*uT&At3S#7XgSY4dDP*arJ;I`MU_#isoGK@*ddGt+V%4^;9v(@(Z#@~ -euTLXcWxAB&g-!w#F)W2+4%clRKJoyhTcY?>bWeDqS7qw8=Ru%PNHFkL-kc@8ndMD*v6pCRnIm)GRQyJua2pI^?{?DNane?OW1 -=ltsUvHdu`zijC~!0VMz{%{$lFTbT3ygQgYO+dKn_I0|5$hY{cqFh3%_7NaMy2 -iu!sBbd=R`;3KqCPZ+U=wf`L#0+JLv^$^4O*<|{7+nA3@m2+Z%7^Y`Dry*Nh$H3wut`J*5cRK&deK0P -&jMx)UMB>ox_G8JeDS80H$1WST!9sCn7aUYkrCXUSkC(J0og}J2=n53<9=n1?G&j`wyjMt7X+=46K?mB|DgPM__O!3_moo}@psl@(ozdU}?VEMv%z+$|xEnyvNGR3X-aa|&J -yX+6Zw;Icz=t^Wisds3SQ#{azz|=74dbf`tTO$h26@Wl#<8+f6R^Ovo1eI)jO)W~2-293DH`(%BcQh -~r?-}-Zxd0?omF0du21=e-^buMa1_40-vRe*6#%FuEW;2Jlbw@aQ`+uCFT(R1RrxcVTvf%Tr13#1!4n -^-hrxN)Z(r@(YWrzE2hbmMM8!Z{Izplu`XNKOz^YEpIa)CrKk^rI&n0~@G<@#!tqJD65>h)18lty;|NI -o^39vKzn*`$Jb!ck19`thkk-9$RLGHmy6B-)sN!!-w~;zy0~c`NcfA=w+c5J9J_5^Lml#1VS -37>r&uNa|{sRwK)&PTEOFK-*AStYWeQ{+jr;hKfFG_=!n-P_^aBAKt!t`{n`})U3+>=jCGs1Ou!m8z*KmepX(|d>%yEG -G&muFO@FV>&Y~D_P9cgr%mJF?0N9lSU(+Xgvh$xV3*89)w9tbY{yDkh|NWK4WV=TboBfc)UMaT79zW` -?XSLm^5ofL))(U$8zO8xrf1itb -;pOp`nBYYZNH6*q7lvFTnlhFkpD}7*_(Md2mPow%zlgL6}KPChzpPH={h?LMz6p;K) -jL7Ifn|m)2!cd)oCX*qD|U;+a}qWq7mkHBh(WScQKHtcBT#Kl|!*K>Nhc7PfU|JEYoU&`%_)o2f=%j( -x4Bm%)5a7s9Ar?m1bFHK*o+c{mh2a6Jkmu9^1lSHf*mP;mgl_|EOEHJ7tQ~4;#B!7fydWuRgd~O8RWhjy>EK -X8A+Nj)gRmEyDy8L}{`{c=Nar@1a#qEEr;R}1RSg5OGh`aaLJgYx7>(Zev@$c1iI!D`r#funLHH_;0J -ENy|qRJ_5#ceU(aaqsviv47?fMs|c;aW0srO|Tl8m<|Y$$0A@9-h}ZX#ASb-4Fuct -S-Qi%8VgC0O96x4-OXlV^)XBIj(0EEJ&EA>#A{hpQ?4dHs?Lw^W$Vv;*>A3ZLIRY5u=<{gm(hEZ|1>93s9H&kjuliJf}r7hJqK^v{9p^QD+x?ZtKxyE?mI$`o;`l3o -{xfu10_V8^VW@e31^wy94um*(uGV_FRz?PFiBNa4x9wLCey72mT6XrD`e@vxf@=r$B=w^^fCUrs}HczH-*xbb5HQN6#LrN|CnjVh%CKGyc+srrmO)Ul&kJ56n$HGxH6 -k@guaHS8;~FuhlOS`+V&L`*im8Rd5`P9zP!)9rc=&MuwuiY7&qRRVQ2T$wr&Iid_gyT -#3HadS7mT&Ts()$#alRDB!WEhd+X=mb;8#dP}UD`4S{ucMsKLBHEQhT_TP3>m|>)60*iPp=+Lp2GLLu -MBe^>jsRM_)^=^(8+Lj^`tC#(8ZwZwMZk-Jak@ljCwpZa+uzy1ASJ)8&uFQLQlrC@$~Y^Rab_~?ltO@=BKjC+q;|Qp3awi#`P~RT)Cs -bX{h$cv3DbRB^(jmD!tVW$aJi`508uc;-I{Jlbbxa1QTbo^~>4!SI2j9vjW$Ojvu}_SwxTE?+f$KV*2 -845&h4TlW+caF@I5gn}o?7hyQNxM0%GbcX@c1>%08+?&00Z-2!h)pv6|QO;6DW)9lmmC5V;e?Ak3W$U -PkV{QnGM$P9a@g@4)%`(Y8HQn@A=2GgVe15ir?1QY-O00;mj6qrt6a{mwY0RRBL1ONak0001RX>c!Jc -4cm4Z*nhabZu-kY-wUIW@&76WpZ;bcW7yJWpi+0V`VOId6kq+Z`&{ohVS|ngo>gz;u+g@Ko3LU?OH57 -49EgQvFTNvEE$sAkNx^lw%kTeJ778(kw`v#Nr~yK>7lN>(T^7E8e~5h>p>iyQKQFt-WSly2kE5I1&mr -Yro~!Gk5(whSd6jASQl{RLOBYD@u+N!c3x=j7Nc!i;YFpeM>;LQ4WhyAov@-Iuw$z|Tm$Fjy^%UwS#r -j9H($2ZuKr$qtA3E9MM~EXQenpTm+r9PaJlAF6l;`l4!%l72U!qX&cE}|3}|uAw?-*3ICSuMNA*q&z^ -4WW4^qQmu>g-xURV?b2;G8ftRy4Gx`;8crpOzM4($UjMUzzO&L7kceYWRB;|1`A#}BXpC7sXGR^=o;A -Y1I{=E5!1b>>iYQFd5E%tRSJz8rSOf;YcW2k9r}mhVx*^3Ow{OmTZ2cKnby$S(TO1?@<^*pYj_h!q@ERKi9JvAK1) -=wF*JVR0iQ+F@QGD0|XQR000O8B@~!Wo;h(^X8`~Jrvd-~EdT%jaA -|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1z?CX>MtBUtcb8d2Lb6Y63A3zUL{X>A@9jJoO^#p -&(djp$DOdQbKlj)L_h{Nmlgjn{3ot@U)rv{$^)5=PQp0s#Pwc4`49Di8^S=9?(Zvd)fn8gqUd|`mTwc -PbGn}6u0OZTO8Hi8JsXCL=v|6R2yn`lL@#}+>&Jspcpyrggl^a$%EcIN&(xrH_t}b_c-DLikyC(@vPj -S4O`utx75H42Gh)+PityV^QC^6j{Dbi+_wjrn0@L_n-+Z%TkpvjJ)vpQc+8l6_GOkl-BT%@6aWAK2mmD%m`+lR5h+vx006TF001ih003}la4%nWWo~3| -axZ9fZEQ7cX<{#Qa%E*2$U2)D*4{VHg)z5TuoAzCj(*hUX_ySQJiqP5*D?-$$0uaW0@8O -y=Qq*3>O(c+n@VCI2cgph?4M}|RzQH)uj-8E2m;W^xlsy#HCGcX6{M9mpBYV8#9;w;6Bw6)DmYeq54l -+ZKuVDmRpfy_I1!V;ssE-v>s?6-kA>|%GyC3<^i0=Vd+aRLWDRm?)2d`Iv^;eg(=}*apkEkF7e=UWr?Z+GZf|0)_}iW|z3u -OO*Xn*R4g_Ep_}_hsfot0w29P!9vk~0HmdYb7Y8H%Q=q>CT#J5_gNxjn^7-uxYh%P@tW -%f3sE)y?2(BgPy+V!2YTK4XB16Eq>hl-j|6k=R47%AgVDF;)FWym?^Fo#-6NX%SROcZ#DCB!BFJnC_4ujkr-G+=~e>3k(ek-aqzz6tp_ppj)@Z&%Yj?+wjZnQ@8=KZtgA5cpJ -1QY-O00;mj6qrtcX{nb)0ssK;1^@sk0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*gLFLPm -dE^v9ZRZWZAFc7`#R}4DY;Q9vy_OPV8&_hEZEfkhuwDverBTGh-vsp_2dq=jTwevyuu+?F;o{#t5%t% -UYO#?+ycfPY&6d;?{SP$aa8P$0#hVKk2d5}&Tok6E%X(}v~^k{{0jMV|-*r?ozV@|t8QK3CS-Ft84Gh -w;a`b*QQF+R^rqn#JpyGUC7>YRTx7UfpIr3K0xF2-7mwLBJ$Xj`eba0kEtu-aG{>=`Ii3bhgqW}xY>Y -ek75^)0UaAXJAgNf!)g$$A6==|CF~E2D96g*7LC8a_89B2qENDy+eqf_js@2(?F>!A|H(p&dy$=S!g! -tnYt*QgV+#jq#}cDGZ*4!wQTBZxII!7&g`eEQH;Th6VT?PUF0R&SBVsA$o&>Xbwnimwo~>axQ|JC}03 -#C$;@P`f?hf^`A}IH6%Gnd*5^bv#!q@meUDpVy`bizxBaihuGu-FJ+O-n?34)KQ4R=a&s?VUukY>bYEXCaCx0p+iu%N5Pj!Y3={;B44FW0F9ICEb&R$^;{u7Bm!gnX4EDS1)g;622OpnTI*95^8dYBNx3f{EDmi&pIFX6`3@=FE)w<$1(`w9a>-Gm4|fmk7E -8`1AnA%r)ZtqPbAstWm?D{-@7u(>j^a?QS?rpggu=~;kE9k~~M8-w0k6&sJjo=(x8Qf!F6DWdbjEFjW -xqmz)o)gveq9Bi?#0!xNd0hD!glowKvTH*K`^@g6(6ubwK5jKfQ -yv}MD(>*7dfP*em)YeyT^9$Ye{^Wtq(0kfyJ)+A2qFeO=r>uQpcvTQb+Wtr%8z1}svyX!S?it|+EHaJ -5{T&M3#+VrCiB>5#H6hvlibYv?FEk>TNo2X6b5K7#s#>6$IF2`Q}H>w~aSMc{gS(Z^4&=?2XG3U^G+2 -!%tUfq!xmT+eR%rgK!99-bTl^q=2x&=?+(&&$aTV_g_NhaSf21%fI12lD1+NiB -bn(s5l3GDQvatuYLY9#zJ)jzDroUxYVFSayH%II3R)eSh%z&ZL=_@sfoPR37GFu!R$--m{7t;4}+4Ba -|*t>${t%w;jU!$hA8zKqiQN{=jE8wn5deg1S$&Tv%e(`_D-PkXe2YfEg)QgaD(^}0ivGZ81E0iBFt45rd;xd2A8y}4A%0D-IJ7eSSwc!Jc4cm4Z*nhabZu-kY-wUIbaG{7Vs&Y3WMy)5F -JfVHWiD`e-5dRH8@Kg${S~Z&pwcE^;uiaeFm-6tq%$xFL2PUVT+g6Sl*HzARF1qTYS;gL?>&-tlcOC3V1wYhTj+BqST@?mw>2!QSzr1|a=f92^e -DLj@O#sm^0@yT@j_9T{_7V<6OlP!wd|w-*%JH!+?B5KZ-b`BA-i$Y9Ta0gK4S?zGv%G#U*<3K&H1UCZU5T;S{YR;=QEuW -KV8g9Qaph@MDlTAvqA*5xr)1$}Fqr_$|`nHzR(}zHyj$T!QmMF -2EO65{wpbICA>33f6#M`7J_%R*gIJjVzXq*aTl0uq`#)*05TZc~JwayeI-t-qA5Y1Y6*r00q{(lEr~3 -fLB=oVPpXR7ZFIvUlHyFySYsgxRn~+H7|v#f%Sr~LB<&l>q90&+ZIQ|ACPv|~L1FVO6jtC-?>1hou-qe#(-w=&K9Ns|27Dx17sQsv;wEom*`2G!Ehj#c#f*z9T6I3S%_m!@dx$pplY^<#ID_D;|sFY -k{x>_{Gd0a7&-t%LN>aBH0~pTzn8>CmWf1vdfoydLzK$F* -OaW=3%TeWGK!(&&rWOa^?9$D5tS>~14s`ui!A-|zD79C~L4OPJAgX}qG#p3=9(rwg#?kMr}i~VbQ9y4 -)?EI<_eDDg;H1EY;h6jJfrg;;{2Yh?o(re`j;Emip?luL#z39X827o$mhp~gkNL;-F{9`^jum7Av`)| -hR}iPYX*G#nW5Z!43~29Gn2kcG1+@;q-Xi5|QDWKn*JdL|LVIpNa3=$Z!%i!;Fg(!eP -8!wCA(}JI3vi>9A$Ot@sUZa>4lDroY7dgz9g-&~GsuCs{k=&`b(nqHKph*p=X$xExyDSWD; -Zn%D~;CX3=xiZd6HwO)y0yV8jWoB$ej+ipEJ>Y#PMXm(-HaGIUc-d6Pz9^iaCv@bsQ9kV##Jido&s9x -X_tP-JA@aXiFk3apDuT-7l25NrH}m<~`E9(+LGmjXX<+_y4;9bb)P9?};L*K6Y9|g}kC*Th@b&uzJ5Q -1ou)bhlr{NH8>)|}!blw?Lk0+4z<=!e&z)t)A-2V4fz!M#WwTE-c-mYuV1|*nPwvUpjBL)0X8dzANcx -dgjQ^2{Wn3*&>c@2*AyBhReRK4o>JFaaZd~X+EYs!k0W8P%}|E?(zpA*0{>lf&E@S3%5E6ICh4Agf@J -AVN_gg3h#Fn4B0Vg2p;^6$(WkK5-8$D{jvaoN(1h1St6ZjBy!nb7}_*zQnB2oOuDvE#9TQ##ARJK~p- -Tk^fHn+d2@q)1Y}uVt5CCn?6J0+zPCO%NjqJp@L?ek8AlKxri67-~frLwQ;8b%*_xd(>Y(&|#ql51w| -@%1g9dKsJFACmJt3D0A$BQniiMrlPF6S!lJ(SL*4Yj&_*@92p_GBH)bIg?ZJ0Utn|1?B-9N?DzX@|8= -IS^^@~w&z?Q`Kz*zu_2m%2s4LZMVbVs;$T$qrQUyM*=}tzS1zT1R#4K1k7|y1x)O`8_(G){J2w -hV$wGn*z!iNRy7rQSpa$NOVN$gf9*~E>V_wfRowZDYq`I>syi>^zwBK4NKh`*DbhEjA|aZz4jgWV}A) -R}8xuwhY2DA9aH8;Iay#rD{b(%NT75QF!a{h542No4t}YUR+^zxa$@Z*$8%JZ{mx|d09;7wUq_F#sJ%snTZ^1g -30ypjyZrhF2QgTAa3yMk$8{;F@pZ0ifrHKhEL4dex$?LNo#@6t;D7r#!z{TmoCjp)~Is6MG9zz6XL(x -nVrHwoU=(uk%4p-xgCXb)6QecTJLf35=YOq)YvNjk(!T&8)*0sW;?lzU)^+@=NR0}zS>=@mN?SVC=7`U_MvMpm*ib)jK*?B+; -T9hm42WgptKW`Iscv2m_=N#H{BX2`?-5y_FU>LTKe5o5+=1Hvov3anE;!QYkO*KS@bIQ3 -vUqC-zJPf_uw4z*OLr567A)945{Q9}YY(dMjePfQWXC6{G!K$&B-;n)C)ni6eQlqBz2$B&9I_S=lXku -~{sjFE0UXX7h0rE9((KjeOvf-dYP`t5DPLw8dUjX=WVm9qwJ3_Hpyy4i&?ZC6WNpBrlS8a*XBOS56Kc@^0x4DaWdlNsHhvCYu(1P5oy{U -Pll)q3j>a8e44Ue4}743dfXkr%+SAV|$)oYtYMN!mbZkBdP{NDBj2B>s%3H12J`pDM%@9O(P<`>I$fq -xP#(g(z3LMFhy$7%vJOb3 -BBSdUY2!lg|o1^GjRfo=*eN;i0rS&D)vA4G_!Cho|*khU-wn>hja~U)+XhjCWd=kXGS-Rgb -9a8qNFXoQ79NZModqg7Y+F%sjs8I!kUc`-sfy;b5R?%rf1b}oJke`=`j^PT@_}u34tGdjo)bWFN?ihk -2^7nl?cw{9VL0g2!buBHU -V0Sbf)7)f+Pp5q^^vFq5W9)%B{7f=`k!z>rR_Q-|&2bQs4CsoMm -NPMGA4;`_h0oixi`eQs3oIOzUV#Sg-cNUfB{I~k{4jnzuNjrjv7t;Z#O60H)2XjFu8mIRJhwQF1ki&{ -1eYjO-p*UIgRFsN_07DaJy0TK06)pb~p6fwXw*X^(RD(4yyjCBpq2lV90VQK1>?S)Nj8%;*~y%_i3-F -3Ae=79~wW7q#1$pOj0agl*?;PAl#gwyZUii;6n;vJ$}1-fF$*+*x -UU&{-Q>I?(WvPaC<$G!+t3nitFq1*9CZK5+xb=GlpyyPr`xG9ZTzRhAH_y6JD2h&Dq!A#gtdatd%i8W -MYRS1GyN0@%V~i`D`92@|Jp(Rj(^NI3!akoBfm{qA0V=3lhDLAhhDL_KJ9Q~{t(jAGBr4*_#aS90|XQR000O8B@~!W2IIcL;8~uWYsBlTx24|!PS+$%N{eD^JZ9(4Sj -MvSR`hYX#WQ}eKKdsAmEiH1=#PHt_<)$DdsW=wroFB~)Jg|-yXtX<%n^}PwL&uyqzf#6yTO*2qcm%uE -3Y5WDtC*2uogmT?Gl0Y+_ENP4Y}Nl}E+MduBIMvV1T0-40T7$CQVcTE8?ZS`zmX>v&*v^tMmV6Ay?{c -q3A)EcOB^P2jlf%^Auso$QW113`(%hQ9o3qIjyr+e#;tyIXT -v6ld{acbW(W`pe8>@AOT%n34+&vC6-);6{MOp0_=xu;3!|{olQ{^&J{9ehwR!@9`nUC753OkZaq%&A9 -;s5$E4-DgSdytN%4O<1c)+y0yEBtAgaTah?c2XcuAD$kyAf-TEX7M=q_ywPJJwf%}rBpNW-7v0+%;Am -bgdg4l{8;%kL5t^@v|SeTe1=SNTX$)?;bRL`HQ3TB?ZSw-Ap>m7m;!>a@vi%}MEnJ~p`N4ky5Zhfhs{ -5>M;dxz`l~9W2QsS8Q|4aiW&rk#*gWg%sD8gag7ZaZeByR*VJN`N)3_E@Q{Dh?}6X;BLz}oX(`+cj%y -+1X-_o6x+cr30&><#n?b$kxdiy*nX)!R<>knNLk;LEv^FEHCZZpf+yN1Aq}*4!D;RSsVev{#fcv?7BX=rVZe|){q^iC!m` -a3w^=8WKcq$vwN|2GwN8T~)ja3OAYt~k93%XqFN$F!`MSthqWZ($EtJl|n3l7Dl8-?M;^H+-tx~3!-n -E(_VYYN|^=qQ4}^7{|hV{7WiA0noBD3U=O%dbqUTzu}tdvl%GM3d=M5_r0@*NZxRsGxxHq#S0k-2)CD -VJ1||uM^uf9kJKzGtGH!D>?+P!m>(guhc-_Ih18K#Cc4Q*TeXbjhxfRl;=8 -4`TvY@og0xR>Qrukku&L;IFVF2(HlC|`LYEh@&})K*zjL2$RU4nei65Uj*1q%(METQ3=XYLzBb8ftby -r_*UCCN7vID@Ty(wt+As>MBiUY`=7(`AJP_INra**=XB?To+YQ;g2#{dL{>ga4K&e+{zEnL#e<4IlGa -8{l(@1kNjAJuhoAhFP+6;DgiA=(wAPThcE8%bTx!GCn)-@Cl8LRIO+x`?7|S4_wnw}o{7EmyUYB~ve& -(&)k#OEE7=_$>jvLWUgquOwY}dfQll1rr&g# -Zx?`UMnTLNS5S|M9w~{H;da5Hh7=E&HK&L{|mK-zkYrySw5XN=mZ#qItM_ukjW7n18z6&GvMeKkN_ad -pn{#EC|WA7fxILUmM`?80AK0f*72;rirAG&U{l0`ITU7-(zPz`3iBYlFA5F<)-ZMXDt)_bs$L{Q!x}zFT~(pW(DH`%^EM~*%KZWH2bB>ugKzt3AhrdTJg7m -cC4!)If%5=eL|+QMOwxTtWN{)Hy=QDjXYp@0~kZKfX1vD$ -d!LEBqnN96aWpbZb>ZOyLn!@O-#qsi^jmqwU~wzy;7Nc!x+?;e)KEI;eBM7F6*fpUNAY{n<#P&NvB<} -V%ObZGcD>27k&rQ&-Urwv$SJqU3ph*PQ{$AO+TJ#Dyti)AmiYC)_ew6J^)wVXA6-#4+d|JJ9kFkqc?N -=mAKQFE3gH6W33DEy4g7h)=$>@DVXo|fKw<*U|l8+Ov44$YeQ42&56ENQTk_1tGKyWyZSA#FtZ%S&Gy -g|>V2H?78j@_7+jFoqK`sY{fgq%tozBtx%>u(_5HXawtiMIpZyC^O9KQH0000803{TdPN995@G}Yk0N -gPE04e|g0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo2S@X>4R=a&s?bbaG{7E^vA68{2N%$n{-cG0VURm -8IEi9)p#EjW30Pu47~!Acf)zV{s(2rAUD@a_nyN?>%!PXNHFq-lSqb(i7UF5kCKGd~W(Fg*Fn5$QbE~63?UaysMFEI`ydKtM(DeIg#qW?eJ4_Nw}LGxXe|N&!c;>DWcoNF@%TDAQDDU49wU -|PTk(pS{qS{i&%Mi51}f3&jDtBi$JUjx;78}=x~jXMo17G;|$0IkX%5dViAN}$VG{MKjL4Hctnm!?3h -S?^xauAD1T*(8z{$_xB?tUv1f$33E@va!kZMs~OqQCvwLKg&zWzaq#3D6Uj?b0IwKRB?SN; -Pp93C%vgacKL?Ckj88%yXt86GU8_DWf!0JV@el$EU&!i+fLezKwE=MEZ=e**-#^_>yEO% -^G!8L9#7lLfGPqVRN?JE3h#ap45!l8;62t})gQrdH-W!8$neWD5K*oyeQ|owi{uWy-hL#iQYP+a|pB0 -y$=6icE6Frf&tikuBaSb=W*#d<&G(sF)NE5dutSZkvGy9-0UITr>dz1(-$2M1=`t#4;@KYS!DX9O -i5Lknw2lI7xIzO*y!0W#3{^GSQwJ5?k258H(9Pw3DD`)RFUX~WQ;DbuLLREmG%rY{6BITzLMNxKGouu -qAOCclN;)HyZeT|!-ooO_V+%}I&pT}y`JHdsGGFB^Q=!wrZORgwXkAm7q_k)z6J37{VXq8<6Y?6j8)| -Beb4&&;-nC?ah8urB8s>+7U-T(4kRTlq29l%)*2?IWf@J|&Aic_mKi;AEj+!?h1%Osibr^BRVR&ei)IfC -N^3wBLbuc7>^KOfCLECNXZtjlS4fA>p3QLn_*G9*KO{s$xfoo{API4Bom;s_4&w672H9;r-`a5U%ivV -I=PjBhL6yquq|N@{b5x~oPg4oT6RD+x=0Moo~#Z^y#Mv6*emBZBYp<>b9uDZO#O{;4b*ZtRxuUz4f?dosFPKQ~;TD -Q*{9@TGb4TpDV4afhUHLN&^Cmfm-V-jLy*hA2N{Pq0mX7Smc2U#y_u_i-;g`S450j$LLaf@N+{01*k-DW9fukqauY|CXE(t<~Vt|M&A)0TE8%<2kgbjJPO$a3Zt7qlC| -vv^9{xknJvJ>x1T(*{WPwUljO_Anhlt{?1hAc|Ub$q^@!oSVrXC-8(E^>)Adirqqsmh(d#9{kt=scBD+&qi=BXXVf~;`Qug{rQ2iogsj0FM?4{BcCEH~4plc^;9GYe#5Ytd@ -8t%uInPejEsx3s^SQ&5gS-P&P-Im8)P2{z$*(z6q3wy?&>RWRE$!~`Qgq*WB -)F{}&puBszuN0L{ZX5Pk3mcf!cs&oP5UN?L$bG?Bv(p#AGAO)AYJlMykTC~lKnTm!i?6kB2%) -K|T2j9;2x}RVSswby-2V|_?GdT6h%3~KhMn)#K5GD2nb0k8XS-W*XGx#1+3GJ~Y$U%2S`HWtTVOFFawAS7e2d}7>w2=Gb$;7@I`>Xo91c*264;13y -4-Tf2{{m1;0|XQR000O8B@~!W8c*uCUkv~NDmMTCF8}}laA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny( -{Y-D9}b1!9da%E*-YL4s+CzcUk=Ds0TSD}21wH&ajsXmK4ML-EY=jM&8SYDL@P)}Z0rUCnuMRk9_yE80!nwSb0<)(yQbfd7VOHyjXd7|A-`) -?30#wq;d2tLT;ipABuvRm12Fxnk`dV-;xtf^x>CRC#?@aS)9N5kRs+A>9E*T2*xm2)l-Hq)E%tNJLOW -{#U|xEGyPU2JiMliFI9;^&JXHLD!oK7@)ctMTK`w4Y*tWd^S60pIZXv%jzu(%u!vW449lKgETep*BYJ -H*?tE)p(RLF6Vz}v`*j04(Q2pEKv`(Em}g!DQ)Rnkp5TNQ~)uHqG&c-H(;|gU3YEQurw -vb7T1!{D_)mf%ToFGlH|p0!Hc?DlCCPUI%jEFw5*{epB<3h9;9xc=LM&r-3pX!S=O@rh-Mk%d^S^5?< -8lg|8AK6#`j#wl4udGV3E|LB&#dlQZ$l!>Fc84^lJm}(Ufiph8ADatF9<>)^Hy^Ex-d9__2}Pa%zn|1 -A)7;JjZ7%a^7@o*3#>=Vb|>Q4xTg&#NO_}OXKLz_~M^mF27xTiIZ;^(PB1Ji=MWyq5vxhCMWV?98sP} -iv*|vkF2De6IlBW-<<<|TwnbG=3P9W5%}b64eM7_MVqEEXXSb+9Aim#9r#lACSRg)Tef|ZD-8S~V1jV -KT=g1~8pY+A71R*>&9-F+e-^7r)Zh^vS4a>+*Dc>j`<12JnOF^!=o=KjX_Yzp;@bBu_(zjR>OpF`KY -1=kEXap`BS#Sz=2&ZiC!{XcnkgtP?`r{+Y;7Gfs3}~u9d7G!a#Z`=c{O0tRlk?x+pOHiUA|i(af@rnW30RjsXAj~NIh;s -z$RqK;7w`tS#*b3c$h3SEnlb9*&@7V%@htcF&ml*}K%Y68lW$2ZU737Go-LNz9E%|tOa?j!U~*Oxn1n -GvxZ7YYVxu82#$Hi(JYHZ?fsTbqExbM+%W+Z<;C(;0L9pBCI^uZefJ -IQ~-PIn_VK768(y4&5N7R9$IP!sDCxSdX$rC&&xrN;ys+tsC>*Dy5tXAaNRK@|9`aQz`EVq*8>Ng!<^ --xSgmQ#{HJjoqtWdqp`>u}cxDlN}fa{;l4dYvKDqp|Ed#%1Ih?Z~W9}bez1246*;^8s&in4isdo}A*Z;9C-@%>}qop1cas% -N4l08(SadGSgT&ViWV1;}c|17RTm5_V`O&IU%KKmnLUX=Q`wCtD_@`*%EphMfjo-wlJ7^fU~AyN&e{) -f6@&qTH(zPE*TGJ_-G$89_=9)2F{wEBZK!-4=i_Z3z{L=_LpTgf=v>AK4${1ml%PtYzLTSV3R``(71f -QxWwXIUQiBuCt%50|;9qgGfS&c})=i%G!i?fm}eB<(Vq+A0*BzlEa_L=!f-DGoM7fueW9|Kp~l^*wU+ -?YE}!R_$1sUiG8V?^TriQ5RL*+?o!vmQLgKmQeSbz7tf?Y=t&O%a#2q(Z#kk6kd`Fj*z5EUQ0eETT+c=&f%r07rI8jYY0u*O6F>$G#dljuIh0U5Jz-=tVk_~gP3tF}X~Yc@OdmM(qY7Eq$ASt?XaP`u -{oG*`m2>LxELobKwernhcYKk-!C*klBmecaM-`Jj3LiQ^&>6(biAh$|}^?UZ(ZUGU(|_;N_hRfmK$64 -DM!HO!n$}&)y>G}2QHH8qda;|Dn -h7Aj(movnW$3L-nYthkPdPnsKm10KvwWgQ7cdBXjKu0y+9z5^;P%i#UQx3&>k+t6T6R@c9SrP6lT(v+ -U1x~Kg0iP(8CCG~W`6Uo{*4Vn=o(6CzbmEC9Qx_&D9_v&6BI`uXVSV=AH1Ww559^Gs0nX3i6I -!_iqbUn_iUWO6FII{vPnTdm{fD?kWqUY?{1+$|eRP@8K@n}8l_ -(;x4=dlnvbrMq)#_fANqEjS{MzXYQ~`O6nxE05fgOt$a$yM#l)W$Bh(l9Mmg@Ic@1 -uJ$}VtZyDV*5pu-gPByfm8T<{~G(g=SR}T;)ApGz^S(dv)S$%$En0`*uNBtUK{e6E<5^6urW{TCc!4# -CAh$K?bC-Dl#|41k=bKq&uN>B?2n~~(cFtaIoq@<{hzn=&@P1dLbOE2Rz0frRo4eZ -3^Q;D7C(arxazX!jUYyw+Ji-ezijgAIsUP_9-oc$6}INpC%T1JXbj=A(&+sk!gu47CM_YN2!&WCZrEM -U36?P-{JMiJ~WmYpXA*cvgVgN%t^b(`osUZUdeBBoot+dvUF!Wm`zS@V=1RVO$ILO@d$qj$G-rzc{`$ -{A^Xn#|N54cz`f~f~N>o7QAn`7eP*gZhn-L=;=KZn&Vz$Ch2#l(s7h$wDk?EEPJV4Ts*#r@UN&hn|0S -o0q7?dkagcl0qG~vr8CmN=@l|?b=3FX68sWJc$sW)xsb5!uHEY?LbUX+xcT$HVYrMtpv<}XJ86eu3x0 -1o2b$S5zF7s7e6XU}e&UM>Ro&cd)U>r0*)q1I3f_2|GMXOkdcNf5FsE#gO|xIOs6%1-Qg`}z!JvQQgu -ahBo)e#_l -@Bh<@~Hsg9c=Qkwb#ieW8rRMv2CbhqkFv53>rNncXe|E^>fjJ`!Qb4arxO+ -jmP`D#kEC^iYXZeY_pZ)K5^f<6}OkAGt)JK;1h9gZbQ*9tU}>A%M**(Io`m=vKKD~S4>XkJ1)s#<$*I -HiPwm0%MGI~Xwsns?yi17r9p~0IMHb62sI8ju;^Nw -C{rZJ6(e(yk-UBNo#9=rVKAex=RLJXD0M$&jr-hX=a_RWdBg*PXMqf;yR#G}dkeRoylBT7IniX#7(M8 -M=m`jIw=|R)`5HsD#XeDlEzT)A8}~v%kzouSkS+p17B3d||H7*ad+n%r&h5m>=?aG)ijX_|hUV -kH*65MdZiNAi%Ina7wNxmJ2$^iJv`Ck{9bW6FZb(0x8PR{Zp%KXNdEk-h50y{`AYIx2Ng5v%jBxNMF8 -xfA;c2D&z6(Z{J&53I_V3KF*HRF}fsZRV)YOrPz*zSSn?j?aHd*`(J*f!b<&o-P_*%QqF0+><%+_=v_ -p(e?{JLBdUS--OYv4O!xh6nk7=R=onNQFuMD!SU(|De@u=?Ee}-h^;CLT!GjT^K -ba0A>Rw+gW`JAx<7E3Yz9o{tRawT9GSk;5>239(939$TR#s4ZkFDN=4=t2 -7A9HM2tQ!0xpwc6&&~cFQ%F77jut1{DIUIiJFg%UV_)xHKRV6caH^aRK#};gD+tk9h)jM_l1vQvA(z; -H}PsV5K0|oLLSG2pJw&df?i*!$9%}u*aN}qu%aO6}XC!Xe3dA$nunDF9gfDR~)Kz9gSSibS!r4Z1&nsOF%2Bw5=5~s{~7Tz;0RAJn~o9g7@LD)Uq6(Y4WA;Af7E>Gxgp{<;hmRVT?71cu8b#E4Ftfw3~9_#aX>YR#MrW!Lv)bpK~jM{D1GpWyYb?b?`aDqZmko -IA*E=XkF9K=+q8~ezsar0uriXi*NskF1H&_WfjSI+b|2}4ILlf`){T^M;@d*A;agGr`1pL+I93~;x8p -#UI&nqUg{Bsk9)aa~D)2a6hvL;~)Od{;PlUgToaUi>oap5te1yR+Sp*v0l6mCJl6+rzh<=znsCzd`J}Kk^uRIen(OL?a0rajdF|Z;Cr#!yPP7X)iLzi{plJ@vD= -Ix-PY@ihjaMkY2V4uD*RH<=upLVT>b%#J}r3(=5i;xN`SzQuU@Yp8jVKJrDdK6ZxLo%pPx%O7;kDvwicHz1cU{6+6(q-|oS}O -<1wNDf1SHaTTBnn-`WQ4gzXlUG0m+8(EAaHw~WNOTappIDyl+xrFbB6g@-vPWX?b?>o!1U9lZy{U*!p -kv{iW`xM9Hog23LR4fh9mLcYcYnQo^^H9Rz0d2)+KEi)`N#f{G_;!f -89_SD2u7f&+7|6QO6x;okfh!Zj6-1Iof=01j=BG`TFde;)kY`ZUM$p`kSLTJY7ea_rnrGD10ZqCVOR{ -~pgdcjx&2Z`zclelMAToYRCMr@gg|VcB0}_t5a@R#9y;gpFH|ySX2ou$Ln?kDa`OWz@^@BK_us0bwv^ -hQvWhR9S9A`b7htv@$F-Hf$K6QH;IZ98(8Bwt}JJs4U8R}l3cdas-J$j16vUxI_VZvcH8>^n~^*lLc>y?WA -eRif#p6_*eahHntmt;(8#P85~{_4&3>d&_~VDhY+l_+FHq&6MA${*z7b!ou&5{at -hP^8r5B{lqX@9J5Xja$xqVz_EDG?m6u6d0vZzrcIWn;7pXyDPh}>eg-uYSP<{2Pv2;*bQJzBtKW-gl( -gc!Jc4cm4Z -*nhabZu-kY-wUIbaG{7cVTR6WpZ;bVqtS-E^v9(8QX5#HuPOz!Kn|9SJ&7c_983+io|V$wNBBv>$)JY -X^FPk$dVyZNwXsVzH@kyNZstD1%~Oxyqx=uhx95-w`4wF6{5)4d`|dwmu7;{WuC@`U~@Gek%-^&oTtf -%6bTR0h|OazSVrUA^HxaX>oy)o@T&<-0Yq(#$6=b}f+iw2n+e^rd`Cl;kH~Gxqe;xR4E9GvuAXjaMnj -+uwC8gg#~{}+x$@60PCvezOlSUx;CS}={RD@z$zO75@^)f&PcPn?A^e=rKI7=)^pEMqr>Q^kNcH)%jI -mENzF`@{Ow;583yUo0x6InP_B_KJBthNAWRyuBFoJs|UEx@glcdL<;V*w9wu0E -@2^aJEQO@GkNXnz7)R3ncqk^HVl{#Jt5YTKbkpjgP)e$MV12E5~QjU?$Sb`l(XwQ}e%%>%>WXLGb88} -LuZ+9xtSv1MAG^nq*yEse8#lS)iQixKcPTUW7nr$sisf`yn1%h*bCnl_^iwV5I^I7>9gWpqMTSp%{yp5;bH??SR~E -7~o_C9Fe2~LsBLgU>aLf0p(b^YRN)c!1BfnoAZTEtN@5GwCN&7v&=x{PW2UWrk;-r%6q(Lk^ -!o#_aJG)n7h2<7<(m<}9i$%k^6uN?C@SV|(9mnx6^KjBO%%?)^^(*CdtMmUl(u`d`qBad8a^#6I_RoU -O6Pk-KPB){Ru{$MyX8tUOtRgxs?bX{MykZAwC%c_iP6{y$d3grh`+%ljRJoX`p>82Iz!AKyVjY`vC?SOp8Iy;)92SSkPsNTnN}EN&zt!0eL> -X`0(!K+w;FC^G|QiXOqkKFHa}ka_kYq4eScB7yxe<_b{~mdb=r(h`LtQ3I0b~P_BDt -BhEsvs@>D6(ZL)qUodwByLvz5@WS3%5@Bbnsn1;Mc*HLQFL=Pe?%9kf>UcX?TDAL2gLg;z{E#LxDKpY -ipkl;09LaAa1C{Zh9ItPq`kLvnno0VJ|jT*GvWN5BE~m6B5h+j>e>(Wfc4#a;)2-cv>6SSsL;r2*zMz -*s4Mn+p6Djxazy!>Jf-Vm)vRE42q8cfy8!|OtSR~x$1${rVkoD;5m+Nx%>es;STC6K1V9 -2Khw=aaUFDu6JG0`u2K_iE)>!zuRKWm0Vml}&LdidtoB(^FabGVLk*-4cIn;4Y{wVZ8m)Q^cx60KKVb -!8mYY^3FAkN`GE=uYdJlvxwtUcK>N`PgOq*F)L#$cqsuYrp%pYuU6-`F_-=K`X7E&r-O<+;x-hp;Crc -9frYTpF^dN<+DVOj(u^apNV_p)^sCP&h$}Kugkpz^}%%*J@Yu;r05!PmKCf{rpuyr@BX&qwUCQ2&0O4&adn2$ZyM_J)6} -oG0lao=<>Yp6_{smA=0|XQR000O8B@~!WWr}a9_W=L^g#`crCjbBdaA|NaUv_0~WN&gWXmo9CHEd~OF -LZKcWp`n0Yh`kCFJy0RE^v93RLO4JFc7`#D|nOuLLX4T2SZj0qYV`}a?_$H1X>y;M5qNMWyC1@?=u1hk(cx3)Yc?UPQ?emVm#y0I`##AXG(F*X!_NTu<<1+zoa>|Le2fwrgYdYE* -UGe~zaB~MehJZ&^xA52`wLJ@0|XQR000O8B@~!WzQyt_>I47)#t{GjDF6TfaA|NaUv_0~WN&gWXmo9CHE -d~OFLZKcWp`n0Yh`kCFJ*LcWo0gKdEHoTZ`(Ey{;pras$Zl|5$blIvU)(5I7NUZDKZb+U}OR#ooyo23 -rNb1G4#Lhj-nLVmhw_yz&0U(W%BO1=N{gXjF+m+S&}SkQ!7XkCi1FOhVffn%GyBEe2-WrHbRTCh*({S -w9Fup!hqsZd)|^T(o#xD4Vvf{laK=+ps;&F*Ji}Lsf)(6XY>I*7w9G3ZA@KhS7Jq)dc@usO;y0lmdY+fTlC8kZ<_h4aT1e -y_%p~Mc7#cdytL6)*{K8|8;nSN({88(D+mkZ4ubAPkTkK{6pXzxjxQ -4V=T5RB9E<9%JHLJE#6y`V+n%_#8)GcSq^?pe9CxXuVENTj;~VkwNKgm--3$Lu54A5ZVdlNTvytfSUlKNx;bhD*s;%r|gv{0Kj -}kUm3eT$Lt3k%^QWq|%UR8B_WU733Wn$%ZI)<_89-1}N)dM-h^++g$b%XTc=wuV(k|>iH5ePk{h*pg} -Gp8^zUc`yfN?>;f~#lmjw|nzd;En6NCeRIBnWwP -p?jXy_j9jlk2OiIc41qoLztXL@z@Uxb&OGZ#|;DSRnh+rc>sBc!jp}KR(ZX^qQZ5j;-Lfpo9v&fPE$YwAuBf=gAq~~!NJMxR5Cm -`;vQD4yDT^QbASW9~lXI$Q11X4G$3Os_g)10%PXRhRTmV3NIZKQ}vD6Fa>og!Vk^qSJ05@$kbbF#);& -o>`)rg=Nqd7pp8IJplBf0!CVJ9bvkM^CJgG#W+&Nh3Bbn{yj! -00$HEs=^C&XZ#Evi?=A&+a8g@ULUXHzEB634NU15fhR(-`WMyFAY;d*L7KYN7+mQ8%3?h2(XU#%QSu^ -d1b8)djqz=TOrFDqjF#+!RnVC)jwUxDJ7SYZBlV0I1o0i4+}N=6_Ro~=XNyU<<^NCR;zhQN{G5e-xso -GEKC>JfdsL(CpQ@||ZVN9+#Qi__{5;&H(B3}!6&j~yU9>|X$vk;FZZv>n{|#+%_9gOq5VB0UqzjwZ{s -?hlf6<^D-M~*9!QM|5q4zgXO9KQH0000803{TdPL>UvM`#8B0HqiJ04@Lk0B~t=FJE?LZe(wAFKBdaY -&C3YVlQ-ZWo36^Y-?q5b1!9da%E*-Y;edmz6kP>CLTVICxA(6#%J|2GON^eB5Cvm)~R3%s(6TUACp$J{eBC8aO&G#8e`GHG -bV?@o$n#u+@YG1~DM`71}HknLPwjnH+crvL(Aj6vpfe+shNw_4BMb69{{0IgVamLqr*+3>gciR3@BHXJiW2@I*~RurbM~l;nL;sGwN?!4g$tqwR6bbFShzkSyEGf -G}%cd=;^b?OCogUAM6At|mL+Q?MMCo>!B0O^H(nQ}e-8lokokH$}vA@M})9`{lhWHo%Q&S%Sxd`yxS7 -jFkhGvmeVlmI(sbh;zDU;WvRRt98bcn5W+cPM)M<`?wNW7=|q%J0`4DiWT@i797pj+395wWHp?NqU?Vq%G37v}&B| -_p@~l~~5(aQMdZ)>mPweDLR@=U35LtB)jUgyA)a-AUvAo`DC_8VnyGf8s32x#Z=$H|V{uyZ_cSh={gC -OqJfL00EXrEmX1Vf_XpS#fF!)p8NinRNJNc;S+oOGUH_e`Ca=Bt*@2SK-3_H@z2KjVxx>V4Ae(%8U#5 -E!Y#)(pv}5ayBayhU4ikN;0kY-D?9YmB)RGMidHM#^Rc#LvZtBkhWTCJ4aa_BFJH9hFomLkUXE$V)uz -%g~eWH4ApXt+n)$Rm+?vc{YefOaPAkCK&R)Ccx5V6Gm$an$U8tJJZ08wUlM3mb(}Ql0)9*TiHa=F!nn --(j!XM3ec%jb~JD{V<`0#fyxv#k|DV!bN9SWw$&2PsPsLVug*|3QUbrc;sPnXVjIWnqR2)oC@!{qx=f -Z7i22egEnDY#EVEn|+Dgrw`_+o)dV=;!r&K5X66UuLH2Vbkjx%ip_P=LIB_uzvZf(2>;QVLpbw$b(cv -an`T+(&MZUqA+p0o7&Kn2HF*Lo(mgQgpF5p6~?E|o9Gni6u?RZz*4R&u+0J(N1d+Lao~!jT=k=pNKF3 -`RcQ+%mY~8H~Sx+}F=Hy#=mE;6NiKXaX9Zb9m$9R@7w -7a!v;iZE4rG|8lc|;7`eSQSL5ie*rNgC*mrN=X#NK9rr}<~U*u4^Pvh_a{d)Ov1pRq_b3I>S4C7_CB; -WlwIg{8B={v43-4MRjo~1+;WX*t62+fq|RGdhCnRWE`R3$seg6>CvNWTgOHqmY9RtPw<79Czqm_4j5t21!F_MalOs; -AkvpJ*p8rnHIy9nf**LC`S#4ufyH?+hq7gV{~-)lu${JMfZ_Lug^UiVhc7>hQ-l`3E=&$tQDJq02!CF -B+Gmfj8leCDKOyL?XS%)X20(r$udwL$v$1X)4_rvo-~3&puJKrHM!JVv=Xdmgck=dvGM)6HI?HUU00l -c3mNZx0a%C&*ujEY?#4dEMwb$|}{`|_lZ$EAAfRquIQb21FoEAsU8bVEKflF%GoTuCT|WU -8lK<0I2*G*h@MM)Z^<1u!701Ue8C!@RhHdYVwgYBcwJyHkW=0>CJP759OHUo@S{@wvD5)~9JB$DedPz -xJ2Mv$g+wtD}L(L9Pdy)^@(%jQUZj-PuJk-tQ3Kt6xXsJAJdjwD>;+qs3>hVH-beXqK&M@(H77nipbE -vneS>kuV7)Y=F`tU${(qoLk@V!pYxIO9KQH0000803{TdP7_~k5Xb@m00jvE04e|g0B~t=FJE? -LZe(wAFKBdaY&C3YVlQ-ZWo36^Y-?q5b1!FQZgXg9E^v93Rl#oCFbuutE7R1(uwy820ZIZ6}s%drft*C6SMOO5#;-p=Qz516E1#)4A$EfgWJuwXuH^~Z>|^1HG|dFGW>Pze!}%__ -;>Fi-3@3?R@%q0&XOjy7E$~q9`yZ(`KEnRRKkacPLObr%MdwiQO#=m=(YhN=alnF)^Wtd2G9yV7_TD3cnXv+w -0zxlg>Rth9P>Dew+$OX=KK_Y5k9Hdd#3$I8k4fQ7{*YGeKR+pAl~;6P<-jQS;VWZa!l9 -hn#dXI>rn5h3(~-UV5kAA_u=G`)8T9eOAz&44~fu&JvKw1IjleXmY)?^xemKH6Mf-UD|ns*3IC`**-O -#{=`deGd69@W|0G>!-;E*^CSlIB5-BMEc%+yoZZ9U2|^bO+e)Qsd9E2dE>bqZbEHc(RXSn?0NL3ZC_A -&C&N+tJfwR%4`&F!G8E-N(NYuQEXnLE~1AP>zqOc#AOVF9>-U2JJ;(PBpBMtBUtcb8c}pwG&sESXNKDR7OiztZN -i0cJ$jmLsFDg-pk1tCtD$dN$i;w3@1FK5TFG_{UYH@6aWAK2mmD%m`?LZ)ae=n0083*000>P -003}la4%nWWo~3|axZCQZecHDZ)9a-E^v9}S4(fxKoGwBS1j(qwrZ>tBo2{$C~Xe`!GWsc&{WaZ9w&= -7yVgEb3gW-Buf&hIMI2gD;X|D4d^7XSc<1w`5qyh^iVHww+j5~0u!`4^qZ<4jQ+x|FM>^aW=buk6gy1 -3y4i;9)-7f)Aw9<^&)m6=vT$#|NSvE~^WDi!l0{KPv6Se{MooR}!u -`nRQH0D@Lla1*5@=(XVuf=AmXj5SW;G>jj -h6Ax*{@|B7Y!F%tWqC4%LWMm>e~PVVceV-NvP^aXkk&iqeeLc+v{lQldfwcW7nUS|%1 -`d~}lZGy7P>yn&E6UB5oL8JZ`8CPi`pse$%F49q}73fKF?=tt-yK#N+g%wr{((tD(t!4kPK4R%4zf+7 -^D4Il>JjSLyo-%xm@{6}i+ZCM-E6;Lo_HWj*kmRjrNC_qtWLeurtUM##!tjXKji6h9+ -&7Onp(BfBeL$< -vCA(At@b;@9%4nE7uIAxjT=Y$0`dZ^M^!x(2e!$b42A)>@)?ln_vw6gQ8jOKr|IoZ(4NvzqFua8_AvM -EE-VL=o8I}IPofYByzc+hv-J8STf^NV%f%cxFJUow0!hNIxJV<;8m#zbMu6Jd>kzc!Jc4cm4Z*nhbWNu+EV{dJ6VRSBVd0mV<4#F@H1 -^b+0mC8_{hzij~K;b40aDWiMNS17`wb|UCM2f{{%h`D|3P(B&EFd2ZSh%P)h>@6aWAK2mmD%m`)X!*;e)n007l3000;O003}la4%nWWo~3|axZCQZecHDZ*pZWaCy -~QZExE+68`RA!FoT)Ms3516Yn*s4`|bL+r4ahXwzbGX<*P2m9UW|9Vz8yi~a9Ae3M8@a_rvjUC%%qiy -~*9dF2eHm}P4;L3EvGtUxqMafA!p)7LA?Nm!VxGNoY_5qkn7<`;k9y;u^XX~A%MMR-Nk3@pPeEig@cz -2z-sc#UCTy`m{iua;qgIY$fhthdAoUXf&(GZNE#7+MAQ>3AIUmKwk^$_l<@1a2`h0TMY)$e;`^K9|$! -KKWeE;NRymj;BO?&-X5aVXsGHfpKz67^hjfq-mU8OfS)5fo4ZN1RqTusPckUBi9TD;JepT2;aUsdvU^ -8#s(kNe0eccB>Me6dWktf<*}cxM -eCXLMdQq2qDT*$+u;D430wXx8h!06PJsSQc?rQ(|08?L_0x5Bu2h34#HeBy#)`je1B3+94H47Gly~}_ -}H!RsHs}0hXf#deTvt_URqBUABG|5&?lUf%C!dlkLgXC-KF4#nBlM>ObBKX>?`Js6eUa1trmy!B@Y?R -3*a$A>ZfLZwJDSgGJ!_;H3@H)B6JM^HIfu;A=eoUKOm6|5GxbNt^7JG69~67c|a?IaGob3s702OG9 -hhKj^3Z2)~>@PCBaOo7F@f=CUVt)M)!aq9||WUX}Km00@)zjvqY;>jTatH5)$rY$AYzJfr7ww{U6W=g -*~A+1muE114-qsf>BED!1HzbMp=w>{%r{!H*W?eek@qDco6a_6?~okj&OnUj8lp1>t5}SjO0vPT|~wG -utORkb`iV}Mksi3D!|hA&4acD;(S;X&Cb -~@MqVaB_hMR+h(QLl<~sOqP)d1}Q0*OU;13=FUs9WAaAO%ieiZc!`HP2Pddhg}5`RM-W@i7v|tYgB(uNe;RBDq|1z&Zc|2z!tm4?OJRUhmK^K-83sz32Xo8K!Jj8_EA*VnA?4oqAlZV#v)lI8~|S9k-^YqrKK -MSVtZ6W<2^I>C~vvl%5Jg1(7*!;u&Y*(M)HU%(m32`uvCOdLVtr!;q3J>xVo;a!B^$4?I1!$0Qxx7w6 -OH{*Kmc71GkOPE#Mcke}mc#urOcVie?M^U$j3;S8)GwSOKr6Kx=ouKb?k0&R!0)p(U6e`4Qb{DIErAj -P@>vLqW9TIHVUU^LF7P5;xvHDTmE_#3|o?+l)jMy#b?C`zHtmCTsph)`fa;I+fAoWL7#P3_gI&#uWm{)CY!_aUKR+WJ`-i}u-#avhTdnbXx8wj2&oZ?_8G~(a=2jr-m&bx1L+Ln2C@R{lTd=9R?s -CDstAqSsruL_tROB(vTQjwU><7b`F+*ID!Mh&#M4O+Y#w0Rq}`8Pqc3M$F2QBqM3m1}|1usWF-tR4yi -c}e`kjNu1+Uoyu}^8X|v>ZrCX;_=_C0dzYVt7Gd{N3GwhPh(`RZ9k2 -%6(T1MjL`QF{vE7r{S2y*PdQD!B9D0lV8t&Zm=oXL+6>nrsCFLVp* -``VN39HCX_FmTS48l9^TogFu~XT`iQjikCPwXGM;ACY@GKrfUxBS*L~Su}1qW15@Q?VRE}sgzn>; -X}qBVv!Z@p*ml!>-v3lf)jWpUsK3W`XP;MS7SaLA76;ILcidhZsd_ut*}`@kblmC^y(V`NIBeh^6HVm -#4i^VI1J?{)MZ<-t4*aQ?RvWbiS{rFqgczl?AU9L2N6H&Gv{|^|2lFK(Yn%_FYz;Yigm@9nmhw^RLey -IFsc)*14o<3GP7v((`|rsZ)~c5Yswb)D^#c986^9|z9O4&jJ0H(K9L&Yr9UZWf81%eMhoq*_~i%kX%^nMEg-+JxBY8b7}78( -SUqmXrlft#o_p%A_&1#6B(iYzxvS4iw4S}0v=hE+yDVg7v2O&?Fnq};;j~Y*8ZibUCodzUuWu}{8^SZ -`l5khwLtw(eb7v61z^v5)vun;+TJqUX6>wATf3edvIU}CLiNv*ET?$7kal;=CQ)~IWCSBYO0uwl{IZp -(t#G#zR4d6*&_;1A;7zGC;U_@&ZNIzFiO9W5`;9Eqe(2mkdwtv=X%Itu2d!x}_7=ZvanSU4Evovhg{L -lPsyI<4jX3+zMU4*ep($VVrou-u4~2zFT_Y73=E6#LdZabmwRDyIku6U|DmNLrFOzt`+G8XJcdng^xe -d&PG}LL&dbwudyhOvxL=0VA8eU3zZ`V@jc%D!wGADZ9aQCTdp8s~CUdAhFs*;IU&s3zxUj)v3675a0G -Mo35hF8yItmB*rcE0+qRa-c^sE%4mDpL<{xtjolbC`lQc47H}$naM*BIh_iB{=4vWoZ -73ld~zUMg!#8f_P!QxysOoT@RiiRUrL*|)^sdsH{LCl{^xO{Q0yEqDz$e6&E{a}h#(VbWff| -FcGT3wL~Q(ZG1J-1eGf5H2Cny(jj;IxP)h>@6aWAK2mmD%m`=006_E000~S003}la4%nWWo~ -3|axZCQZecHJWNu+(VRT_GaCwzoThC>=QGK6Z(FzYkBnaDgI}#5F5LXc%BE;LMeA%JN&=buxkO<|!<8 -!>u*S*%HAM#0`ESLB3URADLE_+vb|H->w{>S?t-reuNUGH{j|NZg1|FVzohkg6)@811teOTYy$2H&e- -@W_z-FM&q@E7mr2mAABAMLBJzWL^V*7rZW|L(&#-@NeL-)q?P!Bzj_(R0gG -CTDj&m(s=8J4>p`fZuiKWk5@>)oA)bcHPs}Dfd-G$lA=m`Sv@gd(#UR}F>gsL8 -R{wteuMAphPuX2*kW9}5v&oArL0V_b5-aH4-Shgphr;wT0=t|-U!dPiKSQ%iFZ2Mq+&AV!PnYoe{(Jk -CeK4I4t_W3WY@Dw)58e2Q?2m_H|99v3iFq?+{&IZlf7+AQum8}k4Y$5|0=VvTYsbbrz`6!6bU#67V-U -{FaD~9ea@&q0qr0$H-^CqzTgvj2vj^*Moc;c*|NQR#hxZ?T_07lM{bqfdbg$p;&VT;yH3L4Xj;o%lfv -b_LiK~^XovMD{H`h;9zOR4W*MF)8u12mVu4eAJaBJn(#;wM!ovVYZldFrXH}xDYt~#zVzadapA#ycwm -H7>YtITg`TxEU(^Bb7o!2Aa0H{4W>kMS*^s*YPdSDD|){6^+CGQW}ejg=%Bncv9#W@aHX3x&t1@E8@= -$->VQQ$G7qLHXh%`_8TFAPYN?g&oK;xaYw=v#BqGduCH#2KUUSzObn;lO;J>b0%xfWJykzNAUt(~ibtCOpXt29QHt#@VXUDX4gKMDUy_)o%r68^LBpN0P{{Ab}m3;$X8&%%Ee{5!|5^CY!haV2i|}8B|04Vs -;lBv~Mffkme-ZwR@Lw;s&(%p??0*eXk5W&c?`-UPmb&1nibuwy%6L>6k1FF)Wjv~kN0sqtG9FFFqse$ -Q8ILC8(PTWDj7JmxoABR+|0eu5;lBz0P55uZe-r*q_&4F-gntwMP53wA--Le?{!RGjePDlG<8%Gm_4& -Df;jib$%V+KEt?qh}dX;+nylyf-naocn^OMQ^WHLXQ%ugoslga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A -4menaocn^OMQ^WHLXQ%ugoslga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A4menaocn^OMQ^WHLXQ%ugosl -ga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A4menaof2oS#bmtj_bnWrGdMCO9Q{B?KizCD11KgOK&MMX#uO -Mbj%x30;3OlrTT%{y|vU$1Q|;DZwehD?#NkRUW*1^&n&=6hX>+SPw!|f+?XZVJKlL^rctaLRhLFOXVR -;&P`AqTTy?aNS7jAQwfT6$;kC8NPBg9h1V;BUJ;d$l#sQLqJ*l1rhS-R(UmatCsVIjdWFiPsXUs>!xW -gA61ox;m?K%+%E -PHVoXW$gJeK%+%EPHVoXW$gJe$-a|znzYlTo${W#+xCKXY&T&rVYQ2S*#xHquY{n4 -sDz}1tc0S3s)VKlQ$kn5P{LHgQo=0+r}A(r52x~QDi5dfa4HX{@^C5-r}A(r52x~QDi5dfa4HX{@^C5 --uk!FJ53lm@Di5#n@G1|l^6)ATuk!FJ53lm@Di5#n@G1|l^6)B;pz;VRkD&4hDvzM@2r7@D@(3!Apz; -VRkD&4hDvzM@2r7@D@(3!AsPc#^kErr^*}~s{HNKncH{ZSg@bR1Rt^M%BXK~nH|Lec~)j$8k-)Ke#qW -C?hGa)}AP}V{|c>q_T==6ykjho~8ksl-JMwbJbvx=?&GAGAeNbb2LN2P#VncP6;jGwE6%n3Hv1ertIu -fxr@>qK_I?HIQMZpXMCa7)gU18&E-9dJ9wjVOEP7`Fp%$(uqdfb)#o1Gi_~9=JW@_Q35Kw+C*|xIJ)l -N{#ct?HM-|&9S06WcX}B5;*{OVB7%!0|P_~p9_u21~R9rg#q$p@&cK&I3lt*VqkIvnbWXNvdJbFCgW* -{3@}1ekwq0DDoJ&V5LIGPC5S4qs1k-a@en6SFtG#^Bq&*Q2}3MNbP2d6hYlG*PEzO+aA(F1YvLrqFav -jH+!?qfT`dE5X51OLGvm&{of&rqZqD6u8Mrwq#ueZ$jJp6gXOTK&k-EaT3vhFCsY7z9V+-pFG`6tD7H -Di?jXk<{xypHZ6#y#(tN>UUAW~6XWsOBDs;exjhKHo_L(=?6Skhd`sgF@IB(w6Cj*=S$Qg)k -LR6DQH6f}gdB0GI$)bW&;1)kS3uDQ-$!=jR7c;*wmW#)7;n`XI>?{a&@iV{h%rBPrg1i^wM)IP&S+H+ -e#*&nbTi%jmj9cEC(hIU=5}#X24xfjoBB!F%{Vo_!yW(*bA7JeRTl)ZOAK2OlSo^@%KET=sw)O$mK5#OBxB-yQA_!R0hPyEtx4cQ&BGf9f*BjyWM)r -Cmyxz!OZ-mzy+3St)dLw(i5ngX(uQ$T$jqLSCc)gLm-UzQZvLZ()a%4r0P~^yp9O3mw_Ie}qJF+y%J#X^1$0CGr6*u>yBx+;E0tWh521tbEIgTe8<1D{k5NmN+gUHoj%UEgOppK5}FqIW~x@F -+jM^k&n-a4Y=8(jt#gueLptf=7S6(9PP-Cc7&rH+0l-0v?Dv(5$9J#W84PZ#<&f*+5e94za#tK(SV!h -hS-6-Gwu%DopE>ImV-SyaCgRyc_((p-GQ5(_y{LHcE;U-n~%nc!-E`{96?S@&L9^iSCAW%4dl+`0W#Y -vtTOhLOymi{^6VNX1j{Gc#0kOjNi7lcPULwfV%~{7??lWyk>{O=c_;F`6EW{Zo_8YVoyhY}#Jm%E-ie -rZ;*yhIfSc!?hL@eb76VMJ_W6Krf^8=J=K=%T> -n2r|oLKqi0WK}Xd0>m^Bcbalp&PnlO4`5ZQMWp)#DJ{CC_nglXDrOc)`!}R7knS21|MH0;G%ng~XPre -Vi@WWkR?|dS$Q?Pt1Jn3Si@+xeU3hYT?dxDM1tFrpw%)G1e_A<`QyDFbNR}Ey|eyiAitE?v#lUL=rp< --@my#L*B%f@bbJI5tmjeX<>SvB5aZP;OLe0*Pn_t<#(*5D>K-l=TZscgLW*t!QfFc|>ZZE5`sPh;1jL -G2s+5N&jjX(8D#p*Nn;+v{XBo?Y7l5}woA4J5p1YWD(}ZfTfcjAs(VOk!7O@)4{#5|zQMns^^urX+?vBnxS)>vZ=8f)y98{BeZjWuYjv7t6-tPQ>z8f$}b!+sm@mK!wISYr(uYiu434pe9J*rA -%8RkK4i`!$(-B-mLsJ5;l?YIdk*XVvUb%^vucP|eOd*r9`REMAAQbyl_xW$UbL9dmSN^Vsobud{jVP` -1wIvBNxe-a^3fg^$=)CW9S53$^3W)6Q12;{{abRdmO4xi{{lK_-ny2R5wpy0~Kj+>IrOS4!QuZ>UvgM -eZGBc0@W>b)8Lb$MUVSB4c@ZbynmKi`>~FcPMgaMaB$$4OY!@9e{&XbGRee!Kyi+nuC>XgoALfvJLE+ -4pz1i(FrTtz$@yJ3X?0yByR}t8mxl@IyhJdv0AL&CXCW#g}}MR*JOp5c;h~K+i=1tP1chMJ(+wo=xpeOo#BZcsL8uT6OZv^&lE3Gug -M!c6C*!)Cua_D$?tS0-sw(Oh>3T)lQ&8xMt<_hPaIr2dBb60s$1+5Eu59RILc;VIqxs^EsFbQ{YAp3==~e?#r>&N -As>r}HhL$Tur8b|)T@qZ0M`3LTZBi{HXN`G{qQBbJ>8tU^7Vm(V?bCM75DuRn!QvR>?Z1zq|{=tqL)J -c4t)1Yr4!>m>r~Ef`aRll)n4?NVYoJMeUlEb@rw@k9C<=x0bj1N}%8kv~(83q14hx(8iCIPpDzkR(_W -=kf=M9>j{?m>v`$m@Wi^jgnr|Cemjia;YSdm#O@u>$Q8#ySp^| -na{Rl)v+s(;a~9}H5xz=B|ApmW&JA`c{Xm|j3mxAxDDvHcauyxClnBP-$Lx~z^DS0U!m}{(?^5WHLoE -`3_=-#9WtYR7TUTY=5hUT79M1k0u_$56*v#0a(2sBGngogBJ?$=eyc%#e2`$8%TGx2%!r@izE}4$qO= -l7YZoqFzq9vgZCb6P+-j6%0(m(8mHK89DW|us^cw@WEFT_SlEHhR=yX5}+iAr!?^sqy2ot;ky_r?vL` -5kuhcWFXDc4NqQJH{){Qeq^>36gX}V)@=8Ek#eJ$M;SoaD9djx?F$U2q%k}$9Gf?T_Spdf}0{%QFG*QUWi}*4QILl<5xmCG%o -A;Fr{k<$z!2m*s$8k}sA6ez8Bx0lz$V%K^XSUn~dwl7O*1@Jj~9^1v@C7|R2{REOCH98J}=Sd6@XtdF;)QnAov6DONzz{z%S453cw!(Kc1r{&(R9N9|V5@{wVk(@JGQPfj -kN>p%sBY3jPTEVt-ZyezAuOc4>*g{Hj>m#Ow -!~ju_)gLiKW$~;mo$%+fnV}GRtA1a^jI1ACDUVN;Fna71-rT=*JEYimw9}_4_uP%u?p}@y2mQOFZ0(b -z%L0Os{p^)`2{<_ir_E6Uj%;vewo)6=JzFjEOu6QDflb!OFGD^z%ThA*mK#X;IF_he#NT5Uj=^!ep$b -)3jE^FuLk^0@HgOZg1-U3_%rM5`R`Kh+i+j`st-1NoP1Pi*KuFTJHbwnlbs-ktso~`LAwsQncy_YP5e -e|675p(8}N6*-+{ji{to=&=dTX@vQAtb_`Bfmz~2Rb2Y$(KSsnPrZ(R6p+>-CctpWT)@DJdZM42^!U) -HB<0RIsD1Ng-cUjz7u;2*$01pfg3DflPwPr*NdU)ED=0{;~JSZ6I+XRQhRvR+sd_~muZs3>ol6B&z?=^~iu)lFHxqd -+oqW_=1*T~=hb7!5nOZkrDc@?rt{w&}?p3mTY06&i3wM)&INuU>@SJ0c#4fHPb0XpZ{jDq_Xx$p6pb} -9IeKJ1dygGNO^Rr;yuhy50hSGc>(LNB0Kp*PS?=pA&$GeKWMzYm@LmR$$_CiolhH^JY4zX|>Z{7vvT; -Fk|+4tz*+G{N71zX|>Z{3iGf`1PZb2K*-Y4fsv)8}OUpH{dtHZ@_PY-+t>5L+}saAA)}X{}B8G_=n&hz&`~40RAcXC-6& -Z-k88Y1^)#8DflPwPr*NdUp}llCh$+eKY@P={t5g`@GszBf`0-35<9kF4<+YtoTNiPZt3SnKk~ub*Ks -UUGE3*#|Jh{~`UIW%LY%9gS*}0pL@yx>9_ih?RC)!S=NBYu>{71pxW3EvNXeA&hF!u7BlrN*XoxwY=|@51sexb{+U7E;lFOPl7)Ie-iu&_><=UHFuQur$1tIG8id{yDAf-eby&J}!B;j4nLDtuM&RfVq#zN+w5!I#8X=L- -By@HgO>;OpFgzX|>Z{7vvT;BSJz0e=(x4fvbjKOrENm-LSq@yzp`mGl0^3cnxO^#FPldICKQ{nbwudI -Q~r-a#KipP(}L`CSztel*v|s{S;T%8*v}&N -v%r29v7ZI@vxxmHu%AWjXMz1JVm}M)XA%2ZU_Xo4&jR~d#C{go&yody27a-tr2s$g!|b|&-i1CupF&6 -fVuuUta1lFPV26v?;Q~8c#10qO;Zg->1s?HF%8BK+B6hXFt`@PY1$MQF{VcGbMeJvR{VZZX3+!hR`&k -;srOCK7$jt<&0jCL015OjU8RTYy-+yA=}~qzrgzExBSC7HN^hVuzun<_C)dBy#=O!i=+Y0yrE@%? -Av1E9tS7HTv%ci|v##GI%K`buyOb2PGhS1k$F0pz!QIC3ExYbOmr&Xh-?Gaj^!w1g^yATwmwr6@@zT% -nqjt$5)7>4Mo#W;1g=k_~N8fl4e(QViBZlYT4{eyI!D}S%b0~Ky=XG9Z?fod1Hr%HnYD2=!lQvW|X!! -5h@OM8to$Y{n99YXC&<+~~yOcxto_i3_h9wQJLvDk_2yMc-d5HRp=OI*&Qlgs?Wpf32Epi3G4I1|x05 -`~s(@i*H5Ap`{iWrZmT_N;YPjhjPLq1M}y!?6##+K6t+=VEXD@hp0h1XD538E!Mx+8RSuQigrlNW;a0${@*?c27{My%U|tn^RXHQ;L5OIOd%O-rZcZCK -8YJrKYPflm*ZrHYPJ_IszYq_t$=MG=LPODpBP(yj*{LX@MFr9qdvLMt0XTFV8*B^p=L_0^;$(g)R-RL=8UH!U6B2l!LTiXLmb^sdta8f@ -gzhi95$TKT3g%=u)T0{JIl}|0wkr6~7pI^P@hyoYDXW^{7>Mf`1>S`~oon&g=2y=h)3%N>somEHvEG0 -Jy#uZK!By+F)o{+HgkDH*IKWFzu@2=8{~2Q^Fsm4DIXu^&r+~6A~JxHk_MlVu}lpRq%o;_`_fb`io~K -{-e~J2i!a;+~+ROF6G$pO(y3|VDWa1ROMa0n{dkBJNvqGxw -$+OW_d3KyYpQ3AI%p`bzdKm@Imv%~hYiLR2wux-N8-6Tm(E=@E@RFs4J;j(ySn-I|;B0=1$%gT8Msw` -8gI}sF*QhxFJOh9oW-Qvy&%4Vj+;p2}|x`OZX`0%nc;O2GdFYfbvG)W}Di=|zv$uQ`yNoX|A;@+jim^ -!OR;WX)F6DAsDJTM76lk_U&g*?h1HJqn*hy(e^AUO>>w1^4I0j%UA2S#lx;6|nENwVLJ9VHCd$>!zc}9aoV{bx1L(>MJs-h)`SKOu7hJXg`%J2(WX1Mc8 --92LSsNpSFGl*XK_)5N%Xn!2ix~(g3AAI_}LlzGp`{1S|pzHQ$C>hyPpp0m(0J8OrY*%m5ME(U2?43Cg2xC77ZQAue)s0(9j^7*iRhRqm(?b*YWzY(f -1(q(;&0+v}dZpqs-Fq+$4RJa^Sx;bR}Zn1a}%ViX1}RWzmLu8eEfxr{o{`W}0yJ+=+UWNgFa6SnLZ!y -Q;X(pK=H!>G<*GtY7?qT#OzhhmB&Fwek=`{J0Z>6seNq-{qz)H -|Mf5a<(Gf^@4x&<{U+0OmUp{cfA9ytkRRai+KWAmfK!+Q>qkPUaAMO0z2{eqSgA@xh{*P~g6*YhkCj$?Lns(B5KD=j+D_S(`r|ue8$!@_bAb5cJ-_#6oY`!a{F -HxCfq+(82l@z7IXt1UIdq~%7Oy1FE{ratPx`KYq-hD2l9r*M{{fd#1w~`g=g@sb*(k;SC~vB9&j( -MxLY+tvC2>20Sf0gkNc^Pw9i#on=Kbqbw5H_1ZYtOS0gSq(+~I5$c4tIvU+o%#!j?l|3au58+-emOh9 -PNE0Q7q*5J_R{~oAN5|FDTdbB>&s7Ma;uP3+4t6*+WJtJ)E6*~XWf1U999;WOyR=1$W5fkw39B_tuRO -iv;K6FjLl%iAd-3uDl{)AeYqnseI<;d#qe@t<;Ois&WiFDawBx;Q=v%bKC7nQPDOaq0e6WtAn4@10sn -F79>&LC2rL&RLGiz9sevY+DE}-9>wy4q@+AJ2tCqf07mt^vO&$uOSyII`GEv(nmnR&Tglv5Bt)Z|X80 -j~>(!5C_Q$}58@$!KL>J~87J6-*bR?Pbi%kWIh0v;Wt&7ML+l3KU{okc8jj0C -Ur$f-<@7BVBZ|P=I%lEK5nkgB+}xoIJU=rc=hrXP=H-QA;U(W+EzVO&mC{U=$5_Vu^&K6WPAcSr?Rd` -)j`Rt#%%DLlynIGt7g3As!t1W!4rCr5K}E?-jfWGLA;n&E2Zq~UguklAql?MqktA$>fHP7f3~dd2Qr2 -}?OW}~No@h|iEJ*|a+{SysO4mRPmu*yhEjiuTmn`KOmSgL&4vI#e8ooex@q2k2!cbRax3_>%%p6V#@M -$~8lD(SP%@6c#`LDA*Hd582uaMr=R@5D?-K2`6gX$CYA820(?VoFo;~%26nEV4!O9KQH0000803{TdP -AHI~LKgr402KfL03ZMW0B~t=FJE?LZe(wAFKJ|MVJ~oDV{2h&WnW}rbYU)Vd5e!POD!tS%+HIDSFlx3 -H`23E=i&kYP)h>@6aWAK2mmD%m`(x%+*C4@005K*0{|TW003}la4%nWWo~3|axZCQZecHVbaON|WMOn -+E^v8#y;qYR*Olk{u1|qh&rDO(uF@Q*8BI^-$;^m;nEP`3-sp(#z8Z>Nv?3`xcWwY>;SB*0wm^cggfA -3)Re=$r0~iuP7>We>f&y5MQb*_`+(bdb{{7dg0|i2i+P};^nQQH}_S$Q^zg+fD&p!9svZtSW;i+Zye; -@zp>o33f`0LL-@%Rfb{BqedPrdZitB=3_)RW78^vh+hzx?tGul@aVPrmf{-#+>H>yLluFPHu7xfj2`? -6s#}U%dONm!5d}$>&~r<_AB0{pr7LFZ=#?zVqGhe)k`X|07%WKOTSOl^QJjr^kO(|H#v?zWm~{|LdRr -&$Rh>^#$Mg&Ub$J!=F9%>TA!v{L&A9xaL%n$n>``-7zv#kE#t53c -D(^p?w_AiTnJl6M%zQ0-aSIJ*}?{EJ6cVzyK&EJXnJ2ihd%->D(cgy_UHh*`_-yU*w(^Kwjj-~Ftvq5YkJ!p1w( -^LrJYp-4*vcce@`$ZGVk?jMzC8YK7L>NY$|LDBS0s@wh;2b)3sPIqumw$9(6R+>ThOruRvw9!M`GoX* -!q#!`jJ?9q_%#f_vP_F{_1a*{q(OMXL0G9u_~r;`CwhlPqpLEPjf`&4u$r=-G;5ZO==-Pt97L>N2G -6fwgkB*f`$I7E)<j+IBp%A;fD(XsOASb21;JUUh$*#i%A-f9C){_M<%tk!3J|(k0CA%-9e`JC6DOrV=7zD_zZ^^Bc^3bNmEDmj&^bAt -`&i6Gad64z{`&b?Vi1+uiJjnX}11t|A#QO(X9%6|19}1YwY}~7v?S?Sp{lk1>P|f@AvOMVK{Ua<7k= -^@8Ssrxs{xOyZ1-*Zq@;4icMzTk@op)X_K()yj!`km5x=hAxT(t798dgszQm(t3yv@uO- -y>e+|n$kLw()#1l#(1Um$E9@@m6bc~n* -&QD3mk4^{}Uf{FTqQGPHWz)C3U3-tZUBgl2D04LW7a@{7t$u)vpcL;EDjUd-u0-RhU$aPeJlWPRIz9 -qoPHHKXG3UG3bA=iBZoLpnb^?(2;*BEj=B*4ivhFsqj;N%)Zu15ukTp27Ry@G`(hUAaS!<^(}NdBY%C -;22u{<+_XrMfI(lmyW~_hSJN^jQH;&rJC1w80--7GT|Kl!UnF -gU!a$Pa!f?zG|R9+HC}iaTvMvqxs|Lvg1KR~wNQ{7~F!!_`LQ1V0pa+Hhu%gy4tbP8&|H4ai -m8X~W620lA7hZ8*6$Ay;vyE?XEiAy;vyO()kT3$?ZYuib;9i;n_1g&i+-FA@f)hz;oxBW=GZQFU< -c98DXHwA>sdsSRbI|%uswE~=w+o7s{EZ(9WM0!=6Qzz8etKy0}L9`#eA;7g@ozQ|^eVB-0%#!wuSvo= -ZSH-(@obWpkzW9Mo5dPJ}0zwV{NI%+nj!tj~SH;FVq1s+OEx=XV4rDB5ngtnuB;MBLOrs3-R^;K5r%{ -G_E8f;+QKKw~?vv#LP;W(anX9)Mq6D$1%z1?@2=gQHt(o(!S*Wm|h~Z>Gm>)596uFdYl!u!7$!Y;Xn4 -d`ag6!%?X9T#A3yIZ_&IxcKS004C)J}O;rN1t;m8lZq#)GtkJk%uw -H&#=k2ew&PBBRHeJlbgoC`sQ?_=?-h0_R<|FAaRPdh?LsgKFn7m8)MHM78A;3wff`r67xD; -SiK|=awRzfjyfmc=tur)76F7V2L09*57fR;StG#8HAXJ*%E -Qhp1DHmy048?X!Wh}YD;oqj$s=2MWs?9Wd1MQ(Y!=`ok8I(Utpc3nkuAKkO@Na;vV~W62yl`|w(!a>0 -Z#JB7G4<@;N*&I;gz=pIJqKQ_|YB#POiunUfCzW$rahcD+dHPxguM5<&Xd;S7ZyXyeq)T71_coM+G>! -A{Th&xBw?t40Zy(+1zs5!;N+Tw&$>G%f<@Nu%A^3>(#FWzeY8_RiKibF;=T`AyQ}> -IY`_vDYxmJ|0il+BA|49KyHC~%K*vVhU+O9g=J{RKhr7yx+}%}ie=c_yBX@Uood8!^kh{Ao&dufS;yh -HAXQdoM7JVRG|FM(@QNJqX=sR8%5F~wdLIC+2sWkL9hX5lFGzXN&1+H~bn^=-hZRU09Ck^1}XxBxe+8mYfex90_j8(~<}>=o7|Ej!sP -X`!;Jyjs?wB!8M@c>mh}BITj)cuhXs%{ffky=FQk?FNX^DH3#_9up7@Tn1{AcCheIj|&JL!cR{K2#)p -BlLG8)yQCc)>$SB4?6kWCnY(N21VCo&nkOAs1(CA*RH|SnRJc!13kY`esVD?_xlhjsfYqE80MVZl5Jd -l}h#u*=PcI07=%uE0Ao@!JLZI;Jgn*y{nHQHJulMPcfS`y^FAE5Y_>?`W1nIqN;=r_v4X4iHIa7$k>$L!iJ0nYzodfBy60XCpZ -kfFNvmH->jB?ua>?G@l!ID`w=_6cyhMWk@;fB@IRAwzZTkN_uFWT>vaE5OMW8LDeX1vt4PLv>9W3zwl -vkfFLJt%S=^B^4^Mc(tmR|EM5dF&#H)EkTw`4Wa7g$lWZq1X-?Y`V6;VtLpT6Ge}uHw99fORdCI})k} -j+e=E+s3jX1@bml2iTh})V2%^2dNk9stf_9bDfkAk_5hZwd&ixV -}w5sPNaf3kVvyzC%FJ$n~89f)BsGOF*dp*LMpD8oNF!AZYCR9sxmP*Xedrq{KcuB_L?*voQfdW1pQC5 -cKicxPYLK&&~)4`uOaufS`}h&It(m`0TuZppVZk2nhQ4?4p36kIya%2>SSJLO{^RXOjYgK0XtBKo0G* -%L0NvK4Wl`B9(T1xd2$u3IVX7egUwL0Rga&K>@IjApx+DVF9p@5dpA|l>%TNs|3J4RttcAtPueFSStY -bu}%Q&W4!>_2lFhcTdSL5F3&FGyW;w-Np6e$C*k(CJhyJ=a9M_>w(V@RCp2l_PQ*`LBi;Hm``V<}d>*8D7T%Htjd9 -I67acc-`#1vC(ZirWNQ*2VKM!X?j&8Dq2viUox?CD!TM*)J*965f;`r)x7jDP|Sjl<3CIDoT;axhameaMcnSoSWik3s)_Xy16Niw -s6%FIh&i}XkE@GMb74?I9ivpNs+U;DUR0VY*OTGZi=IIIhzzYo15ZBUCt&&&gQ1LQJ1qxk+ZoeZq(&$ -QsiuIiW_w~n-n>lo8m@Y&L&09=BBt&m$ONcv$-j5)a7hatZUk!rcMRe+N#axAyD32<^na^={b4he8_MUv#!y8@hCksY~pRDhE!(jvEx3vhBp -KIGO(0Zy)o4Y(Rf2)I5MNnsA|S+MpNle*Ao|ab2?(Lt=b{r#m-_sKfRK^;TvUVk8=s#N0DX)JfIdzOfIh|rKp$rWKp$rXKp* -D>Kp*D?Kpz(bKpz(cKp&R`KpztVppQub(8rVj=;N{g=!1=F18XLKw_HHb$M2+V#nQ>&^$Q64_}zejpp -V}T3JCi6owTD^Ncp>A0d}9GhFdS$!0e6B59lkp1y&6=4Wr>wKn=I2Q^O^68eKaDrr}mNG)nhdE>vt(c -B`jmpW7QPvimYMBk3Z^rffa;Ic>Ir^uIiGn}*UvGV%6GgMxIw9x*7`#O>7vx!u|dJE^7VCZ4tW?DkTv -$ZfxtTA{YwJj7ORXHc}d?m3lvjtfoOvD^O3CD_}E-2tnex@#J4qp^nl_IATPr|F*4bUT=3?wZ`~rRLT -mwR87fu6Nun-8OEnr`N%v<~#eh-q}AXumkv}g&E*B3vVLx~`2CJ6-qAT^spzx^6E$mr -dyuZd*HKLhc;gd*`4i3Ogj-Irxr+Zu7bVNXc6DZjYl*%T!*Tu?WtB5SNl_yKwbKH);8G_+Ehfm)*JSot9klVQXf-{C$ffhq8Yv7;Wv#K=oJrdvk+eK@NPh9{(El9nl+rX8ctetk%y1k7jRY -EZR47?oFd)0UFLje=6q-7Hr~vf@66oBnwj&Rne&~Q^PQRVotg8US?=E1ja_8UcV^CaW?j3HXXboo)^* -QuzBB7O`MB^iE8KTEmzFt~mN}P}RZh+>HJJC=kU4j5FL!P)cWy85vsE&8ZZCIkFL!P)cWy6tZZCIkFL -!P)cb+YGo-KEdDR+)3Pi>o-JExO7r;|IUlRKxAH{2ec4clhsjG2z@y>m?V0A>UgJ?>T)mos67c$ -lZ#8yzOM|{6g;hLhib6dD}Yp+{IM6+ms@A8|vn696WdX7UjF&qfl)K(qx6l4o*ZGcapZ)f(^Bvtt>V~w -Xy?0)9?xpM8OV_!DZelx_UFR0MZh2AHxrJ`(e#^OquG_4t>ryG*hOJ`Vh7+^v`gEPScb&O+Teiw~-Tv -iW*FEYwQ|>xb?mAQMx+cEsn)t43zPqmZ?mE-yy5_sz -eqkYvQ}kyt3RmX~S -LX}2O095BT;ZCy!ZmS)+uFV8xOa95uENc_DRP^1D%=#7!X<(VmnbW`?tNT+F1prl6kQu86ou25+mfYl -b-r+Wu@t3~v#ZaAtIvho!MAXk*V2WoC40RW*WI~rTA;mOC?{Z2SF -{ZS^nPZbM}kQI#$sUb@~`*^&2=R4K%wP3bE$Yel7-pjT!#z$@L%yfSm|<64d~bLw -&v>`E*_zcaD!&LycOZqumJH8iE0hE_VmES+JNt}!ZIV^lihE#364(lth$~7$&<~7`zTqDHoaE+0|J5&94E}s|ZcIr-TJ*eD<2^EIm?o6$t|L -O#d*+P?kXB)8Q-~l)L!l?T26UyG!-rPd)K>)<~plY*InbLhgOAc!lFLsKcYU@vP6BD1AF((Aw^bIby0 -zsQS1Vgx=5ZSkwx!~LSq-9M6ufeA&On5H;P@VH+rxSjJe8-A$RJDT@zgw`CoJsyz3(Wi>{fDViz1ov -EQjMab2gn$o*mxxnE2o|16gdsEb@hOs6SbI=$hPq7KlQq73M?q8w;k -5iE4W8ASzE^4`X4pFO -NBlD=`t-j>~jJn9bSIbr8mOE;%F7m(VD__gyf9fK)A85-B5JxSSPN|DrMQ*tRWa=V!RoiQ*-RG)%+n; -dKUK|VlM=f%%+ICZA>LULVUbXF(t4!@B_R@CQ=cw&B+iiRM?fB2`M9z11{Cjm`+x3b%Zu(7Kbec}89e4g?UE~a=*#7Zi -lx>qQ0FM_hrc?ggfxzpNl=L3UoPNzlS83c_rzR|Q}W`s)gUE`F*Y=;G%Jk{-1NbI`Bq#^;!XeszT`#Z5D4q(4h8r8)J@Eh2h+Ofa$t2))uT>f61r9$OhVTqg$g9pw4z`Zx -}LgGU>f@LnKuE5?hMMCRsJ<^!&=K=T~|MhWw*!rc)E -QmwSPY2(Rjq2iQpA2?aP|WUCUK`uVV1ECE-~4Ls|caTJcTO0!*KsP!tsOiP|9cFT8qO36clrh7<)Aeqy8mpE;%kIy|KW8zyU&#tA1^wMt`;hO -270+&lTK5@_gxlAxhav&KCps$`ofSRf7S;UF;8C@ -QRI*Nz&hsX3#%0Q6F;z&dHTW{MN7y8joyWIiu}1BSkOFuVS^%nq)J42Z&Kvt9Z}w!6?u6_l=oIeUfvP -qy-ksqcSL#bP~_zuQQo^0d3i^a_oyN-?}+k#OOcm%OnK`eHvXK}GN!!s92mtfqkG1jVvX(LBttZ>~E@+uh-eZcqyc5cMT#=V|LV2H6=OEf-%*v1NnuRu}J&j4j!Zyr?eT5AKx>%3EE$KRC8*Qr_y~{n&N -cq`cL|`{QHFCgrUz-k%^_HYsm)@%|9mvPpTXi}&ZqmQBiAUA*rhmQBiAUA#X{wro<~>f-%@vSo|%Ru} -Kjlr3A7x4L+LtZdn$yw%0~lV!^m<*hE>A1+(AC~tM~zS~^3C~tM~Zd=N_i1Jn!?{=oFizsh(@qWOgMB -aV+lKO8ymRlm@K7C33w?AmMM6P}MlKO9d)@+IV`}8IC-)c)tkC!d6Ddyv!Tvmkn1jgyP1w(aF5Ws7% -De>Q*@%#1B{&d(f)QJJy6J@ls%CH33~w7z?Zb0S$K)#bXqF{3h -Ll~kAO51B19R!McaZimdM%&8J}xo(rpx`--Km+NNiM`ccxsLOThRq7(DL|v}iEwe77O4Q~0gJ#Q|@>Z -AYCM(xPl()KEe==>EQ{L)w-OicOgL%(?x_UxgZr97Z3wckd%XJ5b)J2f@gu2|WmvZAYcH69rC~tMSZcCB6i1JpK>()QjM -U=OO%x)23T|{|n$n19BjLL%Y){xn4z8P_@`}Bl{%x?e9s4OUN4VjlX*tev-)x|Gywr@#!tBYUac;Axp -Ru{j-3BM)ftuB6vLw-xjTSMk0&iO4VZ}s0x9Q9jL-s-=XI_;P8R{!k}{4FcWTm83N^Hvv8-s->I2Ay> -g<*okP9~)d&l(+hCw@qhVM0um8lgo&D58M$80*N*yQ=(jy^3kl$+s2pQ}-(3r@o_z-?2{-zhl25e#ZetRP;ebRJ8cM%Fj8hn4z3JrHG$8r -ih<Wa<{8Vu}m7h3SrM^xx891dDjY%leQ)_lb@)z$Gp~*+Fp~NslCwBlgs7s%!n)B>c-eYgh7-27AAlL79 -u2?9JCPAuqKBrM0hkgY#}CmOpaLCe$;n%9`&8sqrNkL)OU6t^_|6|zO#JPcUF)1PG-j@-?otY+-o8A` -HqFu=ROOm&;1rsp9d_YJ`Y+*eIBx~{iyHkJnB2MM}24hsPF7P>N|@^eP{Wo@2np2oy_)4+3&>ktJ;rS -2z^f3@5Cgm+Ls5&crxy}ZESr%R6b=zf!SKM%eN3JpR%IhoUJJ*iuR*K(Rq|8vPX#`Us@CoVE0kqSv=} -H%SU}@^@#8E>lZ4f45v=n>(QW%S%$+rk6Gr{tWo+WM})pW-E9**q!^t@$I(+SJGn%tfabrIC`o^3Ihcb -w8*2F~#@(Gb&*Q`*VEi9RMOLKf10q-g0k+Dqt`0=1ve6;&Cb`_PGpk-TR -O|P&H^BVil=iO*2uvfx!gmS^%4v&{Q&9?3ITe)C79%IWY_TdKC$+=Uhr&$my{G+&l0wn`1e1JImlX93 -YMJYMPx}ldg|pHKrz{1kaLOQ@|0%$23{)4mnMm^|ws;OP -S-_)ccs6e|4NdNhdqz+Wbl~hkfb`4(qU`K{OU9G^bZmo;%ztDrj-?iNKY2rSYhO3K0q;z-rMn$%ZSQo -YM72}F*PcH6@txu_oY_7I0vYCatsOs_gF1=J2CHR2T^*^Plq3!~kYOaf#xaVyBPif0gTp&SW&&`GFXL -wmHX09H5@?ZRg5}Q=6i&&Y46xpP5+?NKW{lh;fX$PV|x|o~#)9aXfY$rVKYqY$Ot(@K77e}}dgi!q@0qtHQN7f`#5L%U3K``z_K`)K8dugQIOC#-G8fo{^NV}It+PyT=?yZq -_FO9T&X{6mtBW>T1AnWnCf~8m1)?n$igEa`c_=N(jPTHX)DC1cLK^f002+DXtK~Tnv3OYTiA<`MIC#z`E^mS|6eI^u~me{B-d6c -@q)o1sd=#2lSExTx1p}@3gUcT9~Z>={sASyBm77~$Z)CA#7k%(R6=pJ5q3Awik`R-Btn?03PFUcH4WP -ue6dkUP{J3Rlmtut;teH17hh~v5~{CSQsN@T2t&6|KmH3v=vOUQf(6^-N~&J>VC~4=mHLft?MPh|MD? -VCRu9!-SXVz9gStOf;H7~D7t!4ngDr)Tz>dOLVAQ8H5t=9r^(FSOA$K+uHswwOgQOA8y*bTrutO;UJi^wokb2V3tl -p7E<_6zf{9K@iYENzIIz5FbO$kk*qK(3Cm)k{0Ap4w^k)=sOZc3Qo()9R_6R&VXJ9-*C9PwljNX{Xgw -JFVW@Y4y@htCx0Ky|mNnr5(3ZR9$2@_O6S342I5FpYvyK2k*Mb=9S~fZGIWYX!!50JX-%#S{Ujsa8W> -vDB$kO6ZJo#NuQza0@rFi*djF1q9v{>-BoU)NSt8O*}df}6=guH6xrF4aT?pL598ELl&XvD9&K?7=NT -yo=J_x=AR%ARJ=E)ag8?V{&|to)f?&N31;Kio3WD*r6a>?4D+qSmQGlkfPf1WhWW<9;Fjf-kaAdwd)Z -fT_elXm~d_NjK6#yJ-q!NHa%n?zv5`yLjVGiXNceHRx&sOS$RG"G7wyMoZVJfk2qF3&0mZOd~CLenCB<`m1>o>veWmK -PL+cI8C{p;>uJL67`N+6@iexe}g<5dMgAFnA0`gmPI(8o^|EWP7h4T3&?t{~{+7Yc$teyJenL --KBE(PK0rEutPZvFMR^PB9ZjYa*7tX-zB|J!&GBzG+P?T0LrFu|)PpLdu?-=hyf4NbsaZkMv@SIWAgR -u~JSeD^7&b%8J!;T3K;8vsPBDnA6HyMm;JkR?TT;#iSUmtXMgxm9<=YcfuMpdsNo4)uXavl8shYOtI0 -*iU~FvN4hn1an@(Md%jPXxh=Hf3=!$~zyAY8!Jq%YkS2&hE(e~Wj@&&u`kM<1-7Dp8i}$+7&ZUX{iJo -|e=(HkC@;EiF2s1oRol(>PI;#kCJWiccgxL(I&MRsIT~ -O2kx~M1vx}*r>!lxz_LGh<16(Rj_YD!TFbXgG+5U1V~gu$@8W6KpmUt=p2L0@D2ilDEt0Y%W)*q|clY -ivjn^fflD2>KcuQ3QRBtyBbkjjd7yeT}VF1bvOIQ3QRBtyKhljjdAzeT}VG1bvNd5EN5i8x>Jsn-o!B -Zz!U^HY=jOwkV>$wko2&-c&?=ZBs;jZC6Bn?NCI0?Nmg4?NUU2?N&s6jVhwP_9*gx&`($Ex)TNBZj;* -FtH|Z^x=3kVJ*ost7tX3%KvwIjA#RMe+oXaHD{_rQw@JkuQREtnZj%Z*rpPYXs*A7}tkz}Zsjg}(f;` -n#H4Wsct}eMwIPQ7qLVdH>M2q&Mjgs3TsxG3jXp7?;=q^(3KUNS#@-qcNB3IPABjLSWpop8s?yF+=a^L1zP)kT!II^B+! -cZc#;XWQ}e?oi%uDf05pC~x(wZbzuPi1Oa2$jdvUybmby^3EvlLyEk-Gs^p2MPA++<*iME+wQ3@qP&k -Q^776o?~{tWymQK1-Ll*6sV<_t)qlF}p5ks!d22B5wtK3JC~pno-F8oP5#_DHyW8$5?&g%Y2JLRUr?{ -I_-rDxM?Vjo)%3IyI+wLjuB0qL_T>ZD(?x`+ZD(?x`+OUvE>m-LvBd$2aL!zBlv -W#1Op-@%P=cqL9MRJ1E?_g>{ira?x><3JO2}`oXyt<|@};d2m*QUgg#m#}7_mFjx6!xzp2Pf1p8K65GqS5!%)R7hrnJ&wLBh;?1B!x5XIH9qVlTPbm1@&ituVVvzYEJ1X1APF6alFWa -pcA9nS%EU#_Trr_gEw`yG`pMmPyR+I;AM+Yj(HF5WC;a?$%ZvyWhkTRxGePQLs?8z;Pps$l^uvoP*YrGDYY|NfA4}`vSfV0AKjky)-xv^MdZsie -0Eg-F;Sg0|#azarDNX;CJH0D-mJ;V}?xm6lZVS&cnDkG?%uesI76a{_FtshiW0ZCS&!Vt^cW^KALy?A -c(K}A7db6d76N`SOE#aPSS7OlOQLp--d%>lEB=ib!HhVhuWH{VbMeeFsy!2C+By%=bkU#Vt}btm( -y)EqG2G`~vYC~O2Uze?){2A<}3tWyMi?NC3D0jT-C8vkND#QDAY$ry;5->Z_x#sKpN9vYE^t36Mnh`C -qd{6RG)>>n_HNNX0xuI3NxM_>zqd7X{JJrd`2P6&5MoY$EN+#hj%Of`V51m<-pihCo@pVgoV+X>8{Ri -}=zt@(3WRk17L{3TT>#<=Du)ZCF~nZK-66=PlVm-RKU8{+(B?T};4YoTAg4t7FZ7*fN<*w?~{N*-GrE -{tfU!x-4Yi21FcuZ69uWsHR_ys32qTN^HH*H#^4VhcOf(PCS}g`MiuF*dfaOPg+NX}BN43!|Dcz|ph|Z>bSs%xvMUa0rMd4NdPJtaiO1P!jJ&Ed)K6j>Q(#I@|))ZQOSV&)9rmh=LWR25zw%!HYN2i@Bk8Mn!}z@cW-^iooAvy&7TLkvBue~M$kI&@E?0yt7zbA -`FX*OcC}Z9zL!J+c6FfD8gopgAXf-gpfT?pT4lANcM-)M&gIc+GhV9^9MNsMBDn(G~;A%xw=^8~;=~ -_k9*E&Ve*Wh|Z(AVGwMbOvaMn%xq;3h@T*Weq9psyhn6wkaJdPfoTHMCC=^fk0!5%eX)a|w4|nI1Z*2 ->Kd2qzL*NI;;r#8hTd|^fjcOfX8;oC}G0gR;Gv46Y%(sA@u}2BX{V8BIs-Aq$22RNNt(Nc?_v7^UT~K -wdE%DrMAqobBENHIca)GZMkWOq7!bgGCjCO5$$TLBIs#E&6{VDjHr3@ERqp5Ii5u_qISizNJcg*f}Td -UDT1Cxb||7rWWKd8 -pTGkFKqcv|#>YCJrfcTkO|ML(!!z%zOW&nco^X;8t_PKLCK@~o2~t%p46WJC>>=bVh_8}gKsA+3iz<7 -8;NBKkqCqCDSZcu*1aHLSq|&o&uW)8ok|!`jU7T$5pKW_YT}usR2xX)>%8na?^P!HNr%f3mPFHM7k?G-u=I*})de2*c@?cO&@%3T$szxY_)Pxzj~h_K(lm~gac;(=N~SfF%bIv_W>im2> -Sf@wWcOS(C5EzwX%gi|FF-B5BmJW_Wgf&+kR>({NHz3?p$>oLzlH<*6U;FvUbe|#=O(mNeo@q?%BYUk -2Q*pq05<};|4bQo5ml+E#7(5K6Bm4}sd+IJxiDg^ -8s`o?HnaOJg$eXIyX}C1(C6&iM+}VlLPnnn^f|ZxvVqX&%*J&FLZ5T1E*c1Z&Y#|EAoMwRz^E*NK4(@ -N*(T8EHxv5|gg$3B84F9G&za)~4TL`DcG<^5pWjTHI)tMT9-ALG4NgLRt~2J4_E8AN98%inq^Tw;^f^ -Cbl$|Do;|5}`+|~_>5OrOgRD`)#GS90Y2MGv -kI5Y%kkX5KRy`c%*n -CT5o#l}o;gk-A3ygkn;sqbdbdRQOKp0(CV$%L#@)HA~vH+yCnV`f4$jTkc%qG`mKnGj7Q#>|9h8Zl-j -MAL{dG9h(TrzmK&j_Cv;6H-TXih@e(curAJX&uce3M&1*OcktA&{rMFDGK_k<2Xe@Uv(6xDCnz>;S>d -Z)e)ScpszZ9Qxx=7M{kOPzUtUbQ5Uaq;oI@Il?Ij7aorzA&AmZuf7p3SkzHw&#K?n~&UB1Ci0MqnZFa -%6#v>16I@2-oAa$&!2#tYeTjMsn;A-s1gXsE?8lek*aa0k9^j0Y1L|mM@qiisVQh -T23Qs0j4wB4h*qqc+GRNF!BtLXg_4b&?bgy5Vdu&B;uU~yBHsHM1e^OB!XiO3IqVHEKe(2nU-i+#Aqvx`e(4_9%kB1~h=Is4w -kTRMeM7ZWZ;VR#{PBYLylBrB+!{Uuu;V^`+riMSZEkR@9doY(;%(FR`M&)RrsiOKrKLzBCl9s4q41iu -yXO$Ys-$KJkP11~%Orm^Ai~^hJ8j(Yj*Y>))%_#Cpy6y@8#^u_k?qUNdPVnDo(6?yn8({&V_I=`{_#X -56@gq>p~{;JyBL>udA^de6hP=c;|^;>)bk%i3~TeL;Wy;gfm|UFwm=x4ozrWO~7*F@~g%?)B*67ah?H -x^lrl{W$|pL4{s(yncv#Rl40{i`N*jRC>X`~KRHn8_W&9`+jYPl;mwPnd)?Dz{7e@?X!vBI3ZFMP_6HC~BoV -W{AO);B_o3YA$DVq(a*_bWIYSY-uK|urSm#APoE@)uGVwD)w3)qk>x^XK33H*DW? -o&UhYoBC)imlJa#S4x(VXzt6a^K(Aj@Fx3TH)ZwMzeJ3dR_+3QLW4Er;Dg9iFJKKh^1$!9hs1i#yGmI@j^6iCCSYl#dcowP12I3r8gk6Gjg6+#` -*w7%|FruSR+6QH6b$S3%^8E|aiNZdN)bDT!Cl9YtaA)Ug*q1W-gGReyk!}NdE1T!MRy#-scB9y80w9j -WH6E&IniJ&H*&JUXl~?$gYn$RNe3gkkrNM(y7TfuV$KT)i8(K!pvl-vD5x^_5(>JEy@Y}?V<#bu@WxI -;7~_5RmB$qYZ9Zv8Q03!4RTA|0qsL!W6twvA&y)lezVd{UpuZ|4G -G$N-jJZY=YOOmDDOo>g7Tg*1m}M}{(_>QyyqPY+I!_`B|&>H8PbIu48pnHlg}s$I(yNOps(j266p~1J -e#SGCW9iM{gpfxgTc>Rgd@W&3YvVzqM*vxEo$JqRl*nye$fzEq9H+<&l?hS`LtRu27+HQB*)7cgyX0T -!8yN%1Vuh?2u}Jn4g`b1PgoT6WJ!!)G6)7|91_NWpRg#X$&x01%Ala87w@jz`kKPFLi3hETgJ;^82EX -Mg1TO`2nX<46!i7#<4-CoiTo#27VAe~Jopv86T`tT8A4ZS5Hx2b#p;$Z;ziMn1ruW -sM%kz5xc0@3CTgSyZBQb|zEvuY9;&VBY3B|$OIy`&`Q<@x88^mKa|%6_c$o39MY -`B`1l%u59QJnmr0$rL)BEGape!ZJ>#u#A%_EaPMf%Q%_BGESzjjFTxW<4g(5WTu3LGE>4rnJHl*4<%XlJ&V~W$9u^My -^WTI@~OEO<0z?4g9m_;+Tb8)kJpq+Z`(u*)4JEq8L{XD6$*>)I}+-9#UjCqN$6TxOzm9-6p6mYUAovi -tHvmby0?^*C?{v1Jy-cT)j?_-L8pz -UPwwoR*xC~x%;?u3`RD9HQzY9*mbzrI$9J@+VUR?=mV(5dI4Qd!G4$}P;X_;&X`MNaB1%%}Kv_W?yt> -Mcy4_;&XpMNaB1Oqlp~_q&Rm)LWPz@$K%Tik#G2nBws5?&FGFEpK5i!?(LnDsr{Fl~97?io669O7N^A -FTsQoJg>-0Frfr5D)JIcD8UIuUV;fFIHkx-FrftBQ{*Mc$Zd3mBIhSsjNC>C6nS|wavL2|sWmk=y87ioCoTxsC2s#l`r|Y5)uD+zmp1fTb<+yrMkv+_?F2XYCv -+9vs{3LaeZb5CqjhpsJ*cz(NQts*Zj40T@By4-dl -P>a#!9`#}xT}pJ+^NgtaE=o-uoew};3@P`h>+&IGiy`G6bzMHBY%!$Vqpr(`lr4mm-|kV@<+kRni%{? -OsOxe^KWD9sLRQ!1j()C-C_!~y?&#;bi1kj@?T&t~izsh(UGC`Tx`^^t*X53Wu8V@auO3tq>hIOvN`l -m{8o{6zA5#)!fAxqGFM5m-ezHeN$i04|7KkyzPqZdri16FvTDf!TK|@k^By?RwJ!nYkj)bm@?9fJC<3x_kb(VBzpZi}yzNtmZFeMVUF2S=o%*Xv$oaE&;eXMcHkx%Bc -0;?m$km-r%cWX7{=GU~dpK=f}72S>lqrnU`voy7$T&{;Gz1udLyklx%VIRj+bK -D`#2d-Ya)o#n(kkT;(cr-sdEdNB&une^%_iF^`wH%I-&07x`cGH9BX6tG)3YlQX|Pc3u%&)=?#4AmQ8 -NZwPAoUvD}a$ho=g`nMHfm!9=|6=9d2_3tRcE-Q_d7Ch?@D8d#z>klfz7Ch@!n%vxW{b5 -Def@l4^im(OG`iG5!#4bG#465(OESp5mkCo5mkCg5%o2pi29mTM14&uqP{LGqQ0c3kt2ql-mqK|^ -tEAyBIs*Fzar>s!+;{_Yr~)-=xf7}BIs+wup;Pd!-yj2OV0hR5%jfTl_KbC!)is)*M>EUpsx*U6+vGc -)+vI%Hmp|!eQl6rPM%R;8x>Jsn-o!B>Zvp8YqKKiYl|Z4YpWva>rF+}*EU7e*LFqJ*A7M0*G@&$*Dgi -W*KS4B*Qg@uYmXx8OL|m!PJL+;ms4Nb#O2hNHgP%irA=H;eQ6VyQ(xM|<h_7a(|VZ0Z|v(kh -N%4wi{D*u(*GIY^5UX;<2jVzgIk~Dv+!gAyA{Pyy5q4iQo&f -9BXLoN?gxw9#sw%NYeQwR9BJ7qYYvXH#-PbM;E5dGh!{-%Y_q8>u6s#$q-K-S=3(9AYZdQb2kXNcIv4 -VVV*C9pFmmC*dBb>pyUB3(Cyz@KM`C)1J{P~lLaOU7{b+lL!zHr>!1^YU$UI(kd=iXVX2)pGSP&bB^- -*e~QR)pR1HfR;aQtySesuYX|>*0(wg3CPmrXuWaxKArKR&~!zn%}~))noedSjIiS;<6(6!&UDnfc*P1sJ!5{XUyRduch*}C3RnLrQ?Zr6r++lMU^mR_PjPd6A4cZc6`SijLZEi5`Jbz-jqM)zYH7e -c)^`&(K*}3_n<_&|szPWHw5&Ypv^-&m)o?Whz$Fk|U^%^u`TzYQnDMhfawc0vhe0px*gd)U=m(|QMPC -av3LoKY8{^o+Vl^Cy{9oGtgb<(q2HJ-w__1qaXBCL^~k!(hd5O3_&<_7Dd=XProfN|{kP3jM^HhTVuH -ls+C&Yn<@jYO#)S6w5-8>cnMMWS?ejn*h6O6S*TgpNe%?0R*TNR-ZPHFrT@mrf``yfLI&Mxu0P2oj~U@2R$tD4pA{l@5v0g*P?+MWS@!U2_*gl1u6dkSJZ4(1;I-(wWs7h9glryGw&6ZjgOkn;j%d=cm --Bktm(Hs6AmMN@s^P;^PL{E7hrUgX}l7Ipqe~llv4Qgd9>&fJEus8wNpNhcviAqIB-Oeiss@^DDGsBT -+g(c~DW%*ZgKRTqH^tmYeUwvDNF$8^UF-)Vje9vR9i2LSJuaClZO$xdHWXNR-a+Q~N@q)H+&jkUgQ2N -1}A*J+);dN@v$;6Ng0U>d#7KBsL95~Z`tHE2Sj -bZ))&Jdh}z+oVoCW0piM1&Px66>8>4lrF5)ij73+!Y)nLAW^z7s&xa2(uKD*pw1bRXyA!N>D)n8B@(3 -z!{!a)4|i(Zfkf%7?2B3>oY{BDNCWyBFfxRFoiuL<`#Pne780eiZ)$1>iBcPrVs-S~h&pquj-K0L?m| -{;v*rV^N_t_1K|B^-BR;H?p53Wh#zN_Z?J5myls&Ur%^a(xXGhhRv0QrgEp3;(Oo3>;fd$jEm(+-`Vt -Q_)c@5atR#ghtOwaArG*XvcG;P1IYI?zht5`Ozhh)?U?bk|`A=XVV?9hshh0`<3^$oFddghFN7gkQso ->#YwmDBT+1|ftr28$)svqReH#}ewMLn}}$ulw2p63Hq9jvsT*{C5T)>+St -X<&_2*0bBShmS?pv!iOASYti=&S6CeA;-;cAtc$TpN<9AbK5l3!usmDDQ%Ikyn240elk{9&+k*eh{e? -lriYKE)eF1KYrti$Rp*Cg)w7qh^~0j-nT?~0V1grRXIM}@_lCADSWZ2^O@9lEsTX!?_=Ba?3u9VUv5< -PLYVHd9nmeZ5Ld?sXJFVR&tc#voqX9KmMbGuClfatj`Qt{s$Q -nK6WhMrj|O35&qHnVa>5nSe_gNk5ZYc?xF$Upw3BDl;GLy9(_y1EET*r9@n>^$VUht9#I5~ -*tJ>_EMotpB3Q%$^INcp0|ykrA`Wg)ghpvpD;37Q=1yN$1P^w3N|BubT4gbZFyBz*g^zKr`J)#UdEsL -aYhk&$8WG%pzNA||SQnuI*mqJ9`lS0*9~_3-e^^lv-@-YqL>Puz7*H)@7;0gsBqcHoLw$4kgd#YUfkT -SWCmm9o#4yy14gh8thMJM%@@j=L(S|^8Dbb}X0IAKhM{KOF?VrT!@N8k%9 -xQMhBf-PC_*1+$ov*_J`yTr7>1f1Ijsl*)>bu03`5OoJd|M=YIdhe9>Y+x?`Q*nVW`=&TBCTP>4k@0Q -Nqri2maJ|2bIoFnm2_98&WZ2q-t*EQAO}z8_febvS>aX-Jt#IrZ7@9cR(vRMylp?3P;9~ssj?9WgMwG -pxzQAReFkCjWF_YP)!gcRdWZm`e3AL?p>|>7^#{&vO*DBoRj7*v^bjK%P>+kcR>Y(k*c|i=C`1)DXri -bshVG|^${ag^CQO -IhFdQ|1`J5u;eoXs?;iv^UV6H|8wBCA85!$i0HFCpn)a;70ih@%9xPOgWEXJeeS8i8iC%07@2AjUQps -_6mn`Vaf_gieG)Wc%1>6^=1qcPYtGo-Z)gH1ET<}S2SYcw#&VAISR4d*%7WZE_kHf`Oi2(6T6$1-lkY -aD%xgM%8aaueQn#uXtAa9~gox+w>=ZR1GNyZRa&Njj!Vk&z?~>3G!Ygnlwcl4hpfRRn!qRY2Nwde*M`9$&3^!*ONivDf3?oUi6XrFbuLPmvD2yb{ZGTGz1yGqQwA&+4aRu*n8e7;KuG) -L;~YO*SOLVAK3MHFpd)&2P|}g~6uzQ8hsfHq9SUJHuep{6Vc*7;Li95(b;*k7&Sw!6w^Z$6(XEX8ke@ -Hreni?>S#7!(h|=QEeqK*kpq?3^vW5(E5nMCL6SIuxV1iO9q>?Dd1q!u(o~}Y+6{QQ6LAKc4&qHgH1L -H#9))n-EI;KSHmt;8)50;Wy%=mVlkzhRHvRFPy{Z+AHq}g9O$;~vao+}wws_ -v^3H5&%Z~A7r1`!x<`ewP-9E>;p@xUtW7-7Kaj|axJ-+>XQKOQnUO$<3LObsZ4)-G#c;#N^tITFlIKd -mIl=;`N_1PML;f|3MJGdHC`=B^;1*Irj*SD{onRvvtQ=JRvPQnCZe8e~V61ucAj**>$y`;IHKEAQ)~P ->;XZ@w+q1TuM2|1phBi|4tGsIWnGKyrU$j=8KI=f@;3ltR%?oi!Dlm)V|oIB*^TG-AaPQz8F;!KEJXgvYfT+qOvY)`g_U>s@<@X5; -KfeXB-idskg_J1iQLDp(M!i_GKmEtG`;VB)s2k>5k^e0p8a4M#k>8N(uS3ul6emzw?zOzPRVaSA$Bz? -|e0&1iv$^1ivHcD{h4F)jB1iR)4it3Ep76l2HG?TB!u@wp~f6LtkxDg145`54QvO>ZB69+qe?Efz}=L -(!Ww|qbL5A)++Ryzt*~gzVX-E5}_yimDWUbD!-O+n9I4p)+T0>aGtX?2>DOUqOZ_hTeVC;3wb*L6k8kOPX1*PrsxOb(--G^++xLY2j@$d7zZ3SpjLf_X^moEO6Z#vs&n(EyGfOhnExL7I -j+@^@x9-cc=9%c&eR>f52>^Y+nD@deAE;*0h -(q2i17KB)MTy$>qBWbX?qzP-ZUSCSdAR%9wxbOmp(Fu#YcV9nIj&=stini{%-xBJbzpeuO0-~L{M%=} -)H%=})^-|YcyAiL-j)=XuFK4HzwduC)tW;xjHL1kSs^L+)G`M#3Od>`~TXubix#G2_hpqE%P{RT|Cxj -ks!6Wzs{>3gEPSTlW3%)GfhWZ$z%X5O|{c=oMgY2|2hUi8cn3+? -vVP$PH)l^eLd(~8vfvSDaoXor@v}glkOwXyAdC!u}yk|wG@7ZFYYTgsGcxtBaiA0ABj4_X=X8N9($m4 -=$%;a%FGtwt@&}`nbMP}X;`m+HwX7kj{yk|yc-ZLjN?+GtzBZn5F7<(VQsEq(Hr^iJAnAGDU0LOz9@knUz2sVJ%N9X6Ea8#-(#?KjZHng+H*7i${W4qdEi -U^~nX*>A|nMwHRT+IOLgweLa~Yu`m&tiB7fku}qI$;8F#yJU2+=3O$nSo1EKxLETp;$qFa(8b#Opg)^ -K!2BSWL%;+fmqS2a)#VT}<^t?}(4Wl{WReRo_en0md;@a1Enq=nppg)^Kz+@oi5FRk-&n5wKcJ%FgLVq?1kh7z2?}Pqq5+Ik3zPV32`uYuBcJz&0y3*0t-@ -~*Z*O~9Kqi^qH6KUQPGlN{m8&iW^$GgjpzG=$4?C9HfK@({^(3l?NI?$LO(WXutAApqtGxy~-eS6pWovxHn{7t@4X+mC5NHPdg$sEzB;Vw#Za&|*xdX4>`_>?qo2 -=49skx@6}2pg$WIU_7X1=KJ73ZChM&EW_M~_2;hL#8{GRH%sYanERytGxx!N+BU9~_Rri0|7qI*j9=B -v+z0=8#@?5anfo4*Xe%F)Xe-733|l%;BO!6mLyzj)tKQWcgKDnYR8jA0g8{eO%Uucq%hqdZa|jratEo -*QVDb8w=S`r>;kxrCP{s1~y5TbSwaLtVQ1m5xUq)u`%UOBMeH`?#_Z6%>=Dw25+y_HFuJ;ujbUd#26& -!RtX77v1%zZG_6ZXE8%-je4owfHh$;^Ec=$QN3Wad5^syfqxgN|p^nHC&$JfqIE;Gm;1{(^&!XSCy1^ -huy<81#46Fb+DNvn=Xq4+RGujXe|`bi8QqOMBWw!9mAM_P%CMdnlq-PkSh$c29dKqE1hHD59*VJro>t -wD!P3M{5rpbhP%sK}Ty39CWnyz(GfA4?5^*?u&cdgA6*_`_kU_z(GfA4;*x~_P`NEYY!YzwDu5pdfNj ->6shEB9F_ckM?`n#C8d7m0Nb2R8|{ -m$me5+}HOrKVf`HZ>jyl9X_{=Q&&T1EkThYHVs~V1FFqJm;Dv4(FV6Rj(xty%ly#-HE+7RjSp8!!sA1 -F>!$AqJMH*seVyQf@gPcrqsMuuGBo4!!ce~GU(!DCBrWEt=c;Mz|u&mzB3132AzI6{4!XZni_-*vbZn -Op%nW?GGO9NoI@r<{)=*@=8L+d);(}kWXRQ=w&aCQ*te3*kp13{_xT+5xc@3@cpaG`V7*O8<_K7obMR -x>35dfV!%nFf0J)!xviEkBntM5xe5r+2g-RhcxVyIl<9IvYBaH^>=k(!#-JuHf$W6X>!NjtH -T@iUQTxO_j0P>$LSb&s0a|t#bWcL%WZ>w|L}Rm0F+8TQS$;^xKuRx}!QU -VkuLz?svP%qrSJxtbzO9uH=2(z1nlJziWJ~p>7>$!LBS*kgO{zF~#}b@>Pmh7uPDn-U!RrDN2CWD@uVj -C~COMkp@Nli-Mqte^U^ak1zYpkfNeT1!*i{tPenMOKf;cZ1gg?MyP;lqK#e#*9hOOCW^d_HH}86M>TI -`J*s&l?@`Scb2Lj;^G4CLnm5Xx)f}^X|55;E_WmaYVOH;dRuE?N{ix|akW}_tKna%iL2Gu)Hkc$+dLZ@%2C1pU@`lpvtnrv#zee -kBOP4k+QoMkUC!9#X}Mq$+Y-WF{c$DuofAs%J13QJHG>ko!I%=rK&G^ooQgND -gkxDs800P$4mNt99aeI#nruf?cA0}!f>*hqgiGp_a88^M&VJHXkn@!Km2l~o5~dP_l1~PRzZkn{!T%NW&U0OW< -~TV2z4q_5CZ5}L2$E)f)G5X3PSB{C%K_CBBK?u=*pdd8B| -4l*AhlJ2o93rIut{~{+aRosiKT;6%@q~h)k0%ubeLSTg=;LVxK_Aa32>N(dLD0u@3POkT#|nbKd0s*2 -Y`&l%*vE?sf_=QCAo$jo1z^^~D++=>exe}g<5dMgAFnA0`gmPI(8o^|1bzHWLD0v~6$E|!LP5~SFBJr -R{7ONvkAG1R>_dAMRT2#3-xLG``F|7y1Cd^Dl?DU(p9*>zNZQLl(q0CV_A-#Pmw}|c3?%JkAZafHNqZ -Sc+RH%FUIvo(GLW>Ffuu_qh(vt7kKd}&UN+R|WkZc#Hq_{4LycZG)aYeHjb1j?=w(BVUN+R|WkZc#Hq -_{4L%nhs6>=E=uYzDg|64&Yq5n@o(8t|_5|~yvD&Veeep_L}iG~nOCeGF>V&ZI_A|}pOC<>anH!z{73 -3OT!lDhqS6(OnHzfTboo&5(CA<@}?ND&g9{qHJ5qI1Cf7P3tP=C_b-8Zf_wMCX8XJu0k1zBe$b2&umQ -cN9Ti{reR`U;PIaL0|oc6+vJ9M-)L{{YMp1U&j?uUndn&Ut@}>uW?1x*I7l-SO0lM&{zLOMbKBjR#7B -S?)A&5N)_@a_xj&c1bq#tIbhn$y@5eR(AR*PD^?ue)3bZ4HtlP*BHGs)MbOuPnmJY*-y2XfN5babzOYzS -Ku`s4q3x4)vu5+o8UWDWbmAmOIp!+H!~bQiJW#zIG_0eaYD$Rp!$NNWD!DE>{!-smWm~&GfJe2=i#B2 -m2K@aF+@QGiauVRX~_NGd-yO9dl=<2i5YC9-JQ3HXO5NriV`{%7N5-V!q7uu(qs7D^3rqo-k8pT2E%K -kaCq!kqe2kCszk4|8J@g!Vp+tHSJ=X+7?w%BfN{SmZ#b2UjVAN(a@8=2WSA(VQw(FPc- -O>P0b8W_nP)C}zn_52_c%6q)J4jf$Ys!A**w(n0mTx!ZKO!jzWjA(b8GvrG@Ev%_ST=^+i0km{WtQa^ -}kEYm|8KVc5b^pLtpKY^vf65i<{jkd6YcUsR`s<41}dPp5Aa?R62>MyW-cX~)2Dpv1K52?Q>yeBItX> -}n5C4E8>C9UqaprqAL6qL03iGq?=KT&u|7nHQRj)Ia_*HKW?>N*OSN3O6?_Sag?kbwWS)-o)T{k2NI# -5PL5QJ;$yvcJ|khJ607wPIp*>|N7SDBbXDg*CBvw`k*nfq}cjYRp&>dv{ok84F_X4y!R^J?!1#&5A;G -zWb&IH&_jOcbmGl(t3xeudmNekhx!Ghkx&v*@;PYS#0HVzpU-ATTDBd>lQOk_BuP$>3*3#jI}OHm$+Wd -8K$C`3ow#4toh5y~ST;jUQe@C)}oRiqgFNuBqOH!}5WQlr^w3fJTiSJE1UM@+;*T1B@#QSx9y-yaMv| -g8DE%F~XZai#YMEKAdNd(pNn5g^r$GrcDd3Zv2)WDSRn1Kz#;|4YfPZ-!DJZWH?@RWfa!Z8Cg!qW!kg -yRNw3C|c<5S}%#Bs^zeMR;CeBr3mPps4(!fuhe#28uo>3>1A%8YudlGEnq+*+9|fdj?XUoBsd4zN9;D -B)xX;U*VcemZPyX@+&YPa1hjTALf6g7*IC~*>1nyGoJ&0D;cv{iX&GLy+ -&{se{(J^M?q;c+MXt5aT(2gg}hv{80iip7X~D#CXon5Qy=dKkk -At#&dp_K#b@72?8;m^Ct -JT-LUN%Pdui6_ldLnodzPYs=T(mXYE;z{$=(1|C_Q$r`7G*8t|JZYY)op{nbRXg#dd8&5eN%K_gFQw8 -tFzy7FjwY~lG%@dRyK70{KI{KoWBsL`$#|O|4Q$}=X5PE2x@&3RKI1P5GaIqj@O|#q#aWEXcSh}fEbu1-yT06euh!l*KNNYO>vH4os`A3$Rpn*izRC}69@w?yt-tHbzx ->FF?+di=%g)lhuZVmq7m@$GMdDAPMW9~_uRKI|EwH;ODxXqC<;SD&l&!sM{BoaYP!9YQDhK?FioI)oY -Lo;2@0L;E`=Y@2dG9^kyH@!31*lvmerl8fb)pRPbD8>lE(5#G(gf}cqFlM;66`<+PmiSs%-uH -s=$y@1^Q+GU3zq1Am1wE_g|Iy`B7zo`wIR6%iguX-wmh^RT;Q1kiWyg^9}=X!|Kx0bDIYV#Hnuc5P>+ -=Z5}2Nr@GA}1meene@dV~ -I}HP~>@cv(+pllw-d6`U78jDKJ2KX1UhiK2vmKe%_z`uC;YDk_TnRbCWjf&2VbcN7 -i%ehzptQPlYT9DQ*|>Au!~jyUkVvG>FMy=(l7%kG-@n&R$S;5p*lf8IFvR(ahuKW=gE*RiwZLX87&0lg9-fz02s0@q?W$KS_0Rc2BbAQS#bAQS#OTT>q -0W>OGe~Azf`l6xlaYRGk-_^9?hqG{nyXGtVq4YKz!p91 -^!mFZ7fpL+X+lIcGG#9vhVC;p<^*UF>)3a@-$;P3j!F`_!KJ8FEdD{A~yiv#LGoD|;o#er39oLcXB+kk$U`b?4-^;Y6Z|~aDUqah}_tRbT`mej@sU^1b)fZd(O -Kn>=UJBXL-_>^4JU-iiM`SC1=(CldYTY&eIVyjbVk_(Mxx41^+3x#BbYJEzd2Qtnr8c0h*{1M@ARAEE -Z0m0sY#Vsq)>rFn>#G*l|D98J&CfTxf6CptFAMNF&sy)kJiya#$>&X}Rp9%oDDs}8iu}B+0w;E>z|>p -qzxkK$3w+=Hn_}rcKhLY7uOd}Lf1Ip_{y0?a`xSKGmw5aQUGv70I?z}3z|WaFpfJ{ve;U5K=1tpm1a< -4CH;!HI{$HgVTD;+ke*^pm{C{rf{(nd}MWLG>(M@sarpI(s61wRL-IRuIdP+BWf>Is%_HlR38$#*`m) -tjIUi-a*%kCR9Zvr>e-Z%K&hD-2Yz9n!|8~P^dTRa}ue-q#2NxXIBOW!p~yw3VXzN?}8m_Lr!fs^@l- -1@l?P&?~=C5`U$$K7s)=syCUeE)`!o~nOGNYBq-6Vj9NH-z*|{4F8<9`o-B={K1FKuEv4{2d|v*76?- ->GzfYL`c7>{AWUXdjFn~p4ZErW9Li+f8Pe>o19|-B=^Cv?3`1~6 -oeSH2*NFSenC!~+he-P5g=P!hmilcA}oj3|d(21jP{+u`phtG+laPpiu3dhcgqj2V&I0^^OiKB4ZoHz -GGv)uxD}P;QDi3iYOlqfl^)I0 -_Y~h@(()iZ}{2r--9abc#3%Ri}ufPnm7uDr-`FbcbYf~Wv7XwP<5I(3 -Pq=hqfmc}I0^-*h@((}iZ}`-sEDIbgNir`MW~3QP=$&(3T3E>qfm#6I0}WRh@()6iZ}|TsEDIbi;6f3 -#i)p*P-==e3bm$)qfl&$I11IKh@(($iZ}}Orii1)+XZ<YRk=n<92XwJBmJl$#=ULcJ+sC%oN^*a>e -o`^rvdX((&{?|ryd1cnU?5g2wRL}1vG5P@MILIj4*2N4){97JH)W)Oj)CKVAFN>UMlp&}I#7z$DmfuS -B15g5u*5rLr^6%iPUQ4xWm78MZ~N>LGkp%N7hvQUVMXbg3zh{jNcif9Z~sEEc;goTjP=bmES* -Soo9EAc@#8Id}MI43lQ^ZlIK1Cdb;#0&?s69m-h0;^RQK&pc9EAhP#8EhnOdN%y$iz`NhfExWL&(HYI -Dt$Yh2zJ>Q8;@{9EF3EhPOdN$H$HY-MZ%iD8!^Xr>IB85Ag=5CVQ8;5v9EAhM#8Eh1OdN%y#l%rK -S4{u6J&`X} -Ci?@zn|)1P<)jz94R?0y>C!0RXWfYDFvsXPI>#vj_!s8)G$c#S`kXPKP1M1Xh@8MAJo!#2E -V4I@eF=S8>|Uy7fDrNUWDg|n6lXDt=ZS}L5iR5)v?aMn`ctfj(PONFzM3TGn~ -&PFPnjZ`=rsc<$@;cTSB*+_-6kqT!c70yN~oQ+gC8>w(MQsHc*!r4fLvy}>GD;3UGDx9rUI9sW3wo>7 -2rNY@tg|n3kXDb!XRw|sWR5)9yaJEw6Y^B24DuvSwl)`BSO5rpErEr>oQaH^(DV%1Y6i(y+5Wc&nv`s -Tm+NK#OZPN^twrK{Q``ukr+NBvN?a~aCc4;D|U7AQ~mnKr$rHPbwX(FXvn#kA2Or%sx6DifwL`tDs-;PkYH1RsTAD!jLqp?b3G*)Sh#wv}`Sfw!QaDYe6i!nqh0|0@;WU*}I8CJ#PE#p`(^N{~G? -h{~%}^|R -5)v?aMn`ctfj(PONFzR3TG`9&RU(}G_}+@YpHYAQs=Ct&RMH7oTgT1I87~e&|2!CwbVfyse?9B2W_Md -+DIL=kveFj&TyJWs-cZkLmR1vHc}03q#D{tHMEgxXrs<>nnr4(jnqV2sfo5y6Kw;UsI!#RZ#?KeEM?P -H%BHQ9OwtnrJIE(N=1rt<*$Ysfo5q6SV`SiQ0kEMD0LnqIRG(Q9DqYs2wOx)DD -y;Y6nUawF9Mz+JVwU?LeL6v;(D#+JRC=?LaA`cA%6|J5VP%ZKU*38!3I%MoJ&Gk-vebvTFU$wD1$!TMyvf5awtTt9EtBsY)YGb9c+ -E}TqHdZRDjg`u3W2Lg%SgEWwRw}EFmC9;krLx*ssjN0pDyvPD%4!p(vf4zctTs_9t4);3Y7?ch+C-_W -Hc=|8O_a)N6Q#1+M5(McQ7WrVl*(!orLx*YsjN0tDyvPE%4$=kvf5OstTt6Dt4)>4YEz}M+El5mHdQL -CO_j=OQ>C)nRH>{sRVu4ZmC9;UrLx*osjSv0mDL)hvRb25R%?{XYK>A^tx+ngH35~?SxV~n6?7j~Laa -4Ph_yxuvDPRd)*2cjBy1wnlrKJo+gf%y2!g}^WR_?n>PUn|i%OH2KlhVIjSNIxB;FYZJ7X@;Oaq@Rux)Q9xbtP6p~^ -yvgaeMtXnmc9{OCT2L;Ow4fbnV8{VG%>@$X<~+h)x-=3uZbBx)G-COi5U)d6EhtACT2JoPRwv{oS5NY -IWfb*b7F>r>BI~N*NGVpwiDAB+@()P39^!-;4d*p!C+#Jg2Tid1&fI}3Levc%^oI9kBne5F$2J7;xL2 -J#195e6ZdbUqtfUsYIGJgI*S^eMUBp)MrTo@v#8No)aWc~bQU!_iyECpjn1M*XHl!OsMYambrylM#Jv -I55+_)z6Rgz<*6IXnb%M1z!CIYQEhZR$<51EUOeUr;xJ*o6u$hRy8Td>@-wccQaWn&ai -8z{pzeF6(z+fVdX5cXKB#=dN*vr6VVg`WA#9;=T$$PL;_HU%463HyeBAG>5B(o@sbQZ-ri{elgIZIak -GLY`mI?-aCXt7STSSMPn6D`(>7VAWdb)v;O(PACaSSMO6R~{MIQ=Egb&cQ_IV4`y{(K(pt987c$CYXc -#jaD)oj4Eb0I91GWu&S8h;8iih!K~tW0^BO5Z=wSReihRf3@fHDI95zwu&kKA;8`(!!L(xff@{U}1>1 -`03%(W87mO?BDEL#%Q81{Oqu@|6N5P_Ej)F(U90ik#ISMY7H%}NnGJ;XX3;?H!!wgmxKNxsb+`mRg#p -oXux1*?kb3tkn|H`4(Fw~FZtb`{eX{3@m|7*T`CQE;ewjyfw={jQeo)48NE*jU~?k?WBWoGc~ -@SXs=3Tq?R5m|0#3bl?h|XoXI+LMK|G6RpsRR_H`4bfOhH(F&btg-*0WCt9Hst4wgCxOPzzI&cQO2gTFvJ!AeXp{>D<$7hN!-FS=kvUv$BUzUYDxebEIY`l1U)^sRKj&; -=v0XS0B2Vh81AAlc4eE@b8^#Qn -1)CXWjQ6GR8MSTEP6!if(QQQZm?1M`7!BF-=E&HJH`@mU={(s)OlYvb|-2^TbbrYCW)J@<~Q8$4_Mco -7r6?GFBRMbu2Pf<64Jw@FF?i5i4%qi}JQuaY5`(P;hpq72m$UbOA9|Yd1R+qUyyq1Okf~qo5h`22M*E -^M!cV82D?^t)uD=gGq^IqH83?lDcOWifEea#^D-XYgr^WMSNUGvHxb=SPtw|3XOs&`GG|C)U0e_uZI- -l5s#wg0>Yn1s`tD|ZNt5L_lOMsS6|1i@7TQv}xtGzhK}Xc4?iV20oZfjNTr2rLl%k-!qc`vg`9J|J+2 -;6nmy1RoLDAo!TT7QrVj7&-BLN}vGJ|obH=W_y`c)lReiRViKop`-Hh#&h*Bff&!#BLsRcK5mNCA5jYbEu7souVh_!&3k)lQ&@ -kb9cJE$+zcy!glb^q`Mge0|6HH%64bNw^L>JPj(&bbkXLEDyVeu)=UIY!T7G^?P*2Lw4+!ch`S~S5Jt -2QSNl;J6pN|mKlkw-H1oc$>`4~Yx5r3W`sHfrQO@ew7es)u>fg$DRLj*yfo)gpu>gU4*L7<)x)DI<}z -YampvQWQqr~7mt($Dwkiy@>x5(FWANDzedF+qJuKffTT59#Mu1oa{P{DvS1DL11J>3{O4`jGzTZG!rc -{!IB0`+3{MI_YAabg}okhwfS*#Gj876c`9%ol>#)w&L!Z&ZSuAQmk_+*0~hxT#9ur#X6S~olA+%r9|g -a66pUVltjNkIztkjA&JhABoLuQr-ok(wY#QsBJp+xO_ORerh(2#HM{)R-FMeCyV5}0Q%$Qh)OO9MRP! -m-d@_MVHkwFA6UhYn&S)a}Z*uFdX_}ZoR~t=}!1|*xnkFXD)kcq*#(S50cTEqLfkjSZ^A^D7S&#*?Ak$fp> -2*Y=lOfaV2><2q-8H>{$h_jwO_S?Yd#-aL*Ex}gR_(ar%k(RBx=-uu$@Tg^*X#RS=U1-tE7$pz2Zpj- -&luJbF``BmurDs+AoI=>3NurG9)6*|odoo0njvqG=h3!QC+&bC5lTM?LgN}UL$PJ~i#U(3M -uwbb-3HN8ts?^4sd)buU`^e#2MOHJ=m)4SC4E;YR?P47z6yVCToG`%ZL?@H6V()6x0y(>-cO4Ga2^sY -3${r9moP3sFrP3uYDZ9sBw2eJ2k?H~!P0%`w4R!eN -nBFFWor!-vq^9p@^a6D-<)7euWZ-%vUI7$bN+kL)llzGL(OXGKPw;P|i^K6)G6=43h4exBh6OFY40%R -~-1}SA_LFdf@LE>$~*8uNmw6^uTWz>pS(pZyD=*^}ydV)_3cHe_*Wd*8{&}tnb(Z|HxS1vj_f(vA$~$ -{4--!kNuvpVUK;wSlwg)!dTN||H@d~W8V=LL;U{07{u?7j6wXqXAI)^17i@sKYhiV1*3kAPWN#L@xSp -`Lx}&(7=-xW8G{i22V)T8zcAJh$y*06e7|+@BH{hG{A)t`Y4neT^t0%%e?t(|+WQMZt)HwQReeKt(;=cpPKSsZIUOQut(;=cpPKSsZIUOQuDB^ev=v}xkgye^vU`%VHtd -GgRmU_-U?wo-^W*$2?ld1kY)-%x!`AoqJ7KAHVUt3xxIY8=t&LSRcRf8OHkfZNEB5SP9q(!ut5_9y&=F#P -8)AVKsc`1HvGFbCi?dQ;knkKEUihc~1Qa^Z)q70$~upwL^sU@!Q#WLm0&G+$>>z{KjvnKVc;>UZnnnw -ZM3hzcUA(QNO@?V07XsVSW5YmtGJC@jLc4SDdA(erZqlaesV|VUq8bh~vfkyhw~;vhVKbIOX3FJ9oS} -?cb5$9ixYV??~~Eox`vFJB-uP6AS(w*7=U>m;F03ryZwm_;=*aU%43g4)3sD8^bSEM;~ay0Jm&3_lPi -G)rhS>y>Gt^4&B%IQ?m6{mv+AhiF;ob_`CZ*?xXwiz^$w`UrO)TM+OM4Ox9&AB9&wdN-rueA* -t>7Iugd?ed(G>=xTzYBZ~RMs{Lke3p0Eh8SA_MW^7iXPgu!XcrK5KUgq7<1CBphac>BXc!Yp8K34@jD -!NY|0L+M_9ko**brdFgRqnbcGuOOPyn92x|em;9{`V7#&+73}%O8FA0M -Kvr88i34|&2{A^bmMjcIo0N0wIJmmkEOq&hQh$V)gB5!XSh*_X&d#&O9d!4$5vEzeO -PIHjeWLA%wF>2^6wou-h1&_-ZUUt1|iio4t?2hSFIK?qLaF#17byY+blW7zFv$al$NMCk -TTWpQ1RzhGcY#G6OawqtnL-gBYKlAq--CnmC0Uk~7>+2=SSD!XU(Ft`P=VdS=tbU_&xGL*p!LNJeLVA -`A|vFWn^)!_H#o&||_N5OXI9gFws?7hz{HU3#!gAVgyBN5UWyb596^NSvc6f#5je0TU$0(K(udKy)0< -&k_can7`{{uqPRvr^yL+Bcp{Egh3`{*#6l1 -pN0(`$1jTW*c!@BG(G`jxXpW;r$}$igM^`D6Ky(~kedc1gk!34<8j;=czmTB2 -zS3iOO_(yRp)dPYk$y25e7(GukY)aV)Ap`?a$h11&$G)zL7p3yS@K?vY74d+m(XS6~AgrkP8KDdWL09 -Pnk;LPD@l`tsQGrfI{G7wH5PH$hoM<9f7ow^1p_KfacCk#S(msTZEvuCt^g)j)=#u{O;p}$U4v%Hzxy -9TLupN1q5%}4h?5C#j5+w1&62+t#0RKUT+(Ib8^2+t$x5ICARdPHMHhS9lCUkaxaM~`T#g7Q40$HXyj -3%_>_qVkyd0|ykhZqoJwPAHC^&<+A>^NgNQ#NepnX!9Up5S^zq0Kj3z>Ft-4kZ@da^qist6?(c461U* -s;^;ZI6hil$hIcr@IC}n$Fc=zN-X;tp_mX-W4l!;mJt7S9>Lo2);Edwv6(u6?OUT+Wv64` -BTCk%~uX1?~evly0d@Y(x3IM%nh?_l(NLu)BG)i`=X=>o?ZM{j7!0OuMlEK1ORMI63Kmt^|x99<00>{>~v_w1j~}lw;oM!zs$~3=L9njBTGS_!Pw*j#G}$a9bb)@7$*#!HLT8X&Q -y$NagqxjfQZha(sqHc6eFE_$*C%P~~SlM*)N~Khryp_~{{n=V+*aNoTt$js{M@5Q*@!+&v>2|;85>pYlD`xQ1EAbk>o_E_%pu9pM#%*FCV1&1zuh;zD#2%yuD(4o -d$GxeZ}}H2_sN6XzM<0Nug}e_!@2Xpm5L@uZy8{(AJN{7$_bznxQEY$_I^RNT7lOLgPhR=|Ksh@iiKk -p@`7r@B_m70B+CGvqK@FF>isPl+bvQh6*SqG+w0j8k7?n-=HB43JQ&HklX+zg{I4Ml%7ykXzKw57wQU -)Z_#)Tm4(JPDFdOl(D*h5391W?@9^iqC0L%P-i8uG<2y8gK#`&G5~){EW@x-ZgD4al+ImQ-3#Ep}t0a -s-v7zxAWfGJd8n4q%777lH@6i|vC5NWV*Z4~z1%D*UK;5CO$FwR>I`37MS!{@IE -gBZRzMi`hu%g=5S2+N&k&j^D|ef5Yi$kf*l34^`gvrWPvQ{SE<39e>h7Z#PFvX!r<`IL23;cdOHXC4}!&T@H%0zX?#IE1V3-*&`HAJ@Y138gcX1hNAd6=P0v -o{o23h@1oko9IYvap!Z#}?mI>@*xHGdz7@w->u7Q!aGkcdXI5s%@oG>_ccH$giFi);rnI#ZHck&=%5W -15W34`=oS>)Eh7`n1_fj|h}nKy(%@Xk^m;jabW+$XGp&r$5asM~r&0}PmPJM)yAV8-ptQ|Q2q+nIkt7 -=-COaRpBYE)c2Vbl}!IN)#~hb}p89={;a!Ut(IPcTYP&l3nyy7-tdM@73uAmrE;Vj{SB)0Gdm -2^=CwfdU_Ix_am+fv}|c=^bHx6t@o&_rb{9xlXeL705fmo1^cBS#SME!r;jKQChfw=eM&#!#G%eI~ -zm~u>5v5xGj*7tE-e(2IG8hoxs4%28Q1D>|w$%*&fnkgP*tah?od|-p->FguywnS!$rg5I&{;0z+?Sl -ZHhw^tMkf5e8|vNpm+Cdpn!NQZV**o^e}X#9aNrPY?&!O-k<^J*AucN!+HNT_6w@(X+Jb1BZ{ju>u^v$tLoXpW$2yDU0 -9FZ4o!8P6{lsJ~sfq?>i!Rgv2jR{~3ZeQRJLI@X#PhbpA7Kl$^3{Ec4$_$Lb>AKf95W|bKO#)|dy7rF -tk6;aMUnD|-HMo6|_AFoxPS-xrBZ4G0l0?Sm#OXG8cuH0gbuFZi=?S7|l?-*EdHtpva~+`dk0MDPtK_oz$3H=O)P13vhMlZP~rfNwZ?LL(mdhST+@#6K_& -Cr^ogU>r_1i8E*%J|po5jKc}5?qD2F*Wb~m5S+v5(h@C7z&f0~qy+?6hm#jHFN1YBc}Xivv<{b;ZD1W -v-jXH=*5TwGNk3p6PVZi(VHCW>4x|W!dALibWC}13caPA(4c_7IQCfF_cR0PfNc;x#aQ7%h5zNEgS$@ -Pmio2&Mfx$f7J#~e!K8Cv|C{AD=?#|ID1m@xHIifdshts={DD%NQ+`UAk0rPNsjlL9|!QD$l;TA*4{0 -3)mdz}Uha0Yj;)0P9A!O;uas(>@NyGY|KID^v-R{GHz+?b_(99V^8%?kyU=&=}k}M -`IKigWLD`5g~{h=V=KA&fxBn8^jXazulz`!XQu^mtGJExwd?Vus%@R_csZHTwCEk2!UE#Ck#?;{V-vW -YU>{egD^chOBjro8}}a*2ywc9o-oL@CkF|GT-$t47)*Ja+!&bhHXjhyr`qmw>KJtY?j4~o1@~`z^A%y -B(%d_Gj6j(5?#=SI!q(y*ZB$F}|90QJB@BL&`TP=L5X85y34`&HPPdle|Lwlxr+^r~nS8GF?` -3*0I7EG3I*T$0d6yhzNFaS1XslJl~3KrTIaXM-N*j)!}qEE%{M=M^Vk39uYdT{cfbGbfiK9HZyFr<)t -7(#ul;{U?muJqpNad=)cvP%|7qQSX6`?8_n!qdgPTR|il|``wJf5hMbx&48W&OPB5Gbl?Te{>G4~s_F -Q)dz)V`S77gPIUYF|w4i>ZAHwJ)LeB^+34UqbCmsC@~wFQN7&)V_q;ms0yuYF|q2OPP7pzLeURQu|VB -UrOyuseOjpXQ+LK+GnVJhEs#uXQ+LK+GnVJhT3PTeU{p1seP8(XQ_RbbC=p@seP8(XQ_P|wJ)RgWz@c -m+LuxLGHPGOgA289Z+!f#U;Wj815ir?1QY-O00;mj6qru)nInLL3IG6`Bme*)0001RX>c!Jc4cm4Z*n -heZ)0m_X>4ULUtei%X>?y-E^v9pT5XTpI1c{qUm>KJi!+zF-NhcT7;K8|URz**-J;hQ?1ye)D7G?D$F -@>Qo=pDzk(6Z1d7Jb)hc$|su|!cM^^hXzK4G)V87ovNo0}`v+U4wL97&SVXp~f{xLwLhWa}-Pv9}esO -Qq|XY)Y{f@T0Memv_=Ay=6$paDmB^I?^#@Fj=3xhvprCctP-(eMO -&!l0cY6OD?oUMhP*_9T&WD9O!N;bygn_BwWwN?dkq-ognqv1E=DoLI{e@=q1IYZ8`L9ldeR4q`%@r35 -B-d-hHmN9&gIO7G0oK9$1+!tbP*^3GV*diNI_6ycpg6cibDI0@;6;Uzn)@0+D5edS9_B5A*H-G&#wrn -9hx4@+`VsGJ%vP3mb!e6ACnVs}YXPQilN^pbPo@K5hJYRE=iwHK-u4ulK@*y!!vOG(uC+ -ylHX4Ea;GOHZD-N-_)rB*ewE5Qt}1#>V0xsHf>004f24=dH)tXQMKL)yj)jr-lgflirG1Z6leI4{69Z -eF*Qm22<=D{El_o70-UB7jKM7=SJc^Ga)_!QBAXf)y19goD>H1?p%IC!{7?e9%5e*6^yLebKoNti)%4 -aNzKwaT|Hp117=EJg(VFRiz>0669iLJ<5R-zObcxLt*grycWR7sHR)`k*s$@2WQ@gwQ!7RcSH=^a06# -&gD(x1yixWKQadL0%NMPsb&DJ35>G9jep`LeaG7J1HOy;d5+;=-t^wIX-#N#e(sZBt -mKDia1&_m{!FZFqBgfy!ZE!*v6%CP|*KKb5|9IDY%;?az!iC5YS1=;cmmgZ9BV*)d_YDqD!-iCmImD{ -i>8I_(IiY~;1f-PmYyMds=#vf(^9=HAo?8aTQ~=H_9m8)5SXJac~&N0J4C!7lyW8<;3Tn -81S(wDX4W@&Q~?wH99oSRYSgIE;JfB4va~dF{+uL<^8*qj?IMM@8sZOs|8_c1WG<|9w;sN@z^A!{mBhRo_4ie`S4_W#Ee1Q&KoGLCd`dr03n|F -ixt0deNlpY{5%t;{4COu+cTwgc9lE{u^uWPy)4>BK?RfT@yu-~(wpoeB-8KaP3avzO&X7w=OkP?8`AG -?vRRiRZt4Kw83tkK7sNzM~Ri=~Ze1!&(Kcv$8J}M8x8}k_ro(~=a<$({#KG^LMr0<>bkm&A$!O%T8hG -W;wIfi$eJ%Z#>06E(o%yED4>Dt-;5N-dR9?^xqG~#*KBX|>JM(otQ6ezk+jbO43xAQqr>h|50KN91cv -~V%|d$n+QLu_H8f@yh|Ts)|cli*SG$=|QI7A2x6Rf{j8uwEI6IgpLWM%p}2ji{DWSZG&%79SkUa18EE -{FQX;LIUiTSr>!mZ$Qy#c@PJm7l)%XK9}rz8CXz`UP~})$x;A2ahyUzBQ1ho++pm|TM9HGi(iT8c8u_ -{$NM>ZHpSJ4ZVhrRyW$p(vDt#=g=$Iz*1cXv+&gL?r^Wr6N>|LPLf}IcjFmo}7LdcxsYYC)uzgI_U*; -(5fk+8SV=YR_t$?anF5_LJ9YX%So6N>1(qZkohBBmvoD3XyB*P2T(9E<8!q8~apM0nW@#K%3^}E9n2% -qbL#8JXM-Sy>16*|w6QhS^q5&Pc?XzmFB{04Al+BIg=hXogxBKHWQeNse -m^bN2bA@~jefZ>SL{MRAF&HYG+CaL$?_cj!dyDfr@iw}26rsQktnA0k#XmqT89>pS&Kq0W#Q8xB!Gf9 -C~_nUO?`?X$~m?H&WbTRjR2A~ZUmf17wt@C_vEncTL=MZSnjMf$vQ=x-3AARJLUxZIaG3F*$hfQ{O!o -uKiP<=c20PujP(VMtNXC534`g*E^Apj{y+nNN7HiIDb|}0AA6`i^QBv~9v|#-xLThs5^S{fZM&Z+3<| -C*3CJy#uk7x?)3N=x!wBm=jIU6iLjIyvOCgloVdYILK|avN6^Kv~(%5K9lc9uUgkY}G?Bbq4?% -4c;J-c7}r(fmzWyg8+rvWvZ9}MT`N7CT|Px^TG1hN77wH1sOVv+#o29cXDFv`ab1D{Gysi9D}#zs5iy3;X8UB%uu6@rItMLotd#LeusPKIZVs~*1xg9El%nwNU5^N$0>Qemab^+}yEUTdYspdaA -N5Z>UQtO4Yg`{@z?bcl%(vAUe4TLx9if>kkGVquccCKB_14Dtk2xE^jDMu0RjAi3y9;jNF7V4GaQKjR`Uodq%RU14l+fZk0ZQe6 -M(*=Mwaj&Sk>8KLB;3E7F?DH&=p4PhM?cGSoO!VU5I;p%hPsuB(HpRoCy{op&~mf>0VJK@`>QAnUhpM -ej3o{G>4cu9vy@tBIcz3Cw=fhWBNv(cx~U~$L??jUV(4XOnkKH#jxE4&7{%7v_?-TK1nrAxJ1gMed=* -x)x>Jn(A=ziIf=fP#ciWZic!ViC}pRY1}~HGBz(y`7e2fn!V_+ahwKm?VoOfK=|_wxeU7d(gOp*7@IR -U6SMh^VUf74fY+-A2INNCL2f*n|MI>Z8jc$jrd!Q>_mBFE1Rz%ig>`xL!xXbNNngK;kQ}Zr#-#`-Y3ano{)eaIe^2(79B2>W)3to#$HNUJ+!JO%?CX|&4zy$64BBDr6^)@yH -Urqf4H!PZDuXzNP#iwC9uM}I2;^1enxmaN&S`8A<&(a?J`vi8U44KZj15Ctl7w@J{=Y}^Urc!Jc4cm4Z*nheZ)0m_X>4ULY-w(5Y;R+0W@&6?E^v93R?BY -NFc7@!D;6q(NT{nOIR>zc7HEI~c^n#`M}f9hHW5m6NUDzizDrV)t(TqXVw&O(XJ=#5g=q -@B*h*!9EwvPt!PNf`f_mQY0-LeaL6F<Mb=x?@~mHiIW=?B9C$xVL}&iWh>Dm6-+5eS -QjsEZh62I0%B3U|PciFJB!n;kJ9lw=OyiLpuX(wL)5IBrwQn9aNf^YhXqed<9!2x2Vh>WDbJRqMJAgT ->N6O0AT^<-EA(lEYJd7#vfca1GBO8F`M5pK?ECqexnR?BKcNvg^@;)&zz{F!u&~=O*Zy1YJb}ihNzb= -B&kaNR$*GQf}{?2%P>w>LTZfSHUQsOxHWM9{97rhxk02^o8d34!2I8!G@ -{K8N^D$P10FED2ywPPMo2J^>H)SGO4vk+~w=5^!#U}N}ifEndil23BFDVz$4o)5q5a_4qJ8pKi!n(#T?4EfdaZ4jj5YhE(pRojY+deBZ&#qMieGY3NC|Kg>>39Pl0& -WCH6jIK~fCsjFkWnDH!@0p0GowdAWmxM^ ->jCT-H}(XyC!#-g!jn+LC-j=-Qu$-yli@DoEi;?xRHv)gJU+qBy%2>L+7^cSN$~#vJioIHU9q)5+(zd -Pr0;NjMXdl=$#t*MM>FiVx31{+!pwEJYm$@gP`5&Rt0)vm7oxM+(LG{&n7FzmxlX-IQ9O1fv^RC5tqp -8-9n%R#4NnfYZxVdx+UTLpC${rn1I>1#{!CbslooWkhXN;d{zyyp)*Kzet!M{Dda`+SNAnuRNm=2LsM -jW-qJ9aib;d4|lR{1fojKaw*?YuyNuGOkOh){2I_ch5$)v{r0Z>Z=1QY-O00;mj6qrsSCcJ)g0{{RR3 -;+Nn0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULZEIv{a%^v7Yi4O|WiD`erB>f-+b|G*_g`_igxV~4?Q0>0 -ZL~00w?X?b7{e&BylAndRFc=`zu%o?D{*XR3)4#^=kB{--+^gFg(pyR_R@aLQc5gCFVs)Ve>pOye -j9gWp+IWyC%!LSUl+l!?51L#b+fuJFTs-zrDSMiVQD~{JS)&=H$&~dXDgc5BIFX@J6k6!DlC<2m$OtE -?}P}VMz&u>E#IEYsFR^K{zy0JU84+OID+bwCVs$*esj~EAtAulU*QnGIA*UrG#`2W)yr*aD$ppu6Sm$ -nVFdwX5c~A%2=}S?-;%1F#a20D~c4UNoQgcTRk_J!nO<(ylFpUX1bjy_ge!}Ss)eQSoqdY|8IccvdHO -Mi{buH_T`N@5?CDoMXz{}{+&4p206GY=LEKm4-0yKf&KpN -6QkF1iusx}6u!O6%mmFmrR|il7o(()=0$F}=4 -DZc_J( -etuwo4b4^DRGe=Us=`ocI_?Yjpqi?Xm)76DJcR4&Kvx_n{G^eL%&2iP?pfjA4@q3QU*bZG>hFS+oj>Z -M+HyH)u{p#q%Q($el`@BuH2CBDCJcJbD|Fru`h)gF;#1=|bYXH|p5&;1eQe=9)YX&}Lp{gp!>bnlym1 -lC`8QW*u4*4+OKda(b%SHVG8$}TCFEvk>rh75W3xEqY@d*$toh`QhBb_0 -Lm8t03!eZ0B~t=FJE?LZe(wAFKlmPYi4O|WiN1PWNdF^Yi4O|WiD`erC953FqmMFA(sK?;U2Hj-=?DQLQ#>Ef{lYzV@aqG -Xs8p7ZC#7ge*%1!be-I*m)*Rw`Za+%1&6XpGBkaI4vp+r`YO^PK4SO^pmrS%R5L#4->mu#(GCki -Us%I|<+669FLfQmX{KfdRw_aK^zo!@6B?Fi!GwB{lG4J=0!>v$HcN!)Zr1`$iQ48QLFz&Ngxnd`U$H9 -s+#YI35|1XA_2EPvCeot4L3;c#dYa&P1oTstks}hmrydS;4SWmHU>NYUy0ZgD|xenj&NZ@y&R?;%kG> -o`@C_orG4T@C~F~KSuSY;0jSM&s|o>H5KlOs#5-3i5QIy%AqBsYSe(|#UKqqwnRjK`;)LP^wInn3AXK -0QOBoIx8Yq22)(j~j*%8$kZM%(Fm9NTCeA5j`nZ@1W0}mF!@-r4N^5Zce9aajPrb8*XWH6`p9692#h7 -m>ebO%R3`x~&VDyNi46z-#{rz&pydX&+06tX|;?Reo7c0a@i>G_y!LZqEsw**@1(Xd6jIx5;WFg3(YV -xuw=8)HoRTyNl?C2vJydX7++1O`{l?YYwC@gx-n4NmJsvW7N4%?la5=~kYCk&H7u_ds2cQ-E|Jyi?gDMr5^5nvr&WEi**Wz&5lhSN9xh3>kgH&28xjP9^@s{ -8x&^&NmzO_XKTNlGl|wQpS$_1Ip$ -^&CM;QM{(bwBpyQOT*=i0W>(D@x2ja*SU&F|v0AKB&1c5%%G)a|}faPL0#WjuWDMWLQHvmWrKH^{oVu -gjv(gS~YkRl+HBq4KS+tHozKTjBQ2a?sU*(`wxS2Y*4r+E@BC+5vCZ&|Ubhs}A_NZ?~a=b=iH*3bErT -O^S`Fh{Fjlwk30Lg!jZtp9SCIS1LFj>yzyW;!0abk?SYGkg!LuP(UFrp*7 -3X=gKV+{5OYbuAL5)24lJ1H{JA;baCXj8Wf0(B`TTS|(i}Y%ot!=KToSL7z|?Gpsbn^5@g4Muz5OX=8aKqW%coZqe23<~?C5R6_O%~0e8IfFqk`F@h9S>w=% -kN5=zmZpzG$E%SATwB$I&<7!3kAG_^W4K)Yst?*N3_)TOchs*8>xyMFlM<=*56zY>r+s1!c)hLT4z;4 -*B`R#r5@pC=-QtN<|`JZk#|t%5$}HVaD?tt=W&a{HgxUn}20&I3^aG? -a4>N3__tKKP@idia7MP`R&1`qnH7RN6H24j5$+$EcM|hL7Z1sa%ZJP5#S=td&G#kBl{gvmH*l@6pleP -RcN^)gHXw7{Hz&D>1dYi!=IpIg#TTA;|E(jxJi2wF&z{d~&0*a3x{$1Y*Y*eWl1(ON!hu(-90Xck#vj<@uETgVB%6pDu2~`;Yf`w>N(qH*^Jr0gxT3-+ue;przJ0Lkj^-P -cmo@oHQWgHnk(o(hhM332lG1?=AJknPG46g&E-svH`nNy2cRC951aVn5q-4(4ctB=+E`@>G5wSHUEdS -D?%r&Lzp7m-!ai$N$WUs!t6=`SMo{FeQDsxJA;d+*5ukYMMU0({lwo(Y#d;@`@N1IUqt(>?anfa+j|1 -VcLG~C5JZ4B=dI=slOJ{lc-7SD9oVw6hE*X8)hMYjbf;!4w6k;twGtse`fBOYSSX)#PUs9<=?2c|iKt -G#0=+t=bal|KhP%ec9b@C|-R14{h0M0yfm3%l_#aS90|XQR000O8B@~!WyM^$*2?YQEf)xM&CIA2caA -|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCz-mOK;pZ5WeeI5DE-St*YA1E$G_lE2qRon -*c#k6arV8^%ADUHA#8B|Gq$tb}$hR1j#ndlwKKb;WW~KmgA-B@kAAY6^5^^WB`2mH -Ue%zTKiCzDUenpKD{lq2EV%LZTL6CE*6#4YW2d2S%e9t&Ut;M+U9{viYsL(UjU_`%L;#xsCO0nub4Ff -BsLFrN4!nok9+5G7VIon?^%zDmf3>UBc&+C%}x;Es)Af2=?q&MiS}bO>%c=ZH#$QrX{W@wJ|ow3TC{%O08$-ur`+p7?bu+$=rxfz!{rHlqAZynl~3C*H9RvtSZO -|`67Ct+os7D2O6IF0?mG?5A8RJT5p+*aai2|5xfwF3n<`QXZFyreYm#xRea=;pnQzX9UH9_aV~@hec^_DV|&sBQuZHuS$<6`Wt)i|(?PNcQ*J-NQ}XksaGh%24wc5RB-wE0mdT3KkU0 -j4r;&!Z@QH!0UQ<|rf0dP>mJj%d*|cdV0%coRWSNLDGpN@JB%+RMjoAeo|$eu>Yky=3xrpD3^4G%vRa -xsAi*nCR%lNG2ym98XN_W#J6IzpMelM0^y0*_SOAtHd6*1|llHYp`AmUVuD~H#$a_8k@ILOh`Dp9A|oFoN3W;F*Z_7XHh`u032zczr?|%=)g}pC_!F;7PY7 -NuEdW!{=77VK5%A?WP!M0X<-wc)scYr>uT63XC -3@s#N8Ma@nW&Rikpov0NLg$Pu`ATXy+r{Ey3We)}rP`b8=9!WTtCZ_hY<|9FOiaMf$a8;xvBG#N;IH< -GK^16quoj$2?Q!Q=$yX>%EYo&`nxBQ&a9{aS|hmDFs_?D?B1ER7fsPRI_DZ-WBK3YS4z(RCQZwF?Bq^ -3m4w#pwj6f90rfWD7;W+i)i!F9l@B6ALytSz5wS55f60NFr9O9&#)C9tO&d9iUVvSgSmI3lgLASds%{ -bSA&!84oybgi@43E>Mj$bOlFN|w9MQycdz~Cncdpw?)|;Q3Nm(6!hbGQe5@9xouG*$+pb0CGPR -+24dVD+Y$*AX6X*QicCe=%zMRg>^i%j$2s}?@A;$I_ct~#_ojyq`Z$s|ivPa)r%%5x>e -o*Eq$BM$(>-=aPax}UxMO*II(T_Oro52xgTLQ1+@cii7orVBKLZ*y`Wuuef{ih75@TIO -9KQH0000803{TdPLU%C**yaQ05}Q&04D$d0B~t=FJE?LZe(wAFKlmPYi4O|WiNAiZER_7Yiw_0Yi4O| -WiD`el~!AC(=Zf%&#yRS8YH5GjmJp^fy4w7FeE1NfKcS5C#zLAF1AC-zsJW;+~(3wv#Qo{&gDDbxww^ -*TgdaOF^$4J2fp1&Wq=i0ipF5>pQETdm%85>zQri2NImPdk}tB{d|(EpwYa30PVGtH)&=iBd4;$%0 -|pvrMm&xN^Ug?b0%65H58LmlJLdF1kQ -1S^bVzhpmQM8Xyt?g>~iZbZ>(RtXDambvE4lqaaS$WA!SWzlE!tLDdJ7F9WV92<+EX##D+!r3-u3I=f -x$jB-*)!Aqdb5G&kd1D!#J`enp6*laiW57<#9hyGh(_V9&Ur8A&tKPlfobsp*P+{4^F^13ppRC732xdQ$Op -Ci>+A99$kre5r|K<`2Qw*wgVniqIua3&dU0C*(C;U!9#TSK0Nbn`T2C_mFN%Dr471KkMImzZz0#`M@?jL5;)&zI`=${yUY_D?(?2pQVhh-5rtx4{!AYS5B_gL??H6`9|}t&*(qAs;t6 -MVmNoTZlpPJOz`-HF5euHIaEo&Nh@Im|=1nD!*czvchJaO}YMqmZ<#Og~3xEo%w{eJO@_Qc1jlX=kHX -5Ekch|=N+-X|>15ir?1QY-O00;mj6qruu>Q|wG0ssJw1^@sb0001RX>c!Jc4cm4Z*nhfb7yd2V{0#8U -ukY>bYEXCaCx0nOK;RL5Wf3YjJAi(Rv|51Kr4DcPys@~st+Vi8z-6Fx^?Wx4v -=JPk7XM6y)ZiHG+p|^_{Z`i`<7CO-t^IxbMZHktb9j|Y^ZAfSZqV2S?kj(uFcvoX*T?h>+hb%_dT1u> -UT#C2Y*uIm<7^@{Gg3~*DvFb3}xUzBjH_l<~Xd^V-^6_LcW#FFCXq5b5uro-gECJqGu>PM=Fi>-mA)~ -X%5p!#ids8 -$x~DO?}A#tj+wk&of+NhrvFU%q<%5abUo`vm%x9Npr?a0IpT2(^r?U69)PhS{xy8^mGq*;QL$AEM%Hc9B&@hyQ5zLy^rtFJE?La&u{KZZ2?nD@!dZ&dkqKuvO47&`~heQ83fw0sv4;0|XQR000O8B@~!W;;RoyV*vmFAOrv -aApigXaA|NaUv_0~WN&gWZF6UEVPk7AWq4y{aCB*JZgVbhd9{+ePQx%1hW9+hQ5MoFM51g+EU0B|m$E -QKu5*%F7{~IZEpN}sy)FnUB)r)2|DVfuY%ZC#uvMDzx7CTGcA{3vc$z&#Kr4>pC2E75IV>`Otwk6;Ae -42;3UD=$f$xDy2{_7yH$qk5+ZuGrC|eXoysiA?%M#7Amom9%qA#t>6`td12Dy%9z?*# --uQ5KX6W_0W<(uot$B3Eq%#ZUB-sG#n%iD>ihU*WrtunFI4^ZQGM5g;rWCM;1M_o%>qXoR|?j)KG -~u%lbyZY&&{6piN9sAk@6aWAK2mmD%m`+?QZwEgc0029V0018V003}la4%nWWo~3|axZOjXK-O-Yc -FPDY;0m-V{0yOdF@?obK5wQ{+?ffRVrsGBda9YNgQ32tvGQuuFH$pac*WRo0BOKvbmN>ElJtdUEP1b? -gj_~1V~Y~a+8@|RV9|lMg#qz(dY)iW~0$~>&<3kZ*s*J%b2s1ReBkPESN85e9ptvO9S{BP1!uTSO8U{ -(RlCx?nZISl2xL$v?F}9<_?-N@$A;`IUUK>wgy|? -7-WB4~untn@EfuESC%Q$3yN8D;X;IoA5EdU -e}y9rJB(PpzKyl54gvJ~Gotvk-@CulCc#7on-2@ti}&SJG#jdY}TB$J11@;QwG(Bn@mNLVt9ZWwgR$? -9a)X8N6}mp~OA#@vY{C2_@DLW?mqd1P@y1Z>(Up^my{LAR`*(v-v{Br#M&C#i@T$7oXBnq%* -H2yoEq*_N|KaK$TARUdG37<{dEE$e>b~F-F5YTD!3Vx72Ya&!?G_E=0VKZs9DhqYI#e#=E&>3X8qSmg -hWk_^`I+uxKixMP3n514f0h%_O^LZ4nt^X_>9s -do3YiML%#+<|c7GTu!Gve!HB_+VuO=GW|4t_0_!(uTHc(cyI5) -gR@^xjz-5HJ{-L{esy+aR!H}VW3e$kaSu4!4eg72r>}mt@9l|uhsPi7d;8+v(JyEAy(bSIyg7RN>dX5 -x5asok)6Ykv_s1WO&+t~S2e^?vnOyS86-_83n7&|^K)cgsFs3^xvFq-gIGi{-fraR -V*LIl7KNZ^OCriQh!>3~(%Fc?N7A5>w4iZB|J<`LDvHu7i?K&;$45TS0rQB?}o`yujRX~dQZXET1`O; -$`)!xnLrMw4iUV)i@F+AK;hd3+N9Va#`9FOUOKA`wO@PSfU4x7(!2U>cRoAL-ziW@8Cv>VicxKWh$*U -l=Ohgi~v2kg-R}zq5vAxAIRTy#zF8-1C#X6!PVWLPE2|ESTUGpaTee=7oMW%bQ>}V`Ic%9$iBL=vI$S -mnk}C(lKbTM|pp?E0~=w!!(%lpM~f-9`<~a!wqdlAcd0zW{mv_MwO;cNXT+i(`-z<5c@_#MiynhoTb4 -o+IA);*oLTE>LT)&8YoINVN`H$-e!*H_~YW8uE{u_&>I=004U0_* -WQxP#%e=fcadMI`2FnqEqaegqgLBNi<$+Cs#u&4n+>GGo=2_ZVYIxs>`46!rdll* -Q92?ZuxFaBB434K6Pnl7%WBFUWjSSC)0*0+~u!#`F`5jf{7;MpkPl9QHdZv0XCgYVrP~y#CwEIGzh4Yh=wHhF&!8v -sy@Rh(W6K_1@9iyS>0wKQqm5Q`=-eFA`4IY?{0Xqk1n!Trwd)@v%IHTUJoR=hN%c -yc3!2|+^b%ajXKo=H*QJ%?}4SGhdD4J>+;$o>BqEFcbq{`)#H2dn!#E8Ptme{*l-wYtqSkpLEoLlwU1 -NMeB$#jWmlwv`;({BMsFne$rR6;Sk3DQgUK(PwJ`7| -5psfoqz~f*Rq${a<_<5WO^jMlJuzSJe(zN~zX45zhe1Mu}Z9!=&Fit3_)^b#hE~Drw@6Dglm}+APTAo -}+OLQT)Dw?C1jeok82*98VJX$7DW1V?Z@H;fuA=8n$x5#-l(Le*X5kwX^+5J6k{AU>>9ig`U_sWXEs3Ak`)sAI4x8W(E&@fMf-p&K#Vj -&K$%C8hot9Bg{{K55Ez3~0VFVnL8J5Hzrt9T3YNeWPs5G`;ixB6JXe-{-T|jI1`7cgCebp -UI3^jy01z6@cxcHF_rN0$F92jf0jPAN-GBUeueaMPK{W_#a0IH_9BI0#!IS7}bA{nlgC`C;Cr9a3c{u -naMA9A6hJxscX~E4H405CE@&VNZ-$qRz(qc*;b&xxW@l00K3_&0sobV)RMy*Ynm_)#7ZNnU`fhhu*<1 -B7A1I8A*^S~Col*x4y-H^wR`(`jH<58fsm$k;w)+^(x=>|g~li3l)RtKM3S&v+ma*$|-Vc75OKifapd%FLu -%^s5e_jh~lB68&GMcjmHK(8m2qjWtXie(bEG;Ib=Q|_8{y%8}}MM~o2?9DU8gFIcnRW-vORwp_g{&4FCvlbrQiR -qI(U7Wy?E;-4v4SVT!6+#2ZAEC3SWu>T~ZAC#ssk%nygsjU1^{{WXEDix22orqbr=uqQxSZfxp4dBCtT -9o(V24-f*e*xwpr>w9u$Y6w}h%Jfek)HkP{du4&N}<2Hy8(a!~ay^L-|RVz{xLmM8lx62qcWFEx;3VD -L2$U&G%$(re7(g`M$O*rrJIvu8P`~y%^74CE184dAp#J#7h9oOF;QDye5kbr+KP)b& -IYxaT)VMYc{GlrXol`s@vfSphHAbmP*@X(d7(%xJsqTzUkenOoD6OUKM@3Y)q|zsBxYVTF5k7d5}esn+ULQwjPl;rm^-Ch)Yw`pHnxb|KZ+k)! -6B>h~pxzWPl` -ONUbz7AaFzLj`#AoK3fS(CfKnkiYz`qNPEM`m3;lAc!aXbA+}>@Pe`SRDB1;Gp|JKHkEM;i|kMxOUW5 -Sze!M0e>16B&!yzL@1qwCV{!NRggnJ9+TDnf?4XOv*VkvgKpJ%55DD`$b*nae#BTRVRfJ@91~UV1 -sm2I(cl7TM;JH$!+<`iL~@dpRr)MIp@tdkjnCRTfT-4Cuw5gGxAH&4TCNHdwR@S^z}Z2?k@yLTu3*?43)XibI`+P&rF#M+8-Iaa7QC5KuGJin<_#hS07UT -8h$Kpt48Z3m8K`8GT==`CaVPES_Ai^2&0JF5y49e$fVhpHG%4AL<9^G*gkT7PzKm9Dq|dLsGHq7kE(c -8y&C`qu0w39T(O>3^V<$P(E`q@JO8o;F$dz>yCR}@xe3P1%(t18f!~4d8uA6FQtCDitqNo{58kyzgYK -nI&IZp)^#yMs020K>fy&6J2}j!uYR_a+iYF9iOOmm96MSYBB40AuuwPaNxQDkE2aJL>ZDp$YoBdHNo9GLobr|>B?@*sagGUNj2q;A7k -Pe=*`nWb(HB?dpAcEf&><*A?8Bi1x}O5SX3JUj(>Pwog_- -vOSzM&Ee(uF*D7rM2$1fne)vw;JC5?-$;ucZ7GpCcMX6fOr4*3-7Z5x;qg1v4b+4kA69;ug34&Wl--N -j(65Wy_p)nH*l8Al6S^gmRC5xZ`;h*;rzY?=L3av@9Euu-m4At%Xjxidhhp(^mB#uUjJ@LKdF!O@x76 -L^7}>FbH!05_E$1>S>WkbEwItTaa9WsYPZneLJJSvEu2)fuvgwO_wcZc`u(c<`?V3;u9IT4(7Eluxt4 -8ro;O-J-Hw+1^}A`A-`!lx94#Dgp@D8S^n2S;!^`ichJJrLY8ZSsHT3tkqlW+ZermW+Q}Z;qB|oU{&=v$m^Kf@XhfX!bWnb8izg`}an3&yD6&9nJlFqPf2{H -1{_}^T{S??%x~DCvG&K>1fuDEKATl*czG#o1*!A6EqL*jplPVng@p6tQ|j=8P2EMvz$*i1+@2UBis4( --jMd5xiNiSx~^2*Dfo@nJb%Fb2!Wh;N962T^B%#(eU>|aSY*d{M7FrrS&D3(Am~0Toj)wHlTu{u9kCx -&Yk#wSIf0;mX9Ry3?fi`qtX#Mdg@Tl46Q5yZQK#Q -h-nIh@6eh(DB5b)ly!xc -f}JD>Y|_# -~+={9Foa%&w6S5V6WEv+>4@g!ZNpm`&kK{n4TrFh>cupvUL4{Ajq<3V%BPKdAhc>%*e_4oJNadoT_l9 -60)IG`1q6*FBdqu3Kr7Aqy)F(2smYw(8RB{*1=RSTQ|i*<6J9ro@JdfvMY2b@fkbsq)l-bpYis#p+;#3OYH=1T!z@g|D>vW%Q6*$5B -pk`{b}(sChjoQtN??1Ml_-!=y20dJx!QQl4VunEdd`6{haeZ#h=-O -d?NK9_b`!)$W-fR%7UrMF!L-WJ4{3lndIC`rDg2<>dUCv~>n0ST3Od93cpP4tAEMr{I%D4$9Q -lS8yu#nkYQF=SOqn&lq$m^&Ex6HYU*wYL_iIPZPGY-0XW3aM|!Ah~ZvSgC9x(CK6^f6BhrT9_FFQpRc ->}CF}mSJignc-v!nQ^T~RyI4lEm|9qIjo(V2bow-A6}BiW~QsX%+8l%P{?~`Prh2h7#R)bF^CmJ{=pK -YsrgsoC$=@z&tmYC$o`VqaP%%LkgA>pQuW=zF6&*%G5cAd+;&zUIok~L7q}Q+o0h5A?XeY;gk&jCYh- -}ScvmET6K%{0hgoy92we-j=nW7dPtp;t!>2>%Yb1(_Mpl2AKR?}O)~h9k_S+`R*V|x|MwGas_>`bpw{ -cHMssT{Ys>7h7b>&Pijnqr_&@^Z%!;gFwMviM)s!r@p1t5D-d=xqF#*@OniQ4R7qNvzt<9=ZeMdZVAk -5Xc8XM~V0=eY5=+ez1EN3e;Pf8fmT&^u9Q>B?eNeS3xaY82^LHc`C=%iYc{dqInGi2Ut=1N`a+$Zc2} -5{<(KjR?n5GgP$Oz3uCj-K(Z?RZS>|s%S`0pWja`lnWo^sFve-$W9>!HvsL&JWOf8& -QuDD>uhG_vaxNYhyz^fKj|U -%1I!XUSn=BH!rfp5^S_vx=?1g45_E!cXJ1hxvDjD_8MkLQd_VBKutBZ1 -=z{RyO?{~BdWgclN7q-r>rfY+Jtio#w_1_A|yRl`69lJ_*#Q!#0HWv03|BVRBYyBL| -W$)xcP>Ezp7v3u3)T=kF4k44+h#oSZ)v9nqs8*-m*$!y}%>{s}CFI7;avU2pxd)!fWJne=bm)F1Zw_A -UI$7V&l_Qb42d&`(TsbuDO)~Slw(@JKJM}4Z8J*#BqdeEhcTk*7k#;r0^Sg*q}MtIg{?;S(ItmE#rND -uv>tQOa~i+Y@;AN<_SxlTMrvu~}U?s4EgYNZYSe34;OZ$~q_#@?>O?AAS}mb1hvzXsp*bs)COdUp`eH -ZAxdynwiM$;(M#ty;airsghs|j(2URyWnu!FZ^(N+SY2{Yw=Rc{ADwbVtS^Hz;0=WDa;kU -s#7;+w`-39(1{rrtz)&59`%dj2_D$h7iN_Z>WaSSEr*bLX|l0sT3Gk3*${0-4|q6Urd*GYaVXBU3tdo -Jfi!)$j`%qATM%Xi{*c%>PMn11K1!Ki>hecjke1oKKN5=8X_75tsPX@UB8X@6D4ZAg;aA}X)0Az385s -_6PKqA03t!DJXT)M3hF(2_X?O8*$Ib>%>rAQ$eDC$2xhl{DGDV)h8?n0!Qo{8YiBl%EnD~F)b&v+7YcahY>>EqRQ7=C!pqaZ=ZKT&d@y2 -9hM=#;m(IYX;-km2YV4*`M$~CJ=9;(yTS^qNCl|ZPjvSO`rvy4&A%_u(>g%E!8iD>$60q-L+OOB-}5i -`Yi$PtL(b+^n_c6Z>qP~nLB~~fn5j`-+mr?AwAI)uE$Xc|XAbr8it3|1QDPiDq4(p|Hpr%hI}~;K&)a -rYrMg;MNxf>Wci}Acb6n)?exA3Wu{)=pxxBn%b*Z+b?C#Pib@V~SV5?ZRH}SZWrO7&QvcE|OZn~fSWY -d1!bo2P>-MaHI2ur&&KO$cJmKHtKP=&=2+Ct&-0OS7vP)h>@6aWAK2mmD%m`;BT0T+k?008I$001HY0 -03}la4%nWWo~3|axZXUV{2h&X>MmPUteKjZ*_EEUoLQYbyC5K+%OEi=PN{(y``DirI#%f+V1Y5u$01- -UP>{ZM45;>wvpw9{C#aF)B3VG*yu%1dV1Ck{Fo`gLZJ)95=`11Af`P=DvZ)gj~&dF9gDPZ(2kT_mby~!~QZt(^MVMNhnLf= -g67Eo%65*d{OTD)TceGbk3^?gkOENmPMn -Nn2e^jXA*4~N5rWRB-P8GG=n*N3V>Q%#jAcMtuspx41N_~fiMBb+2ola%Kso4qc}GdL?u=a^owbl>OC -ys_{;g~IE}mBRn*$QgNM(hzSfSYEGOva)M)VGrT{c=!HYIv(IQv~UamWjB8TP)h>@6aWAK2mmD%m`-I -I5kwRL001%q001EX003}la4%nWWo~3|axZXUV{2h&X>MmPUtei%X>?y-E^v8GkWFjDFbsz8`4ytQY!J -fOeTRMYFetlp>@tRN6QvQ@R*>aF|NYz~jq8heAIYyiw(vbrgq|Eij$N`29JLrCc924c0y-clijTnkBw -k0`=CGg3YWP8k#G%^4bMsV#4c%1scKEo}G;lzi;QsS{_jTAU4a3BQS!eG&f#ArIl;x8BdKPHej}8@~L -$%~$Q}x0gjOmjmL1TdY$f976kzGChx6W3Q$samrp`PoaX~x!DChB{w`a?3;a&`&H8y$-@s~L(BxR;>RHfjtwNS93Rw3 -j=x+H8|EhmbO9KQH0000803{TdPG*YQH!u!lCyp%6-8OQDn^Cib{1Doc(u-qe)-_l_iINlL4Wq?z~Ld~ -V>=$wU~8C6K$H(SkJ{xkx?CuBQNeB47$*1V7}@n+ZF)?h34d&lIBZPHkY@GU5`IQXjwU;E>+!xfG&}8~oR+Z*VxkPTbf3cVDZNrNtlgdJoP&plA;ul)VBuktOh -V&C5hlL~8jrTSYd~zy0?Zsn`UjR8Ipu8b0Y!O7ASjSf^J5uQG63M5?OF_e~&_HX$S@WO!za<-%`YFg9 -iQfgWZPBm<$EJPG15VOVswR1MVI27dkCsy|Rm0|XQR000O8B@~!WYmXe2asdDUhy?%uBme*aaA|NaUv_0~ -WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1ras-IG0UgD?<=cYehwSwNzw>R72mKT;`DlqFGD%YievGB&l -3Ncs0Q5ZVNkqAVTa#rS;B`Q`k24%B~#Q6GpKcj7N|fVw50telG91qlO%o;;oZLh#$Wt=2q55Ar-7E)7I3JD=Y;!?RJ5Z08yn5 -e0?$Qa17GM0evoKZC)>(()3axWWUF;rG+@_RyLsEOe;EG -2RS|{!9(Co}2|INWook5otEVrf9bxoq~#vSPaHD#E$8At{k2rcr}7wQ;6@DcEojxVVe;{lb$fvwu`Yd -(RxyW_Sbq<$$YX8TU(#~Q$8tTNNCJ2-q9L!PI8a^?Rum1pYZhSmgvVoL*RNN-Tk+dhW(f}(vY|XAB`T -zw2?;0Ursu4(9k2^Nh8}t!8cG#0|XQR000O8B@~!WBJ^Gp^a%g}Dj)y=AOHXWaA|NaUv_0~WN&gWaA9 -L>VP|P>XD@AGa%*LBb1rasr5W39+&1=ozJgI6EWxVav|FGUWCBdG(}htdcJ0(y>|h|s6314e5ml11<8 -{(+-*b48NJ(QmTR(Ut^4xiNZhA>R-jsrD%Zd{CE!wOiRhiRT(1NseK{=5(lt{{Vg0QW6SvFY?KPMV2C -YO|plGU@9Yz)k>P`_m~vrZHa=#q~T>P0in(%3OX|wtf4#uR^7X>Pfe9cV7{~ -O;$F-&-==Jm^p@5I<4JShWT1L|ZACbPSGxL=(?%-3>iwLGwvr+yLV_6A7cxWP^vkL)o!Ze=!`rD;}Ga6${Ro)P#949xqCf2KT$_2M7kX4|r+#XIEBOTp^V)~dcOIjeWHmLIYmw -fjCHfX%?vDeZw_YXgGhRVD=SxQCZn)zTH`j7M{g9|Y=mS%YUPNU~F)r+DYSRbqkTl6MKFeYSDQ%X~%Nt(hFnk!A?j!oon0Ea2zO# -e$qEV5EiFoZnD2#02ZBf`_@jC2VelU-FbL~A)_+E3EgHgYI|+TTm&AOPiq16S*w;%W1Dq`F+5A1~jYt -l%6&1$Pn#r8R?cdu@;(>&VD9wc!ru2-|PlvWT`nB`@#^`n#+Z?YeU#+JGh -wB5SGsWjsC5>jS1LM)htU@D1}wFyDBmQwM!KfIq&0a5r)0X)%nHo>4)^)`!n})FB -S_px3BuqKE3IlUUyF~x~IQ-xDE{58+g25p8vKwPfwA9%TK{zN-ArMflodBQwl;*(~5LFE|({NV3cy}t -S~rGFJ5m2V{l{+KSJ3;L3823fs{6mALFWsN;{T_W-5}#n8b#B)!=Vd(`vD -MSMzVxMo!^^vT)seDy&K9R^W?RS2g-gwgEW*^2xv%Ww7XGt|eFvSBC3^5ZEg;HvZ0sACv*;wut|L^F# -#!mnQwm)@aMMTf@N9+^%qVC_`uBVK*sKAWimB4?E6G{r)jLc+jeKh!_M`XslHWV)E0I)xrk=jk$nGk5yAj&-2e?&qQE%*v{u?s#|*iT2+r4T0 -^g9UzFl$S5)Any6Xbz%A!DVvbMh#=?RIGf8R>sNQwJUjw9NmQ>QNF1%%GmKWYK{nISJ@Rn-}{l;6q?v -}k(iB*D$A{1IE&^%Nkvqp(+>@4}c)2uZ#2fK9hfH1I@XN_xmMPOrGnyTT+XqM1ZZ6G@BKN{qjdl$X*czTw;q_(_yzZ)z5og+m9^B!x40i7&cVL*qAV^Gl(tW_t7+{WmbFWc`0|wtR+8(2^0YQg -q^{~SgtFw|4e~)#{5TN%=AVf{X5+)Xa=^VPo5Z72w;Jsb1Hyce-g#bP9>EeLsb^SYO(b)3o;MnL95%SQAU-jLU^{^UF+(u5ZZ_?Y0Ac4aLuBqCa|`A{jT6O?X*G#Aq& -_Vg??rpgnV2}JiFRhxuhC=4%{Wu&CvP=3@QcO9&4|qvy!bh{vFBc`!K7j5Njt>KB_9JH -h4C8m~`(BMIha7nGGF!2}}n!89Lif3_=+`m38-&bM~#fw+dIGelBYaR=ALukxE5xX=P)K+J6CrA&O*` -qoCz^xKJ=q$><7P(Kf+5^5TK{7NIqo7zl@bO@5P!OyW%H9vnIt&L5nD=vF00jC@qkD{= -}7-QnjL~1kagQMUHk~m#;O!3fxPfo+;Q&i%;IQ`TE<#FKbC?9@I7&Ikxj%aUvG>hpuFJ2OC^iTOaSs|iRf}~YY -7|LrrZk-sO)8d?Inlp|3L;go5BVY8~?-YZc%d_YAe6=v_l?~hv7ZcwnY;9o<*@=}4tbiTr -K@hAAFtqGis-(}8=bAY-*;kCgZLNv=Y-sDd`daN>LjbYm70Ir#QkPw4t@6aWAK2mmD%m`)W^p8Vwo003MP00 -1Qb003}la4%nWWo~3|axZXUV{2h&X>MmPa%FLKX>w(4Wo~qHE^v93SL>6THW2^LU!iax0%O8lI_XU2( -(8rzNb8ATwS9Ti<1jiS`;=ltC2@}?`QN*e01KNmslOPsyT5&EcR4|e8!FI-W(2{1TH*|4bWL(WQdH(C -;Yi*PBnjUM#5VdRD)1WqhK4ObZwVKa<<1HEDLf4j&Qs0yYJOSsglJBPJ{%7E@pv9r3UhtN8IuMZEa0S -If=b380B^%MTC-h|5lK)=B&L}NoegI@lq8!{mYgIBqPv1|iSV^xSt&_k-UF1siIoQP66a}v7^hpB<7`3hl->*rbb$%cDPr -})Rj~IuLzGECPCt4I|0h*C5xerjE?XGD~egJGpA!U$DEYJ|46O^;R@v)eo_u-D+5)qa>%jk72t-y$qg -=76(MJC)~{ugAs<{L$`H}Ncq-%n=&8fjX^Cun=gF-{Op>GxB#y -IoXk1dT()7l9+SG{WAx_&vjk>ALUR?njO;E@S{6$VZ%z5pHe7W#0@Jm#j{a`&CoQSqMuKnhYgtHM8oO -t(fDeF&UF?%lj9JJHKhp@qEtA&D)nIsS(n0hoZ+ik)PEB%Ky2u_OVBmAsZuxxR^DHe__wJ4p#eI$V?PYn;7!IV*av2QL~V5 -q_b3{Fuu`fok&VK5 -(swQ-OKeeQ$LHo-r@3I&n6VMlsGcp2VZrx=LbpKpo$1bM_fI7c -I;yrjW3f%s1;!ArWpo(pW6cJf_L!g9&(w?;ysE0(f;_Il8{;=6VOX`^woL0%#k~S_=T;SYdC! -E5Kf3jcbuVmazG7f>R{$2G*RCYeG&Xg@N`DmU@K|4BY{dAu18UTf(ykI3xtns1PMVCr?kG*+zwWaGSg -3x%bPJs@ZC^+B211eq8v-jQhj8xT!DIkd%p -6wB9B}WbI&6D?QGuD?V53rT!|qfrOh)7lmKW$!zvcu`APQO;-U6zSddW>x5E58(TWET>)@DGM?ntH=H -g$MwcIpfC4!~ixWu<|s7O;yh2Xlyxsu;6rD}DR;>emYsmy~Q^eO3jQB%UDICa~R2Of0K{&_?oy{fqhm -w;DO$sI?BPMw;k-_+U3yK9d6tsusF7z!sPKJvLQI)KZ8bRPN`~NBpaMhCV<2`Z!eOf;*%tFAnTnk}zX -yXmsYkhn}wjc;1Qa5rFTs-r}uShokaZ7j(^eGZ>_-m%T9My=DFNC>{K#_Vz46ht?|0m -Y!SlXUFV4><&-bo$k;OR3I9+drLklfH^!U-GcWoPCRV%yQB$9n%ffL?K35)gG}JQXxIRuAz!gp`+!>Z --X?gR!w8;+e!mA!~-GIS}G5!mr7anrj==vtv&)*r)ncsfb{?XsAY23Cd&D@35bz?0%U$#o5mhg`*tQF_uVr)Yqx5JDs(YDx&V@r& -X?G-1o@6aWAK2mmD%m`?JDM$>N?004q)001 -KZ003}la4%nWWo~3|axZXUV{2h&X>MmPb8uy2X=Z6;&vesH(`o0%@oFgwmRM7ymY^)Far(F4`v5=y1ZCMxueaT5Cb2~V4-XIT3-1BXhtYS7Tt-)UAtLxWT -c<@-L{z0t3os)nu#XO3z-~T)zvbZOs>|=x)zg3lrL9R-9+h -BR>isz6aGGmX8BEyh>fCEotF)CD6<9;Jup2o{VTnzszT}qIZWAkP>TZ|Ihi0zX`{!L4M3kyn(a!+QMA -dM#bgPnW<@Hc>T$yq(mfQxM$uPdo@QI~b(Pi>bk1q(}M^;gT -a7)z6QwLIFh<`v`JxED_Fu&w3aYJBp21Xn87@*a8ax1n>XJ?fBy4HVnFGEKToA-M|CGO1eztUKmX!y@ -L&{G(;r3F#0s6y@Exo|Q>R%2Jr>oBp3lS;EEhbUOombvSE{)^1N?j|U_DDoECG#?6KWwv*`&B=hCvKw -z^B(jp^y+88&GPhQ{e!)5t@Tr7kliCPY0aC=n@GXBmy74<8RK -vChl9F@lXKj0c0Alv$=twg51sfG4$>i(6phw9Xbo>>itju&&6F)V}SGpE}K@=o-qwxo-_mqo*HEK0X~ -Jpn(An4-g-;oJ%<1Q$T1)BPH{?TCau!J>x-~prv08<5A=^P{zG|Z^1o`-a%K<)mDxTQ06MlGO=oGl6m --9ZvaiZowW|ACA+2x8sp3y>Uqoa;p9pEv851>XuXb|uCOFslweLcIb3F^u_$1XEHSX?QYazzExS1q5FXdphng$v`u3M -@!kHWhRF7cH}sZvCG^|y>%bphq@V|(S%`W?h=Vx;wE1>x**l8-d4>ydfH1cuwrIfi9(5A0Cxum5Bo4w -pOm)Tjd^nX)u!nVhv5&J?xg9HKAO%&V^p~&?W)V^&@62l-D1ESAJ}t&6nP?Q?7~I0x{Pg+$SP51VxqL -9_D1-dyOJJ7ZuGWj=xvkKFR@1*y~!H$K1%nG{Yk0k#)!t@FkLR#fvmW49fKGeHvE -Y}icfXnUAll1qz2$#qsc7TqPNHvf_qQrLufoi*U`f_puyXyd@zEth};tkTRT8zI=)QdqET|GRbUd_Hs -}x1)m-{Vg7{IM73*#(u#jWSfg(268c0M9|MEKIBRJ#bryQ>kYd31FON{)Mb^9U}+DKy}s}2wfN}J9Q4 -r=OeheTFmGTFbb~vUqM$V(T_bg5(Cm|NjbW^`+`^X00!LdV^2SFzNqUl46RcalYWH29^uOAmX4@Of*js2TNH5T+#{aDPEVq}#XW#vNA3FU1El12_82)yS1VD@x=uhl%QrdseJt9{ -xb6x7KCQY$r42e$lmSS*ar4zEg?^EXr(&L$CA{tu4=Ej0Y&ag@JsID<9N(S6|959`%c1Y(k< -&+EbLJp>@%PbxznAgl5r!B*poQV%G#V6y@1T|1HYua07UCyd9o{>U)dmOQ$F;;PNwvmh)=aZey20Y4U -T|u|gbT4*03XU#nxSq3L0{&_SyfaeyS|I_qb*8oMKP~lNN6XR -EGZiPWvXE1%~PbIW*aGBAY8GQ58IV8AwyntTyT+~7m*iYSP%XVD>;as*(~u4SOT8@X)wa3-@p0x^RM5 -%iSF>r`Cs3D{q37CUcY-2hhlB*pyM$Z;Q>Xk2Q8%rPv|j7$fWb?CA}&HY$?$#>oz!}2J>2=eduZP(t+ -Xh_B*SWA3y0X&~dAKw|-8mAx4SxAiMX03Q6AH(%cn}urWh1!t4=;HM{#9s|iLig5HB4DAGfj^?KZJPa -Zg&#{-WW^yLEw?ef**#yxxNWFI-r$ItSS^V>P#0gYAz{qowp)T0ltv`BnrGTF(dPFE7&7-aFuO3d~^u -Pca7>#!I)8!hkQRX4&}(pquR>1zceqKJVM?;uMyVc)`0I;1a{kZ@`4UQC{_JeYId=F<7c4d0p3x>rG#fEdHl*fZ!v`s)DxWcf|8f -AB`?tbNNPfi?`Ad;kD``8iKVFt@xv-@0BSsG$Q<4^6AhkFsM+z4jx -{8vv^(YN}iwsg4yTH5!r-@3lzvQn6d#(7*tH7YA7bnO6b@}W`{K_6wtST$%sz2Nm`n*s0*Z7E9tDQv% -y8kFryY}8bG|utleRA2wmSCoL)4S}h&hFA;wSX_8N$&t4{=3P=rn~384J9GaiQ{`WL9i>R=A5VnPN(!PN0>0W2SD -x!*fPBq{J2`-$)q%(eM2&;o~!u*Lhejkt~(@b@1f%RXBX-5Pnr!Glz9>(xWgX##?M{w>HFmU5h+1KJh -?5K^cD?JaxY&zPG|91x||L}Xal009FXlMLLxMDv}cyj^G1gT1JHE9Ns2jU#=?5#XIH62J%%KJ)o-R*o -;kCNhCk?F3+yJ*{A2h87ATDZ((>=2cl^))ksb=bykEF?NcY19=ruTZoV{)hEjb!&@zY4IrxZ8_{@9@B -8J3(rzhPD-+W*cdQ3Bn!I_c9Fh;~$L*M%rS!Z_ceu~Y%StNbIY1k5gK=VH3FNvabFkeT+^i~}Y7Z0EP9%RgEq^GFPp3S7>-gl)6ijR_s2wW&mx) -~}YzcN+PxGcu>#ZBt{H!k+(~S+a#MmSBau|KldLJg0qVg-a&B<@l0vsH4Ql@!nPRE~($vqv9aX+5gdG -=g#+~Mc(i{u4%!$)UUbMTz$7|@oQ8_CN^| -VW6dg2)d=#l^#)!G8BywL7pbj~6|M+d4aADGSeN=Dcb4DQC9jEN2=+eA-R>uHf^v4_JuWGB8LgvT2(F -F8erv{9*PK&lax>14sH=~7!t7q0-Eb@+(k%`n7`DZ^$XL<#<~w}({016zE9^HB%K18fgW{o<0smEVeG -b;Fn7z?kF(5)C%hy)(3Fq$9t3OxT0xPX7@T_TcTYoIVwr+Fsc>?o1g^hl#Rx(!7J9MNgN&R-&9^G)5X -e@KLPv;RnhGd*`@>bv;6#xj{x|8|Hxuu7P)^t4jdu+r=s3%L?$)pZGUu8rNh2DZnA~nUEZ7`bhu`GZW -e@O~J}>kkin@gU6KVa^}cipjA3^vP({bR_3~gQ_wXjp(o=^T(1%pd1)Vm3<<~g-TYY#_S|2ZSta;Ljt -X@+%ETOS>KJH-h6$9^+y@FRVp_;5JjOo!u99PckyYj+W}JSs4NqUX? -g7|*s-$y(gC2mzC(J_sGDIGdmJSGGXGbR4glGP=A>LH=HR%(_v5vmko -muP`f#ToJe;Eswm$)yBkp4?yLywE{mvPG1Pv-8T(d}B|i4S>!nR7BzytZTF`(G$XZaX^C35i&2!55Mk -rVE8+86jB9~aI)lOC`~1 -&{%#-Nle2}cW_xosE0>jWJA6W$T2qmcU53B8ItJp^hiKj-bKuUtdwataN#Y{jS;ZANw9_F -l*7Ea@HMq_>ayl9MOZ4FHR -s*R?{;MdVv;PN52=@AWY9R|osMkZ(kOhhr(pjsJ95r;3;80;b^n%~*P(<*0mnLdo|8}bAO{o$IF2PkE -$4RRA=Yb4)oyBztJ>uKr6bcmCqErbTTTVut(s0h*(EW~f=8T4Q%j0*Vx`XQCA==x5MVr)zX>UhAn`ra -??y0}UPVg37JtSJwMQQA%A3oy3q28aFaEiE9@dW3vzi3Q>6XyyFs!t0RYpM0)is_X!0SaiLfFQqIe_bi2ex!ti*%#RoqKvF-C?dlw9WmlGqeI0p=_0DFl{HUL65AH%5+Jzjepxy4p~(ML=Vxi~umT6_gtBO*`HoZ~QQWw(T_sw5H;UBI0Q+J -6Bw6gkfmJmuRQW@2-d=ep+g%-zc2cjic03xbb_nKzY;ku$7GG(u2~{MP)zi3MidvxmS#L`LhC=9TkDjtmxI|euKnbXapN>!a90uPe$%N19)ii(`O}J7Ib=JPr*My9eL>7 -0DK9UJj31NHH#Iu#E+np!!GW--)JE&PVH&K;a&?j`x-C(YXpx&*V8y!H2qzM2b#kIm>7H4Th?%{YOc6 -epSAcFF1pmwml~-pQ9kCi}lLJ00y|M|6y!Ydji|tJ}Scwk|%XF9zJZ1ddNx;D^)Za#N>47wwJc=@C_f -AH#6d^2hOEBzRXM~y7OALXM%9w=n%@77QD0w_Jy+0Deq=e|9+vB`(+f+82}+Pk7-60VXc|%QSO9+CLk -%p_Hu=R5I?fwi3QcaE@{KIH?qj}EVMLB=imU*<*KfJ!b^UFx8X9qQ3r3$U1n?bjk|=)&pnZ93_MVhiA -J`JC0FR<177GEp?eDJ$XBMldH@zMJl@}_+tf)C{qE~GIl6{0`S9E+etYfaEOcBk -=>l;{x08=|pz#0{x?9Y9Fc^o>{se<{oLH)V*VcvYp79xc!M7s#te9|^LFJlpS3-2+(54l&A9TTC34t2 -()QS7Ds}tH7pCw$Musqt{vekv!bCd91=%{^ogkM>FJB6a8S02r=7@x2{+P@i5pY#(I9QI!OK}R}z%m+ -H>y&ZF1x5w@I@L-(2g@*-6RKe45ST0&tGv%$e5ji^=l}f1(nZT}ju1};}4D^XZa_6dY6rO=MMMGNO&l -J9~TcE+uz(phVbQp8&uP(9uMcPx -RQ}ouhtGrcCsvXZ6Bxe5)%as*orYJJwT(9Qt!l`0m4w)?qS%a`khylvvV%E9nb~7`pdbQbZ3VzEKS8D -?^(4_m2%^F;(fK-p4L=DJfrBcE#*#Gwx_CMlxk^*uuH23ISkq4*}6z;RZ%R$oRAZ_$2}0<8^W{GUYf( -!!*pKzTB^IzPNmznfKs4H+^-9zl%_8`2agsW>$0K(#@ -1qE|Ju&j9TEh5|33*&JR!X$u=hen42<7FfSW5Csj>+?5c091=WaCP8wTjvFChv<9W0(nbxUYP8#(N7S)DW1d!P1;(`D|x0ynl(bK2n~lZk7_LfTI}Vj+3Fj5tqJImoXR+)#U|ZKSJ9iQ -PnPuu?>wI)`)9d(z(Om3z(%@i)K!#r*kG4ocw8~UKeXE8w3_Ai`7V=p9F~fxXp6=L6un#1hnhHC-=6C -!V4xH5Q%uDym#M=#beAA4qStS~jM8OQ&YhGlb!~UFUGFjAFX$fG#8aGEYl?I^{lX-^*{@U!buA1 -_6X>Q~bqUej=GUjH6=TBxBArLbJE4F?nT1cU4EzAJq7HX{VrDBsnJD#m{w4+8UyYZRrS309;zsBAsoS -k8uBn9Bp5rP*rh)l`}(A->byv&eDzw5Sb9g_u)qP>8&UFP%hC!x&57{)>$SdS6L~y(keORDh@6aWAK2mmD%m`-6mt(}Jg008g>001 -5U003}la4%nWWo~3|axZXUV{2h&X>MmPb#!TLb1rasjZ{r<+b|5h`&Y2efZ9kZ1RHiK(8IdsP#`FZb= -ajV48@`oZMI}ca+++|e=j9lNk397h8@`y$w$6NWdz?>(n2L`1X@MMYp7+3%A$Zy2{hnV2o6nSL0949O -Up}I=DphlexR{Zt7HTp*>nP2iQsm5cNKjY+#v?z{QB$c=596ss$er(yFNEnV6fFzI&HR;uhIre-Ly42 -1c8pr+OniFx`CpoI@cL23Xn~!jRU^0y6zkn{r3cfTuWcr1X?4NqX1PpUuZH!7)<(PY~8mIQ(dbyuca6 -o+jp2GMah*`vZU=lSQuR51}-QO^JP*`nMv=@3idEgbMh8g!HWRJ8_fJqex3kbqn>`c9si9ALN&LuTlh -Tv#Da%G>Qcc0TxPpPmY$^(2nkuOAJJq7VTbmzVI9EJG!1Jkfp)iGWg}}&s_WP_D+=pOQA}XbIaqO;1B -F1~jwBSas?eY+(S}@)(yfB1k9-T#yDL$n?RCZ)xusBCHmDri6%k&X+4g1mE9!9(i`bPOTyRrj`&y=b^ -a$p-wm9g1>)A2BBuHE?41QR?(NCH^RvUO!w#^l<~GjC9?GI -^xsL!Dv#>27h!oGQ-6C&%wWB_Jny9;_GL>H8XAA8mT=0Zr`8L!>m_-EOB3nG!=%|yHqFN$Xi8H5u$2A -MQe~7g+vMSZZTvZml?@u@`{Hg5o(Sus;a5@5VdwXOY0Lm@^03ZMW0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rcWpZytnKebKAmvNy{`dXP0YDKXrL~a6A-Ip76FG&VI6cLUAS~FTOk -e@#y62$PmnVO%+9@af1UTmqnRYg}Mj6S)oK+ES8z9q)22HrCAvcW~x|-$z-;wR!UALB3&#CRf%X?7TK -zj6a9NAlJq7e#)e|4(!2sd9#_QZz(B-BmPuYJ?NSO!tD?y21tkZXU^po&wTg*mX-OXEvoueu`@vu^nM -7FzW)8%;w~SONy`k`oX6Vm%avsI^jfLag*_ir?=U|-|*JpMkVXKb)}dLwgT -b_u8@&F5@(C83^N$P~Mjh{S%JMP<4Fn_=!ZQA~e_2#l_1Zg8|?x545|nJ0uCWYSp=?X+ZEkziel)1y= -I%{SxvG1JHxw_OVznJRU!g`|(+-f&TCfuGB}ST4!nO`~-{9WmAj1_Kte1?_)~vXwkis!%OWzlC6WYc0 -ubghN{3Kn}&K#F{9tid9A$pV1L5tmtd;EYZmi@Bm9vE7p)BgHI+`QF%3)_@&HdK}R5Z$dAIwwY-NUYq -+d3P(x9Wxx2s`j?QnSq|cj%B8wK&BoZZ{_C+aPi^9b!zX;ZY7Fzkomq2^aMmzr^+#Yt&ei79kwy@@3g -xMD@X6^0<;-Of`>Z(W@1aNqB1bKwxysV-;uCX`0v$4Oy)JahtQwCVbypqYF&9f%8_EE!w^;dHU+=JOe -RI7-Bd99?I4p*AUO&yUD`P?Y6-URB{FwwDR5-*lm@Ev%^Ho&y;3_4IvAf(F8P~K}-=0C@O1&3aUjJk* -_pFn+LpMe9z%lAuFERp~2Ya+|l6xG1v8S7%0Le+N9=iuR-wgJItZxfVBfE(aWid=4#Ts;d4dG#4!NY2 -lI;^h4dxU`%=y6vj@ca)V|5kSz-!vL8dg(f068p2XP*aK3&ou7v -X~#1*mke3+2@hznmQfU5q#lSrl`GnJl6ukp8LDC{;`Q!i&9O{re`Bx6ay#exVGEvXNa`TpJ|@$HTGUVZ(|KmPfzZ@+7S?qFZSGUls=RB0@93Q0>G{^rK}RHDEkq~RyD3z`4zI><` -6#(vLk?<-I2GK}VIN1**c#g5W3LWhtoucE(C(MS9}M!A|M5!wnQFEN$iM+&y$poxuFJZm&Jn!EX7NBk -;LE~z9g5+KcWz@oNhv?q{|&;z~g)TiJArEPW(z#9N*7=v!EB-o?&E8;>{{z1JND!p;2d$wEXM9A5UdV -(7XB+FH$d#q;Q9~yMGS1H&*?O5_2$P>jtM%g$4*PxKjNm$@X*XdSF?-8ESXmC$taiJD98pHm!P^B(Gw -fF~hY~ImKm*^Z9+-g?QH41rdt(MnwxM*3dR4mKTIT{V>)WsE4>l%D%^|BOEQYurI*7Q1>Q_GO0 -Qx&Ou%?%$g>dh{@C#>%%+GZguZl&@Aw~}F(gyOLA7M+d{rwiIXuH>SCNf8}tRf%=bh46C+z+go=Y<cZ9Xhs$E=Hx9eQX{FFyliof_Rg~H;5`8`lpi;@bzdf&v%)zpqwXy -m1@Yc(hUW}I1{P{XSHEpQdUjAi(Y}-jLH#F=G20P*>2`7*W#|U0caSfH{6>O2vF(PkaBQnPzWnD=3vq -RdmfRDn@fC^SiaTv*QzE)bmd%;H?+myt)8noJXN=>$*yLrQ3{+qQ1@VEcw^fmK*cs?F|cexw92;TG=u -Qt^>JZKE3uZ=$$1i*O_8eCrmeHg6&m2yr8+`$F+JlsOQgA4md2A^Zs^U>rYynN%V8T^y%(2pLb5AlPF -A2=F6P&9tPqX&~)gW%D~a;vxXNxo+ZySzTMK|1ceh;72um3$v{0Rf)zo|p((1sY6eLWRk2$7W&#=nBwXJEE+EBt*cv#nV;|@QLpalb -BYsMCf`i5mRs&Omqd*P<7aJnffvGJrS)r1vyI=`B!D)Srgd77pwE3uaB;-R{Bc&hxIQ87R3GKMs&obw6L$z$1vDXFcYP)fs>Z8B`53p6d7@PW-ls -bF~|Ro)Esx!R*em*7tl-DI&O#dUJMrAu|dW65G~hbmPB4$*hb?A)=NC98AzBMI+zs4{qyu61`~kY-Qu -vD&Ez5)v!GxxCpk*q8>9 -S-a1&f5!O~0yC^94g7fj^bEfS7S26fWC-yOe?!ItFpx -gtuQ!{HUnNa=%hbI7p?JzM<*_CW2h$jB$C%6%HKzdPik@}WK*oa?Jv>72M#ELaX+*O{8lItn37t-ac_ -Wd!;oUrga}HcybMnM2{X`7j8*xfA<4Kj^A)bhdL-N@gR&NA8{f8a)4K^sEEEZDS7Ah&NHZnlvRA!b-n -bGi!n;E`;G#k;VHL&sfE(O>iUP^HbbP>^kBXHdCC{W%vWd)Ya@1!0Q%xM@EeBs-@IkM#>C=BDIw6CxFF!KC!dDrz%0zrfN73)aJ_cQamYot(VTfK&IZpSFA+zPVb -k8{g`C0sXQ`WOfh56kV%%MELAujkkddM$Gl=O!&7dX{<_itAQ5cb6-&T5M9H6Bm3%4mR>_C(>UA3LlXQ;sX}W#V(R!L}KkjAQ2ECa)+)Dhl+Dxx#= -Fhh6qf98H%PR;cw(4x6<5xQLAbl!q6W!1BBfLb#mCGix)jOG3Z+Jdp*@pLUC3A%}eY?+siZv -yACs1%B&&xFgjYwi(7*atR!o6tGr4x!!0KR3WjiSY{*fs)25;EdK#JYTYa*u3@%O)nlAXCM)9@w3ECD -Hh-)$3HYVn1nxQ+GWn=T&s;uRti##$K#YNM>Q415E7rA4_%>gxm#MV=K{fpanO9KQH0000803{TdPEG*>pj7|>08{_~03HAU0B~t=FJE?LZ -e(wAFK}gWH8D3YUtei%X>?y-E^v8MQc?;pN-QWyEh<(h$yZ1!&CE$r2&gQ{$j?(KNKDR7OiwLVC@s#+ -OIHYR4Nx#OG*`&T&(ALAQc_al;);(i18U67&x?;&uvJhu&@wP)h>@6aWAK2mmD%m`=xVxPWE -{006BQ001EX003}la4%nWWo~3|axZXYa5XVEFJEbHUvP47V`X!5E^v9>SW$1=HV}T-uOM6$k~>FPI}8 -K7c|g)QYtS|=vIfQGdID|HF&jzLNXm{EB0OH -Xw76X(^H@<`QJb*@{b%r7Y8AMJ1=Rgbm5Z@yG99{tz8sp1nJXj*niy9iN|!KtyiBT<}Z}6)XnY4O@pi -%L^TTRU#XDgdC9D-t`(6?+wXq7>0Luo_E1ikysy_nxfE7wbYbM7cz@hGy!c?_IkaZw~!(wSBaPrp5{V -o^S2$f0|~FD?5`*lagi{u92Ck*3l-*6FP-dHfe}|E$3L8`thCg!&^)QWHp=s!5r>&9j4I$Ymps=4k_i -o8cHIF{f^ZG!Wxgh{fCMV!QOU-d7fj{*7MjD7^oxvZF2Ei==182^PGZPDPW<e!rHkJ-lL?YApl!8q@}?hnB!7SjHZNBgy_OxMV7V6-zAEOU9A_l3~HGBE_`k*_En+IWrZ -(AR-L-G}&v(WL1jQi^-9qNKt16=wQ`#UIV$?sKXM*%1Vc&kD`%qh{ -kZvE*TiVy!t`u@$K@y18T!dlsbtNlZ0uMYx)PdIM!r$c-t4d!t@O{2}W$;K0U&VI9S4uz-4vu_3dK%_ -Ud?hAl|jc$m`gFT?Sm$B&03LTHUr!x|LPGO*=}1JV)Ut(Icz4VuINHeYNEm?4TEpg7c%BxVu{iQ+MwZR -r(h>^=t81^BPHQo3Bu}At`p*Eoq*AxQG8NRkt|H9o-YIGPyRUk@@4wXLHYYj?ZlyPOH#j51=6M4RSY} -`X`UmaYEck_@m9oP%zACAYjqX{y>rpA^@S+1*zN_k-g8;{0F|mW_i<`>)*hQ9%Y_?HGj^jTo!i6EnIg -7b(4kG*Q{z<+<6_h&;GlbC(TY%RmIqR3Dou3|8$#m4{de? -DoYZF(=Ly#y`ln@wQewxz+D>YKuo -$5V57-L0)Iwe-VO)-`{eqve95KgcFcEHO0sV+y>ebc>rG;bO~BBtX6)1XXId+1k$QnrcZt*FL$h!!X< -}8GtjX7BPlYxGw}t7j(x_Kbj3v>L*m~%B>m4EZhGdr*QfyD4$sWsGpNTv_+&$1s9v+l=*sPy!_E3)sk -XbgbXDRJI?&mv;@y*?2)W;xmPPk$QDwjy?@n7;z)cDEY*6=iF;$l}02Qvvs)FGY`3CP@5=aCUOD`#&U -{xQ6PTH_;)QR^ -JC4G7`v1M-nC<1eXV8^K`IopEt89>SxAvCWA!6MlN09ur(DUp%8M~#%ga9jxs3dF+x1BIny9!t9Q;=toFWG_H4|nNeG0qI(camt0CQ-eKmEi)XL_;EF*PXyPUert~0T=xj7`yR -gXNcP1Np`y$elL(4SQEQ?K^dJdlEzed`PHT#4|_v+SZ8egk>x*HmnDj1l~ZgfVgJ7d1uvAzot?1j?`9 -O<@oZ=({%Iota5fdJ0BO@puT9@%mxU4hAKgohMjqG4~m!;-bD^n%ZCX#E(HM5~ -~S_9G*)W$=z54RmS-=U!#y}}9$yod~9QA9=~;ztn@IEsAhk!7>@H&9Ch1QY-O00;mj6qrt_^9=w%1ON -bw3IG5b0001RX>c!Jc4cm4Z*nhiWpFhyH!os!X>4RJaCxm(!H(ND5WVXwSOAkqy+==hL{ -azf5xp#H3SS$)PjK+E)?S7QjQGV~ueh-iQYFvJ5jrR1>_i9`0tQo|p#=3bR-5D#A$$0W+=(B@69KAZf -k+s_77f-{uQ#}d2umPJwgFlADw$3bcdv!bIN$JQxZEngG@AKw8m$6F8gU3jjRanGKjQTUt`Apzg7A*{UyT>Bj@jsic<#y-yCdUZjr?k~PNTH*ps0#lmpHHD9 -(AHSAqLeZ)Q(2<8|hY&D-+(M@`tHrLOPUSqJ6@AYfoViyh&Kk(M38&7ugOq$!?Lz%=3Su_3U=d>4Y|! -hHgsuvHZSUiOeWBj5*piY#UdP(jV#%MrpRnuFI#*HJAsgqTlM$Ep*bfw3Utlsx#6uwx`;eIzok1UIRNhMENJuT{V@sn~Mhk^;IuQH90di#QNyy%k>`pKPp%9~ld_7 -T?{L$(VHlKGDRO}}{O#Ja?V=a^j^~cJDfe7$kv-*f{)=`G)&F0TnZ{AK;d|C)U(GW`#scdlcd?MGs8% ->Fj@swruNuB1d<=LtZ@>s^W1JswicpnLs;pF6#tHZ)DYkz~WsLrSG5bUPp&Kpf9y~LSOrt99wuG&T9X -JVt>(NZXvfEvOwl!_f%lyplXm{U|YrpKKeW6i*;mCH?ZcO;MTGfctzX*xF&ufvJGeTcNiDmsk!i2uGs-E -6auw61eq1kJ&ZZ~aSW@YrWtV-mSQTG_zP;VzPO>NHU3t4r@UjhKx-K1{sqywmX#+zbkG)_20)?Zm0mr -Br*!{1-=IC#k3%r;MMt%m{NGFPn7LNzj9)h+z`4D?Jwh?--hf!EFSy2JVR3*U!m(@(-o*_a{c2JrUYA -CNe-y2EG!V>;x;5UdU9IBuSD^Z<$rF1;FL4X2$oleI@2d(6#SP(&ALa_Vf{CFVhC+B22cTRXuoLR~Fe -t~TWAh5&XPJJFbcm^_8I9>+tVJ&ck2=ad?vBq84G=Z_EDI*@!mrBS#p@@7Z{sT};0|XQR000O8B@~!W -AOZwdbp-$b{T2WK8vpW;~NPilXy1&+iB&rB-ivZV8 -o)ENFhm@x3F|TD~c*kSk&pSyZB6q%zpOy0{|Wo_SZ2^(eX}Pm%Qv{)FXkTcp^bB^P4CQb-!%o=GtSc*uT9c_3U -}(;b2^!96QE+xu4?0zi+|Goir5eH2I*<_T1r3`!hC^ZPTj6FW_2M*Fh0?%4Sj{C}6g

N-wJ-QsNERtvU9qf56U#+zPGahRd+*UemJVx-sI4m*9$@z!T0KJ(=K+^T2$%;`S9ZxlXc7(hbkD>0~ltd`WV -2f9Ceg3=_sC&Yv^lhju2@{Le~gZl-4w0?)kwpY7vHrbs=Yuh-yX^{(yU1G6c3G858RK$#5e&|44SQz4 -fsiC@+doDq0ik^4Agyo8wGG8f#$tt@}Yc{$|Rvjg=Uhm-h{3RDgO?y)^;AAB^om6qg^77*^^rh|b7+) -*DDa7JTswp6;u{=4^MB>bqX#}kCl$cc$(PWgfL7w#pLJZf~MA&MnAh6pwQl^J4~U+ap0l>Pgz??WDQH -rqk0{u|zY)J8|lW#C(%1(H^vHR)RKdI{7Ki^MzsSvDPK?qC2P%rAJ1n~>^8kYzKnA4PpQoz>nVpyNaX -l%TjTeLST4x;s(z=pY(r79X)B5<)*fgA~aO=Aa}_AuXq?xAAlsQ0?x6DSV>Kz~G4?OmQP)OV)JDiPs5 -mEtdw2jmB6xj@nhWd0oVuONNzzadq8GP+-Im$87Ygs}oKSqUI04s{wRQu>#q`aOsF)!6bQN<%*|;T7R -523+zrs1sn9$z(au=>6LO`@jW+ZN=Q~cTYX{8ewVYUuFNaQ -gdJ>HvqzdltLO5$AT=IZ#17x$e#Z8^QzJxi -*xAASqp1Od6L=e7-!(eA!xGCx`t5y1$&f3-muN=G)AJq9V>D=u6%y+Ie9r8`|Qf_G>_O(T$N%GKDF71 -N}`?n~)p!4?lXm-^+Q+FUWdV|vc5Ob;fP@?yl*h++m#)BF5>RW$LwSS#vYO7$K>JOvew8J&rX5wp{c<=q~kV3ptYr~;LCQRzS4nCWcSlZa#BqLg58PE!K4wmnd&LQ -@})Y@=^3UA35@W%j$ZwighoVV+CfWHuxP6{vrm~hWY=71*4Fha8|u0>q9PA7i>P)h>@6aWAK2mmD%m` -)9`R?vzD0006I0015U003}la4%nWWo~3|axZXYa5XVEFJo_PZ*pvJXD)DgeOF;`+cpsW?q6|mFhpKlB -~3qU@Rk8y;2|xF6S!98R*Tiz!sW&LOSokTe^lz -<&I!&UqD0#-7wYd{RUfALBY0&B$b8AaD)&BGLduOPYEwA2#MYnWiF -UZxDUoQ_%VF(5TG6{6B3aaMThTM+YXp@4zH~(2j}OT%_e5f(OBu#c?j8@PsZ1y>3sAKopt69GUvvC=K -obfW0;RyU?uvJut)STXB$u&*h+Jpvxu|LN}G956;ao@Xu3W411|Q#+5z0_it -i=^KO^^n%w9Xhh}%A-%<`RR3H*d6^%-}=84j&iQ#_TXv6X+ix75$48wByQ{-IhndQ ->SnMSxw7tLtBryFU}neq}1$#X13}jjvYXi*5&80VeXO4o(okI( -3zb&b)UY;U??Psg^7F^7buyP(<(jyV2kXnNT`Tz^#!hKPUNc5S#hA{8G8To8CaDQ^>0rIvpbw~Wlv9q -~HE}i0A2(`zjNLFz1(mx#Y_R_`X;C-_D5|n0BA{Fiuh%wLg<5q!K!jO~WPO0JQTpGoq>_U4*Z4pjVJF -3|FHqhr&&{z1VNuk>oWk;j=TA)P!d)LwWuB)?7pP0U)aCdAioa$d-8GN9mB{FxZMIs}JtAuN7IZr5Vj -p4|ww6{#9X_wE@k>yrN8KyJv%KiR@2)Kd-%zia!XcW&^8TTB+{Ic>(jN6|AG(;1Lf}68F`=ca3{v%73 -83(u-uL@VEG#d~p_b`sC&$+S^)2lFDit*iB_37FKia(4a`Si(Nr{^W=wmWh`l8$WQJf|rM#3V>dK`#e -*@TMYMx-doD_RpHdcmHyPf_pd`){w^Kd^9bgls`^y#5T{^8WPnK!G+pZ%=i<;-o0we=EnGju_@0Sh!Sa -`P&yp4VSaLU?y+0sCHR)RdporOPFwDW%kI7ykQg8A*&fPST -N`H$WcW$J-KB2fue({5FML;tTtHXt`)m*-Dm~3Pc~no%t>&!wcHuH)gX=YLR30|XQR000O8B@~!WNIu7c@&Et;cLD$a8~^|SaA|NaUv_0~WN&gWaAj~cF*h$ -`Z*6d4bS`jtt&qV=13?Ui@ADL4JnXh?7ilj=s7DbGDyS!sGIcWDsoTslGwaf~ce8_4N+|`+B?%<|m;6 -%7TSdA?@Tjz4RJaCz-mZExe -a5&rI9G4P>~jgxhI2eelN$Op$!Ho`f!VJo){(uE*PRLqMksw9=fINX2l3`NP3lk9Gbekh6t0W6W6XI? -n38V-jS70*+6-Z7S|A5_YfR{+3`!EiVn3^;9R5U -P2~#lr)F3^FP9Q1a4?o>-9z33k6cXtB?m(`r{~p4W#}wJoJcm{QHzWXF=nC_%B>^9N-QA5b02#zXWuJ~BCqq9We2C>jq2 -gOp_uM*2B8)#S3&Vg?E4#^`@5%4BkboSPG(mM5GJ?c$Pvl$k3_K!C -drZp6q}txCuhYdBO@j?lqE_-|t{1%7f$&I}M{`3_pGN@Yl&tAAbA`ggZtkD9;nih4G1zVhpCY;q`L8@ -iZzyj#L}@JBzkra?h3GC=>GCG08B59%PJ4r!Hg?0YrxW8_NggnkXs`K;TFqwmRko#Yl}6qgv&G&g&h5 -DUs>tSTZC@(G8SHc#No!ilicw#G1I0NGPe^F^e+XSi0fZFicsTlYQ|7G+V|OMWylfm6kjqBo_}Qd6gd -JX%6Ll&n-6sF~&0)p;D+5$?U>jq&%ZvW)v-}ZO+xswMdj)B;QsVw-jxet8q!QAMo-NLvKJFj+z+lkCK -`*$jbtiWNvK@Xk>WaQIL0aL(^sG(#W2r#sC6MY50<79^{-DL{|C4FONAr;G3omRB%c+`%uw;{;Um^4qR?~GD%x>q?HLPyetL4T=Q7$d*Vz~$wS8L? -x-}sBrLkVyV{9o|}HrLbn+_1F~NV3kBtGjjZ@j8U-<^0me#S7np&4cO1+^^Z9va|U#xN+ffdNcj#8`> -pet<5nj>8ESoEFsq^{?Ec-xv*epvDtDFu5r;t?bl%o@G02%E=dZ&=0u%Z|6s%q_B`3o4p`!@%RGwiZ<}5C%@;sCk8y{;1ZF-U2L=5}Xg -~4pXq{TUw~{N>y!O`)9BbpaFg#2L4ASS&qWWMbrmZ7#2qeJ7)z!Jm}l9(jxheZDGwVv%Kz -1=CVe0UkN4X?TsaWR3A#R0m94#e1}O=uL|rLJMIlQ>3ur*fS({3he;TfJ!!%dpNJx#(+%|!+I?ge~D_ -FIIm!^rc)JeJCac!--V}Gs`KAlI{I_ASmT_tqg~wocA3Ze{Ud*Lt(Zt&Y7(F;&%I;UZT&a$W+x^;>+w -8V@V>VEXT)sKzX#jRC|2T2AE$*OYyJD6_=0|F0J}2x)ha8=a=s;;Q;o@HW~(m(E;U#54%8Rq|2pxh7J -u*2pZZBh%6IOib?Pq|^61-S&Q`{+O7a$)Z@s*?c^+@dc9_KCm~*hximduJdtu+HI=KfMw!rp@*db!m$ -%=$(CNHq0o2rWv(7ck^VTF3Px{YkdhoKDXqRb)l5AcXH7ZkM~Z2U@u1F)Ankxxe@ -2LF0x(lG#-KsMzF%U?EwKDoib84SuK>FS*x`JwY-e*;#xlk^UQ0OgKf~tt1OcV6;}Z0zC&eY>t@DI!?hYAr6l~1VVjHOk;KfZ!c10nE`8>hJ!Dn9 -m8m)j<~YNH9mT0zQvER&z3N2H*A8`h;2eJc!;bv*gzq*Q;MNzuUKkp4V|ecL`$*4cESwEQ^S$HM_W|= -o1O4ZY0_5sv;**Mm=V9)F2RkAW#sHG?kR`%y6N#gF-X*0Y6K`4{4+s44 -y%0;m=J?Eu0)g(h4h?f>KFec!Jc4cm4Z*nhiWpFhyH!pW`VQ_F|a&so}b -JJJf;Bc-ko^vhE(Ie;nQ$d79eE@)?C2qg0BvcRPBsnEH(ui%}WZHoYMS;iQ-bwTgpqiDp`DXm$S-nDZ -J^Uqoa?!EXj%yMY(1L;o#nuk(HZEaw>#0_}$@y62eMsrMw~SVnI)5_EPA&as|T) -CcPrEV`eK0BG&}z#Kp!sv{$r(MFrHeKHz*%32_8gd);X+tH#F@mNT&1hYtqQx+-98@jwE?h@X2x_v?V -a1m`W_uaEYURWF{ud<#)|4bre~x%$L%(=YB-=R8%i22d%{vQ|06)B{PW8e$}d1Os8no-8O$Un1YxtO4AT*$vD(B|0?GxVSTz6~dX^fwD^shj4YN~adC-mNisgwd1K_!LCLuOy52;ogw@i>+F-XlJtrLRDE(Kv=q_M}&L0c2QVH(<nJJ49e8d|AV&B;wB4D%HG7+@~)6RWE9n@A> -Ka>$Y*N!J2hDF^)~Z?G7*~tWP+MZWvWm4`fRQO}m{-^^Gk?-nh?;q*F#g7U%Vt*iM++b=a*N^!&# -W=b@lZ$ukWp@TaZ)(~tAyk=#oTlJ5bY*$)qqZ0O0<)dNgC4Fl0){5@=gEpW&+0hJc&FD(<_aF7WY9y> -P*1JPBBfH{4v-^x9}GsR=v%^RT+kFS!uv{5!`{@fI!@_O{;2X(i=F&7tn&D`GN -W>3{d2Qhd;E(BRNaOf7~H~~r{l{@-g3Z6^I0U&A(X#s_Z=Uc3oxm4)%99V#-8y4vECuz(VNN=rOdG1f -t_K>9Qm^+>lZ4_pOGm?^zp*E0#PGrayPF;9g0f{bcX{a^+fA!bv^K%l9?oQlc%&QNSm4F*lP#Fro;gH -SPk+OuO_65-0QoH{_2^#FAup8k~m<8=biND=5(Ci~Fs@kL|8I2NQ`f#lHW^p{94FsQ%_jPbhHcIKqPVd0kHJ%v0!bq??me&UF -@)9z-q8y}`DXyok1t~O=II8=r#b|yqaot`e9=w0NU!{=kBJS5Xy+|Dh`dW-SuOjy&gAx*5&;9{WO9K -QH0000803{TdPA{ayR7P_E0EVRj03`qb0B~t=FJE?LZe(wAFK}yTUvg!0Z*_8GWpgiIUukY>bYEXCaC -y|d>v|ih3PthUA2Y?K=Bs-bO$U|ooNlCQFmbfL^o(#l{Kt -_CSPv%lH=5{vAvUUgfwYTegSHf!cpefcEYZWhPCKR7%*JUA_8*TrR-t;@FAu4iTT^z`MyapLFT;Hhs^ -wONrZo6BleEVD(mECF)8DXO}hXSdbns;c4rib0RFX6;)awA+h$wJv9yX1&WcSLM2F7I~JvyDIgAU@Te -rVFis_|FAA@%JyK>WLL%e5+PJ;_;Pav|5-!3wuFC+jSM84P9ILEd6Pl&Y}=Mu)8^EoS(VVBYU(zFo^Oh}T5XpA%nj>+hLv5Eu)Z*owuJ#yHMGU9U>^CwLGKh{HR -okpUE=D&7q`v&ng?Gu>l<0%cGqso8~wf=ALQlbCBGSGMLo~9HNFD~{sm0sNZxr%wYhUvo^X6<&hYStT?+;nA_98xoYM) -A=klT4G<=i#dfn@my=0W-Oy*nMcXX5n{vW`9~{VYn56#NxZkQqf7?_yrT)HlzioD_(lv&8;55vi(uF* -@E!H*ckZa#=3iocYtpO{WrF*%$zT9rAr5h6AK(ltQ0Ra}UL;CluSuO!p5lMWLs@*KB3;nyiDXJx4)Ve -Jlm~y?Y{S?caU;>-+!{&BftlVO3%5^Zts&4Uo=%4il(baX|wABZCKpP?R(Otl8<6mJg2b=Zo$w3A`@) -lnmlpkj0YLmUBM=#dvX3cGmveO-GbDe#je+Kiufj+8>YFTY|76km06)i*Z@c#tUd+`C*r6qvc$16BLr -iZ9ic9Ok*%k5<@)heI7FY7rTTG`9$L+4!%5A&PmJs`HU+OC(dA!9hht1+THP5uZ@$qI24F&d6NoWhG8 -p5m;9^Kj980GwgijR!>N=%y9Dy}1S|HwH9Cx-f>*xvc7IYWUrom+xLo-hOj>`ufc~nAf}Yw%oJOH5}Y -EY`dPhakg4F7sbVL2SDLOW`BPAA_@0TaOlf}c+`NzHEv4NPViTK%~VeJt);QIfW4b8V(>q(hWSk~14> -^49WPq{c;X(*42s#Tgq18dn{{;oryf@q&JA88vXV59dATfhNHt{v%h?r>+4iQ*P45Bxd@{k+olJU{FY -ytq%&Vr>g~_$M)$a4hjL5zCRjgL9E^Y67rp<^c6FFCt$#7ti(Y46o5^8}^3`X~8iwC?~RPe>Uny-z$H1G)D{dUAlzAh>_KyS7+ -9uL}z;h`fIzeQdE?@hdEGa2dpa6~=eQ9b?ZXNvgmt{MPzv4tZFmlp3ZUBCq#)20UepO*{bIN-JRK;NF -0>zk^@0V?gF9miL%n$6Sa%6K8n+85=f%LVD9kUd0^rS5}`ly)CCk0#f|EQA50n8 -3BNF6geB(8-U#AQF&*gY1nw#=B?&Shn6xRt?O&I~JT(3J%_Icyc>0N}~As80OM4&A@TO$`b>kFNxs-E -G{QNC+5raE9IBmE*}tXBUkg=-#+?|xq+cztNba5j0_C^`wg;kw^u+miCZP!w}$_=+macjB9r5Q$n6d* -v5-hnmOETCVzUT2fuDk|bJxeg0bo@|Ji$Z&4d2Tc9POo(Rl*HbXB{Gvf9t-Ywn7ZM?OxXJi)A&J=Jx> -nRe4#=b_P5U2;`Vxpam`WPe04>CvtZ9^$=bo!S$`oMGn+(ly6saYy@xUg#oFr=GAPIBb~i2cP% -s=X996F(heuUzVL^Wq4Yq1@~Ego_|JA>vTN8+=V;lrP@SKKJ*vbp$M+1F{faY5(uSzq^w#U+Hq9&0$T8Cwly` -H~c`jsd7G1Hh$>O{Tm)G$g!>C@&_%jj326-?Tur2LG0C&azLLVy+RHf@EHD^V?Q3cNON#+txN2>r7Pp -6stKk5;<+xeuZtNlyxG6Y_0w#ZbG(1_#zYqC0m!Eh;IPBJ(bByLeBpdMgO?Y(Xf#>&$L)rs-|QBMR#9 -)5pv|tz8D2~w3y%~I;9u9xEe?@jISSVqT1ofugY~vX+W7!Q`3B_8C49VXQPgb~PHLr3ghl~#Ijc6b8h -lq4SzX=&-Ar^f#%^vv9%Vr`7};#Q1}1xBKf`r>{Z{tm<%0Kd*3|QALoH_TO-l!`sCQX|WZi9ZOw!?WR --2X}xh8xKg4|7jNo>TX?Uim5ZOR;W0$AT>jVhPr&J%ovg(Lwm1UVdwh4daTYhYQMR*3Ig>JnJB&FpH3 -ZMhk6O*gn*c-J6;lk|=Znj7oMNp?6d*0)uC=m|@3t(f5qsLKz>pS1A5LH0>D9OQ%iZ*aK}C;WXu -=6NUTXltO>rDffOh*$v|*!Fos{Z^`xDxtJMboq9eO*-dDhC=-(FTV9Wqe8)A7MZOe~9whSL2pRAvD*d -~1uu~{^@kb?^zDHGNCT)3{FF*8=dBVzI3V_DP}_4{hw)F?I-OH${pn2*>cW_-7A4tAj)4E -m%kzOM(-{#~mhDq0nxWi(k8zU9m--$l6`0#8F70hqt(Dn5xe=0XYiIM@J2fOx~PFv -xq&|qHXoZg=?edRf%|yM7~odYi7E^NAukC4od^6(PW7{9*7Y2|?T{31%1Ces9PgRD+jVu<79_|nK((jzRNpXwa73v-nQ^=Fw$Dq%3|juqfz)^9{NV+3aa*kC5l4pV4w)caS2smPr|#+dqFNSkhMt -Fn_2Asexe@IdI@;u!-KQ5VQIqVVXiMUX=H&|6mwL9NOP0S!J$18gNn*t>S=<3uc8%P4xm=7o0wq2Lu3 -fZAPFn}U41Pu*<;a|m+;AhhIE;oLN#;+{umShte0N;oNn0*~r_dJEq -}-@Ram7jQ)<#OMJd~VUT}bZP20%@(hq3w1wW3K-b2E->9@?p-Px@&kOMPUMTH7EPIYZy#D^(r`Z5RS$ -`UI<$fOQL1k@pCrW?jiDZiP>L)!<4IQx@Ey&d@h%NB@~v8 -Ex2*!P1)9i4Ld#*z-$r^oGr=%O_ztN`nas#mo>RbuzJ~XS`%Opft#&LRo$Ncb@KJo|MB__k|}T1IeYT -?`GGR4@appe!>z*KpB)%>75;vF5b&$;m#0>l -_<>2bmS7(+<}?ozh&0)XG=_s-D>1Gc!rlVaJ0sdQg2eWYDkIz`%4Ap)jz{uw+o|k29B%;Uby~LWc;ax -@zfW0J+HaG`9Rw_v9EILyio6Fi6wa5Gjd$H$obQfC5dIjFFL@|7g$5XXm1tBn8&LmAgoNWh|+-ua5-J -Tf@3PG>Ho=AXXm3fOMfYFHr20L^A=QY6VANnAr5OfF21%r(3t0J64;VoSn;J3%%vXeyYkqoj9c@8v7B -%&@CO9WYQ3Q~;cs*IrSzEm8af@El4^bJ!C4Gau3N%W+RPm8Mv&r$D(a9b1@*b35Ur>&UHJjF6zkd5P@E=0BhF8Q)8@8ZpFSHr$p)*{4 -DVTbGJ)+!m$&vx-~5aw5QTy+Hw?~@pIG^QmkCC+RETW)^jJ);vw)Xsc|HF9-~T;(#ukF*j-d(7Z_)k? -{MK~3*J^{#gD8_#Y`3V(a^A9oz!hLUUo&4-_4Wf@2ddW&DKt5Z08v1Zw7RtJSI&j(fbq;31tN0*dPnq -V^{HPx!}u}>5)0=KMXRAI^DS0)6#pK*LIr=&NcIgH!8zL^y$34r+jHb;mIV;>!|ZUJ9Zn9zuLNBV)uu -4dKbaqY(jKB&p?fmxjbbX`;%FQ^cnl9ZUnCJVZ1xdG30z>q(Ramy{JiKAB0D0U`3MZUi4z}O-t -sDZ5O40nYd-9HJ!evKk|j=PXU*)#f;#+tmt&ZFT8_liHx(o8<58DCq4E0f4nJvgq0qe3?$dD=JoqdD3 -x+p0%-%oIVF)_-5_)+2DF6HrvHSa8md8T*eJ_;X9;TTldj`UdLcjQm1ZdeN^hG2OC)tYB^(9`k9!kMZ -!aL7I+!TLnyxW3|mo7|{zXGfljCRYK{pKW#Ryw^l;fJ4hKm2@@)RJ_DFWir#H$WSB{Orwxt4p*{X%En -%U0WM@;((@Qa?lYnU$wF!ylT&Xb3<;S!U0gO9I_Dj9J7TqiGx86S+nXSaamG)`D&g;-uNt((gnG -HD`)JC>v@LmsWK#oSD&UmR*R4o`=ZjVf$zzLv -jl0aE@YhM(e*-1YaIkwpcV<>;HA`oWmR-mg+YGM?_j**1pR^nnM$>^2ZJCU!~z0_+V?C7jSplqV)qjn -3Z1-h79zCl%#@MTI>j`LY)YT7hKaCzO56yI-FVaM?#M{exR7^7WyfRC$T`W_VV{u3qbvWF!I0r29xIR -A@otMPT;ALen%r-=;ZO)*ca-S4bC1=@aC8(VDW#vSYu0;&jtjMN2;Y6rg -3sF5`dRlzbxy=L0f!aB?NC&uaPv*dGE@FphFhH}5*18~-ij13eW;f@GJF1mM4-!^l3+q+@CpB*|SYi~ -5>=1G-1_hrqhq=&Q1rliY`y1JhZmJEChdfvVH-GZhO3eRdo7fsyPv^Swhb$W|t80wYQ!N?88cnC8bYJ2?mgwy(Sxnav -M?DID__$8fqXO%6*Lz2)zeU*fix1_Df`{B}`77-l9eS5lIrraZ=*$c_T&#C&2$8cAYqE!((_@T%?(QP -}yIc#c`W%9YA4hby9USg>>Jmr@K?klQLmB_=JUp=am5E& -`(AiRCXL8nM^uzHXIzgrVFYM?K^ad*4lCm-hjEilu4{rFqq7~<~D^WXz5}O}~j@5sQN1FL949??*;n(a7Fc*$+NdHy01lmN76!*)`I>eg-ZM?(TvJDs6{eHT -}Xnnp2xUpUNwExa6PGYvSitUanTw>Kx{_&CO6ZL&*Bsb=#`v!_dy9s~Qj8aFU`sEMP9Xgo_op1xL_h`CezUZ|A!(p+izUv0 -$4-VhJhY&WXIZ`I$>(h>93#V#WQj0XJSy+FQcSO2M=+C8Y;y -&kCm>Py~G&b|eI6$AUCsMV=%beozVGAsa;TOU-IWx(sB*Is?)NXHU*~t)#C$+(cCLU3#J)`652WRbiT -r5qsG6bgHn?oPdUUmLhiD+Xo}+71(sz4U6EZj!7W~mmU)4ZOZ{)*f_FrDx_Jn21Hmj+_4y*+_keCtF! -8k2nI|NmGtGTKn?kHs@nmRniZj7No -rK|(g$MJ5Sc5yGPbE_rJF!78g+OIV0+F$b%Q)7Pw>#N6MU18l2jnNadV(7LI-q{?D@4fx7ywXZS4usV -|d5Tr>{~`L`XwYa0XszvZk%$S&WWOX7^4EVxsI3b#Q`LqS2y~6Rt31;_b><$2R6V$k30U=kUh}HTSHo -(y@{Ej&t%2hx8}J>mux&>>!BCmWHFb&#>VX+2mwgd0t$MXW}ZL4&84{<^{o!Sr;%(48zh=qVadlC#Y7>kU0S##H#zk!F+9dJ8QwcWW(|upX1mHQE)eC?fSy`6D -hKAGK^>NKLjI0CHoQe>Sb!ZvVJf_`e~l`XG(N~mhYlb#tB@BrlrnIt*O!jbAexiXeLp3~|L(B5r -f(nSLa8V^y&G1{Gz5KVDyP&+!`vRAjGi75>BM+Sv0LPo|sz0>568Wp%RiR8fy3xiM|zb%bp0C7gjKiw -%+wq;p|;x^xzz!VDJrrBF!pP-S@wTRE?vcg9+lwwU$0Yye0dz^rz(-b*?s@@s{s}2iQ1KrNfa3JSNPf -7g1jj&8O9Ox39LCbUU15dT!oiP^xH4iv$!>kB%bHbDlSebIYIYFKU4;*=$oiN+eVabJ|k^Fg%%z?Do% -qo))ka^ya;5t4y+t%(*ALIS+1V6zEU>4E;AMus>Pwv*^$7@VgREY>mjw7&b8?q3XZUQ_j(aOEBC}%Ki -GiXDecgW25Z9$$45d%KTjdbBSJRw{lR8i^EzXdaHg$}MT&Gum;FysVMKx~gEuUmGhE7;%mkSDC5T-lAWZE5t<@rU?oAgkdtmfI$R=_&HC_ow;h1@4 -Wx@OD*si-;+{PyJ2^m6+77C>hahJesq@IzZC@%*fqO{!^7aHp9(#zJKW8{M-EMrWN>@5znaJw`e2Xp8 -Uld68-Tq_YGJFk`e$Qn2+YMjOesbEq0XS5dGz+^kPFL1`PYA$MZI<+1kxcF} -t!cT5i0z-g25BXNCw(D}~k4r;4 -Uo7nq@NmKw0LqSCiYT5f9XdRdEnbqm>ojkxxejq5{8gj2hvpg9!6V?^~I$+w5h}Av*GQ68EO43}IcAG{s+?0_a4K?(FA}84dC@4jBqU>op`5LYtBt* -?3q$G`wKBRbIXmz#u!hixST5OlZv2k1}!lhiC#RZxxT<(KBUQ>#iKe4Hbb0NHx`3**5#tay?4ADF03u -Hxo#t4+CE|BtVu8zswC1MhO$WFrZvT9btM;#d*8?yC`H!LL+y=0zbwwu9J*@u1(Gzu}-4(FaCl8^A0o -z%3b6AaEk^wVoP5hRudDY`F2q_omY`c=hOmxJVql719V387?g#}Q4N6P*;!{-#)UK-^ae*E1$u+hL@L -lbkZ0o2Ms&?p9gdJfVj+GNqKeU71w$j_)ApMyj7_$A)VUEux9N^H~6`ix&)^O8ZM%uUSGCq -lC$?tnZHSdRDE}4KQXGmG~SlRI1_;ZxKZdNU)_&CI^In3H7TN -E7>EKEM2E@_ch=#2G4xEQ$o=baDk(#hvRT9^R*C?v0N`)u1Q7kU#g4UJY_2pJ3ffwq%~!61Q9wVOm1h -0;fShS_<(yg1L}Fb3HfsLNcC9IQxl7sN7k^mY+&+|Rhb?&jKUh+3bMArU7jsvcHcr$ER}*nz%`)da}Sn0&)0y>hyXU_Xfrug)?F@`nt -7c;Sv|W$HUK;`WOV1qOU_64WP8x~zeNF_zR?=%f%OJV;NGz#G~v{m-j)Hwt|ep(1h%0`${mbsbn@!iR6BDBD8fWb2oR>%#iDdq#6_$bun+x5JkYC*(tv3`3&hmyp1x$1(9h1TdgXt -P7^)w>}cTKQX_qH&)GsaO^15%vz)fzzQ9a?Lb8{n%?cf>GzJrFK1vmDH=RT;~$MJR^rhK;7-8feRPw? -!ZcjN*dLv{vwA}3@qWSS|uQ?wm>DKh?*#gZ+0sIcT*Oe-UNL@);r_BX_$||HA7V^EhX^c`X3FQ|%m!^t4SIwPQ8td-Kr_*e)EKqiulfkLQyvW3dfe_3)>D3||%mqYDoq)} -n<=iJMmc%iFMr`<}l*a8Q$nH%0?=(jOYM$FO027vdaH(Ok&yF`+peIkV;WSvYDH;~=7*Tl0bcDNQO3mjV?g1?ySr&R<(^Z=SDlfl-BNNLCo8y-&e2bd2ku?^kwC31d$+B1Oq -n~%!5|vq*;Vu9iO0Mo(}K8wd!-9ihoGTT#%NS!0O!9Yebcbj({hCLiQnC$-TCujUk$@pRTsZkfYI2T9h&5&NdPxp%TRDc -@r+3Ps;IIs>kX`aYuzE3tpgcM5OFU+yGFH`Fen~jm_F!uKIowK!i;?n!^R3b_7O1N14-9wgnHje_V!^*=cIFuc6A}jT%A2RA9wslxB}2PF -b&AFE+98r0Oj6>Sy02_0S->CCl?bNy5pQ{u>Wz!eU395q9z|5q-K$wWPU!~7A`i<%r0!@g5-kP_8=5m -%Iu^y`p}s8=G`>QUl*%{!$1=llIbESZwd;ssNz)N6pd}oPtNmXkFSW=JW0I+1tE6AAF|>Sbq*UI9NUy -bH!nLN_wIVXJuufjvVq8f@PniM$1uD3eiKEIrJ+#Z3RcH*F%Gs)Bpdg^17y -l13aM2{@tH%8qSIWif=6Z!qJ7A>te3tO``$tt6C$)*y=;an($?TWZ467YokaXIl67$*|gpS;pBcBa%A -YFI)as=J(3H5HG`;fgb%O_q6hO=&bAn1JI5%a%M4j6fvCHiuvFj|ls^GnFf -zU*28Qr(p$%zHtf1CKR;bJ9|Win{_a~vX1;Gl{nu6uX=4ZYUQc4h#x%)Q9#eRp%|B;rX08B-Tfbb+9H -GNj!d{XZJZ5DBX;BHVqQ{5QKjFchF;enQhaY#j&bT4CHBoQL6|aTSNLfQc5T;nHS4lDAK&GE+^fV{L= -JBo98E#kGy{ChU)D#qSedK`AlU$vF6plOX~#bvl;|TUm}b%`qzP+D&L)4&sZZ7MwBHeuIv(m{JfucCn -%+1xALg`HZfs7Hwj{b4s!?z$t0gwWATl5|_h;NBmwQ)?6K&qlB9&>fZk(RDjGK -)BN@Hqh+c8E}L+FcZ{1;jA~ZiDt+FD4EL(C-#4jd~+dEV~A`lI(!@uqt9MFp`RpxgVEFFk@iUvyWfE% -sN^*IYKpj@4_tHG~;jyH%t3zyZ$er|=;#E?p%j~Donsz)Sa8gCGJq*u&2Cl$O0|$`mUQpZ}>sN__tANbj2`TJpXVI2DtpkOsZxxQ@P*5Y`4V6)E(6Rk#rwrFjUcku!mS$~I8X -C7@79L~y#OKw|8JMCzV#5bDX|r5s&Df83m{aeyjJXuxE6tkhpk{BMF(@2|8}ft&pGB2zQ_H_4mggab}R+iKu4YPN2jxUGVzB4qv2gJ157}qoG)!eY`Hm>;LW*KGhf6TL+ -KHcqFtB@nZWnvFUB9or1MBTsaz%@nS(Lv$_VZ*t$AYI6|rQEny9lwV)cUIg?v}n{@uyN{H&l07ueNL) -`+Zjy)gSdPiU0nmhE=kv0IcXst#`DI7(5xlG6KyuEGgd6{Fb|MK5b^L#K02lkr|rb(~st?BG-K&hMzY -%UjA6o~Zw!*}~K1XG8xUuMZDPRuA87>rHi2#CQ%)QO-l5K7H334Cc04qY7HKa%Y+0@~L8pu_xiS%Y%GCPS%Pcm6vyC|2Z2RSd<=sAjwJG?tF}%$ep$h!6*BG^b>^)_*KWCMtEjL; -=9PPnz{4U?J|4Lp4fqN^t*>NJtapd{1{c%J*b&?ajjai>J_&qqX*yb)T*Emrf`eYjo+Fp&2D+ccLz>@ -h_h1-MNmve5GK1>73IUnUf;*eHTEICI9;A@6Vw8U$h1?`d_;On1K1$u0VH&adP;-$82$=ziPIcl=v4< -m(n`K>82B>-Nz#Q+5@gb{N5?w*iA=OV{wH{YBv`&4So7ED&#i+8|HSp{662r=dc46^{8AAcC!zB*!@{&gpIyZ -(qNW{Bv{4~hZl9V$78vqiCNvw;mw~mAFPqJJ;cgGQbYd8*6#JMVn9GTjM>=!u#ep;@tidBnd)-~D+n= -N|YX+~p80YPbXO;&tjj{F4`fJ1{XWdOY@>PyKU5smkPM!8XS(dl2`{pIzm3DzWj_Vn3bUIgGQcm2LtS -DLVZv+pr~%>%1gw3AN4%3Od5qkKu#9gLD3HWc~Uh<8O?O4Nf6KFgJ5jN+d0Re;S2mJ!>8Y#^3i)S0V$TiV{>N&CK!0N#X4t -)y@-6`RKFk5+VMg(wlH){{W^60|1<_%KEB1y*S{WL|3JZB=hua$H`yr3#@^a8x)?Bx#Cw55sq9{0*9g -D+E<$m$ivYl71wM$BV72-KNow6dBfG;GAV#_YJn17@W0LkZLNveu}Tr+!nS=ML`(Xt(UaWryNF;`)|U -1eB*eZ9w9Y_|C&SA&As6l=Om8G@EOpu+JMdU%quPqV=>(1F1?dq5-KlUROou|p@m3FmO1xN|WyJ$Ka5 -FT8kaVZ{^VYuVg$tSkU&y`F6Awpf&tXgPvO#UEPP?92==Oz)?Gx&FN*cSq;XY8GdA-!~W=NxV5W7(tGre`D -sa3Dk5{7|d9y2N7A6iY+X{y802*=N3CuDCgOCg;a_HaotPyXoJeG>*m&v+YsQ6FWTGEWDY2^qtE~8cQ -jTCpqQ5%bi(ZQ2mtKXbf<%QGw`*85#>$o;0BYW)3tgwxW(Ye_24{G=^bIJ!|&i-gXtPp<(jg@ix<9}> -m{WD!m+Zk3}}yRX9SAVdzUvW8)(ZBgD^T|F6dUj(C|WBK+L?_#BlhiandPRZ7ivoP$j!ZH&|?z4n3kS -V`GkXR(NjLjoSS`7=yaW-%ehB_xjymGFtQS@t@zEhKqF5UUnRhXj?v^+)#F6l(qIDO-}+Zwo6qUOk>6C}xldD-6nXRP8Eh6(fAr!-EX6k{;l5#dmF&aL_dHB#qNl0meq}s^uVDs&0D)>`RFXKP -^4sSb%v`mtVvMF7fHWpASy8S?@Mi&d;=1@;xhn=1t(N-MQMO*^K>EJbUo^)mML&0=E*Fh4GUntDe=oq -ULw4skOKZjsx1U2jHvM@3;q~sI_Zj>`NK~to)o9&b_k7`rEpN)nvZvK03rV&AM3cMggyeV8k@7dmCga -cf6g?CKM+sQKORem4Rt^r-nK_z57uhqEhaIP{oLpBeYP?kRR^jreAME7|9X$z~RwklbyyTUmcAZW>~MIcm -x5@Jn*q1>7Y9?{QNtsA62iljw&B+lXsNm+v_Axx&%JF2_M+8aeeP*uW_|Kn%Y_S-|28&e5eioK9o%HJ -v62*qCV}{@H9z-nkAf(V$dxE5r+(?Fu}1bR27DTUROG-R=&a-twdFxtH4IX8qCFYcEw7T8T@>)7-ACF -G|glE%uDTskI&sQ{YVNjFfQG7NU<>&yl9%f-uXuM*Q1^k~p|_^R2IPk1^aP#Wz<%(`->WnNro(sHL ->^afb=#2hWU2gps%jl#JNV7FXba%LShdS=*D?Zo@oc@ZFGMg10!6YD{`*F3AwWa`nh$FfgepqF`s>_R -M(bZt#u;2@Xx&K#M3!6K)Vg}dLMGcJWY>xi-pmb~HI>CyNlz7&_%amHLk!B;yc8dHiIO@M=GP|U3>Xf -}`Xhc31?FJP!`qm0>rAap6tF#9*4-%JFY#^;uGz&tx1X#;N6Un?PA75?!0^XFy-a_Vx6iHGUDXUG#RO -U?h(^+K_p(_vZ~9?2IGEvPm&AcPF2l0%DYv=lbSOtHb7>u`A8dT~&Q3kH$$X{t~lpNV~wBi`A?j!B}- -BodK@+?L1=ua__~&=d>4_nkr?a%y(HMqKnWia}m?>O|HRr+{Sc=8)CG$1g4~+rvB7~=WvZ`jKy)ZrBam*fwe|Lg84$n7)k$%ljp|sBZI@HE>ncT)y&Sa -3L@*K1$YjILL6J@~=fuyev1z;kyXPP|udBwVG$Hw9(~#m?zdtV9S+QcGcjH$D_8?vWZ$}E30*0BK80i`u798`0bOsg -U(S!qPhiILP&dIm<9)p?j9b1D>Uz}#Yd-VH&S~7qyv{RetiNI8@FBe4SlV<1rhf2eYgAv-Z@pcDn`Uj -WR#yFmpxidsWKEGv-g~ID5elCMA?ecNF8?RPsFoGJ^i&iJ%;=uPUS#B?;BD-iBydyOsni}9F;8~Hn8= -fU#h(okXQfVMNr9$T&$kly|v!gFdFY0Vt@!J`!c9>HG`X8Xkx?S$uB|GD@^TVm8a|Ws -UG5owx8GlDEDIj{ZMkoOH9%*(AveSGJmGf}q*S33B7MmXV+#xL3PiaQ;PBuOu)$z73hkSHUPpJ<{tn` -u7EGP`xY-@c{ -yw5aH(%Mi{sx9Mx;WhKIEr={hWNTxm9{96TAW2z57Z2@upoKEJchgNw>>;p{M`gV-eI%#`d|VD@T#pT -G`imXYsp}3_Z~9HBI};FP>=FZx<2od1iVBa~IZ~nX+-6dW>NeLR7h|uvnM5#Haxv{eXXK9}col?Ptjo -6_N{T92r9S?vGL&CUj$Ox&NOS$Zys^QztIps=M(EY-5)LnszN}3IC%oo69Jg_=FhfldOA`WLBO@|9<^ -_jh8R{w-<{4%YN7QmEnZ@wp>QxzI0o7<{5%>-?Kuro2HzFdXI-K3nHin*)n>D5pFDin!r)dLkmB2%%P^JHu4*2Z^+R-|Yc~& -9*O%U0l3#6ZmPas|YIdv-kJ(?=v$S7+`6W4CQ07alKwN!*H2{*oE@$}MoL_B9J{m2_w{X}g$pLG^qPF -kXm?6o^$bDNKe>NN}n&#m}vCcOiHW5_RV+?u3{zaHO$U({ThaU-uiduBnrc+$mb@8h^aMOjs!vFp&$B -MlyKCTZ@Qt6-K6~=;4TdoSqcfsmIkXwuD@@jLuMPIL$0+OxSONX%@eE)rV(cZ0r_EQ?o;Y~wv)-%+fk -kx2e1Sv`KJhx{{?3Pccep9o6*JQ>}uV=P<)h5o6AANsNX|@s>Y+|&}p8Vf1-ajsj`kLi336ta|-5Cvj -!M?w0>SIy4n=W7^i4_agM89y2o@&getdo5g*tSLW8}mX+{{chMepc1u2uVbrym$ETay7D<{PD-X1th) -@u{~~7Z{il_8gzqONQxO6V=^_Zd&d5RhaZOz5jF%h7@uBVqFWc$k9FtK9pC_T8;rO!Gw(~9TA4dM31D -79twhR}YlDr)M7F-598=qkb?rUsfu`?6f5BiF(C!QiJb@T^$feuR_d^0J)O^5I6r|S-O|Nk8=ZB%N^} -JjG$`TtSj)+nITy)-Cmaxhvza1MK2y|U()~q6x6=_I~8W#9wvNnVKHi#G32-@5@*QOB;{@u7fQAd*@2 -P4{>V+zk3=pN*6s>wKWAqVhu -#L&JJ{Wt=sF4aG&ZA-H*JXR{o-*b2#Mw-(n0T)Wp)5ExVe}Yna77GmJi;KFMT76yA)dCkGmB#+ZYJ~@k8e|vSYN^$u+=?a9mRb&JU-xJ_{)nx@dR}dHQ!R_NsyCo}QF -S`EJoh!JIVI6jRhcNPb -}MwYR8~4ImrzRyF3n-EcvzL2ZnGcpade4dD%zwuBuBtBDY8p_)H8t4ZF9eB_|95 -|Dpms`-)Mz^mDTfWr@`~kVqP^Km($P!`83Mn+Bul0<5)v#6=jSy)Lgqdy)4it(DPefki=mpBj4~v5Yf -UR$&E`kh-0L*W)v8jGbG^n=$9z`O$V;U$B8y{IXDl_@tkJ8hx*5u`{)+MvBQzJmdx$vuUyEKR7fCn2C -QL69Au=un+C&~V~V3*IF0baa2g!wm6WatHPgvW2dj2z&36B+v{n0P^no~9iS+jVn -Et4ygL@lY^m&~YwS~*u+aUqZDD!S)?x_`C7q2fCEjhHw3M5U`xpn?Z}m!kt0{$ -m>@hX$-{olMWJ4*L2)dgW6uwJu5GX}H9(R=U9MUQMim0dyLuvp{3? -fLwA_|ISTR74;#!ii6`Hewqy*k@LdwV~a13|M~Zi;FK;fBvE;$xz$zS#{lX -EO^^6{eshig3?1aovbitDG%Z7AJ4+dzI74|Yt~i`@sboP?C_ltGWG!w4&CV1+A~`CWOdQsB#+PLM-Ea -fVnf9Sxl<`+_33y$sAUrdSgiBHH*d>@uJ_p_18Y@cq^B5wb-ZNAh)-BNJASQF)y?OcW#pLZbr>C#qyi -1X}m#>+$4GtSLq~oaAM1X&9>t$76AG-V$o~R9yYs)_aSK?KqPNRn;clKyyilx#l*_%Ad@06wyO1zaML -_{c}v7vOia9)WM3G*1baU@xYXdhkU5N@;GVD<$HK}S8x%{6K$SBZNg{|7;v!>-&3$Z--QitDh~`HlK- -bIQFiJ(SvX6G)7@xV -SrL1%wR66DIFGmsmIr3q$7v&5oo91@lTfCB*Pgmva8tdL%H1Er_wt}Hyz$-1L6^OeF7U5?amP=91+v8t6Nv=rXxto3HfwY|Dvx1^bj~DBztmnYNg=vZLN6~s;TB -&yGNt?2TT(7&jjk>^e~qfQH`lJeHGK6$cZQ9Na}f5K2euB;GE?ob{B_pD4tlao>&E-KWe ->Rr;0oYEF>i-qJ~h*GPEZjk~CQ+^(lQUgI%JYz*|T8!#3Uw1|n>s&gc*#|ka-SxpHOGp4B_aRrQE -~z-N?I)1yKO*R-qwEbMFHl>xF90uAll*;p-XC+6b`f&=;@tg)!m3g3d&4GL(Y{u)8CXBP(qG?aS8%Cg -&aVYuoAta{Vr8Ave`8+}_Nd?``36&4KQVHe^U*m8`#gMzb9=aH9x9l_k%@VBw%K(_W=S$fbLfwa{8a< -B(n%bl!efS*GuUFrB}t)+LCI1bVC)^*B(-gvYn*voR<%g2GfGlx(#pzW^;$0?bf?{w(;YE+zaW$|gm8 -D*rpY%ze7LR^XSs}cG1tRKhgufQQF-tw^})ZDJE=7Ds_{E28|iSXGWD|$4YN!E>KXlJJhebQSennHY&t9kq$#Q4-JtcX6K^oC-mY9Wc}Dj)JN`nPh&T8%URrU5)dZy3HyevOiQTBct$rjdV+L8W87zv8Ga|oH -5ys}wN2ObAAI1FcxZb|A{`8NR*vFjyQ>@EL_C0T3~pbHYXW!-FS@g0ck6=*5aT6?G-M)zD*)Y!;D!vU -QBSbyCkV19KmDv3h#a@cuiP|2w;#BvKu5$@n;(YGS+cLxHAeS3xqlw`ajZqIjEVC7YipSB^bm9m$(98LWc@lCF?sxT -B`H2o?~XIuKJGs9QDiqn+rVzB4`>JT|nD(7=Emtguybnuegzx9SHGVlh)oGoO*2IbO#=q)4>u{UTlg` -j@Ii{m4QQF%g+>6R*%m{UOUT82=<2s;wZcDQvJ=Y~#AYiNPa`CJ -gw(J4dz)enzq~GlY9d*MOck4$D2BA0{WLElJ@R?R_?_g?D6)==uMq}+Sgl0>N_Ed -7;xub0^DpbYt=rs49MN(``3~H>!{e^Rehq&|+a_ygR5`txOVrRU4IH#h2Vx(h*9q4F;-t?$v;=K!~k2 -vJtlk#Y;(p2vnKW4#dSCfmKX5s`6p`F3*VW;FD6cM#QQ$l7=>x);d9zd7%7wHL|4-W|LW+gcnJD*{3d -vk%Q_2@Z9yt-hGi-O`a7EOcyNQP99g!9LbaL=NLpV2c1W$#?5)!98k`XS(e&b#A$>(U4uKZb8Uzj&5x|cKf_PnF^IqN2Y#RQEdSt&+hlUZ*#h8lX3fE88f(N#T^({x?#PRz ->S@xour6Ex%oG(t-f+?zYOgFmCtP{%BH$}2kH$b-3Ty6kf^x7?cEx_JFtJuzRB}YRvn&khU={_J` -N)F=0FJ=z~(#ebtI^*s@@#ux__;)ZH1jbYb=gEp_bg#MVfRu;QZ?yA>|1rE2pXU2?6yC-zC9VBbN+^;RQCj;O>oBnl3d*sVfdeSzjmRs%dtac|8mPug+6jFatipp%xx`f+empzHH#jITvG+c0pw;22kt8^$ikJ0 -G(*+2RMOx+AGI=zI&up{Fr(d?ls7U3jkL2M84ND;VsM%XIvF>oeED4Nlu*e#Iai@hEMT7QwX*VQVVQ& -eWJ$GpJ)2L^is#c-c_-L$9cac`1{J0)FztY|QDA$bK6CU(JE(X;a8`HOE~eD(Tt^8Dr7cVkBpai?nZd -8EK=w!9_C0duBUUVvAS8nTjKEb(6Ds^5g^1!ChaWnRHzS$H2uq5Jswg#O9nn#Q{0RqWR0mkZxH{djn% -q^72VGjSmtH|B1Xu|h~NZ%FvWH;NP9ElR9sLnSj|H-kR>OS=D%i%KrKG^Q?n)1btOXOWUe21mRIxt=w -ZD(H+sPyqi+ObV57Y{_ANHSAvO<7iv~H&LU+W}uJ@P(s(Sy1oQx%lzfd>Sd^B5m^a7GAVd0tDbf$+ziLBu;u)ln2&sJJR&lJRshzENZBLeu+ms>jw1MxV`At0cqM>4H1dtk2RsE`vYfzut~)#p30>mMbWK{FHmdF9KPP0!a+ZIiHSs6m1((F)!rz$ -bz-1NU(&m_O$VR++nQQ0@I*y!0`kodpWAy2|R?B|*%qvH*{VPhlrVcXMd`qQkjvm90zapLg%nUu$C;F -$2rAwzIJtUqCov+-@85_vi7Rfkc7u73)CK~!EEVjj7(j@T^IMo#JpP&MS^;6EV~$hvTf%f%;{3jG^7*5t~B2@ -ui0pGTjIch|R6QHXo)KOc=r~5a7}J1+UeGyJL%z015mjiBoR<*Ci#(z(zh_+MYqHqE(DNLJm4mnsueF -Hv&rCkL+FGbujdK2UVz?9@hpcHe5habX!FA(Ig^b-K<#y+51o?gRlT -qYWiX#6S^lfqO>JKiX;Wm75=IwGH6_rpx*UmE{!3xo3pyT+nQ5Qf`P&w%W>Q~zApUvbi5eqdml4wxV9u*Z%Oz^gwmX23E*ZB+ua7P*{wEiK~@h -{ZmJzTVy9jTE4SDmVp0x1SD_LHDUqnD7*nFMc8Z;5t9G!bhm1wEFETE$2*Cp-r9Jt4^fkzBHGW!>0wq0SgrB@ -3k78FkQMk=k!`l0lN*Yp^;n30d5N?omYfipMknav%bac2{Clfge?;YrwPE@)oL(hb^p0oLUL^Ng|YI7 -MfmR5gx(vB0v!N~_B-`uJ`}pU1sG`fojh=zK~RV?Cd0aQ(1dB^Jk;Yj`?Qu|X?Itk&gwtbM-R9n0~VC -uC_AG5m0y^m8Bb!5g8%N^(P)t!7d%9QAtVbeAz$Li>^D3cE+Bcj@E{$83#0ep3Qr@&25w+ns04%?eX^ -!`Z6aV_h~~0=B35w6PLWM;ghF+wt9AO_tn>PXSO`AH(Qw%z4tn9c -6S4wM4>Rz;n_qW-*wUXg_O=cp(Yp!h3SJekkKLyR(^KoFPVb6vGq9(}t8{*ayh%?NG6MJ)5{l*^d&fM -u^ZCF5kayS%MPi8?bw8aWeVPlG39Mq3w`H^mc}*sOUU$xzRln(Kvvz;*ii?aP19K6~`&_h@F%o)N?`Y -H4P-^KAI}NY!1fh+j9Tw)cKWZJvG8YT;>}LUBQXs>4xs3lbDwX(U6DS_!~@(ANroPU -p5KzHZnbVMiVG@8zaf;Ubb#oMi^rZ^NHoza-vpeN06J<*yiM75cY(oJZFN~|35cHE(Sf_QB)X1Fq$K5 -`&_Q1I0ar0}4p_1$9dhGqS@9FpSwHFCS~3!DbLI+kF&Sc3O~VGw%@DN)vMEJ)PkK>0?vX#x;rHZV*Y$ -c{ZqPnkQ$mePGVBlyM2@Oh>vD5uz~oBPGADdx(Lrux2GMbw`lSQen$V~_>f3iGkJ7$-9mR<5%^^QF5u -hXQ9-$fkdvs?!#Yj4iZcDx>IRecD=BpGLr6_P|3E)#J>$(Q5n5+|GgC_3oQzhzzf|$b1+W5^zM$L!#8 -&D1k_G1Gl*+Qf!3?+{JVT%?t8wKFSVgx=W4-Wo<^xZc1Ir*uRvI1K2n(?q=4iDv|q~-I7jMdo%6~du! -AIgB+pdFG0SJI@lX(Da09z-oo_-xQ=Ch$YF#N;mzaScXdG^1K&p#cR({hZj;A-iSdMT0?Ta^meEs%C_MiC2%Rj$*{pQ89r*B`34|IkubPx4yr-1$&hnuh2z_c#K%#0Waa3nR@`B${zS^-Ir3DJmmZfIcKRTt+_ijJ$=AHO*aMiIqw3 -*87DhHY@2yf=S^&1gz!LZGzQ^jFjaPt`TyKchAh0m}Y=emw#IyFOe93bU-9Xiil(k8x+@Ve%t4-uUc) -3e@lk7I$?t(YNh_;2ES~WM`kW=K~niU~J*UQRP8G4P*I(_>W2-n(f3hCo+*>K~lTIg&2_Zl%CNJr -6_Mli_0s1ERH(v5~sj&PQ#wg6x&QGJ-^c2xzB$iQ7yxr?ha;m_&yr6&4r@2b{B7~m^5eb$#-kg^I;=ZR=mc{ -7anse?A$nC576%jlyBg~H9{m7#Q-WTs!?ezH>$s`rIz;K~v5r#IG_6pd0cK6zsTidyOutjCLwupaL?< -0X0&rLwfEp~j7EJ=40B^DSKV;!8I+2f3T$JgLLvJSVdh?PQ6Xi6@>WXciXG=1t)PRo3rMSZ7Ea$P&cG -1m(6=&oKl_mWtBF=uku -bsz2cv#*}B@l^hgF^@QLGo$`m%3^U+dvg($5+j9%x+l8nq?271m -c>1iqloxjKtHrDEU|3Lu5Dw08q1u|zryA}b)XV}ZMdd~1s(7hp#|5JhKR4|6VmaQW_EuuW(H0o-G9N3H^?2m|Y&iYINL^qbgNWV$!n*+0C}4v^O -B83@B@fECch3IVKL2{YQ$?uVh!C3My%qC7{La4#{tXoXkem3CW2PRxi8CZIae+ -^$ja{y7?rbH-?YX#aoX4;A!KZa#?ZjjG}uhc?AO})aKtOSa+x^CzzMXt27w!4=~v`p8N?zI -rxD5uk9t`T5^0C+gRhxN~n^45R!G*31&A|o-F-3W@-Db16>D4nZ8Ugp(07q>wC*k)LKO-{?v0Vc%=rJ -Carh1mCotEQJ>|?oi<#2Y@%3Uo5A4A6^m#U=K}Au#@gXO2RW-kme{V$p<7jf7}<{j_L;mvouNqsa{Z=Zn7#}~m)K#8niR -X&$p(hnM?#!rDp+ZOI7u+NZ}A5;>{Y!j@3GtFhH4$E`Zu9s~_}@N%f0;y03-NJyx9{NS(w -@=tb9)Yi1awb-H>Vr`@GfgNz?4mH=D(XP(8Phs8kl+O5u4<3L?Va6n$VzU#qHB~YoLFqV4P9CEc8)mFyO -C(Kb*fK6UWGCpv2Fz-=S{8)+x~EYZT^{)iemd!So@u -z@Z+VwN81Xy&>&2*dpmHnN2}UA!9xeg{=N_gvIrFdJRg`WKfVj$#($c<7`s4yvo;4+I5F$x(8wM=;2ebl-T5Ef( -7HFj8>0Q&TvtMroXgnj`a-O@2hu_S2aciP4)nggGlz)6sa!Ohj5{nY$U^cO}R_vr|WX^}g-9=b4rbnv -Rb+*x0tw5y`Mn%%5=zU-1izK>mx<3s~@5)&`4%U$?1$&Li)f0XLOQy8RdgH#j6o2WrhDiUYkYem49L# --2lixhmi^p-2S%X^Y6%ct4Da4Y>gfK+}Qq?3M7mmfE%FZV$DxIulnXHex2y`VI3+Y2nzLQ5-6h#*fUo -d~*@&RZ;C704x)9Xch89mwrQe`7`;mgGoH>15B8>N{6QmDmo9MqItS0!~me9B(k9Lv_R`h7>>UcnX-D -rL>v#oDHYm2_ScyZGi<^KHSz=jhy}Hm_u6bB#JE0vSF2%`IvJcbmN2pSh1raBZnX%B+57FK~udt4g)o -R%0>0oV1%>&aRn^k1EZL_)3@4v1Xlz9x5E$xsY#+fvA3R)hcqrx!Ndk;F&Z3B!jBGPhY76}X4FN@i(Z{%Nn>zrb2o~f_sqi-WF4I~7HhOv6ag(NYGF+lESW6mPQX!Lz(e{nTLSrvuB!N2|OBhOOsxmd#C!U|E>Xsp;+i;FulGdv=!;fCK(R72IWR -zRgA% -uL5WfU4Q#UG;pJY#BxHA!l2)Gmwb>FqqujvFd=7wtgjN(!Jg0ypj*1JbnZ4w^YSnDJ#N728SK5Iim~c -QuU}5F!>{0$Ghf65ra$8s!c6FL_Db<_ma!s4lIDFJX_RBIg_BI?6EZ|6GWM5?d`x-gg%*NM*z5roD{P -(b)Ob0-4hhe}d#3tWMxO=F_e&QVqdG{dTMyM>c4wz?hgS8C=)wGsSqjwyrpd7{o76e5bSVX>+a@7cQi -~q2NCM{wdevPSh08ayLry(33hct}TW3O_2fUdlYDkdKjhumhWE?1ShBAeZ=NI%#hbpWPQ{xd -opTY*SbQP>w!1gyU6Ctts>)=f=bp*O|)n$k -nmbJ6u>;2sJg^rg?pNJh?gBs!Zg6E5EZ+#D@RH<`eW!G8 -?CAR4A#;F+nM#lusx|@haGlsdVXV=$?yO~bYgzfwezUaZJ^E^T9S{Ej{ofX=E~S;1<-*vG%$5(xfEFG -u3Kb@ZqFAjEl)e9aPW78CHO?=2lK~ -}JU)iQk(rk)GbQItcw#0aVMEAg2L0f_qo`h9Z)}BI*{;`C`fmNCrF1oQleOE~l@OXmSx}0SPu9+RmA0 -aLLc4oeuHx#H`l*p~F~RGV91GbyH=%Mp;waa$=h3CxXQnG{ -)K$sC{6zb#t|DwwIF3pL8oA6rrw%90eznt}8!P3{H*$#UP|-7-Uqv2Z9*#t^qfuLrw5yl0@0aEPvr_L -_SkvR_2#EqAx~$Np3{XSHKK9xj>Kn;$ZF}RH8^ZgXCQN$OV;OXx~W=WN_w-Rn1F~Q8(vS# -Eq$iyr@b{vt=mMW{*N5z3S!603^HKtWDw{P8i -;7Bdh|I%%sDWe@Ce<6jHRwz46Y0X1s$KtLs -Z&O*7cAK_Z5`zdEkM@o`IOzl%f$hih9~4P(K`7}=FHgqq&EXv64GbFIkr+*f}h7DIB7U6cV=s&6UM;T -Zn6+DWiOc-J*PCwNC!2;y<)z3SrbG(o5}*R>0?Uj!D3c&laX7!YxcPGv#k__X+7NnPW&0Qf; -gvi5q#c>7wFkwzPC+UQbz>@eB2hY5o+lTY_mzjBJ`4lN{2J5ezBE4`p34aqJ~lgcc(!GRL?50X#%qm> -V`FBL#=cQ#HPM@tCxU;3X#c!KrPhWMSZr(57+uyBufN(}EUOuPLJ}-VetD;CSwyO^dEovriH|gMU!h= -3fkz#7$!>zbv}G1{n!sH2TFpo(jE>7@2-h#jN|CJwzt0s~RA=Qs>9Y>eA*W!cJFH;b1r}XI*DQ71T$nHYv6l=(S@CY#eWN5p# -dsg;1es;r+tm`I7gLJ^C@*OQ@(80JX*Ox0w3TVA2{0LRaAuE*d!8HqHR|XY{NRDKA$iI&Q9k!CQZ--6 -x%6*YK^5gZINdV}T69qxiEIV{D#VZ=b5iXJOvWHMw58kvBncD*#11TzGw=nx~vQcW62#@ZM$R@%_BZsuF3^7BQz#;oywfQS1 -=E_T+NG@Lnl(31tqun9-g8NsXi2gmDS9t$Fe(24vRqY{s83m~t7ctocC1)2^B<9FeYMyz+7B -reklX#ah9$HZ&D8^iE6!@Pt_(5RHmX#?!!z@yeIdhq?9_!JLLST -QOD^v$cUUc7y)4kAnuF0gVIZnnjY!%{Q7x(Tpf%^}B-;uE6eUz9~`e3X~Lg~&YU4NyO7A0s` -u+w~F+?HB|c`byu#41p;FEVtfV;@&@vK+Kq@_p*wRY|K%ja;4X3FhR*{Qx!tv;8JbGJSdy{OMAT^x~k -v%7|O9&Y7pd-x3Gus`yQJX=%i<{Nh=ro*nN|Ws#TPNjC6qRgp>Yh-(0`m7uE2_Z91YjUN^QI@XTbEUr -P+xm?;6C0dznNSuZdB+Zh&>Q$SWeAdk=)}w60O9V)?8dXyrZkpAEazmulxJZWdd&!z>bh%jw9j2J1Ct -<6EHaej@P6py}wtWRO90cVW&_-X+fu75ByzfN#ewV-boDbF{f!jrCYQrcS`K%IM$V^>Zn8vb7kjyp5G{)~hS|i5 -;5bK%JHlwNy06EWRjS7#ZXdA<7v=Dq8hsOpJ*Q)G2-FW1;Ns(!5<8Q=-bix|9a;inh}ae>)F{R4YM1h -8YPT2drrK=DtCQ-P?0}*b^(AZuP>S1TJ*ON#aYb3Gu^Yr^sbbn#6Ou*$1mj02cYS -N!BRDNgsB`CMbUyqdhMx_T`V7XA-nGv`O8obSw4{CRXvXuZtH(T>m#ksIe;p}QA1*A7SHflFvXot3zN -{CG)iVc5XMul@(3!A$u*<5OS}6Y_eYZ``lCUa&v9>hfex-spAp^zupInb-4GBi>2m1Hg=r(;;XRKyJZxNY-4 -7>e(~<<^QZ5gGUa*kKVSUMI6>m@?EB&P9Fy4$zn|w1C=br?Z2bM`e011*_BD_ISpuitOXsbaXC#7Wab -z#;`CeyH1s>lx`;@AtHe$!iVxRwT*dw|s-W1i66|n1^=7Is+^fy{g6=w3{iiY2}hCOb2|HnLNXPg0jV -*N|gF*hl{S>;Y+&&d%fg`k~$Lzc@0cA#qr2$*Ijb>#d7~|B#FjTPIacl7=uBw^{x|{>s$ ->cK8!#2O2zKV*PW1%f%n|IsyQGs2C+d6cGsbk7bRP-e}|zA2Pq;m}p%M1`w5waDK^mto$i6E$uP6BBq -zVO}XB(*Rduo2->5QB)2-JObF;0-8VPhl~Hz_b*5o_P!BqR*od;!l5;&j2}2+K8!o2(B*hGAD_?W_N% -FcGAN(xoGeYj$IZ;*4`6BLC@q>#N -p)={$4pD2nc9hz)-DQzVjT7@_Bco@>dSo_ -doEoOZ1D7bS-v&xTcf^-S&)#G@?r8uCJ0C>)pTr!XUiGq{43%9B{O!lsMLy5XHx_tDd6~bmsUp;QkvWGfiQg9UsGJFe2FGndI6l7;?r*+=}d*H(v$ubc5_@pui(6^M!=Zo=^rAJR(E@IKj$HjZ)l1sT4&UtY**)e<#Goc;#Yr8Yq4)Bz*q)mv!Ep+bP@69%jJuKh*6Zxm>v!3+r(b=Qz5C0{x7jzZ -p1*$f&DSqpy?gOI119+|ub+QG)TryCG5XD3mX%$k%xB(1N`{yiT+F@o%w00H8Q@Xrd0KMvxJZ*CO7&{ -)JR&dK+GU$j{whd#-J6=mHH{O;bUk4>useLQH^Q5~qTGAP#|0B4Cz%|%XCWZ?r~24%s(AF#Q4T^VUAa -CFfkz3tiSu?$!q~Qn7YymfGfXXzO03aIjS&taeCL@9+g?8zq+Z@^uF8}7l?RFp06 -Mba}f~=(sCUBU?pQG$4rdUP&pwzfRqnIj+b*6A+%GSf7BV0txM@Bab1C3-W_DIYzE}9*hHe7=Y -t$6B#owa~U8wsrAJg*w*Y`{^pd@-ACC3$#KSLpCO*Tt80HIpKrj{E0tF(`ch%<)~aolYH}j`kE^ya4V -GW0&V491>CF~D)Hm^n`SvbCLK>E&_Z4da8v+^y+~Rm982 -jrrrr}**dWWByw-UHrG>e;6c)y6E^Nhkb^%3$JGILe1$(!UyH;~CWy8i)KX-mwRJ;T|Kf=`l+yP|Tpu -h*KplQ%yv}6hrmGodtpTpCU2FsEBKie%>p``1YXFC -C96j9{{v7B8cZo!k5JdkFR#0Kju^eKlC4$tEz(oBa%W%Xz{`!sVgT6CKFS&}sP_z5R)?TUlR`8#}1 -dYAMkleQ=ZXmQ9HO7}U~OV`emhXq7@bCh9TnryqufcPUWP@1`eJ!>FD@#Y$9cCHe7FSt%8AW76rhVi$ -Qx(h#U*2TKQ5`08RKnfxXY86xhfIv+gC|VxzW(F`wvGUY-7|Y^{r$=ly!x|H-?FRkgERZ5^|u-qjDKo%z -~nyz4~IkU6ue!KbDFYKwH*JU>4b`+AJi~h3enP5fu%Iu`eJc<;Ju~Wq#n4b>X+eLv|qoghN-YOQ7{9! -BUK6c<%ZAt)o)%pX -sG60Y{lbV^@8J$-4T|LNH~WLyY0h^SG49rOl-<5Dgbq+*r0e%UbE4JI{<_^7-jMR|p!N?cS)@%X;ECN -61)$%mL6ksF*$oHe#|gIB6Nm(c;yRVNcTyd)2sTGDN{tvwfplb`E#$INR5;>9iSz*T!4UXW&q0X@Fsz -W^~c!w#>lVADjSiD~M?0kiYKs2eCJ=650PTAnJd5JOLy_oDP+_p4?Csb5HtnWIC#G@LFEPoNJn-=OZq>09VvrD -xcceFKN3fW^xQ_{0^A|8C*xSqQ!i^{TXkDG**bJ8Sr@2KnUqoH1PTX~d@;~CV`njDH6n#KIL~#YogcI -gdqOmakrMPnC2$~1w_ESH#eMu>(fksVRZbk3O9MYzNgKh=}G(gBY2Gk6j3Q}lfUe?|1ilD{GW|wu+xK -1;Vl)4=(N=lYk8hvKvl~|eJ7V{5=5G#tm)JdF%!Z!5F(a0ixWP|OtV5k`a1z@ZnBg3G<^7Bz`y|#y|A -#uRw8+<+fonkI8@ -6aWAK2mmD%m`-6N1J+9c001%q001Wd003}la4%nWWo~3|axZXeXJ2w-~!TFDP?d6Wv!2BC~#TiW3S_30(d5lr8_P^bj6s=6-dO;4oMe|(+jQVBt3%XE& -2#w>s1IMrMY{#k!T0j#p`sC7QxegX?R)=+o!A5@8|mG#_A$yVw8PH5U^^&S=hQ-bZJ8s#TGVr&?l04j -g3@6?F>qXWil9~OERH?wq_9LPW=%F9T1GD*r@HkLX!$(jR=PrJvhH$8y}skIP*@6aWAK2mmD%m`*}z6H9Cc008+C001BW003}la4%nWWo~3|axZXlZ)b -94b8|0WUukY>bYEXCaCx;?TW_046n^Jd95oNdDRq-deOWc#QisH79moQ1Rc$3iU~JD813NR0?SH>#hK -n)AY0}m5kl-`te);Bb2IIWgF}hd^(BmPzySRJ@w=`#qoWmD_2hk78;lpG3`f0I>XgZ4X)kp12JA-?|R -+Mv^XCQJ|b7DY@`V3g*37zBrC`%xrTrm2u76il+mGOKoHW4E*&lxi8P*1UDMa~Iqs8|A0<^OywU``02 -#F8-bu!9AQGC>jp3YI_8ge0gh68MKe^pHOiR1`PSWVxU*Q4T1p#opEWs3=IpfMyV-sg$IIk5pK}!~); -F3BH=11-1|Op8LhVwyxoo>ErKLU^>@|$(#if*Mn=@A5TsD&IfZk1(fnkC$KFaReiOC33%46>7j&+La1 -)9+8Ix0*S2%35yp?WvO0@bZqnen3@1j)?WAkUzK*n(6x -py#ied#vLd<#vOfhmPCf9SAppqz#7dD3gskq(Um+jS&A8V)>Ddf`~NQ~TC(#+DRy6@TD*$T;&W0Rv3W -_N7gC7L-YHl~UB=Sfx&tc$o|IMEPKOn1nl1>Ag8D#7NWTEMGww&evkiNEiZL6*&{wyN^`%jO;m@2|Uk -Yfxjz(I8Rfe2)vOX|Ex)QnnZ#Kx+3+Fd{0O!qVjkZVY639F`;Qm<-0}|7YSiZ6KwaJ2KcD+w!&48t(< -2x*2p#{g#cU8Eyi+oLPWhsyd|n>VTj``qr|wcU~oBlKhU%ZHhegqc|PV2iQl)E4}bms?tMDY{E7Ru=V -XaOTAW6lgPqN3Mg`IHhrcmB!^#($5)`PSk`%s*!VS%me1r7M3#gwn@X=l5zQZ}s7GR=((L%z5yoKzLD^sY`H^K5bt9*pb676ls0QVIxC@u=v0I38e -Wx$Zz2QCnEK^PE(sU4J|cbi#neE$HQDaD27sIzMa-}EBKN4OjwPeTiM_c^?H7M6G_Zs*p{d>(TJSkDJ4{p -%g0dh+nFF>0HWf9=p7L2l>!)F7OioeRbp}hFTB&eghhJAs)Fv5O!<^F(_|J)-_nSa3*(^`3+(QB1M{T -R6qn(|2b-8iz}X-JA6Lx=lIMz*2`%d7VIpT@C7lq1}rNOy;5!Egz{eLF~2ZCnkxUW-~kUPIQWxm{6gz -xw{7ZKPM9e3E{cd%3V|<)%W#aZz@ZqzP>MK};p;;A$rL)yS%gxx3?)fHmx^(t(O?Yj?zDI~2QulyA5j -RiuZm@~Vr6&0>7d@&!ZW(CZDklIU4b&*g&FzniY{TGne-hB7rAHR4^t&UzNf(pBppt`+(KDcH=H7Z<1 -ReRZLq+9c$si{9Kl=cO4&RuTG>Erw5NefcIKqLcdYS4^^_%cnhdMU^x365~Cos4h~!rWMWfOQYTWZ=2 -Mfbgs$ADWx^M%lf=&DL3F^_>=4P#K0{O59)!Fn%X#;#qtBG^uBHFP^X$C$@`2kZaz|bx=mhHv;{8J$7 -+Bh)cRDdpZ&HVpZ^OU{smA=0|XQR000O8B@~!Wm&~=erUU>0CJO)n8vpFa -%FRKFJfVGE^v9ZRnKqZL=?W~uXx(3N>VwYTP|n?E8N6MEjf0uovv1^Dstm-GT>i~?Y5EjzyU!Q77!rq -isP~ejvP7izw|HR&5VB}AwWSQQu{J9@B7|2Z{B-3fZkCL7Ku;eem0^H>`DRKx10Yt0_BbRGfGB3`FuRzL@E9w&;`Meze5%4aPD} -qFe`ZjTr(*+R%MAWpAS{gHJB^vTrFF-U_4YlIXN%^sZLhI*r?|nS5FNMMwX3Cs`(V0sW#A6LqXBDHgFYWsJ@;i)dYXXMlaM>_(Gz_7-DhFf!P_UyQPD6P%SFM^{(7@F#llx -;}*H*a-QyUxlSThG2hg!nlwQO{pIVC^=)z%#z)0(+5NtPf*7E_a)BJn&Is6=ScY)ryL6}+SEhv>Ij0Z -Ss7&x0Z_7@5z3Mrp!wC}N6TL*^mP3G>3N)hZ9NbykAZ!JPE%iz>woociDs0H}Brao5q2 -k`ERSY|~K&>LL04?8sW$xYXP=dcrbXxqZ!(qr?Kktjm -eJ>}SjD$fctMVlNJS6c_NThKtT>4V;5r{=v-KWOMur+K0(%a^2)sP4Yyd|l;tL33s)?Rqa%0t}ZXoqe -~K;^lSgrhBKwR@d7;a{$HLWeZw>e}u8#|e!)&q{@g#59khaFL3PvvDX%m6~q%BhN3I9Ll6IEV3}}@Zj -CLhz2WsJYG!ZA+}-}PT{L&EZrinx5pJRm=hFgbcgE#xNGoOS@V -)wZm+$SL_y&|M!h7<){&k1%^^1m2j~9$YmSwvf@{Iq)blTT6Zg2EJy7DrTA -$6y~6e&=kzrZOiu}VMg{L1OWZMljd7#zLDmoG+#^el{7D;;l%&Yn{gcmi&=K1-0ALV-|Z&c>Dz`f -C`1x@n>X0*{(?OKvxqJUgCqcfTi{b=+es+7Hpp-Qh$vkYQQn}-xu(J$sqo!$LDi_*YUXN;NUeXXO5&u -f|2}7=$Y;HW7hE!rT6--D#;~|{JcYU7B_?z57>-4O;OMx=e8NHBIaaDm_r&9tak}0Ab6}N0s>$`&gKB -4@{j13}r8h*h;&x}2WxdfjcW*uuo$%&!X}*x=OJUxY<`-#xljiq!6USM3{`x*~$_D*jnjfV3v1!6T08 -mQ<1QY-O00;mj6qrtU;JJbE0ssJ91poja0001RX>c!Jc4cm4Z*nhia&KpHWpi^cV{dhCbY*fbaCx0n& -2HN`5Wedv2F)RMp%_h1MbQ?^$h1vBmRwR!Q7jgQVo^2`TNFqt*&Mh3Ko3QM-R=AJNp>jNak9JUp*r{z -IrIGtZTbjK9-hEb7phu4g~pX9Py9|096_Y(8>3ch2fbw<9zQyL3}dCuN?SOWSjaDxg=bgY>o2Qqt~P_ -E-o6NqkUW!StE^SJ0;i#|GDMU5CWI|om56y&K%uNN>Y{NH+#1EKF5Pu*B$V1)`zJ3QeDg3fT|$hY&=s*J7 -~wsCKNjyxRVcSIJ*(BvKWFm?Qn+hOt49Man$ru$V^@?Q^;B-tlGEyX=+ -(9~t;`xvzJe@+E3LhKhf}#b -P{fOaEyA_!P2)rY>?Pdsc4B-L8N9a&T>wuQ=0I2dXOM@BRLL(L!HWy}jR0$r_2*x -WfN}JJQ1C%gcYu*6Z9#3(ui<496iHfB*ZB4&HR|wu5&ayzk&c2Om55bc`N9j#%B=Y-H6X>~{LMEeeZU -RrU6*CvY0#&2_u(U21r^*XsBG_W%ykzpCF3v(J?5we$aX?C;+`w{v{^vxBc4{MEr19PS@bO9KQH0000 -803{TdPA}lyx(WjT0AvLK03QGV0B~t=FJE?LZe(wAFK}{iXL4n8b1!pnX>M+1axQRrjg!re+cp%1_j- -zp3<{46kK1My1Wi$nOxpxx$sy?pf+R3B7G)EaMS+rLGC-dpXp%*iMdJs^rawT_wC|E9=_O^)OuA{b;1 -S7tzI#Z^M{x4x39L+}%k_O|oBZUSTM2?A2u*cm^?K95@v0AZzy9VfOti6UQ^T3Ujr0dy!?zdR>-Xzzs -*B;uY`+VR&^%XmtLs{u5*h<-tp?bnx*EV1Tji)}nL(!O#_IF7QP6AJr2ripW!3o=tZiC0DjPs$&4tcXhP<@FK|y+ME);@R*QY5>qgToY@Lj8$sE4hpQmF-9LRu8 -gsZ~An$C6VDA{om^gi~Mw<~%uLBRYaRMBw}mka*;a$U;sN4kISQh_IOe5=DS6PGZTZK-429r@-liaC9 -VSLfj2H4x`10#S`yivw6g@$&DY9F(PJ^hf`c2rz~Rfv2Q+RGNwWd5dm=m^o+(5#MEJK)GF7$ -+P_Bz_EHPD4hb0fy!@lmjFj-p~;yv7iqZNW&T!kr|n|7~EU;Q+KK@C6jA^fkk-UH`h$FJ4-`XYBW%=x6=w;B&1G+4uV2=udhd-~8bce|+|&btrT -bYEXCaCt?{K?;B{3`Ehrr|1F1TX+NaCD;@SjVY6e*B48Ro4~8UO$QaA|NaUv_ -0~WN&gWaCvlZZEP=NZ*pZWaCwzcI|{=v4Bc}IbxI5-2MBcR1xoi|Ql%LDDY7$}+`V$i&xIDMLALdzrz -d$ZDg?NBYc52dn(O4Ew)lRCt^&3@j?nko>Dc#8Kr>3P7=n7B1fw1M!5ayqHt3Yar7GKzto?^#W5~Jfk -_zXwsDv{CWBDin=Hxj0GQ4(SY`s>8K|`cPUQ*GRcs1gxyzE95Lt{OjtvQ) -KRWJTlTMUde|S-f*w*@8!@lJgP)h>@6aWAK2mmD%m`-m;y(8!e0034f000~S003}la4%nWWo~3|axZX -sbZ>2JFK}UUb7gWaaCzNYOOxBU5x(nJV3h+%n_@{jsa<=@%G4gbmsI7F&1EH-MN!}kSA3`dNS=vj{(H -IsJ^&J=39S;1y0uL=?-6=x*VZGWqZ{4?hjuj -|e-%SBVk)8y{%?qh^NrtG^2EuSoXZRfGnNZxeaDZp1 -4~I>#Ro6V%7927mm&vg*Lhs*4>6Gec@D_so?HS_?f+njj81XJMf6lv$Mqpgq^~hKlV@HkD1lfZX8`J( -kZs8YHTV*cG|O2T7i|5=WGp4uB2xTBk=&E|;`@H5h46&YkABjY_#6E*ngPw3$VwsOGGU0nf00bomG}t -YQiKPVR0rnKvrHEsD9F@Rfv9;5ed(5OOOS=azjXs%RTA0^1n_)SE#rO8#6$y;R3`@Yh*J;A6L^pQS)I -8Sx22;g=$^5_fumC-!2><$b(2+Uv5{|vUh5U&(V&9InP8nyV=Z`YCBQHB|Epamkb!mLRl<9PHa(RqKIYkM17~o8=J&Tvf?(AD#5UM -D^jO5%T2wNJ5o1eLl50}pl#2xO5x+~Ho>%H$4;zH@jBeJv)UUtMeSV*LDd=X&UXc>kzM*COSqwPs+EiSXP!ii{>2^hE_0RDB6c0T2cvjWA`J$ -gNk)2gU5P72cnBRy-U=rXL`iDazV1>=tmPSa4o`Br3YB^*k3%k*iN0F6CZbZ-d -35O`~IB~_UM0kXe@wqXpSYkvU4i7%thYlP-aj~HNOpX;Tpeo~PrUomb>M}D^a;q -oiiLIGtvm}p&Xp+VI*0d39CNddCo?v+jdl(~$L?fEHFEj{MmTP~CbVlZ_0*LfrYE0N8Nw5FvU*+@DoG1(gGyT)mp<&&-1^9g)dEgi-r0f!Ukf<=dFAQ?^## -a?etm>lT_VC`WOQCC|@Y6lP>E_%Px!r3lAsk-l=gjK175)5NkX`$4m%WvFB -(CTl$#xSu4YB+|zss{FPsL@OjmtoDlhVUKwh|a{|?bya;%ElL_tn4)I&4f6VxW)$z>98qp_~2%cC~$+ -yLbdj35JO&ItGG^05kB(jeDaq5BuB*rM+St8tm38#;8yUe^FTM~U=S8Xtdxw`A+{e-dtt6iTofTe7oU -2N&qmP3jHBK3AQ(eb+fA{}$ja;z<5ZozsZGQ{yvBypK+Rqbg@Fx6cOquES5ahx$m4>>wrbz(0~bS8Lp3W<+fz`S(=>Z-cno<8J2HJ{VTBr_)tW3;uCQ4z#^Vx`_ -e2MvtLAlKL2m)BelDdJFQ~!D!jKLO5V5ZUrh<+JVAB)u<8kUe+;7NM?q2`0`LZo{@3v)I`u%lV`tLwt -Mb!xb+DIzGZcf(7IEHfwg>T@D!L%q$B=Jd|ynQ2dPwxrc?(yWVR7G`&$5oMIQL3WE;v9=}8YpbK-Kv@ -`)}*SKQt}4)`&eX&klZEfm-%+PT`rf4?egwtC3Pg8DlVgQnK{~@z0Gp*FKj_OuZh=me@9v(^7#kEO8dyXu0R);TNp8!@ZV` -i)sO*}MBS3~-aAm3ya?b3w?=`F{5&f=prt<2cn)4JF91Ua;QU}kqVjpq~G23XaGsrrYJz(j_Og(|acb -X&m$Tm57&Vle3P`S4-6B%jvM?-RT+a3RN*B2<}de+g_k#k&FTG93r3iPt*LIAq;s)6-+=*V~smDpDH$ -QDr5plqy)@uFc_&%6I?$%i{M%w0qyV8MJPvG$vfc$R8VlJ(!qAEY`>0F8{Rr@)}GN()*4BZboS@Ei~) -w+D0Oa+&q&gM3JK$Eo)9=Xhg)Eu-w=HH=&Q|+$29HuC|>4I*Zc0ilxh-?-#oVSOS)>o7Lju4ocC(_Ta -zsp|lORhwcNm+OW^NriWSQKj4i@XE#NeW1*SPq2~{C|J97Ls}=m->2Rx7n~s+r#C-FGVkc;izdzO?df -s($4LpZ|;pdgU0*R=E23gc7&B#9D)b6a$b;bBaNRt)dCbrIPYzLDNHR&)%rTePNF?*@!VxYpSIu>_;q -_|tS2}SKIG>ijhK0XoVbJsMuIx+Q}7;)D5e13HveAm?P!4Ic`x@Cf7QvHmO@c$kTu5+OFLG2B8Z-?0U -(g3!(JqPS=4>!CJ_X>Yv*f#!*j5<^p*(tia+lU6#&b(y^R&tLphkhWYyDK{a$WH`5|nzkH>?_$p>xc@air -~l971&vJBMrQ>#u<5n<1t0DD~e=>YL5Rz!pVxO+wdi$l?P -i8@L0`GiuG5-Nb{l74vfKZPiP1qix!xRpr*GWH{H{&ro3ug5Lf)P=DE&;=h4)_I5bcGq9b3lz8*jNW) -U+nrjkg_mLfH2NCuQm)y$d*cm@AIwp5FQ@&vA)29SzJYaT7zu?#^f^r(rF49k{L~=g>v1>gF#k{wqIh -L_c0YFb^bX{!F44P`Qp^r-}2KcTlJgX8eb3>A&xvs_4HY8uvamM7IptF?g_P!^Vb{M_qezRT*2-MphX -s8|oP8HTu(%*_yY5sw)O-PlY4R{sT};0|XQR000O8B@~!WtpVJBZvg-R{R0318UO$QaA|NaUv_0~WN& -gWaCvlZZEP=eWpi{caCv=`!ES>v42JJKg?9=_2yNg@n9gYcZe^B9>0`#{1}%I-=;9b!t#VUfYNL}19_pgTs&kNsjzQoGns$>vjyF>~ -?63MfOL3FZe#~ZovjOz>}*TYJ~X6jY51m6#eYvV?tUt_9g>@mOO3MRMvPK^%+QA)Ro4g76bo)vK-JR& -XYxM|xqT~J)|-TD -pmXKTt~p1QY-O00;mj6qrup7In>U0ssJk1^@sX0001RX>c!Jc4cm4Z*nhid30}WY%g_mX>4;YaCwbX& -u^PB6u$FUcn5?@z)jPsThY2+d+9FCWoavfz;2N+j%+8|lI4HjvrWLHs453+{NDGyU!SS@Mo5jSLQ`FH -8r1Gv(jbtmyt=x&$t6X%a6n4IH+4g?jPP@H_}vo42q)vejtil51IHIMJ`UAF#*pXTYy*d9l55LA? -*O(7M{ySR84X90qToA7-ugcrJe1EaOo47Eaoi;#$uS1Gm|yok}4TeNdv^GK?KSrP0XH6_uKGBALVDc(}|K%VTy}nk6ExYuLFY4sQ$ -Z_Ms6#U+Iq63AiS`yIMP$cW;jumZ~D~xLI9+_j3yJKjR+XOv)P>#b_KDJBSrx=ix`UqoxMZK@yw*?eE;ck9?KL5E?-N1Ztar -EO{S(2&=y%_40f1tDu=Be?`{Qk~Da(kA7ZRQ_$bw-EdAtN9+_wGdp+zEPviyjC60Z>Z=1QY-O00;mj6 -qrsq6x-5&1ONbj3;+Ne0001RX>c!Jc4cm4Z*nhid30}WY%h0mX>?_BE^v9BR!wi?HW0n*SFjEil(3HC -Y|;W7G{+Vw&~||~=*2b!TB2;m6lsu@6C?0{?+htflI3L4>fns1;mn&iUnz~QNS2kgs}0XGBC4G>j?_x -zy5N}^{oBL)?O -UAq4|p?NM3w&alN1yU2TGLJO4r=&nXEb3h@yv5pxGZx)4^;94nbyNMfRe2`|Z_5;w+9XGa8w%c)4#CGnL9>g+< -y3amxK|Yh);6Qj^D7|ci_j^M&G%m|Pn3i9;rkKc*sWs(M#z)rseEkAEDkKOQ{X@UDX9YSwHyFkV2;Q06R -_`c%IVALkQG(o`PY-ziMS>%`eyuE>=lF_HjfJ3XOEVZl{4PEM%$i43LjSFMo1P#pWDw}CG2k^UNTY$e0sj^o68os#f<8TICAQ0p8khU? -XzLa*428N&`>CFrF)z3a^};1TuDh91uyZdd#Q7iroir(-Bjx{-lu!^!Bg6C4jM*M`|_yN5HMuc*Tc^ -@Egk0EPkW+dR#;%Q2%L)cY7vyP9I3#m^+(PN9hQZ3&%Id%1C8Ulafef0>kVPeV5lLVJeh{16U*bz?Zi -lsv)c4_1m`WejYO6ZKE6E@c0TteE8m(TY_1SywAfEy;CNapfM!#<`t+xVeFqxv5tvoZmQI$!p2f+DkX -W+M3&&+xwrcyx3g5{_^AO_UqmK{YT|C`i2j^@^eMiQX;x1O=_rG7}kwt&m~ND$#NdFUI1KJ553AA45P -DT;d3f5r0+j=39cxZe7DE<{GAWK{r3?JTkDib_0| -XQR000O8B@~!WiIdf4I0gU!>JI<_AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFJE72ZfSI1UoLQYtyf=f+ -cpq?=cl;350(doj-6sFj5L9Xq$~Bsw5RxE4t6Vqe#i}p9CE+Bdy5e-SO_nyW{aG -9Q|?xu}nn1oIq(7N6#&Vkf#6;MfNj{q5+QUKXCs?5Do1ImxmDGC^&*(SpOY?<;K-$Q0wr&AtAk9k6iP -wCD%s7+u7_2F2r0hRgr%V{m6z{XkfV$Nu5XtYbA`~IfxvtDzlP#2n(rTRc6RK=je{6@H^8YhCj|`q|| -K5CxoCWr>CbNvO+2Y%J0yS6--+iU2+rjSH={2G90egYg*L%P^p&vK`TMEVW!j(LdY#~e0oDn(X@Zh(vpw*A>efEr -{j)wU4IIxI}X|JT-4qS?F#Bhm|;`DO{=0%A~%7ehJQ0P@jIyx6m4{a9>SjWCJh}4))pl6oHf0$yD(}O -MmyL7Ej;?#MHaC?<%Z;-JgI9vn~L2sG#Lx%G|};xmOeWtu`F<1#})nGrH47JUORtiR~ -CJHw+^4BbDagiK;tR7xyYW&%Mxz*8Lk2J;I3+y;y)I|Jr%~Wn9+woKWE#`%FQaAif%Dmf -w1@-8vCMNWvGWkH>cyt672I%tb0p6?hwPXQhSBBfn`w7)bmZbx -EFk6iuCoJ}PGLN0B6QCsR#+T^{xSOGEqG-iY&W;(y#=S+En{D#3IVg-esDEj?E_}D`2bP6Ln9??+NYIS01Jyxp~&ZustRLEdaQx{7WLn!NtdL3xT+0opW?#N6+kQ*Ny8+#J`|iS>W|by8a1{>QCknY -!~yXj2QTX|L1K+`*g@R~z_w4lCPizctaUzK>v!H>=ve2v>$Mndem!r_lU{@FPn#beQ1>{>FR|O -o&|xEi=WL$xrr7i~++3bFriM1Gu%FNZSvuDmhA&q+OKEBBt>{p1Zmrw%%h&I3ZwQL!vYk%$lVtarq>a -P2g;HYPC@d<8K4_h`k}ZXb{0onbHAqHYJn+SRtGso?+5@+3#}wR{zy1 --gx&uDWZduOOYuVjgtJIAaPcoW7vp?hsdi|2l4vENa&fvu4x|wCSP5hD&b&1XFxi&}xZ_PdttH --Iz`jE(Zkr3ibG3V1BNl!_>S}d^6%{XQR;C70xm?<-YsK;;#YY8JFm^8m*3?Vc5*M<}lisFSHyyVZcJ -4Qt{MscxHr_gULj0P2HD2HlGa-s{mSL<6C`%I07j$HTL2c@ea~hTsuT?Cf*3=bm+@KHTn_tI-+k?q@6aWAK2mmD%m`>oWs#pI2006WB001KZ003}la4%nWWo~3|axZdaadl;LbaO9XUv_13 -b7^mGUtcb8d1X(_YQr!Py!$H_a!@Z;Wc83xD75qv$R(8Y7O+)k6N}igqDN_pKfaO`HKVp+m75QArr)>#thJ=)qx?PRZ#xVg -BdSFqY{H*n|;tb8YwrP1q6n>>wk`e{Dbqcxx6Xm5_u_Jzj&#c|3D$|C*gWxF3q_RTmi7z?EEA;Ki<8k -IuVz&lF!LvA8=LSBnId^shTiKeNsl{G4R{oSh;b%VfDYu)RMk;ld*@ohSRvtkK%m9;pf7*BSdFZdF6A -B?f$@VH=*7?S-0P)h>@6aWAK2mmD%m`;ePIlB}B002k?001Wd003}la4%nWWo~3|axZdaadl;LbaO9X -X>N37a&BR4Uv+e8Y;!Jfd1X?;Zrd;nz3VH8?9gOLeCTN~(8I8GLk|OrtvkDlP1o9N$)l*IzUZt6_(;CTcW`)rfZ8?2K9vx-J$#4}r8b+5BK#B3vo9)R8OiFt3T%3>{=PX%-IIGZ4SI;rh9_u)t=T -y1fjiBh38jYhVZa6!u6}~!1mEWx>eQLKg9b;m4LA$M^hr6lOEACWw4eGs_z!aIzbcd233k{ -h7NAuz+}NIt$Ar|Uf&gX!7W$}{ajew0!Tw!p5kn$0uD2T@_0KYKu%Wx2W1zBcA+S1OPrb-oJPf`*I)c -l?Dl?}6}1Q`4jO;DmP?F~&HM$e`ulNa)eBj=~5cu_bwC9%JQ-kh@uenP%w)w20H-d^vSUm}o54QdZMc -z(Z%GoR3<2`1s?~-5ms*nqt?BvQmOh#$&NelfI@Eos9LYZH=o0uOyqNkH-auo4LOf#NOliIZ;K)&!Nk -#BF%%_Wvtzbd`tCTUK;&%UV>(kBXagMSQBxT^pU*VhS}V+ho4avYA_aKzcYR{)XLV$zOoiYW)163ldd -Jl7rAITN??d7u&|exMC>FF>)!=@3!dSK3t*iv`e_}*{luMY#Wg%i>SOk%q-cH#N9X!CW{JC)7JD^p=^ -!n3R+DKu3%R^6!Y?bm0%i#xDCFMorN)urXKwd4W!(}vDlb#MXt7NF15ir?1QY-O00;mk6qrt&IW9zu6 -aWA$Q~&@V0001RX>c!Jc4cm4Z*nhkWpQ<7b98erVPs)&bY*gLE^vA6JZp2?IFjG>D{%G)Npmtc$$Z!? -)hJbti6s(fH2U3*CXd<4cPDI-Co;R -AvbtKH{0XlN21iFngF^hX7G+gNJmH&46y@N*+MmJTZY4{$&XYP704J-s%t}_R1gi?3m7Bb%n3)cjdBt -utR92S)F6Ar{OPPrQ&l0wV*$4q4WnxjuJS!u@WgyoCD=(uBuU6(~nJ*qhH5e?5e9bm;6UC1rOY$PBi! -_z<@1sqgr)!?^dr>ew=Pg`%qb^O@rpQ0-Vw@hslzupcfW2g;FhG8~yL)@1ul3KWE18-Z8(x%R|03@2J -GmBl4a6(W*IQmMKC>2}Srt12;s$^8PY|CLVnZZ06VB4S6baJjyeRVGNmCWWG^$UYj^w0CxZl|RdJ2d) -{1a{X$rG={_RNaglV`t00cuchem)UMl`p=4>^FiZUrO`a+sg)T^W$lYEBSx&#LIla@xottTI<l0Rr6a -+CQvozM*fxXp>ssaDjQ<(WCEpaSzh*-FFXL{5GE24HaC17xA_~I(j3^5@ZX2p)i4{Aq$tFngp4 -Z^#)gsj>dz5k>c^@y*ax028L;5g1(+g0E+^?Fp-tIL;9L340WUT<&IfMJ-xVv=D_Egz5z(re6+Xfc-5jSAx_Euq`6du?kZJh -){y-0@TGACUaw8K}=yDUmH}X3`sR5icUYaq5jai@bV*@3lsy`Gr(+tRGXf%QBFF`(=q$&N&*nc31`bR=fEg*E^Jz -e<@Do7hjeCnpE-bhV(yID5BggP6shV>Dx5u3yNzhJKV#O -9H(NfW^$iabZHF>u}L-J5=s568R?edo7OD-k2HlcT}oKj$kbq)NP3m8JdtOquSt7oTdUS|n})bJDHMERu)M|CbU9$Fi~{%b(TnS3LJt5C(7k*h^5Yj>4bU -^i26kRXwXcKAlY7Z`N5O$5L=L-s(Hurc`qD>q_++W`uSbr~JFj<#nQQyP2bm>%D#&1;!fC%`ToZEPCp -g7Fp#@3)G|DCzei69rFC6l-DKV#ybR=GaUJ!jqERERc+Hq=kxj8P_U>KW=f2lFcc6S9?H}LK1h(Y_m| -rC;?M@+{!d1cy(Fx6j%ftUw~=>F%WL$*rHp768k}a0ZmgdK|qjQISAqV5WG|m6Ul3)SWh-PhsWCnPDG|Bt7( -s2?X(72~pZ~YTWkAmoE*XhW^f-5<(+e3eoBU5lS2Fz5c{oW1>`d*1#LPk_kCz!&Pl}9;C`Ffr}KwW12^!6K~+N+INgI04vH&&iwWfU$}0b+qRg4 -EDobSM~B^H<|tVSkD3WEkZp9oQ?-xkqshRWDu1VLilkPgi`zw;vZjC+`vLHcgoJOV#XfCZkrbn0~Yr+ -M&fi@kswCWGMtb?PBY7DM=)H~#!bLr;1(%}D(#T&V$IT1mXNtV*is*0q(k=EwK_9bc1OS$nqJOA8Z$d -kOIzwn|5FhMl1f#mX=zxazn&e7fovus!Rs`Q281+I)oL1*bjowKx^XWbL1GBT??6v!A5)vR?^HfPRN% -dI2$lkN2djf}Bz2*+ftKy4!&G4b;JlJ*a~q2~Q=4N42e~RGwP08W?um)-rW(QSj(ktQJ~#oMfgGjz7U -X{%fdee6ax1IVXh;>}VapAo7-W2nMMYpCQEAq#^N(~v|B0Bvy>4x}qisqVI+qP*GmBz(rbc;YzI2B)C -ZNY{cV-ytaELn(JMiu}U(vnW`{HvoNgvkugw_|ooH72%@xfg2R-bvl{xyj2gm>DwXwo<(JyBG#Dw#R~ -7oByP0{w&r`4;;xbO&rzt9BVZ!6G~5jh1Ep--?`+K@J2;>g<5QGWkMMjSkI>DrvyxJBArRC|DW|nDFl -AvNOySy?;-YZrpXCpsjEXhh36_)1V#4S_{~55)MtRfrlB%FX)0j6LW7Kv(pryl5IHAC23#<&S9xO*p9 -pzfQniMMG@r|W1eY8&74&=6WUO4t{Js=e&}es=Nx>zcNOF={?=_bk@zG*{zvBaxQm58-@K;k`{?M*D( -g}Lxj|BDSz#1Tf&|=mS*j#q!j3vn{m+q9$EPGyQ^;YDB2elzuNuT!+d{RA=q4x+dV=BE`3;tZ{`1|%& -H3wLkO*eevP@*LZ_f%kk8ubE?0Tp-uoC=g+L~i@a3kd>SHYKht$Jhds&i -Ud2aYcPbQOA%*4AJFM9kVWD#SNtRb_JWkbFD(~(skH&Z_X5z(NVP%Z%^1z-5lzQvWv(Y{vepiI4}x2k -xipkV3{U42{d($TFdIeuDBV9u>ecd%d?mGV -=RSB@^94hm*YM2Jd0fw0-9>ThN+esr-mfA_m%+SVSBIBER+F}y%``e*R!xIlBFn$#cbCG~aY!b4AP2> -M$hGvs0KwsChRF_hIP>;;1J#9ZJs~tF0r%@(f+V&Z;qIlqse*w -Z*w8SIuusEiSAU>)faD`iW=ad&R4l*+cXhbk#LPPF5rRbE!T;e_7&aTT3fb4AH{w%I+rj)qkS!4Dv5v+zH6!@9&wL%TYt#zG8Qaz%80EC& -TYQ9(6IgvTozXsg{5UL2qI=ZsbQHwBeJ;?Ce%tQgz|S{#y_O}adWlNHvz_W^0*%rKjt$hax+p|er90h -#LjX&A^kNFx$XSE~CK@fRTQ6p49#Q>my+*HM)1T=NGb;t-hwd9CfS04^v_Vrx-iPYfzn(}N0kioCvGf%&I)HEj|IT% -D$5GgllB>MS@APc(KByT<5iE3rX$YlWArJYq-Zc@XO}Y`URhm_maJS{B$>1=z-mIPCw;y~%IT_G`V)Y -0I}LvruA%#(YI8peduHQ)@8GuBXA)_>iCn-HMSJ-@RDfP}a$@I?niUq;5OTsEieeBu2*)H*t=#q_hVO -^WSF7)avZ~8aWr!Nla|8RqgL~g?@Jzcac@*Tcc^Jg}%)Utmr}u9T7GAwUH;01Vx@60dtV;qlih(JL^v -aCf$3A#N$B6K-&lyZ4FNn8~(R!P2kxD5ETrV(R7-$MFk6{yR@;S5j!R0{`ew#rYtvhBU(tXu@#E^-05 -4K*W}kzu~hBn*mhXRL=Qt{*G~`{9k$Ti#?~)X;QuqG2CMGCL&Lv7oNJDL5peh5*Jema9`jtlXdHH&)Y -xf-%|Cc^4)XhQ4&UHWpk~pgUEm)OMx!!lKpmklzDxO8#bVgaL#Ym0Oh&Wj_i}-tAoErS*&IEe*kRj9l -fL8-h%73M$H+6P{#)%43$D9Sd4>@HXH^Y~K;mO?lglQixxTtOKf7yuEqTm;VOew<56~QGUMXYQ>`>>6 -`!XP8cuo#_8)Y! -hLy!F+npA%nbkYa~>@&d&LAl$I73t`A$oXQEaA;@8}6OfdHb;T)2!`-;owHi}EkOM(iy;8N@~&p5y*w -#3M7A2x&|VEDmNuSxBy9{atcF8l;8)-v|y}sJ2L8Zz7bis?F~PwQ_C2ONc{{4NdRYtHX?Wvb#3M>Il&1PE9X>tJKwP<3#1$Vl^KRQvg&@aUGg>x^mj!r)<{KBezCDEx$5D? -m6_yrjcOW#RQhE?5?A_r#iyc2^`Y&FDdAY?^OlcWi8Yo6(Y4=#2&AE})>zbXSNrb)`2wIz&7}pI&hde -aZ*9iTMJ}sXcY2a6EuLelYA*^6NZ>(-Q3P^EiFmRg*>@(4NKZG>{MDWB1@GUEEMT4?u_#n3ec6O2K%@ -@%a6V=?8T>-JIxlO=}p;eE9d`@7eIs;qsfnZ4Z5hWA*spgkwmS7Q&qW+D3-fNpo1S`@~tn{SkQZb_c? -nu@})FCsbIU*UP0K4-8p2746N6WiKT3!**MsdbX*?0@D&3nyf>GJBVwYx1#hTtX|?H=Q5SmP8DMG9=? -yh|M#ck*h6*gtK8RgsfRML#tQjS*m2R!e&t5%MX^)=kR~FZ8Fcr+JKT5RC*(hZgS(tkTnh8%7|(zpd0 -WX!or)FtJOu;8uzd!CWy}TfH4Lo+Zx1X;jVSzA(NLMIa@rP4SebcJ5+U(LRr8eDcMyf)S(dAV#IOj`Q -jHjBi5z(^)iRIeM-+{YDV{BgP~y{i1rkPa`|=;Xn)mjxK(y=!f2LWc{eC5y9kA;_*6Y{TQ?MlKoD2yB --4ZqCS@diQ7DTY)7k_&GJmj=neVWb6-PfM=I24a88qxhZ;l2%fFAeK$Eo^A{Pj_g`^nA -8ZGT-DP_igeE|mcuTq<32Fy>Sci(1&NdfG^hm0nJ8XaZ?np|GoHS{+K6F71*cK%6etqA4JUxfqon1&( -Cd+vYm7VQ=&v!bVXV0E>H2z+pv1TBavh(+iPp30kNCSn+svJQU%Nz?VtpU40coTNP;pOR|(}`2HTx&U -B*cf_gANF2+vj@{P{DftRc0tRf{V?dnxlFM%7{lRGqzl}Oz#zie>CxzXJc60h=9=F -Zb&_;TQD8UTptI{8nIxfYnpXVTTHbPY!W5~w_WUh+-s| -!T=Ol7YD1v^HMDXpsOCso|s2H*`f#pd!omd?MEnIvg@B(nlC!pGrI1I~tow=1$tdK_y)Hol1#^t4eB_R%7OsO+NMD -;4v{)ra;{ZMa!p2_w_tv78f;hDR8q1cFOEBQn{@;~8t5#YvBBm#!0h2oZ_A*oaxU+lQCo${Zv<&k(-@qzT{IXY+1Jt73VsR_`= -sQgb`BGJT~~j-njE$klC_N#pAG<7hIxxSX6`oR5c>7vstB@`}EPlcSU2@#t(c84XWHhsRJGC2IpX#+j -fla@9(biLR(iZiad*jwv~BodR0@ahH6AE-%D#$t9&_R;4OuKMV#RIDwaJVcmk4V3Mu#U6OC5Y^w3VjwaC07nh+o!M2lWsUHZZ+nXePX -RnICPgjF@8_cS4B|4i4%OtKM+q3EhJIjiq|(>QX;&tP5+GCLRv?e=5s?((~aQZMPpxG!eotdoN!6dQg -vL-uZKQwI(QQVeRtC*Co`b=7mFo*g(o*D*Ex%aw8y1beb!J86#K`DKVH6@0HAeIP9dxsPr0%9%_jjve -9@z^XlC3oq|)9PVr}gR#Hp^;z%2- -MHbk2erOGXpgh|H>TSC_GBBzUn+9XJ@Av_{<$jg*8Hof(&I4k5@0oq?Gg9?Hlx1Xc^k5f;Uah@n#`;E -C52Q!NkXc0@LF+==CgNFi^o2kfkB&jN$PdCw4Hi|^~twIfWGM^ZkX@_6VUX3w^8?%Hod!Ec5Z-OLO7~ -EGvZIL^r4{L?f1t}Z=S^-DmH|J|7)Qma0lz%mF7}@tjtSgf|~K*7_^Mv0Uwq%p2a?M@xR!YV7}p^``0 -GFKwfS0gt<`j#Ib>Y0vq_}4)#>H$#WlLuD%lHNfD;Hi!ZlGB5b;N6ixWu?kiEA5>c1}pFouibF}#2vF -~5|pZ>wWT}EG?+ei67P)h>@6aWAK2mmG&m`*n6ZD(%_007=6000~S003}la4%nWWo~3|axZdaadl;Lb -aO9Zb#!PhaCzk#`)}Je`gi{oJO_oO)>a;CyCSGDWKDK0+NMRC;d>%HsEalk^@LJ{*#XnDSzNOe#GaKEpS?UccY(N%pm3N~@GsdeQr5`04d77hI90m{vIh{6bS -+D54jPATTR5pHR(3K^C-_=1eLw6OvqbiiUoVFH0dc5z0SF=ASfQ*3S#77C9f+OAE;;3hZC3s4U>C>h) -$)EXkNE_Vh7vi{qz{Spf<%x0+7GvZUHCS28cDRBS+$mIH$e4@lfYi!08Q2WK~0(uvO8>r9L63zZHwOT0w3_<1=E!T$5Zk%B9Rk7B38}RxESH~NdFZ$sQ_z3hzL?v8W6^OJ`{Nb!LwXKyby> -LElMJ0grkqCcDRb(D)SxwK*){Rf?jh`NdjM{)pAV6KyJlI!PwMLmkb2HW)2;QjoE~P5~O6JglMIbL7? -TgAR{v6I_*1H_zcOL>WV6A-?;ae3m|Fm77YF+mu3L3jvJlJ -hG@07<39WYCJ|IS2>>EyXn`0JMHc58yw8%4ehy5UUE3OVeV)0%tU#>fC`Jp9(2H#Pw_At#eTfEdudW9 -REU)ToiLAQ4&>^7?M^NpRlCgre$R$?{fxHVE$h-lbMW&@fSAH#i$*h7nV~9h;0GlY-55{>jHTGI*CaswE2tYBP$7{;)kgYb2JxsXpg -itvK#T9K_y5*7IPBC#l7w^@%A! -9bZyS+QN95EnWtj7-p&qFvwy5_U;dfea3Ifln63s=xoS3$PRl;IP*0l%QH>j}Hz_I@LI}lg1U#r?B6` -z;!z=7k*0yNd@g2_ECWWF<|}kvDCLEJH`gzS`YGx=1Uw(HY@rmG62!%8o}FjD}n(C5Wd1jX)AaNRXUC -UBx+Ke<}g=ry|_axi&g^$$fBf>y}K|iRDg!tcGwBep0%v+LbwqKVjoxA!J35vM{iG`G!e&gbr*2`oWi -6GUQL3W%jt4FrLbF7s)F)i-R}-Dl-b|e?Kq?$wevFWNON}0@=*4WpOX&9TzPk=C@C-pzR*i=F(M=$6u9fwCxo^I9?7QU;h!2cVR_0sOt_sQYWW_@AdyXp)4zd>IwZBu<-5WCpiQ2Apd*tKCkM^9P+18L-rW*$o8WicawK6kjf;hwYGs+lyQbYI{h8x^@DdG- -lhn3{$Bwo1VfnQ#bqo;>Y$!ftT3owSL@~II8_D^hCy7MW+4JnOkrm6W3HLbtj4-HVS13!7&*505zg5d -cHH>_>Q#vCVySkR4?;s3}Ox;>&amftR1!2j@n*!-FRcWYsR3R!& -Nu}fmsgkXka@Bs0O*1T+`e%>yAn822Zvoq(UtWS?+ABW;rJy)%i|8#u#^m7ur?SAdI8yM|Sgw=u7ap1&Ay0M{g`0D1pDs2Y8KD8u*GUBK~&?QL_0zk_Q -ad?mq`zA9$xF^V5SV~oya~P`z-8tS69Gk(t?}a~Z_^lOCCx8nauh+nFGm^D%k{!Bv{>dEyZHu10`Z4E -2Ltf}~cd^{H@i6~(YpbhkIIiJ^25h3-WT#A>vzH+-$%&tuLo+QV=nzK7rs)4s_D}wC=-L|BW6szjME!SM^*NrpvRuVNtO{IPl60#j>D-~cUC57B6s58vKFZa8*m$TnPgKg*+l!3lmU785btQ_s=cqfV2Wwd-Y%L_$ -Ru75c`_;u_kf_JOu4F=?5^jX?dai}ys)}U)cX07UNIFMulNuoK#FLI7nasZL$vh3R4&FK4bsMzej8ig -@?JP1n>V$4#$c7*qQ{{P^QhXkJ7 -9;D9_Ifu-@3q*57XGI>s(931=`_6`x66R&{dmg5Ge>iW31M=sck7q;@uI8-_S=jQAS-r_MB)O0a3%VR -M$7ltdmK}pdx2Qh+9Yfb~ns5w5g+jYD!4zB9)1UQP?%`UPrWI -B>1ljdTDdukJBJFWhl93A(*%~6lKp2Dkoke!)pd$4gVom5y$W;va!5iGv?>-oEjvlk~H&XQgH+)>log -?kK~QdN!P2nbtk2euB34#Oe9`s@W{0UjaXFCXyo8toyOy>B!3Y?9A;0h|D!fcgMI(V>9n!8w?d;8k|P -R^H<_4k|}S;V~yfUN;UL-|pL7z%HR}f>N^5c;AQ4M3lE3n9aXxh!HjQF9!_?^GH|gd{X>FCG$9K3LPV -wwL8x5jqf&{)2&T7hElx|z%Q+h5`HpiY|wZk#Y{8u1;w_5k}fzN2H&Q%ED>6+0eGK{4BOtO8k5O8$D8 -eSs$HXY+zmi=uFsFdBW-iM9Mu1|D4UO}lXlHtK^>>p&{`lE@fQkij8Rv-G$9Jo@2H~NHcfY4-)wcitX -(bJe%9R`>DKdOY3rwEc^+uXZYHeM1QY-O00;mk6qrtevZBu}0RRBe0RR9U0001RX>c! -Jc4cm4Z*nhkWpQ<7b98erV`Xx5b1rasRgkex#4r#&uE{9o9CG2Js -PmAzwn03k6%PN1E}xy}a0$r28Ywp5zVvkeevx61(di>gZWcw^Z9R#d2 -TqNi@vl3rCd}Jazp5q0;!URr{GGPaes#?f&P? -nIR_4*^3gaHIPyj_vWZwB3TLQ?*5i3WrCQ@&V5&D<4bdD46xm$(ZHMcnj7j9ZBBKp|um#jgu42pN|ME -eD(#rPmMQM$Z;ValM?k#N33=*OG7^aFOc&gXOy1%%D$2KsMQ}5cYV}+jx~k@tQFUhwKyEGwzhLD)~;_ -2#_5$MZn=bl?MO-9smFUaA|NaUv_0~WN&gWa%FLKWpi|MFJo -_QaA9;VaCxOvO>f&U487}D5bdGKkQhU983GhLbUXCWbwD@lFbsxb(}_AoQuWcsm;Lrp@@Lw#TQ|diN$ -Qb)BA;{$^EY!SbSczk1;JPIcQL})$;k<`co)!lmlb+vxM#l(AI83Hg@c_ggGAVJRZ4Uqc1BwdO^R3xD -SQpWIjRI}^bd#%KG%M$6)b>qSnDja^iNhH%*7~k?jGe-~dB|$&xKWJEn_79k -2NyQnW{gT&IFG3rSx#t`3sq?Xu6j<{{yh^eH}!&$lbG@S?GHFVhsAV^TlTo+Biu6L;FI>af^T?sk3fw -mwpfA=M4RYKymeH<1(S9nRNOB$r{KXM2oJ_0ZQjSdG*2)a%j1m3`SgAh)S?HM5zyOu)#AGj4N&eNerX --|1sV^N%Y^x8t+unaOUapbMNY^0rKagA?R(CB7Z$Tf*l#V-06wnN*XcHU+kG&k#y|7yCXl~=&aeR8f)NmW8-Ei&v#2~1_zSTk{!x`#UvP!Hh-#p&+qAQhh^R4$L -m%@2AQbeKkPk{s;k}p!I16*m!mBZ?dwu$aC2SlNz#KO~2>W}^fmy)j~@xS865T1?9hrL_q9n?CL+#8>d2synzsX?C~n -Xmfze5(ZnZ*NJ`q~>&m-(K_9|f>pL^Ec($9?lK*#^7-{IG>{Gq6BxsA8X5rsu;*2LX&IurU;3LDGk7% -t=M;;+^ClKzgXF@2w^Z$j3rS)9J0zdtE&%6cM60%+eyxQ@!E^cYz$*F -kT_(IhC39gbd#eM4Cl9}Uiy`!G_$b-93o&n61%&)tGZsEs&4v)xO#adingqp?NapJ-PM2MliBRz;$o) -c-+HM#ofU2SP)R-e``|O1ebw&vc~{+5b=4h_juc%hZl%a?Yx>%2DK52a7 -tM9x&fXZm1@&)LDHTpqv`Rsr`bZ>qd6RFY5vAC-bya|tEku> -cY#~Ys6n0f3#o=CdpaHNr)3wMO)C4WNh1kMIH87_nl4ZNgt453V4j)d`G(d+QrattgK -^+afSRawud2M0IP(u}PekG2EvV5^9CBC$kz-yA#SO~q4un;LVCwde*-d9wp-rqo-K%cBPC+g27M5Y79 -{9oM*;xVu+{uDQN$GwEd))-PlErSR1Oc%hL^lQQO;{fUvECD3ZtHu+IN8God)zc%Ur)^|c -w?#~ZcYF;jo}))(+??~61b82C8LA$ReIdRBb+IH^|43D2qQ$$n--wE}5`3Z(_j%bQ9qKSW`??L}{lX} -ZdjJEQwzE5wnO(pIrU{Nrf>jK;U||HbU(qU#qO3}qzUojLz}3k|uvRt}uu@oer}~1I$F>dH#Rlf6p?F -}|hb}W6tn@vv@@64q!@*{iP_Rknjuh=*c}j(X^}ijg4J8ZC@L*R7JWQyEam?xaNKibf(a#03v#<}r+u -sL2RKC;hC)kHNE~ZG`seHQwPvP2b0_~~vx^Et(s_rTb3MZ8BTJ?eE-{;zxow3{|-^uYHe2TtyAbId`g -QmcY2j(@LgnUZg*WK#dwwai6N*#IJXr`de(3}Ti$;&dH{XrfV;xVs-Il-5?sDm;AgAldcRuJI9R}#)Z -XH3Co2l1jUe}{BYp>Olz0Zr)G_5yrlDS(>{eWT+iuVDDMZ3nTpmbiPeqyU^=aC~#lT;I2ST@t`4OVCy -VA-Md$QL?NQ8Hwd(elg&2s#7R#;JB9~j~s~cJ@&f+8=;=@_J!f)j8hx$|Nmgbk*Yg7a?j9FqBT_K`6+ -^*=yZqOPtyGq4;~>TcFU(B(tX$M5#D@#ef{RO)EaQg6iUiqSF7f(gSQpKXxiFEbP*2 -2zeiJmBK%Vr50}Iyhi}*l*h%abOElbYR-Z+Q=E^Sc(bAEm8ypjVw^$ssiYd3xnFV>ogB3nT0L -|Xsl=tjToi^2LHxmc#%uNI{#bRWT!2`0K1I_t)$?k^R82=rLYjm+5+yigGO@%90T;iP1(5jXwT{A3zF -uzH+Xvq-n!CkMPS@}u)R=M2W)Ue2cdxCg{hPU%VxGc06-9-L2iM{Q#c4ToUqisM@WJJ7+ZEgc4?;3ZW -`l{&TyXX^p@ubb;t(VhyzItt+tL5gh)}ndeYxFsx5oS)F7)0(hm`ZKEc4wWcM0VA!61hlaPRby(3Prx -~mYtFL7KnnK~z0WDNslymX_(#>iDRN~RbH^Li620ws4X08&Hh_P9oCPWdMZ!@v;&w1jXF-F5dN*nvgA -1KD@l=bpDmGZ4NQC?i_*+TiM4`bpakw6qZh#}#khMJ>U1%onJd-=)nwi$p}N7*J6^-rvwOPBdu+ph%7 -jZw_E|Cc7oL_a7@-W}FrPZiY;=m*F5@GA;yd7I~-Do5w)LP~`_t(?hmL)aaq7g+HI5WD7vUso_GUcNLkQl-uiECWt_rTyq;LBMOHK5{E6+6+u0#(1xm-ir~{IcrF9i%zj0AS@E!OmRCN+*rp=eCDeAtIcE_B!bG6k`@#Pks4=lyZQv{H~Fg6Mv= -|t2Smb5&#gJK|({2i)7J{7#cfWR*@GQuupWul0y9Jw+LmXp|p`_Okl!AW#efgR$O+lWSj0Mfbw?@1yz -1tQA2Nd!khMz2AFAeDA!i#(7(0N^sor1QUa_iVH>wB2(AWBr~>b-;^2s0z}6v4#;VU08!;`{)fQr2b* -WjLVYs5yaOeT72j=F~{B^k}^4Ahz2yk7OAjKmx(Xx+Dn5XP_69!m&camwi<{fJK77Ie --m#ST$I%UXtWM#JM^K@@4}=t7}@dBUZjke>10D1tW+ZZio_3=Dtsa2}A4mu$U|23u(>GGHUG<1LU`-< -<_UH)sb^n3;NgAj}jM!@fVAY73(y?$X?@9^t0YuP&{&!cECghX{`-T0gjJE>EvgF(t>mpC6`Sibyvx@ -p9qCxqP=d~b=d>hD!@>68U|bzqA%;1;`g8AF{peG2%8=8Tc!tFMp^MfynOj^KzW|p9sU1$ccw)B!nu~ -f!kL4f@rm_9;0?iWs%?W+3^doAqcDjkLJRZ+_Zr)W@}7cDk#Vp&u$&ow@uOsJ%p+{V2g!Usv8S_eMIb -rjXi~G2e26kAZWe%wcGQ4L7%!3s1nN}lA@+e$95L*WX`P9)LhW#LTKFcTk3nS_L->O{jw&ya-nmXj`I -rnw6l%&l2w$*cxGwUv_Snr5b9v(jmm%T@tXNBlnhaKqgoq`ah2Q~#i%#wkCQs^Cj4ZMHkO}-8DU%9dm -goIRz9)GWU?|-byN*pq>}CS(wqYQ+BZ)*|w358A}4D|;& -di=hAr5wfM@GL-?0l-@XMk9kwobuRYD?jC>%<7)CaCVcJlO6h0l(s?;gDwB~#pi9`kHgS4FjPE*zMbhf2$^@NSA~w{2TbY -Vt3sMZ+S_p!JM?h3A<6wBE54xVEbZsN!V|0@Hp8AMiGh-659zQBP55p=WDxfosUJhM`mIjbeA$dv3OUR4IxIMA!EU!t`LRQ~-!v7uF0xSDP@8C1SXmOuTAXlZ -#wSeog#hj}PnJt5ukA^bqdZqP3zVyutWc)oh{XAD%61CiQ-w -T%>3){Y*@{DiFaq^zd|XEWU}BaQ@B%K9lal(p<+a7@D2@^YgieEzYSyf?T>ynHsB>C(d-3y0Hte!fyM -kBUV$mFIT;0jWRc{gYLrif-S~8D{8g79!DIt~!nT&F7bqGs=8xnp{kEfavF&hbJMv-@wUbNxHd@}v*5Ks^KI2BzBW+Yw{!|ar?-~SpQRKNZq#0+qKl{y6ue98(AUMm!#k?+LdN$==)e+uhB<0BK -^4D}BXrPdIL;hRiqxXE`2-0ASxyq6Gs*KL2)9fSVB1?x1CmeA=LaXbtErP*)9={;Z9Ljgcm_n99*ZAa -2OU)#sF5z!*@AwWAQP)gtURc-=P+D_9bH`Nh2)-Abr-D50`i2n -Xl270o85Zq(yuyX9;=m!iac6t~MoNv_r~QG9S4*21-nD%I`t5)zsCyz89+pJ$!%0!z6$~$FckJ@PQw` -Fwf5Ha4meXvAt*9aYwzi2Px2y)4{1P+jv)d8mrTbiKzK&ooDV&@RKWy<+wR_h$p-NSA2l!#+P>HgHD8f>Gdj -}oG#Fr-}6!D0QQe|kGsSbw}9{@SN`748|vw9lTaAVPG;~-*IedXqhxHFXYSpa*&%Ep5O2J7&#Q4q^UVLaU2B@QZuP^P)H8Q;Cg*WvyfjwAJE-om?<3(Q#?qVvb@n+dd{OAOl -0Aal2ku1fpeZh;IK0G1`1$}Ypi8-hap5tW>cuaWJKQ(tKmcUQg7q3siv(LhZS{A)R%2X#08sx`)1*@J -QUg;uNB{X1}F=!~-9hRHNBTNIn>o#tLIdI62$=6-C#~0sBm!HBucg5$w`SpLrtNe*K{x&b^TFr_oRYs -G<75!qV&#l>-u3o35Lfc4U-JFXp-l=QcyJ`>ecxYAW3j2B~E_E`9+SkWD-`Y%(=p`Qlnh9-G=H*z=7+ -w_NmiM%sYp3N2mZ$NICJoz@n|KUw_PJ3;9j3?O%NjjlMyIxee8^?Z-=J{$&` -tqgSCw3L1OF6sn`VL(X#kYkzdf^0H+}pO{>knaaf)Dc3(5 -1OD=Q3(B;+T?bYQE;_~a|ggj?iFlJJOoPVknB0`Rf}9zVo;Y-$Zl`gyAhgHj$taOneplNOX~_$U -)k{_znslXC^m+yENW%$OwD-SPsVfhhm@zW0yS$Hzs1awc7}GgK4D+V%Cazy8r;JF@E!bssUd3ec?NpY -75?HJYasf!noqC{jEDD^(cp{!swYlS1v4(i@BO`x&&>5Aa2SA?(3z0)@ECbagkGNtY9L?u -=ST)$5)I$Z>e`5g<1V7{>dr(o1|^s&nBx4Xs$oxe{5g(EdF26po4N66&v#>78N5;D*E~YHzG*reh)Jy -Zws}wzh!kJ*wllTx$o14KDDgc5_l`xdf5Qrj6DevRK}wry#S54?4R*6eaCQQs2J`bvv-7E7=3(wms;z -XdQ@K`4D8RU1lx3hRf$-z20YtDo^-5o$nZelzN5iLe(mZCvu-D(!BqjT%@-wxJ_Q9XSjO1|YEQTYVkB -4dUL)+8;r-LqSkT3?8ns~(=&8QdT80OPDKINezO>soLs|q;r{)$XEh_zGeIM4S8Rd@w8XwmA=5IcMUd -1!UpcT@PmTN@6aWAK2mmG&m`=I4Y;ijT004aq001HY003}la4%nW -Wo~3|axZdaadl;LbaO9dcw=R7bZKvHb1rasl~%!W+cprr^DB0ogC&p5OD-MH^pH5t#4~Z5vDNk{LBvW -#Oad$bT2>GF_U?iNMM|_Z)yi4&l!^$h8UGn -Srmn8FCIVg>+3nVPwsKL2rNt+ -5~+d=?J7fh0+?LO2(B?&93Z{huLVdXoVCh;W{xMc5L8&>+f{+SI0Yds(DfkmM|@twjmjTv1B7(6XQff -}N>tKx$Vejj&00khq4$LTTj}i;2TxJ%cM@H;(?Up11te3TbEEQ=}4w`VWtk!&dnmmMzbc)JlGH6)gxZ -!K{8_MulPO2pGS@@6eE?m8m9|arklue;AF^E}jLZy-D%$Fd!&60u7@_m}(7^4w8C88y_NqetsEX(qK0 -;{&L}j_qIcsK}R<2t=@>fK|XPOpG;k$og6OnEXV7+~nq*hHa75$4utO_i -f*XTf^0rx1Tw^SW!m4#4|Z6-S+dd3ySO4n%X%DU7))(bWD#QndZz-T_b15-2`xcF(QwS_#M@oS(y&!B4nO)Zp -){U7)4rf>7bQAp<4aUUS!aaSTOvVz=ENEq#Ugd#n(ry)c2U2(eN(XhKD2(^SElN}C -VC$UOpaK4R{LX?EHO9%#ej(G79L*kK+ZmidDV~X`v)4g$8S_Az9#K*-dEconGmJ#~Z44eDJt*g>0#8| -vr5Let~dAy1D6`^W -OfRKtkZ|%o+&576Vpw*eQIBMb0MZ(C|G4eZf=Av*CSaFXXEr#|S$^G63!m`K-YmSh%++N+NVMInG;5^ -IbJosTMDET5y++DO{Ecf|fgu3gAO`A=5dxqPMm4bkk#lQs|&C8r#6srP18+jJCvq!E9 -xe{`vL_9CIIqII>Hqc}*D?$#eAK)KhHGOu6S4h`>n6&?UO0E>GNf-^Q6=!spv5Igyyswnv163~K9pKO -43sz)Ng7Z4!`UGn}F}MPzLe2e63E`{f%Qjt&xCOfLu-Y;;l5vexUT7wGl6dl?!k55O5xo_%4)3Z{{ZCaT4!L1XmOoQo3K^hT$;sKpR#p| -;{CIY~*b`Y&?a{M9&XG+jv=luc3O)U+rAn(nO%g4;>jdx_17}`iW`ZTzrVl_T8p@3$^tGUkhFeR&ky1 -#9)N{ZBmV#4DTp{V<;kTGn$ga_1CrPvK0-aWhIux(Y%f+NvE=iJ-ZXw5|iq;gDISkC>J;nTSAW -*VG!wb`U(0dB&PVWVWp%@Tef{#p=ScJ6{&#a`d5nhm!np!^d;(0-A&x1NwTPcxHbs$@A>Mny{F?aNp7 -~VOc)JHG3e2eidHM-MlNIh#hhtykOs8%q2^M-%fGXLAx|M=EICRPO3W7bOBDQleReRA^CF({LpLi`Cl4!M -!TOlwym>snz4GqC81cu${LTp9*rcznRY$%C1fs39mYphX6h2f&ZwnvhSLtI_)9K(mMIibd{Aifc!)oB -GL*zZA4uT*CLQn-RC&JR@6bbTu`z7<(b9)+CuSnqt!U@`t5Vii)%4nA(r@JU)xqVVIHR`4DAyk(qJQF -JaxD9s)Pt!FW0i`R3=h$wf4@KT%F4(bUpq?Sf!t0g3kOEX;s@3o}n}+@=>T{x-;JidCR#jrQ~ba+K+8SpKOm -jF{7tV%9eoJiigHqD}Ch*wRP!tPLkP-jWjoFlag+dxqEV=)E~ndctNOofn*M{#F}kx2t8o{QCKqoBMG=#3z -)CA=pt&ke1U}0NW-q(rohSY!C-LCcX>QFkS+)U# -cw!4>n)B9R)L8}sG4Xg+y-#@Y~PG;3{k1~b!10)jTfqDgs(A;y8FRim+X1Y4DNWG<89>bVYTe1xaFLh -dsJ4ob)%+kPr!{EXMO%eJGJ;CTRbZ>USe7oA7*%#OR%!?-0VJhzcIUHo*O%`(w!mBsN`=@O9KQH0000 -8045ZeP8&*d;duc70QCX@0384T0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)hk-+V35Eah&q1ieqm!es< -5@x`*9uuMN(br`&$g+lp@y^q&0xGI?krQ+Hhyxl|V3DDFq{U}}JmJ@>zO6n_9vO9KQH00008045ZePS -ZAumN_N>0ON%K03HAU0B~t=FJE?LZe(wAFLGsZb!BsOb1!XgWMyn~E^vA6J^gdrxRt;AufW-p6XnW`6 -Yp+QZIw37N7wCcl8K$$ndUMQEkZWe6seMw9d~E%Z@>2i5CBPkTszZt<~*|-i3A>ihllt5pgnc4f1s9S -nic0$wQW`h&+y64&hGB+PNo04)pb+H>oV1Oz4Jf*-_FkIMOG_#xy?1eD4HZIYSmn5wW+doQr)QX>?gf -!@LAHRO?j;=^}zt8A$GF$rmPy3CXH^gwKm`Dn|fzwPaX3&UGNN5QC?3}Q>x^u%u)qy^K6+lN;>5Lq>8 -zl_u@KhF0ukQ;$^vhY_QmV$m$wCJU;sR*Uw_JV6((J&e9^;*;!TPT -5YmTJipRKT2}G4%3)4N@ha0ftURw|SFolB$`n%4!W;kPL&^Hd$`ELzi05 -;mvS!{bi{)O;#3mrqPaqzgHSZCWKF5@=1CMn_g}kdGfw0n{rv^^7Z?2nIMq&I3PV63udy?!2MX%+YNr -w>AQ`ts6DrdFJO1=_^Dncu--X6lm>NEZI{iq(zeyhq}Inpt&2KqvMc>6TQ)LcoNSv5)9ky`)AxT!>TL -M}9?JVA0M1%S{Pm}#n&azv3Xmr1TsL!mF~5MtYgi+E-`tpo&|IJmArMCv?EC<91Qc_!ywK}pqK=EJB+ -t^1AHJWcmlxaOQm3zlsJH|5e+kD_7Y*%$eS=R6IH)k3JUD6KsI1{}ybf& -Wi+bHV3Q%dKA;m^8$H_ruJr2ln-?FyKb_lUeSiGJ@hL3p=y2!d -ySJyW-=5B2e)sY1pXVpXe|ZhhpB$=v_}|m7c8*V9fAHUZ{p9J+&dxGV>e_I4bCiF`zGOwja&HQu -M43lea=o|1kAayu9Kt@rm^Ody1KajY80D?(bMnfY7+ydn($ikS!v1tjNVIH48w@)_k-Own(MP5I4-Xp -k~+Qj(5KFwAjvm1KZPQz(FdOY$5jp3w#B#H2~0~}BQvKXP$Cl@?D@L@Y}M!y@4hu%?7XOK#RC@9ou6# -rBLj@#w^9tl2Mt~JQ{)FOEquwAG171{Q}R*Y71va# -Iy^5bd(K{1*jcxkQ0SsMS=2?C}eT~)q;C^&}`w9*RgsBtfE3i1{Me!8g$KgaC~Mv+77@|8kJOMS%W9S -MYS`Lq|(S6ff(GG#P0HU+^!i&D%7o(nh-TnQOnxKV}JW(A4nfD&wyX9)J0M!O;ZVk5h`<||6||zoY?- -n+rI`Sfl1$e4hoXGoTw|>!$7ozTi?IztJ-7GxM_GY%)IdR;H=Ca3=cEAsy}z$;{2{~ZdY}GSD4Hd?l+ -G4wk&jis}=?3kPJ4%zvwb%8jVI|I*i7_qAy8=jbRHw*}k0I3QS$y0qn{Jb~PUNZM>D85iet+(z4cnot -;)&J$5Lf*28pjk28;|N*&SvC#rk$TPAx}rZ==XiL%=EW7M_}=m3gIa33x}gFS=+Jn;Dc0}nsy3jz*Jt -ux*7mZ(+o@Ds?f@kAXBznzd>2}1W~aowFob^R`G6=~bOGq-HxBp7=Et??G -?i<>QH2}u7f%Lt~zz&Re$3DyH@I2@E-!;T5+#ebNrv;-VihJTHwr`=Y=VA|f9LqlI<5Y;fpMM!Ujd3; -Iw)|Wgx2@p;fd^)oY8!Ak7!U9T#cDvfUtZ_>?twgsj2=V?i+Ko{XIwVjN9oyz36+|nP5a*V?tan)H|dD3<jnhMgrrVa6bqfx0ct>~Rf0C+7Zu-!< -B8D>qxWPmnjSM07>T*7S7@I`nE*zLMobmqije;O6w)#G3YNzV+<`q12-E0wJaCXUZf3{-QZZJE;EfQH -XTU`V?$|_zbmyX{p5*Y00}SwPkhzrJ=v%nr6G{SA1@Fk_&S`XGe=nq?hnx7L -w4wucD80y>8q^V*3O0jVrj!{pASStwL%>mXM}n$%}#&84uJPJ35o=kivu=d6B_Yd98?8@ovzuf+N=16OvN1H)#q_!NPDOK -L0Ff}a-)#Hdl;CyImBq_)kfNGd3}m0HtKiiskH*E(wT$ -4pFT?OO}`XmR6@s1OrY+a<1(eh0oKeVM))QKR2Fm6S#BUz$1{hHb81P$LNo*Pe;JmO&AdWJ&E&b1w<_Tz^XOj=~tfs;OFOt`?NeABu9}o^EoqfkG1i+pP@oTu>|>KloI|%WGJ6WkD-r&hZd<%+Ta -e$N7)kt7O^Uy@hH&8@w8>^U|wpIt8n!eq0;bL<(*l^gRnuQffg%? -%5ifklfQ%y+MgJlyfIVEf2duM0nGhoPvW9fV_$-VhXlwC!6#2c5hqrK9co78Kd%)FcK4Vhs)Z6bN7Hl -MqF<6~E0~Gm{#Nw3sQ!<7HoRGyns>{-iBJL#)wjvpxPU&@0(xZ#U@$anl)5lK;Z)Lx631Nuk*p5vl*e -@Q<0HTK5FOQLE$xIp{M{fZy69_^AH;oU}v-QI2|L&Tu!@g5gt&FxL+f_$*DTq^Q>z;l-F8@cK%$tgMM -$&lMVM0R)F^HkQNmu?S~9{?SLSVK&}>W4MUB|9%VREG+@}Z;97f67b&<`><5d%ZwaS@ZS@Evb5m8GYr -e6h+tL3#M*<{z8!~jv9a1>i1ofe-K1+jwYns_N!i7_-Zm5+eE^NHK4l`xlzM~G8r1>)B>~1t<~c`aQG -}xpaZr8yqb@LW0(4Xg2kQ)jrVh;xs<$Yx*GaL(Q13rWj52_Gi&Cd+?T&q->8wRA>^iQ=?6xpJNScBA^ -z`uXPPy!GgFR8o0q18%hYq*GwDtM1=hHG^9Od29Fq<*}!<;*W;cG|)QOn -h7rw)-wNQC2Ah&BNU$RvaLEeIP1(Y^&7`SGd((k5nzvj%T$sUw(ZlaVGc~*mLHAK1eYD*n&G)9%{~Xq -wYA^usqWc)ndw2EU9yo83^>PUbK6rE)GMO?6_rH;h5SP_RZb%Wew9@%b(8 -xBpPy$}6b3UUk?%ZWAtAKH3yh4^?rnpa5|m`bs~Bh{IEhRoslSyhIFf${TH$s@t>>_2bPO~`bVelBl% -I032ir`C4U;RK#x^ts+?yCa*x^V*_zqFZNp-5m#4$%RYqJ~QktqiqugmHZqale1Dj6m130xvifCKx($ -CFcaUIr%`M~=xrl<~_7^M|&1s**Gn7vKQe>Fm(|#}ClnI^6#bEe^BrLST34R+dLQAf4CDdkq_QUbI}* -WwJ3%fr2U??{xxLY(IF+YU8rQFqbg$_@z5_;d_<`y0a7J)p9a-u#nO8u%8~4$zVA+mF$U>y%=T#eB2$ -UmZt&VYQ7j`%KO1!pbsR>WprsK-flL!ipIC+24MyxCh|(cKni3`CR^P&>kPAJjiSUEz@}BlGm21PlGw -^buJHV8)M$yBIf@JP{ZWrVY;2k90UJBZvm(uJIK(R%qK^R%aJ7O2eeL#6YIZS^%90h!e4DaH) -5e5N!XsMcXQPoP+2L4hC?i}Q#b3N>-77hK1B~|Z)2BzzTpD(q{Dj-SXtFiZ-M#m=z7zM7E{qULc;mq^ -$&`5whNMHG^MU;EDhK{V4#JBJCbLPFu&qSVF0*SVl_Tahkq3zb?YBXq -&w!q6;7c0$X;;)ZA(lNwi}rV^3)(i__8`cvA&<>KeW35v@u0k&ZE1;wvwngOOtI^^FCq!8*@E1M|h6b -N-fJtv$%33^DCoUhS9oVEG=y!DoTn00iM^6|uk`BcP1+LZKYU&l#xUi%?7@_p0v{N9?N&Q!E35QsQ_K -KzgBmnkrB?vvOYq*%Sz)kU(Y)lInt36Q`l5chD@em?x=ce~?W;Ph{d&hDg%Ivk&lnVg^?C4<-IW#30y -iW7pxA-3;8jJL!`6|Ijryjk5YC@tX;JTBBZ+3YaMYpt#mG3>!!L8jgo%y2BOZYbO-u{mL3reMbbi^uK -7$;;zoN-$5Bq+7FI2b{CKt||J(?szxL8x!^k^s=llF`6dfz&+EzxwCRx#p(^P -e{NnV#|K4+^N2Xcn&L)XYg=;X1DkRb0)msrOW?T>+7YS?DYYcN>Z79yH0e&TTV!UBd+e)k?X{1XYyy3 -sAFfKQivyj;24h1?;Z5t7XXCgBypmY9TDsv_8YG!p}EivG -2>jghV29|;F)-B(T_A5dHAQ-{`92FuV!lW`%wr8o|0PPz(6iH2m#pmuSmRMD{nD>zz8j~S;}=p;<87y -?oi47a@(z3y)9ABuxd=B>h3+iMY^I7VK&w+aCzB7aP3a;hX=rA0n!iE)C0gj4}d7bs2`-M0-%2%0Mv- -KA-Im{Gaoz92edKqMcqnfTt*EVaiar@SH+0E##D1Yb9r-*Cydtgc)GV$_WO4wl^C}!=*I1;w&A{EqYV!~EyMSH@qUV%e#`)=-OZ-JV)tH#|^Pbt#`$_DVdEXTpXrw;uhi -1BC47(^)D{U9$FZ$`)0b(ibU*&FgzP_c}+J0Nv%!6x*JZrO=wMGclPVrmtBa!fExk^q)HQPq~Jfy?dr -1v~%^FgI0dao}ESvSNf=0GeeBsLyL0B;vIWSRoD+6%_VFot?s*gU*OOC1td9fHFi$!o0v6aNgZO)^6up~6Uy?J{zrsr96>Y>lW6XN3RX8tP&Z|X{uoCed94LMPMsmoF7myc4rUyd%E^ -dB`O*TKP%zA+>p7Q)qI!|%(I?-3GE@rWyR?I8N!e1H#?DE^6D1kNQse2ctIy+GoH)5I&PhPp3R5m43a -zc^6fiDDxi4VW8El>T-dFlO9vG%Wj}}MMzO8EuVVo|Y$r9pthenOg^AWS{@$G5$=raJ*fMZq5E!YSJC -wI5O4pGr7b}Dq4o4A+BCqsHXm?CHvR2npT^dJ*BD)QHy+t>p_A}Xc?HEhtU%i~{vjD=_rkq~vctJ%Hd -cd}RSPPmAAs0M*nmu9P#M&x8kW4tL6QZc3ruNqFCkDkPS{9~&Ecqv}Xpi!txMR_#hGIN+KjFE{ygVRP(2VZX+iYy~G^KA`m$}>A;R3`Brb=j3&BdL -2o_?}viP-;1~(-8x?kJjUZJ;gK)*s}u@_9w`rCD-4#T(JvlPyK)ykO!0kNyN)}kac`dv_{>m?Qy6!cI -(vcu|i3_>ZepUaL`u)+uP}mVkor!?or$6{`E=QzIMa46g^NpsrKdI`uh5Sav^O|VLI}uFNpjxFeWA1o -q$;P)QdDVgC5YJh?z!RC*;8}buScXlcKVa7`!RtafwDQz>%LZ-%)|RnRgBc${HeIzZAghL1GE)(~axD2iqVFiVIG@(K9(<5hjX9BzqaS_rP1qkJ{!$HEk5V9s#?=Vf~I>Xx -=t~GF7&JySW0qnNJD5gr7L{|>|U7U-2J#IKl2*M`SeE0grtI?RS>4hIbx<}z)x{3IYhh!?x>KMOh60$BDz7kvrg=$K9iM8;(YYqb_|?D4nU&2GnPx(f#ZYa# -Z!%A!Jo>`ZJ)b=M;lw{iQ*tCLVT@>XNn%yuGR$&!vUWMTEur(JI&C#3b;&AXyI5?LPB)yd@A(WuJ5gK|OfA0Tn(tJ@*zXmIrq;P;KrB6S#@ -`-;1`nad;&KDWxVx%3AeS{QaCTh-TwL^1v1g!@v!NTR1$B$y3zFC{1!y9d0bI#%K_`{GFw=Mtf3l=mB7Hsu_G;YFp0%yp*o$a2NC7B+Xd8C~iRhoY -nZE;7a4xQiqi<7Qq$*E@_#>If1tT>j1I`&gIH24D2C9`iXeGGG6XJj2z_=F>U==ryENi`AeS)A*D*nb!Wgh3<`o*V`L)~U6OLDGF({1ylrH0 -O4QpjZooDw?1qas}~&?qd?t1z+>e?CVurJm2R?!>NXWY{z+Sk7fyl*G*Rgdaif(vu9cU~fjPziDIwwj -;KE(4z*QgrM=G&XWxg1iz<=v2pqN?%ZQ@IB0?}Z7zE3eT)Cnjc)_Z3eaOZ&ZNDmI+kqKm*_t%SAtIrt -`aIw2qT~c#pkj5>hLS1mZyh@K@zKjx4tpZ{eFtf6vgrS8 -IImEt7=!uL{lNrp&Nks!a_#+$rxwjHSVULMq*utnQ%*@9dkFYg)3g_ -hD!HavieH&@^u>Zbfs{H1Z_nhqx5BHnblAeFslWpm6ga~eJn>Ytp!vcZWGf~~I;Ujp_U2EY4J6ln+x; -fP>}u4JP3YL&<>54U7shLw22m#ODgZdd)SZXb|e_#zx)j^0R$AG4#M2&u -0y{27Kq^u=3njNVc&iC=iPAI8BQ;Dy&BM$rUumJ@N*#x+S&ok+Z7A%9vivVFj>PKxi~gkV}31hSvUdB -wZ`jU0p%uPMDXQ8NW_7fR8@vo)W~MG$C55bLddDko5VkobcoE=eWnDM(`i6yt+z&DpowAOZ4pi@q$x5 -cDRR=zgmqK)s}@;(K@|o`Romns;g;&yTUkb9SL~GE76~byh?pD2BBI5LtkuXD)|`8pCbl=c2H4D{zPZ -MrKvJD=Ddrv=K-r6#y&O2Un2Zj)TlrwUoDu~|E$|hnDPN3L^|Km-(y+#2K1av)a7sEp^;&;v>vz>Y<; -DdfdzqKDj=ZFI(0ox!>Yf54C6~3L-c{Y;eaGkDIy{cEvv`XV6GtL@*)IU7wAU1Kf6kEPOmE-H0{%#>2<#J#hEoAig{Yi~YIKQCKo -lPxdFZWLypmU6chXecP#cKX4MItT;R&cCHD=m4-xwCzDvtfpekFMx2AEf3sTS>|1Ep#Fxpd`xN677iS -`MnDWxP@=y=1|B%Qk3Vq+L>-j|f&nK^PPlX52xmvOC!$vS`>_4{`#1?oPw*z_vdfg#wpidG@BX}4^c&|6_lV0&cc -+T7_?xcE|KF^Cht0}*MFUmEXB?{~^tj|}Td*E-KBR%(m^Yr=34h${V1 -BwBc+R7lPh`nkMx@(9$-DY~(y3n|M6wW}`kD{bdjF9xpilx0REV>XV$aA+I)ay<^v$iI?&@DyPlZ|5% -Xd*chec|!aa3g)%fRG~sSC1sEN7{Hb;6IW -9VnQ%jfzqrmez`JAf&KoN(1q3L%7 -sx0R%lCV4g)Oa-%D)GSfF#V!6X2~t@U5;e~Wj2iq=9%h -^_z=XMW&s#O*s(92JrfZG_~4{bLKpcNG~Gdd4SZFTF9av;?klZ@6R6PB107Pj9ZaATNlon4N)DbZ1Q4 -Sz;av96LDTUnAW(#W)3s?x_MQiBmrAgYvdmoPNph8BbWvejs$|nXT$&!ZEfCL=iTs6T+nze%ShJ#7Gx -;LrS82R<&UK8&4@u5@#8O}C(O`BUj=bVCe$_50j>{v<7qi`G>md203P;9@R0HO(Fw#_sFT!#^~o36JxE&tJhc^F5FWzG~=_+|BLJUc`#82^-TrGzj6)k(@9IJApjOMtv!YE!X? -2|7$8P#H9(^4rtz=(xEN8VY;+d{Q4q#*NDJW~9kyBGjWy4RO4xW6bZ@dieIlY?+RQ%FY`)K!vdc~V^)4934Z^A?Siho2?NYr%yW6_rp&e8& -3dJN#s{o;PoY{;~7t(ML;haCCwogc{4S<~;_?d@kInB0<3jYBQL<-*;}`1?d2@Q+2whi!qpfTc;VxE- -B3W)GXLnUfqsPAADPvtIiyEp?L_X6g`a2pjGmysth?)#&84-%^v{bUQP@Vb$dU-QOY`Q~o`42@<^rwT -pI#ICa-l=vO+|sBz1diNf|RxqwCzM&kQ5$jBC@+!M*jNUyQ@@gmvc)!_t-lM?M-y1oD}qSU3?rr%w08 -^H?O^Nk*xbzqGZ*}+L`z8J%YerdrNJ{HJgAdvDV7z{dQl2C&SEA -6Jh1Lj$}Sd_MdD(Cei+!Z3d@}+36rmBaDtXjh!J%@}JiN4z?mZ=rcc< -6eiplsR|5}7M=HfuPFynwdMX0mMFmZ=1h9nl;j1o+@{rIEJ>T}7A;kCa=sqhxvjRt0ehYTGi> -kO1Le2kRu3zfajwCt2kW@bCFaI0>GbW$Q`!y8)6ZB*S&xD)RkY5qtf*xx49iQ(~OFNsm=|KKjPn!>Qh2(?fz&3@+priaxu6 -`H52hS$z0N6Cp*}>7%7|t$o3L$XG00wjLTZ0hhB$O3b1<0_IqsOvkK-X`?M9YPzNQ*}+-HKi0c++~vTkkQ%SD -GN*7+|Id2u*$g&`o2FTc8r>O#MwLP1jd?Y>n`Qd@z=HP&z@fvU|3}d2Rwd<&J*B`IcZ -5|Hf@qYkO}7_2|+1n4x+6!qyseOXLuWFXl1#l!|$SD?xJl6#$P3F{GeGF=HQ0_Xn!&d6QJF$#$<~V!F0YvGjef*Zp{yMPxEm0F6F3UVt@6fz&9G|DjE^U -o8uEFE``BMCyIMfqN)qHby4(~?)d>}Yy1^$&0kxx8}GYI>s24`lj -({9A}@WHX`2v*{R*yP3xkht3!Cfd%)x^&s6Dx@VEq3DP)h>@6aWAK2mmG&m`)Nr-hpcY006fF001BW0 -03}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCPaCv1?J#XVM4Bh=Jh~6N(4YYI%5Zv6}+ASyy#bRP2 -isU2Zr2h9uIc||$xCs1skL081G$hU-lT_6&_~=QXOCABgNV32_G3;D-yg2qHa~fQx9R^<@B914JvF -mj)m*?%sYo0QpRx>V41EV0H(L>GncSP0HF3rR)``YKy;m5fSQN%eVUxW#IiCPb2)gJ@OqD3*<&qbTfq -cT^#mFzgnMep&jt!ibgxnV0dMjd%iUs^UZ7m{tjSl{d1tUvEyH{)&1ZRO+EM*H4(DOb5AD53Hj|4{T! -KV1qdRXB}@eg#a2KL4)%0Z>Z=1QY-O00;mk6qrsw=7ZQnAOHZAasU7z0001RX>c!Jc4cm4Z*nhkWpQ< -7b98erb7gaLX>V?GE^vA6J!^9tHmwW-SMY^jY()hTyS<@t|#QLDOC>$FHOv`UMm+UUw;rdCGRH4F>w7gcGD8%_-uW -qFlpGgfI+Uyc#*XZSiwXja*JQ&zPqjs0Y{?qi*;_1>x~*J_#88ow#;%~I!ey2tMm1Z`i=&Qp^uX834k ->PlKH%Jn9#Z5y6bo}G_XW@el1v$1+tEp?@rud_uxR!x=vSY`!%*rb)wWA#J2*}wuFI9im2H{4V3#}9u -@s~I+$EeVwVTvzF$o=J~cUCyAzSe*!h4(a*7;G?y!F0^epl97NOI(Gv}ud#YxX_%N^x(Bb1zCHNx=4^ -Iy^!oVZ=GXZi5FddAgUZqW5&*hobYU`F9rA!>tYx|ZOt_ZcpPjuw;AeY%tLIrG -^Ov=rHB~lN7rLJ5;ySC!VkXSb4+~va%%@{zF3Tog&d#@+)EL){fMHW&W@0K}$T7gb$qHy)F1LH$veLR -Sz&^`%Vf1Bh?}1vC6>wL+MQUV)UaCuAb_Aq9Z%QNIv6VVc7gslFwN$)gvhys@>TN$WT2?zfJ2*SWVSp -=Fx&pRTi@aQ1jR6`02jOvZnJq5i1MFdxF)&!VSTq%EYQP$dnXXiQn -HKF3cMU*a_5eMa=eVO8NwvK_po8ppk(@)3nD#sH1k2s_0SXiV1{^Z=q}7Or18MqN!`jwBUXa2Y;Gs>G -A%3MlQP(26vSOo7ukao0_Yx_B_+boRYQWGY&lZ^z?no)XN!|9w698M<23a9rY37MKUa6G8xdwQk;5y) -ST5ZSJe5-D188!`=Q8%U2t9q~EJO;%ZD=v{hUW=oak!1%Zr28Jx?5 -n|a?L|JH);xpdK1wfqYer@cLo -9^v~yGSC6-a3;sKMZY_}Z%s&0dEnB=X#MgMuQx0r3cR -eh4aq?I88Tjdh5YNef;zb?dz5=)On>-XnE=nrQm>uLp|RnZc|5lTC^6%w*pKDFA@+E!*<*e&g0{!o%~ -LHI@`W8MDXICLj=?661OAa@1i8^iaq*Z5oXn&AF|I`F=Ra)NW8~9wjvdwk~XtCt#H~#=PNwm&Bl`ffa -DV(DI5VPhfic-34Fro;xh|IeKeUmM;2M>Db6ci5AoEw}{QMW5| -5Qe}Apj?g;uOpsVYSEY))SWe=8=0dqbSf#(2bN$P(K_<-B3pp@P=hsu+e4+x>$IrBE-D-20fcS~n2Dx -UxH*7EK(YuXDtL6W5;H4BYQPD84RX{2ms)kDoiwqt*(6}eSoo9Rv~Yt>xuIy{9|!iu;8W24fjVqJaVc -sL8#uM5SfU6)A$nQY8*3s0K(L&E0a43T0yF{y_yZj-E1rNV*wjj|H(8YdrIkkO5-Dt&iwoiy68qd3aS -jLPHUd_qC@z>9HyOw=5V`vYr-#SKYH^w3=|Gx#L0Y<-_ENdF)Ok -f#)bAqhz$5l38<6_J$~gfyiU!_#P&z;qo6cFgLmRHn?YnYYI32Kiy1I}-_9|EzyPzyoZ^hLn$}Z$Bms -c{pHDgHg~)WLIqL4Q=nS8Z`Clh1W}ZprmMpl9)8uc|!(_h@=u8k`+_v8~hN8CotK7G4Pln3LHQ`*!q9 -GtWnq*!xxXo#D$~IF2Eihg(8S%5I1ljpFe*lFh{-Q{5A!PZ_ius_k2i*+k;2~L_>cW -NePtlOClj`d74GLY>;9FDudK#+F4=9WcaAl)2>T(u^0B{hn}X&P8u0`82D&N4e9_Cti%XM(xH_T&1eV -3{BiH1Szn)f(&SXOitMtgELp)>!$A+{cfGibWm!N9(1XI|v{DWTigMeXyv9?!@c%!7o>#+eT2E^?}S+JAY!taAl6%@j=cCmh>a`$}S32HXvKByxx-kU -JpR@PvQz;_(Zx9J$r=QH(m+8R#npMFAlU2ag^NdWga@cUJL^^|l?%F;Ix?A2%F)Z6;qEMBA{VKYAeL2 -pLg;rL)+#WwlQ8?60(oNo0$$SEEU1#e#BT0sU%ByrF0~Pt+fhC&|-rmR;?xvk-tJhfOPUU{S0cbmY-4 -ticch1$btYrwcu_U8Wr%;RJNvokGtrJ(4l%6!c-*NQ(=U^m&)XzD*aX+o9Zpollfgt%ayu_y!GAQRiB -fvSS~y_jB+FbjHg^b@>R-$);N9fkMwEz(OfXy4U2rp3(SFE`fe(+KJbv*!#v`G{i#icvQDvs6Q&MY;5~bDF3C=Ocqc9Y+P -79!vd($I;zHENap8xT2cbhciS{2SkwRRu})czY?T-28XFlFtNv+YLX_p>T3%t}}L_GlY)WgU8b#TJG2 -hQoAM(o10L2iTOGA%EUwxpcZ>*bf%dTHE%oUFfdi?p6@cW$pY!9Gi~3L!trvtKM?NtVakM6Z4w&-lG9 -%W9J6-jFAXT|&2~B2@In_B;D8nYkPYG6<}~6Vf_}{@(_Jw!F&{xRq7p!QD`MbQlsTl(ZqIU-=p192 -k%F!YJ*~WR_U%-by5S+#`}~9>{KKMn0o^%CZBsN;7mH*E)x@4MRsp%_%|-CLD(K%VLhqHD~wga5NV;3 -HlIeD}?~B)4b7ek{HSpm~+HEJ0Q}ONwy)6wm~`I -K)`QE1=rBuX67RsOuCisnH5TLgryfDtF+@TGygNO5kHC5~gjo8T^h~1Ho`gR}X(fO_I -Y2hBi+|RQ;R5lwxQ!P889M?+Ma)Xr5A(|MJiFlF61(qPYT`Kqyt@GfAKg>o=r@$21j5W@C;;7Mq(`WXyh$N0L2GEXd)1m9973X+zEkLk|Z8jHi9RSs5)LDO)xO!Q3)4K$`88B$>xz*2-6G -Q0lqlrmVoTvkXIjdFFVV29CYPU!)cWMMrI8M{sC!q)fm -c{BPpqZvzaV?f#RKJw|n}W7DQv&{@(s(mv47-S>)^b7H+z5b?mzy_97C+KV>XF;hjF)?4 -Bf~#oPx6k8_OowFn+Nc=i!jVg9YQjL)Zcf@q2+J!QDz@ZP-(gI=6*~crpKymKZ+%KzyLKKrR$U;Cmc< -zc(sK^1)*^$z1V3PpTS>ya{Dm^h$|ViM5~58)H9u+7of+&%gW^ix=C(1#tpLRUERR$Vfb4>(6$L${CZ -ZZ9zFL_W8iu243dDGFugV)(APfcPYgShM3XMSTktF=aKeVkQtu9N@$1+{7lCrvZbXl+SN7ZV9?%M~3?alq)C(o1T -J^`J^;(Pk0Q*q@Pt!E`=Y9M`OQooz3!S_c8uLmKW-INF49i0vQ3BE2tdZ#rZN|tZbvc%c}v&rf<)xji -*pRDyQrh$$X5&YTXr-q{|0Nr%5qjoQ0RW=x0_&cV5s^JV>vK^q_zdJp{vqB>Md@_@(I)yntk=bUoq+H -`{{Uy=ycMjZN!SN|90NNBh#BA)8a`%B-j?wL@p8VnQ^DkH_=gN31#n=YU_ns@=!D`UZ@?4m;CSOdPx&89xOIyGYrK{i@Bfffyb -K7-{{04kp*gb{+o@WJZD0tzV#oyS-x%&9@@#9Y~dGvP`=k-x^^K&hQR8=@RVwUb4u%|mFupR#W+Sv#R -c-YwtvkJ{@hGBe1?SaT;bc&0;j2}@7&ybU$kgeEjTibiIl82K(_`JGV6EkNRLH#M_g(FfHPgKD? -ZB7qN~r)7QynK7S)0Ue4QnOZrl)K}PjbexMEjzLvD2gV3m}n@vvn%WaXKgiGu4ev63aBZgXdp5yo}=G -I(jfZ9%7F3KE-cb{=fqWNbX`e-1?QApa650hhsKXY!^L=9GDnVhH9ALNNFm=9^KcB~MDxR>pdwc$K`zy9hd^{o4j|Y?6s!BZ9)a9iYUiS^((ujrtR -c56j#A5Lm(h1j?t30W9(i2S=g9fLuZz9n+_TbJQPeLbWlubnyXUZ*oqnVY1Qd5n0}6xYNdJ=mZ)V!h; -b&%BpCF)V*g5{g8gn*3DWK&H7wdK{k<%tkX!I+DQ7iUYd@4$+LBaby$u$;>?!0a;24|m0)L^I08O>f!jZI!V4#*s%xN;+*`&MCpy -hi7XP3YaXZ>+`v*flge<`P`-X=G|b7?>Se~zG~;;&%cZUy08(UwMzFMzl5)UG-csl|>MGRDMZ1o{R{P?6emuR^ps)+Tohz%R$X-WhdAx~sn2A!dirFINF -CL@uKYP4^F$!Qv6oRCY;2?lQ+4M-q6Ny<$WJO9r4Ag2WL!3VcM4933`x(%%C!t{#EM89vHKQyeU6JI! -(Y|74Hh`&~Mk8t+uhN2yR%c|z{0X7jwi6h=V4{ql3@C1PglJyV3C3BjR**1BZE<0n>QRxqjZm8DzgeB -amBxk?`;8QRbxnm!_&amG1(IMAZ6AchbXDkt0!EoP~H!3f=cmA*?J9gPirj4UY0inGGCAv93A51T1u>a -Nt<^*Cs)$EyJ7gC3Wh$)IA%q7(rJO2nBvc%42Fzs*19TlUz0?iQL!Y)v>8gV#1iPJAR_0l -TSeTws43Uf!bvMQ9-QhT)MUD`9r53=!kbmy+lEJ~cXNqhQ{W=2|SuV#9SO3LbIkH(2Alg%rPJq_@$Z> -@APTq5h$x!Pdv1S$R$S}lVIhoDfaVB}FvTImJ^d=wJgT>N!clyquVktSF=yDE*9Ef;@Q?6H74 -{5VtYrTJ$ -%KDdwf04;e)H{(X3cfbT4{~wGd@i$_&+$$%eVe^Ai9P&UhM3T#Rfh$7GR;Eee@=|Xug|66qVzi! -#y4e@`L^Ln|6GKG8=A%CK$2let+vx~Lv;-?S4vC}^i@jvv@zK`H|o64^w`N7%Y_rDSSABgBkko%E+sd -G)L@_o}-uty(qS%Y3y(df1gHZjppBD%GMI6YiO -&#jHyq)0!TEU$qY;`d|OaKG?E0 -pO+om%dwH*J}ls%if*^|e)7P(;CHMf!dvZF_Q}69nR8d{` -1DnbxVw3%z_VO;wcRR<$WK6!q?NwX0_tGf9Y3FDyk -aEh_sakkuKu|lD3yfz!1P|6^jtQ$b4w8A{e<1Bxh~7BfRw_837qS1}w!_Bw6{C@7lYK3*X~Uv~X7tV%7X`6yT5Yb)wK#Fw6cs?vfc*; -7_R#e|Qh}if&QllnBRj(Irn@8FyNjn`3*U{9Sk8$WkN*7U5ZdqB`cT538}MM--x}z<^sQ5GN&w>H<_(Bvk#bU9<&!q7Jx4<0)$1ws}6+rFNSakQ}lcHq(EZEHZq>5e( -rrs%P^0u-A#ceZ@W2FGVEoyUavXgFc9{!+qBmrks^Yy2VK14nSp$NY=@$47i6Bd8!u*c -yh9L=v -K>TB;#O{5j)qDPtSn2?9hsp6ysNY`u{5YCHB|A%~HY+iS<#}!Ah+`8^&!gE%>E4>bg5?xb#fkmH{)Jw -*^LKzZ5gBG_3ZY6m8L|N5bF1yrbq4}^WvAh6NX}B-mBzxg!ANgwymiUo7d}>Xl))Sz&q$1OA*tnmQx$ -0oa-duY%Qs2-A208LHP45R~e5fH>!+GIP%2+kp(E~L)co9@Nz^=u*VBIZrpvM?s$3oBvZg2b`RKkyPI -U)as6nu9}bG4(t#4?Cr`oo)W_%XNeW?_Mk<@U8qfb^e{(7G>PhlAdE9?*2^LYDYh8F9l*zDeK`zVZ&a~Y!!_E}Cir=r{*m3oKqTcEoD(JR -%|KRn7b}4^z;!#%b3W(dZKfI=Zta(motL0j0>6l=x=sK9k*4DIOqiv05 -TC|{B8_T}?@ZlHcyzsq~uJDHWtyGrjzLi#0qG4$Fn2D;A&Z$)+nN)zWOn`Ckty=XSY#9{Ps`AQcVRwb -{vURhfc=zrdv+_$Xop&=d_OS$2XDpz&m9?_qZ~3WMoW6bnJo8d?#uv-8%O_1;n^!P*etKFI?@cSoUA7 -f>lC^!~RR<2^Zea_$W-H^jtnWH$PjK9rd-$w`lk84f2fo8r)&*=Z#zqsK$YXX -f_iCXIgnA&kIuk@R8*c>yEfoVC(*1{S7B=ix`!8SG?Mgsc{rubK0Fm_=m6`|fLqbWw2H? -pyYIQ84&DXWwhcYAY}c%?yQSr>9qJQdUNLrF&T(PmiPgEXdux^3@h9gm>0>Q<=tPka>WB0<*6-nP!1T -x3aqJjM6@7<~XOfihE;tW5O&}#>DYGd7LsQ56x`=hIobl5HL;>`byG`F?IO94#|iA|NQ-DvV?o8tQ20 ->qfc|%M=0WMUyi%bMsv~ot+5JHq3$GC5XNBoX-y1pT69TPc!;sgVlh8G4;sjx^hwD`kfvW?kcIV1G&w -Aa67Y2ZVqJ48nt&SW{7{5r^$4Moxl0U61Hr1pQ4Hmk2WO6csg?sbkT@3EukqAE45-8wl)!PFYHJi!%x -G#sX=%-!tT`OMR%qB_gBe9(Oy@~CPQZk%O|R?B3TDem$xWajtQPzj0WlGtw?LL_CG*Lc3fM}h^M_rgx -Jbv~kq#sN1Yg0@Njh#}6eW)^#^aVV1E{B8s0Scis4d`Uh@Y3SNI)2T2{8wj2a=ix;#f(bL0pq5%@(uM -AunGw3f5rXSZgdLW=V-ziJHd)7%anZaBxYP>2<8~-?ES`mR$eRgYPv}Cd!hP1*OZbR9#D*nHVz -?bIHn+l;$NRrIoOD%>ycOEuFnI9Pt-}IXcS%E~IR+*O9Frc6e&RL%732neID30`^A|5zw&8a~vchiig_ -k*QWa0x5ofGZgnnXh2E!3>we%E1HKGNVJPLR>gMYb4Vt3AUquVT0!Eaj)OJIZ@ZuSSBX)s7-NFq -cEeAqwYL^!sD<8>*nakl)rIyLbcpqnoH&kIBC>Yp#OU2|9`!3Ik{V4c+6=1qH_m0EO3VDmSt;LoHuiF -FRXlEeFJ4hI29jJ~sasyzvJsr3g4D1Vr$!~}nkehkc7a) -;wr=K7lYp}&U3&xzi{NmAiv38bBs;W;sUxE?mpFx`t?riz!Xy@RWqXM3lTOT%#jCM?=XTsf+-hPU2#J -hs|&zy~r3W^-+_i^Y5=tP(oh2+nXVHwHQ*pS2k0ME(lcX}wkz2HSbKj5BUKCzf78dw#EKAm2u{3JCL| -lCmZbM%}nPF?euQKKO7jv+xmQ-(kCC?}HF(tYm(!wvM;?QwLHWt -_3LOeBx}ZH~z)4MbGiXNe8NSB`+<-+?01-SX!w*{2@W7kI7a&58(fo7|r`8OjLwb0xK+hU_sqJJ^QaQ -dVr_+7Q|7CrKFSE&XSOq7AP1dGDU}lG&XKz_pVfGnbAd~Xu<_KQEB|Bmocc;_#KZd`blHWiRz16II!H -()HcI3jO2}KSK$F(<&S-~5ab8vuj6vb~?c`|&ygx*z`?B(GegOpqw{U0+FTyt3W6Y_96J)9149ac~dL -;Mr4ACnFAf#C~$jL9$l1yD-^1QY-O00;mk6qruwi#d691ONb~3jhEj0001RX>c!Jc4cm4Z*nhkWpQ<7 -b98erb98cbV{~6cETGhttT&g?y7l4*ev%|-XJ?7Q#}=)#xpk&3U2D)L|2+RB$y?zBj39 -7Z;h@obH1J37!+T8DM(-dm^{yd=+%?)b_{~&kuzD*?H-}$E(@-w-rFCMZu=|}PNvVXja3d_fuPxSAI{ -Acblueq!Y~Ia$@}U|tasu_F?=9xC?@LQ+?o~#8zrsF$Z*E^C{T~{z@N3DW(w996S+k}g12`m*Gzg_U> -yc9y(bxY0u54c>!G7hLbbl7g3QyK&g@-pMpiU+4apNBIG@vljWCr$8yF?qt=@Y{1O(J#hp;EHY9lwYC -dnU2RhkB|pNF6zN-~H|8%{oNn@Tuj32;@9tx(b(z)!T1#8C)04h$=KLw%`(u>ES-3Q~i&WsiOkSU`3@ -RJ=mMNQyubXzL2svgX9P!43)1Q&=u#E!}dNSybyeP-^1pqppePi;IW7FdN&g1O6~3U-}|R3DMe#^di^ -Z3CCqWqp^?3Cs**--&2=?l8jHIxN(v+cRVITo33NooH)@e(t5)`b%eMeAtyN_2c3ug -3P>uua5pu6~y*zf?x`sp{9@{F1pMH$b=Jo96F~-TqdfHCP&)-LdpE;aGlSlbL0uI>+~`y)gq5qsaDG(zfNLZDr}lmcWS=MW>u1BrK&EYN=1cMt5V16CaEryOdSj8t@>@0mN_<=uTn -M73#D%>U1U)T$Ytefu|!}2p|zDPmU&Sj)_PVp-?9q&q{-AgNpkZkuUi$`d@A$Vm9FY6(!zQqjm(>wE`S2ts>;JGs*-CR0vZ5Z0bN%ak?T?yd -ZebSO8UqnqR=#&T>(0A33Fd80l<_uN9t_>opt;&nN`pvleQPS0v@_epc#R{FL&YeZW)y&L0V-7R#a- -neWY-X7rF?myCuR;%5Zu2unQp6*>zIn*+OTPJ(Ty(Ix7<-^~yi2V9Z`9tUIBZ353K$ZbKXduWre;;vN)Qi`rACdJ1 -mO47;bI7IXpdn5xzQleR!fK%J+gySH;X5DKF$t(B|dgtLJC0Ps10_!*9>tynKBa{_y;XLdT*8+}j~@QI1^aQ1J0@7BQ3ZUtP?L%B0Kta`-k2u0ZN!6$oMln6F%g+H2&X=#>{pIj);fu55oY&$Dp#hUa_ld -*|{Nn6NVkUY36=;s$jy3?biUv9~Apv6p!W{Ga8OLv&cF`jHvsa~O47 -Eut&j#PE -AzMkIHHAv^(Ve8FOAe=7&;D`{qX|Xr{pn!G$On&q6+nD+-wrZ?m+dq)U#xs=(rIT$Wj*11vYZ_*6z1v -{9*5QUS||BAsP|WQGR{>T?Gtw0FoE&q7aNs!xw%mnA9`{!I~*!oYwq99YF;}u)S8xII46&w!X~rGAg6 -0D*PC%j|6OTP)rSiG4NU(&||b+EPP|Zs$4C>N=$X;=hCmrD=>}W$whSu-QU1Ar{^JvG^2t&k__wXTi>^`P)A@!v03g_!zz~ZhBSk?IPz-p4qBzsgw#r+8;K(;mi -UprAD?E)-zZ)>iaxjyi%W8=-bea%b!BJHQZ6V`LYf+mA*rF?2%#km^55C_kj0fgGi%Zo^#wah~_N>|w -N|CleYzO_Ig=pvly7$nk-zQ#iWK3W5gXo6TxwayG-V7ho(CYmTe33O0f-Ute*vJPA -tT~K#uhP{V@Vn;x92P+ogGVul{l|8H0!EuQaz^SKp3aEzxoHB$t0k1Sgaa-s`ehsLv!waa2Q!Smjfx7 -9pzFMcMPMcxxrmu9GZrpi2;v)~RS9b^cV!^?I?=2tU#x4FPx`KrRC@f*waAIY?00!4d5d$|=E84Souw -H?sf~S#7oz?8of`;}j98;q-y+hL$H4eyM;*MCCvm#kmK*BTu`>w3O%%UYhK5fIvV9$cYri~frnOCVRG -@WjE7n*$w;{jedYC$mnkt;sw0$C$&!Amu|Wn|@Nm#gdw+v6y}O`ZMf$Q+mw?p+k#-EG^m6n5tga;>%K -rPf#8kWJCn==~#as}nM6kKR(JZ_)VypD&|pAT0nRe@;f;F0#g1UUtBAn5%(LP=KTwz=J^OthV{f18nK -TZaNtDHt6Ub;nhv!qTdMz7XquA!0=2q?V9e(sHhTRzyc)&qP;^5mrp-}s3cdD`;FZ*VYI3){Z)~IksBqY4mILkPRM@k8d12@YJpj;mcT~{fV4}bE| -P1I1OSX}P8y&ws2t8}8W{HmeHp1Y_|FgMbR!BjJi+KLqsDS_PC|1ORF*TUWi<40H5`W6fIy&uzFoq;f -!$H~-amJL`PB>1t%Qcf&|Pp@?7!%{p0hCiZTG+=i8_yxl%?hGzI*%qA$we5IY?)>WfVg~L;Gfx#MHM8 -)QJYQijJ`H?(TF2=E3p~6lfOY#l>z?mMeX*xBvK&`h5>5)9nIO?rMrI)LkP1n-2t|+}(fj=<%B4&Q@D -$HIoIyy!3&pJ#6o+9yIARn8N0~vd{d_r^ppLDq!RCQK&$72}*ug{6<8hqoD!bD<0d37YQI?{KUxoLwj -Hpqf5m+xmrwhQP$iFh>PLD+VDd%4}t(r5}?yRd{8lJC}rucZLv3jKYyTg0wd!9RM=$#nlsKd&BmAE$UmH&Bq|tIFj#0 -&+0BDA1q&^_x{01}G#z4kfb))P31H_{mhbd*61FV=>x_z&jVP(Rb;TaFZ9^JwpvbTw#B&0SlOu&Q<$e -=`9k}mzDzH{m67Zc;7XnT4HLwIdx=M7Y_v${bCNZl>YA(@gFH3gM -NA27#f}HQ%f|Nti6QK?4S=DV)zsp=|9kw=5-`Cz24d9_s?vLT{z50N`y-@#s3(U42OpTOy%%X0%mti` -=<11_gGq(y_y-|kHVJhAZ*8nQH)%$DGgLXYiAC62M{~FR~auT+ct(SA*mG=G2N9NN -hSt%1}P`V9{9>Xi5SA#xVf?o-AM4z0DwkkoZqb#{j8|K>>f$Fep3uNMxAFT1g_JdERUpNfv0#216iy)#% -^Oe2}ukj>-6s5?6C6Xx`V{-uj&V3KQV}u$Wc|%LNTQE1Y>WAvFqOgo94$RRJ0q2HOV@uH-JewpHe0Q -)z=c)3Zaeg7R#*EglpNl(_rofDavE8&Sk~y~4F`|X^&8f?^JgL`6`IKoPSr^khPbpPmXzxcdK^nsN-f -tj`=kl&SVP;U_-zxwA$Gt~Z>xM%)IEkWz5Z}n3ZEV-`UHi>OFzeXlHv###@pRxaAOiot$a%eEn*^R_E -S}1Q|Lu(sS$qjhyRBZ~`Emhgtkq?5mG9o@;_8!LT`0fKUb9XK!+_YllN!}#bUK~TP^F^q0J>YJ0B?Gy -j$ge{2YZj7s1r@htPW&}jxzR_%~okdY6D@+^2H+BDK&hHa4RrOO55SUVyZEoR|3nkg1nUYJi6zTY?iK -o!jy6q?=VZ1fl|-iN1WI}{n1MwCAg7jWNHgG?+&+Dc6(Ol^r94dia;!qI0iMS)L;1(E~)Y5!$B!uM0g -k_uk;*_+vZ$ms8FHpFAd<7c~!DqJ;nsX@dqY-sSV{nunA1OL(9!5z~s?|9u;b_N~;8&WmU33WI*Q3;0 -&NlvKHnpCK$m5VN+b!!QE3bCW&L}?Sc6r&_60-HJ+tlb&fwEsXvHV!EM~-46n+sbT(20p&&sU$i6=3w -laNX2G>NC9Sl@-0gE<5mq)z}La=zXSk|;MNt#9|AXhDT%yFIm!b~rclzRpuLx><_ -ckIpL1;`2u06X%WMXg8Vg=bimAeenjZWD0^iF)4-uG9-{b_1quB5pie -ai_hwTQ7 -f_(XuOVi+GMh@ryJ;mir+*DKcIf$mLKpNZGfN|Tht -T*5A -`=291?~TduZ`}Xu5uvLr(-CT -)QzXD3LmQ^Fkbd7)j{(92pCfO~T9zQ$91NZ$DZUn)R?=xNLJ1r>9I(?puT?wE^~JE?Blq3WzO -rEf52WVW$sEK6nB3+3P_9-Y)cxM)ljX6_ziA27_TOk)&8762S!HAS0RH%7^{zvCyL|H?>eH$Kog#o*S@OmyqWjWlbg#<&dqPNjt49P_KXkn}Dvj$kE)) -IP(Bj8BX9JVd$jDsxwZ?*{U@6S2$d_eQ@yjaiDxuwiYadu}L1zv$Q^t<{r476Uv_^Xv-qHSVWtEF{K39*ER -6XU~d;`56pi&efJH#0jOp2z$mO22xVK9 -QFbO4DYxlOMf^rkHGBSs>drWVNUuGk9w2@PWc-XH303U292O+0wkGqw`ZFL|D{&5 -31z<=4+YWn=GJVT!D@$8!veaa@DPOKnML#c}F2%s)AWa%9BqSPZg$%SiLWlWbOyyE{tdwcp?{^d*1N6C+wg9T}ROW!#5KagCQr7@A4WqUMemDz5vGFRr)NftY%zDw8Zq -Cn%fh5VH-a2Eq%4xP@h!%yj9S`_A-La!Q-!Iigv>q2n3|#638>DiAz{pa8Q9!+Pk_b)D!k5}m;%a=b -FWwpA#xxM=|01-0S+dp{t=&Q&7@5vu_g7BXMW6~S9YlEG?Dw0M@oMk(@oJC|+-=WubhFl_#j9-f4nGs -E^sb*3Gtj}gVT}exZ-Eob&k{yZEaHL?9>5C|p9IDVXlhkF9lu??k7VQhAy=nZIaXh;$@B+MlIa2$N` -}6g!)P)WR&JJkGVfX|2yl!pA%KM`92I>oS*}Ap@)0rVTT%PL=X^4Ty11HtAIT*ipvF|MjVfBWUu=;PU -@3*;+vE3xcj~7tb8O1rVbCI}we5^SpZ>8Y^yVlWbyc;R8CQA3!rP~m`75VA{oug*U>@vLB-3+7Uxd_d -2MVST^URMN_BKH|-){-+};Q@!Q@8RV#nrjNTg|fDIRQ!+a-+l3W&mTVcaNm_{+x22_l5F_|93Y&f7v1g1I>!Yuj@w2K98S>!N@n -oBqw0|#lLl?#Yo^Gb_HHZNF~8{D~r}Np+X -a%2|dm$%z%|%q(%_-aOez5)c#C}f+O`;zc=_eZbl(M{gSkwZ^mgJn>dS$BfYA5=mjTUlw4ke4A0%$Tg -6s0vdiu5ZD9Ss#VwdpjU9mz4<0qVXjcE=tFHp{|GmwkRhDG$b}oPFAIjfXPoJuX2Wm(0Ja^Q-O$nQLS -(Qh=P?+ia?8xJluDzuR?5E}Rqfj=Noc7>ZLyyg@=g8;I(ly|0Nhi&8uTk36y|L?o)Yy`Y3};DP7~rzX -Erfs6blILlv%K@=3ITRCi-IMsDr6two@l{n_T2e?_kPq -mW2?WwkKw?lY9F-~eSQW!^DkAgTDPPDwab`SM543H4`Y$bn|e>dz?qaWIDkVNjT14C;6&WlKnwWkx?C%rb{cibyCWgw`L7uF!uta8)f+`M#s)ebumjrf#U{wdj$xLPi`k@N>VXqzr_8GI!OPz1!{Na))W)o-<5M3sZ1Q?tcPfNgiYtJEdyyf -@{!6TDMRS-KRzm34O4XcavkIFvG?h8nrY6os5-0^0GMz4INF{Hh@}d((;&4;FI_zS=tEnR)BM@71M1^ -5sRevfYZWer0#*zUi9`mDn!+0yUC;myRKHrk-Zg`bots8TEH+^iq{L^Oa&s0@4QOo7vur5x9S(&N(wv -xF_Abl0Fdww#Zh~E^i8rW+i{9=;Kq^wllIixT1H-D<1Qsyz`mR)Z*0}Iu==)qSbZGZ%P=kMKxoD#4#* -e$m4In*Xf;^3c&98MIdPP?GiEmO1z!s%@+8#tfNr8}T?rUGGB20nfT=YY7aGEmf_s;Y8jvWkO|?dRjv -T@4Tw`u?uiP!;oN)@K;x+TSni6M8vLDR==@_}9j3;hk!L}%98@GP#S+5VR7g3^n>K4@SEo&Rrn;&=TK@j&ZXQUHAZ>5#HtPUnT{ia@P5qEjsnAFCKcL>G1{$V)UkT*=If{u1lEF0H}jFa?Ku_m$ptA -?;0_(lewo;|pU{TQ1c?pU7K1E+dB4GAu!=n5qN2T3_hK|h&Py-CiyI=bnEkKx9R=cQm@NS6OOSlKyXf -=oAT(Onsd<4T-rt?@;;-);-0bTJjV`9^BbkN0bFk>N!PRuOrvWW5&+8uU*}~d=OCD?;NwzXJo_4`m`>=y*OWFm86*oJ%r3qijHDCw!pO1R3BP~c>9XPCFnyqzSwVQQt3wLIW28 -&H^9JGvaqs1FhLh9YslmW^O4?$I#%pp4p%KMC>*CHM_28-JdT#Kqqrh1|n4~Uf-Xupl7m)7pr***KVW -KhSXeqIdKC}aNf&a?1y{FHJFvDNnDr&79Nh@RXGXk;QoXF-@)o%{Tw(5bI*-(~Y-_pI`ys!>Q>YN7r( -!QBZ>$|nB-mEaa0fXdU+qGs2Etl~?(qW=brgQ{`8(tNzs}zMFOORQsYQ7a_2nBCq-0tmpQYoyiyM@+a -oe=_^IWTWm3u6EWnDWKK)x;mk?8a) -d94Nq>J*9xrQHd3&6nU79K0q|t)G+rJlcK3M#8KRp*zVh{n!JWQfqI_Sqk_!(_U-p0)|I4s*i%)=iJpA^sYYuw&Lp2W%JjHlIV{^AXcE>p%KcxF&F4QOe0H -5rX$%WSjI8xuAz&hLk(mv)m<*NcjVmxdQbnw1sQu~j4CIt`IPHO-0+DYNs(duCAiw2eG0Wn`AFq>vh> -Yg)GuebGqWBZti;mjt&;s;~GZNKDd9S@6`D>T3>M?Sby+L>yv2l9Rg^tL+4sQjXOgr1(yfSg*8x7Evp -OD_p;9!LQppgFWvwAFVgIi?-&Z&Tu7FC`u}*tUL4#O2Gi^ZnfZ8)p?+vwC>YKPy{~avn2VA|Q%E*oJI -YhsiudSxSipcn;Gy@}`khf1*@@h9uD)X#r+nnL50gEj^w5yE76hq8Gol^1kx|MSaAA?eOPj6U>wY*fw?!CC9^BcgNX3w2#{CFAw -tz8V3*U6U>VnPT_!UUSd3IHD%EpSs*Lh!yi$&o=ziasMXL%!KQaiA29z5E5NLee1e15?4VH{UY?V4Bl -}R-uZKH}GSx#w-USu>-Wj7wqW~b(-n0)^?(RyfKFT)CnoN5X1=$zVNIXq#r$G53iiCPLT6#;u>6*{ox -u7F+WfbY)8r5HR8&z(R7hu);hpcyXki&R$v*0y$_?gD7xCc8# -Ev9mz_&xm?u|yb3W9xEthdk+*}_f%Pn2Zq*09HQw!Q9}s+|rgzKww`Ck>+%uyXwPY^kw?rR0y#5!}U#;>mKqvK;)>sT5{zs}r)ZoPEr9uv;f20 -%ld0n^QUsXAtH*6AS@u%{_X&&GCI2kZ1<4}B3&7z>#WM}^}rxFi!k$cReLWx<#RPIV@B$y)ZO!C~RQy -0Zt{Y6pcR-9nr0C%?|G9i`HZ>r+9aSO1K`SF2Po!q9sm7CG7o7(|MG^oqZw|+ZulY^ul?mn2^D2J3{9 -+_V&>lGQjzh~$Vo@b^s^Nece$6T+S+p@Qle@6aWAK2mmG&m`;(515G>x005#20018V003}la4%nWWo~3|axZmqY;0*_GcR9XX>MtBUtcb8d6ia -KZ`?Kze%G%UY+y(mtOca)lK}&D)58X0V-auAM}aGic3D%T!owTo*LO&YtG(QyelR@OH`k}3XR}%6v=D -s#GhD-JtC2O=hP4Q_k`imnm4sd?!Q}>+Y(V3+GbEJRj6${N;r#El(SL2V_ -H(I8RN<+hfk4$iwx-JezjVD+}oFAU+neImkbkF<46z@CwJnBXlXSpE1uMVfmI`)FqmiB|% -9Ja@nA*w$#j_+42sR+oP{amwW>0FbY?YJ -EY`^3(ZG8-mDHGCYdvZeD$M`I(D(37~Y2wi>Ge7UF}MVcAit5;5E|pV&L -P$%IjWfPM!=w_o4jhm-0g%atIN0k!JZh&+^4&dA@8qSovOcu=qoSwArK!15U!YjU=+Bsf?us>&nk*0= -mHMWNNr!Yk^f7d(yv2;G1xlc0|QQjYZtR*L8e7G -ElmhX6lSgUzau=iv0^>3KVtBIY$7|hsIESbCb{K2Q?n@VN7#mrj(yNPDDF0g>4o2UDMDs7(~)sxp( -9UBa66sWd^^^i_^neFehp&KkP_E_XGfMz&7k>v^OVr>6*r5(bb3 -z@kKFiwrpCDQ!4aqY^!{H}XSgR5i>LVX-6(2iaijEbdjRDhuo2|PS2-ev!%W{$x@yzE1Bc;n^usrj&L -6dtikWBs0#Hi>1QY-O00;mk6qrsF_X;Na3;+Q7DF6T?0001RX>c!Jc4cm4Z*nhna%^mAVlyvaV{dG1W -n*+{Z*FrgaCxm-ZExH*68`RALD&eSZFhyd98kc3gUh+iHRxNAq$moXvF1u#o3&O_L~37pxc`37kd#D9 -^4jU$en{lia5!(Ad1koly4jTTG$_ld3#=O+xGHPNSKo{Ln=vQPbcFulkG+*Vy{e2?#si-u2XQ;lb>$0Ba^%$Q}2z^%zp5gm;*@qv?^nPkH#?ILLoa=R2Zx*T&sa( -tSoc&xn9*XfTmpN@^*rz#H%CfWj(I*pY*hv&x)XQb8M82N&FX>ZZ(aDf}FSVndGf1}7hf3I|EzcV~>Y -Arw#nbyqZYK|!=$ASZwaC7eskStU)!V0eS6~mBeGd&q?Wij3#BYU4l-##;5-Qz`gPNNsBNv|E|NaX5F -PA*e5f&HhD*7N&sGlExRU*4A3(aLA>S)fQ?>~KdZ+9ViqH9|BbCc&-Rj&Sk!}m)5DQ<2UDNCfeAcp0RVu#Gx#*A+yA~{Ji2d-!S)e@5-O}UT&HVE1Jy;@|A05IWv)q4gOb<4_}eAA*W -2Ls#F38vq*b(-)%(=G37=uUXZ&sOe!X}Fa^YP$HFtnyjyv5<8zFSmuIjAmZxyB$P&gb@j#*I%(#*9Dd!gLmp6C_JIh5ZMcaoWOx17Z52_M&we0(&T3PS`--tfq5ja;k>dOq9h%ooz!=| -C}C1C4!;QWD>*bWFX$VHQP~+$%;rj5pm)|3Fkzzk+*l6-SMp;A9u15I3zdn7S)g(XDjX@$jCHD4|8G#|03T454u>9g%e|ZY#t8)LI;1v`>nd&`cT;xF@@;rI8<` -r;m(kI%DgcNzNUqgUe;3N*}|$`aapSbP#gJ)POTGxZJJz51ehge1>XqOt4Cf<%MG?eB1^flwXaZ8%Pn -Fo#4`6gUf=rCWSOKW<@s0=il53vY(b9%TT-1gRmOFXw%)k!fnNpykX)*CSyLV*!!c_)bjX&kfHfcd&Yu1l-8dEokmc8^J`COxRn9>2bEaeD3HQ3Z-FZmLjES -KvPzT9r%Qi3z5mrD1CU9@GQHzF}$!PXL(sxPFqyoF!r2A-F{P=&`Sy%_|GCOCnf}|n-pG#qO@%rNOM< -nQMV=DnDmIVj2N=fpvsM~0C;6t<)zY2z}K%|wElDDY7L7N{h*`Ys|g6MYkn={|ne6xl(Q&sc9sjNqm_YiDg8 -}w)_SIK50r(KVsnGR>rkk65IZHZT17sfHc(32^=#cVT$2bf^5)3f(8t*7z=`6>Nd_HjF?14G}8LGpQF -k8DaEJ^}+>4BwU4_jvAWsql>ABSt4`JMvLM{QJqc2SIWu=|YShA-6IQIn2s%cdP4-xV+a=V8thBK -p8NqEK^6Au#rgFYz(KryvfPeBJ;2IIqB**V}r-=R#u?Cs|e7z`3ZtE7DskalQwg4n*Z+b+?FVRaqMz< -Qk~TZaFsEjVMp6exraf0*(H7=)e@X#8MG<`Bd=_^T$uJ8=+v5IF|}pJ>h1bMHt|U*)ACe8o|~FIp3LO -rj|I*0y0+^Xz)Y7O&ZM4!t)(G0aV7?Yzw#3}+DA4cD~*2rsg({r3CfcLs*HS$|!knnMu!+w!1xd(CbE -777O@4;$ooF1Nuj -mjNreV2e93=bc0W66?ftiG-dKA`=@0Xpj8`=CM+hl1@L3Nll5KT@9?#9E$)H{@-;F8|7+ot@uG^E{LCs0WyK$sZlD%dx28hMXsy; -yJ|<1T}E*>F;VaOyMIy4&@!oeYsle1i=KAoP^b&*>wZC1!l}s -CLtP4pY8wL_3yyl0yDOZkmlfhRLKW9_B^I8eNW=)IAO0;Ang>#ffr1t)qiP^UyBCDg%HOUHbxlK#EB3aDt|3B;9uQUp;Z_#7fZ_Z$9ij?JYZab-Q)8%&u{eWV+V>+HIY}0PfbsPAjo5e6QZD{~VgcB*?jD1^DtQNw~3tuJ!8;;syL)Gunr})8EIGc7ZEbMg*1%-_}b -LC6FwOp`A3uWGt;=Zc71`*(9ovw<3A)-j{tS-P|or@1kJQv6oTriT!wYyfq&Y02CQ^Ny~~a4nY>4f<9 -)W0j$PnS5hvgu$<_gXA<8sNj<~@88*Lhdm)ra)=qVyKOyQV!f8BG?�`$YGM9ZIdm!v1Kg<~tk6{Ux -@O&tqgIwU@+u`mvL?S0nzuPCB|aY8RF(wOp5ZW_&D*Mr6ypOWAQ`Jozu}wJv=^zq$^A0EtMkHg-$&agBa}A)Q9|OAHDj>bthGY*Z^Pvbg(o5PCIU0KsdHzobqk -8QKOQ_$6BWAiR$(0doeo7iz{DV?oZ@GZmpwl3J4tXQOYYhx7FDu;NA6054u#PZE3YDHgr8Uo!+I{&kU -5%PO9Y#h_0cQsJ*o0x>KToO&Hc=Lq)~A*ZgHx2>orMz^yEh`Y+A`U{Bv0#Hi>1QY-O00;mk6qrsR(*@ -``5dZ)WHUI!20001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6ZZ2?n&0B4A+cpyZu3v$Rrz5JR8R -zBFR6Wm~Ys+n>uIe*1{WhqJ)Np?fcGkoFm5W#>IE$ooID7cg%xE&DZul#p=ct|2^{ -!gOjGw3u2S5{65N3ZU3ZHHHxa2HK5?D7@ty9S=0e?BmqYam!Sq_%L(u&1V&K6v2f+tGIb}5W5IxR*Wm -q3jgY>6IEt(kQOdLNjWT6JzZH1_3D$4kEL(DH3rwaHo^ZtBJF@Zlt@P|DZJhV`eNtoR0pG|iKq(a9{_ -L{+>F*FsjPHY1PQ>a$Z`R=CiSwgWShx=J%5<4&aHu)E*$Fot1a$=^xeX~qHXc`0F*>H{bTdoDptUKVA -VSE@ZOIdBZ?GRxA%lQ0%}#qaeuB(g1|BGgbY8QDS^dE$1*>90T~%T$xJH`ot6N_cse#?@#9umc96!6# -Vp>H;2l>4hPxBMgBTjtdvNP{wNxdOK!+kW^#bzT+u-e&o0B5*nU9ed3S)9E}dx>ow0=T>#Xf;l7-m&M -xQS*~xt7GeiKiSTJPV#c9r}tzbJIm6C}i8FyTlB|-xtr4Q7iJb?`XNXfwxt2LPVGa!>!YssRO2%yL8K -H3x+pR#nx<|2u947SSSqessVj~>B)K9bFCIhb6FI!kcRMEQ<5F|c`9bzrxwc!{H*snN`9c1(dvb&et2WwMz1i&A9pVYHe!a^cJb3U*0{nsQ5?(< -&AjL8wL~MtgW@gO;=s&V{rsCj&wATS`pLIDln3|x5aIL{mgAV!wda|Mv@6!Yv3M>$qa2cUx%Brm63iO -Ip7O*S93nlU}1|$dLSfp86?N}D=K;sKuZ8MBitdoy@lz(?zz34vK!8cQX=Ad1J)Xm9^k(zs -d;*7io1rUTbsV9%b16N_y8nQ@u`T9`oi=V2DazymF|QLImC@nC?q!Ij7wv>9i>KEbqD&u2 -dk*!1th_PXw0LVU?_|D+Btpr!45)XiC8|8$3YbmY1{7)%sSI_$1OzybGRYgQLH>~DX%&WG+}YA+Uqb_) -rvDWMF+K^j<^J^&v!6*B|_VC-*OrWw-{x3j*D8k`TH4(dK^7S>!kZZY`4@~A=o0ig?6@m;f`Xa>~XT0 -rAZ@%KHiFwg*RvlisAN>0HM1|;A;Q$#^HaK7 -v=qf`#XO}lB_ODUAZ=s8;!Ayv|y3llbvZPtoDoW(=Kb=QV->ATEWs2&=m2R;eCIRUKn1D^6Y5)TaB*d -<<;w~w30*umaO8Kp@fb#+DWn9w~p-jb-+FjhCH$*Cc)sQ^E{83G?hXn)>6qw+arCC@sK`v;GA&!(vY( -?3go0kS0JPWOi(jRJ7&kQ}XtS~l^G>3+86jxxE0eUA@8>)WCwktI1NEX0Y@sPY9m8tCOO|ohIS=#9Ty-&@_Rt1j7oHLOGq)rmdQG;hLz`P4G@{sU^zU -9?lIlX2QZS&nx&46Kd~1V1Vsmyi-be&fX@h66v(1D4XLSG!6}v<`gDfnrqm_8+hV@^r{j71Zm|{G9{H -y0Bi~{fsy})(K;3pn`>8uF&7y9%x74xJyXU$9ZpX{5!%#>gU#qU?S_ -DX-Q@^=T`BFucP<(a~)Kx$@(aT=SjleMRcl0yc|+kNFz4{LWdmZA-yXMP1$*R -&r~N}eM|(G==2j_Ahe3y;sTR0@vkF-X5&pdEPjg0yIyz=dPcWi@|qHcKDDT>1Q}CUV*Q^ -@i%B7(Xla3!mek#7uLO})_i$o=Gs(= -9v9mfOIM`C5ZBvd&tG_QtRjqeZ#bcXIzk$#E6ySaI(-DWDBDIm$<`4jz3@R`;TD%@G( -`6Z2^->8E&IkQX1htdR{tl|q@*cIS;scc`QAWHjK? -=P;tJGltYX6GlbF6QC<#ZR-VSMwn%AhA9)(xg-}+?;IbR$WPI^V|>CH`>YhMo#r-K!VQC%*2WYoj8!z -)aVKeHTu!*&}a|$iFxkWMLTnK%xm7d=HsY?{Jzs-o9avOCTWT106GIB{Pj!C#Y%So#H|A3* -v3Dh!`y4g|mLK06*bGW94@>f2g#*m~SMejOUpwK^U4c8*nD>9Fk>HR6&2E2X{cSg+d!MQQsqM%#%Vtn -J#>U#Dkh8xI+?6?hm({6$xohoJGMhm9XR-?O^Y0Uzp2>cc2Xr7_y1;ck(!Nv#d_W|0i0Qe#AmH`Ep;X -=yhPpfWc1kJNjZEg>I9iW=5F7ouBx(*v~3`}%8%I?&sfb1%Pk{vS#f=9nJoy0JdUrfSXtF(}JuC1YT$ -kEr_xVt7P4T>Ut}%6z+CI>K`b@_5&zDt82DH69$`5L4M_EAZwPwHk|)NDmLcqeX~`sxKXmN040d<-Z@;l4MhhFwBj -&e421Qh@1Abq?E1IHbzE1`zXpphrK1>I@Og`#=5AcS9ed40e1{E%TvYU3o6b>+y6&}rzLp>Ixf?sJsWEeTChB!>i;?pqcah}BD$#HirrPZJxzN@ -bpy(tc{lsI({+EsJP@P~xcioY3^BeA#d6ubR}|1KByYn0WnXx*MY9IGQkWZ}0X}&BsBNrn+);>+bAj} -Yp#+|GG=CiZISG_^GDlhqSj`<9_eo_uqN*pNxV=Nv2syu5F0})~G4&c53@PNIB@Wn(fHC= -3Q_%;?(3M>W?uvq6;;D5>*cqJizSHSYO3Yi -}Ouy58ku@x1fCKTXho2Qsw2uXL@g|J`eJi5xM-nP1%KQ`4QVySP**|R?f@5=Xjy6fDz9 -q-|S`@=g2Wa@xcx4`1waC29G&?{J2U~(iT$_{Q0rwUdq<&;6FR695+MFc!}Bfhd<=Y0GVM^b-%BHaC# -1D#{xOsoRlKLd7lL6R!OBkub866nyd!vo-;V=MM}{5~EKQw@xAm5q?6AOOCK41gs}IJDHh(9`jRlM~4NXP^H;QMf3 -{hUghtHt6%y+(`upq{a$;jXCvM?i~g9-mHpBG08mQ<1QY-O00;mk6qru1E_!QACIA2#i2wj40001RX> -c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6Zg6jJY%Xwl?LBLA+emWX^(zpmTqGSD^5gFIqJ(?pv$eabv -)77cXDiv;A|YZ(A_f5-29V56CBHrWnkPU>-c7EqQc-QKC19p!rl+T0)7@A#^){K$S6$mRYCcbj?XGUx -B)isi*|loUe;>(X)ihOY{wVA9x~SIXPrcXX*W0YA;Eg^yS|NB{FF&a^aWLv8$#il>kI(VXY0?&3Rd=m ->{(&D@==AVNAg1c`QtjHJuCxI=K1$%{RatA5U)FWWaOvS?Q@8apcyzwqwfm^qcPh(ObD1?7=I%eQb^B -_QRcn=dPv6wb3@7j}S=lM?`P=OCd(}4kaQx5y-|t}{S)TXw>gtX6SO5J*rPUHP>Am_(r*!)R32EqJ?50~CE`uoa%@Gq)?d8<5rVSAq&I+-Sa%(QYiHrQzxn`VN7 -+_$RT)Va28^bRP^q6-1PmuH3`yS69?7F_7LdpOUVdbd-#-z6Gft9HIBN;Tiry1+hR+i)J4*06E&4bkm -<$AlYp077(2gFpPY=E%u=bKtxdT~nI3YnT|4%{2Mgl+)z=;G+;bAtydnI)ETQhs!F1pEY^3s*^Dz&G%#YR2<9(&~IZIXarZR;#QlTWD8b|2trH3=fY^5< -JQBL?10nKuqGO0bh>!<>ZVgw%83K@{;ZLzjs=B2H?jim(Spf^~ -bFT66_cb+7^iD15M5V`*Bik1TOzHhBnHRg8-w`Q{c?R^7*D?uv%y-E6=F$=WNz3{cb~I{7L^7kL_^Z` -zBa8Lc1|;1zRWf>{Y53WrMsV<`nT(Q0$++F`6n9Du;Y)pqs}4^Kp9ZZzdm9EaYmT -$y-)^!}9$kBIXwW4JF%L;6cyGAvsD10# -AX;y>p?7(DOoP*CkA5qo_$b2xbR|fez@0O#vc8CvEmgRS7YQP229yPER-Mbhig?TcvfgK3($fr^o|Oz -sj=f?5pR`)b;Y|>6_yEl$8Kze^NgG?enAgbqNoESxXwA-@N|gn|H7N -^q(*rKJfh$JP!YyM#3QC9UnFg@ZBdmTdA075Ho=z$t2HMKLhrhZKE@Znnluq!a_Y-#1T%*<6X&ErRy{ -~hJ|J&c0Qg=39HbjsM^|sGK>eYS{Bz4gIa{MK&p1LxWwak&n%F`;Qj$d3ZPt|HzdQ~Kee-Q%m-%mWwU -{EUM#)&yvkrQ8klo_)n;v{-xL)Q{k38SmLr2hy3_PJDe?U>t41w0K{4n}2lUA-ff*M$E$Z}H`ZR%6K1 --kZ-G2>E@h44@^bt+CHX|{KD5elmUL1c#Aqu)r -1*ol-Dydf%hoDLT3SY2xAgabf23Z%VK{k9-=`t|{Mp24BVOuaA((@S4^53YP}aJWO -WT_!KWt!VfV66q3dImW&Tg`zL_sv=%}0sF0C8p(RtNI21c)A^2HN0NHL6q@ZHp07nd}H4K39oat)L4M -z9-heURri#)*Rd^AZ-QnL$;aMK;4Mq+l<*JKo56{@FUm>mbe4DBJ~M+?HYB1d>4*touh^v3KlW~v?p8 -m0ro7aW!b?>ZegM%)8+hta@$p<0%2GK@)`q!5Q}Hh@d))97~ryK%Y8U18W@H0MkONym#`|N>OtB&O~gzB>7C9as}VkURv&-CF$(RIDVC4>PGff6Ii -1`AZF}=BC^jHK=AAr`_6k1sMpbr^DBb2x!cIeoCY!`(S5O)fj#jb%f&hh>Iw$oH}kQuYlzPTWRW+s9m -eSQAT%a3n9%s*VbJ%9J{!_*w!*|RBgo`aBtC}dbUKm1p}F;kqh4ax6N7rXnOVjt?Y=|NmfykqQZzP%n -ih1fu39HMDYzqq$zj~3c&{8;cgHBN^~Xr~%wV`ko`Xfe!5NilsV0enFua&JUTWcJF-8M7y|d(rgWpz> -Sz+5wT@qVA;l&-iy^$B%_9B72u81lqEUiog)-n8|JryfXw~+t>%7@chSrI&de+Hz){EEV4JI+aq`R&qgJI%N=EFvzMcJU})4=&ylLR8enUF=Pt -~+x5B)hKJf%&P^aQRiYo%_OZmOSk@uu`S>R?Y>yklz9VatIDrb&{M{WaxgMtxGjRm2q7+z~r~I0PF#@ -Fhw4k-PB-ZplcL#pjDHtw;--b1f~(lAIM(8Gx4daZ;d$vyqHwhB+F5kFv3#2=QSJlQ{2N_+rLq}GGl! -$8lx=G_UvtttUU!iO$Hc`c!ar(Fq$Sm{^a{SDs@YEzsp}B4vH+2AU%s|sPEwB{{1X@W?Pi?IwkTLAA? -EQ5Xr!-*a-1-y78lYa+W;OXOHypkke;qr0Jl~2M^Qn@1OckFzjOvcp#P75#>Q4xne;*#QS9Ai_eIR2% -Q^d`2aW~#yoaB1&QEqykkY;8N%n@W}~0iZnnLai9L+|_I(S)nFS{14+ZI%LJ>U&64JZ46Ri5~+0qv%E -e}EwCb+%wmN_NmnwR-hKQs#!-yN(8=&b3)$) -`rrMIu~y_9bZK}4wJ=P8#0WZC@HN5>;SH=CO|8X&qa`$J9n3^)O~m4S!Y2NWa)GrNC$1bR^yM$FDtXx -g#ereTKIJoHLQXP@U>J<9UcdP?W5fVB59qIN1-tF%H6c+d=mdlq$rIh-mBgNyfk*Kvtu+ -g$CgOAXoz)eDZegX~&5tpjtBNHTMtq5LZVT#`iE*g8O0}v^1a7N4w^8k;^XR@X2+Cbb^jv=l+iwDK-y -r?)j71uV$Tz%dTmV7|GRvsFUkW%coOr$&e^Lb2lW*Q`XB4QQbqo+WV{dJ=-!j=A -bsW=-y$foruyA2sS>$ct3Yd;nPhdFbLJZ6TmA0=88JmOsfWo%lFAv{!=Z&b4fW&=kY=9t6C`zcr)l}hiC7?B3s6CP=gAr6a#Z(vVjV06@tBSzhjr -VZSu3WWu73Y4ck<|Pp=#XW%Vq%&Ggr-ZD|g -4Csag7~BIn!YdF`KvYe!-dJrYvu=4n!4^!?X_8s5ya@r)#shuVeW9Jz4$K=kKWyg?&*}sygJ})0k=Mj -hBD27=BP008Cq$hI_1$pU$#<&U(Lz8X$dv(;JBp6GZ#ewbp^9fNY;(xb7nCIJrm1g(dqF~~j~mdONFyV}jOZeM#Cj3@p3>hqo%jy_uZ^@&5ae3uK7xMqK@#Y_#{v8b{#MR!l7*w3EVtcDv6qF(u|OhO_+Pu6}=M4@%3o;`j3)pH --gBfIDk-TyMKCrGQKyx{8wJe8#a`+%@A2^x}tCIs+L$@BE9^f!Ms+|xPUW}lSt*Llo+nrzAK9G>TyVV -7v8bk!%7A9S(P&*R6Ul$#Mkmw2Gwss?!3))Qbg`Yq@NEMczhD^{YrdXX%3=UojxP#F&NX@*kKg*gE01 -))9AOL1pR0FtDv&jkU{<$nO=P#^%QlXSU@(i~$)%{a8L!SyKqctT%RBaFj7Zs@kF7cp?B|0IyD)4}k8 -AZ#F3eOw5^9`S7B2k!PuTAwmGC7r%3gbf5?+$VuXVMW(Khg72<(^$`*I41q9cNIZhB7b1uTnAnQn?>P -Z>T}yj$P3@U-umpvEp=Gkk2FEjwqh-N9LTvavUY;pvZqj7?w>P1(aioRDkliYg(fddlY(qN9gy>YD?3 -sIfTztAF^ySY5t#XSo%H#fk4$Q6_|k-83bZxxADcH*BLsw90S$XF48htHcY&Itt_2#hJ`8a~j=8*{I~ -aE|LJgjo-GCBr_?omB2V8TI{oSGS1#5l)ByXwY&>4&o!nKW~#d(g3ET0b(y8p@_>E&*hoLB2YVk$7;3 -zZfiC4`O6lRyKBd_ve}G)*E;HbZu*(2K+d88Xjfy+`yX^7FE;N)d6lXm|rFiNIkD1UJocXQ$DI?`mYM -jSIxt6KR23UVyeHEG+^jp#kQ2WKn3Gbt#0yDc&}Vl*DH&7(zF1T7$M1O{1msN_IoC3P=l~ld75<&p_)53Vh%xkDxkEIl`w~tyF`%4D -=@ff(%>t=IfY>jLz4xh!OK>Y~jt&CleutMbU@-&bw|fXSg?7ZwX&AjlSnq20wS_s3-G$T%*-Xh_$nIx -OQi8xdD~Mx6uCa06+@Xx-H1tlazJ+31e74DfVK6;ZG5k(FEVdUoE-DNz|V6D-0bMj~ -SBccEPe9ZqI2dNRm*UUrKOCWvy$xeIJnsNy95R_iiQdR4A<8guBnHWqb8utKg^}0_S1G#gK+KD1IJ7# -2;W!9p(^~87=&W4ZeonF_`H(61#N=qTVHgs`}y3FV7z -3zoj@#FArt4Fb*EWrS{Tf<@()5K&5?^1i<@`;+OK#5Y0Ty?%Fwk){%ICvL4?jx11#K-rFC(m04sK@(sA=f}gUDvsZQT ->wW)<$s<^o(-_MEcl+A&-0RzaAW^?ofOmGDdv>L6_=Am7K_cWGQBo^-WUzA6T3i`(eB~EJ^pscLzk9}AR{f_DaW -MWOR8hC1#r+^8uqz(j)hX~A$Hz*t>c&j+-+De}bK_~rpe{IEBrskrmJ?DPI_RG;zOXXvo<4gQdQ1L8P-&%)}UN*S`4vE^k -2m81sv2%F2PKOewrn47Tuzv)bkl{nFcL=P5Q{_C123QUHSz&K04jjwxwB+BRag?eDZRQ-j)E$#p($j{ -wHtIal%-`s~%~i96U0OBRH14mtmt=!KuO!8W6}QT!pqVgr -j7P>mGUI-c=)}m|Z;t4H4Fo6#g)A1Hm+2_nbJTGb3q%vBB$S(s?k~=`LZ^HqzJ|cTjTmSl9DN#gGby?C&nL?sCGnhGqc3vNcVzAbiwyi+UiS-dEXrYZe-^@rz<*cz -L{>hw7pTu8emBt81`kg6Bh<^JF0#%>wPl07_4Fq~khq` -oAbtfOS;qVGJ@Sxl^oM`9qGhnN7&o{}raqXcN<5nMK60STw1>CF2Q@MO}ppf<{)BQ|#E6Al}oO3J#Ot -qsegs(E);yoS{YL?I^<8XiB_%vKTl|gO{V0`OBd+p$l@fNR#bI*h%-KZL&(QqL4IDKsn7id1w6X4*)4 -;DXJVa`}i2)YM!tg7Ek9ELA@UlC~n=wA%~bz;s?E+E*X>kC;aDKsjs3GOgR^|?^_EpRcV4i0BksCFuQ!;a(;$iKB!N-D7>Ya@sC~8Mf7mp2w??M -{hYWO;E!&b|0SR=?tUPFbqlBkL*{ELpp=G>-?vrbOrE-*V40^OYT^4)8)itJ^_|s~0qOHQO+415ms}m -10#->sjV{-Dl-#$xzeD)J5DAqeQ)CU{=6P`}IWm|)~(OsutNuTOX_H%uEDo2~6BlRhO{o3<<@2$!jwV3jD0p(QHjbn8|&8LwyfIYx#0L -LVt_Rf;zYmFPXXq)|I3@xR*#fkK`$7oEFYLg5gzGHXOA(fzi0)e&Kj`-$hlp?}-Kk^ZFAF1pOV2D^wP -Mg|i@hTST6Jg`C$+8DiizZ3S9fK{(0Zuw(Hkg#MOYp7lhNz)9R^FPsC=&%FDoAZv_0K1PHiY3`p?oF5 -VW!A|&K&nDZN@Lf&mYjG7((PEzRwyOieCQoje1mCu_0|~Ndv#j?Mo1=`+Ky9Z6eJBXB%^L}n+j#?KRO -WP_nbPO8gEHeP<;s+ -k=1I(}*VB>n)Oz+5t>^dKXam_or7d?*UXNU%HN%R%LOlh580L@$k$-h1Hg86W(&=gzOl2tTpe&X3%EQAZ3 -86RB)EU>Cfbc#`?srCc2xe&BxazyY=ygn#Yr71x&)k{)T#*hlRJ?_*Gvxot -4juaV<0IIcMbUM-=(I_QPL{1Vbj__A{L1-a(&k0X*+c%l!Kl>d)++_VG4Sc(En{uRe;p;qO_OoB*4_#yeTj&N()1X|;h$xH -gaGsXis%#0K08$C$BgKTwU0-yID_9Luuu^`c$as2Nof`*JQchlMRap<=COdaqLxD>t6}`243{COAz)m!OM}d;B2O&|N~N%NjtzCZT^J(XqBllkWz#tck$Q)JNBnFHW@^@W6yTK?I`r0Dvl07so|#|nhjvI)!U($@qZ#IKu;#)2jOh@UNF2&&I59;hC?W -u406^r6XwhS^N#Tzx48be^E({g;gX -dY~C-YLiqCj$2q5=43TNaAPzt`GZIq|;ebx)8*k^bn}d-3!|fBs@}&63f#=O0E#_mj$lwFWZ-Yj61a! -{9y!5hVSQUA0b0JE^Pra2SW%j@NiL1igdCxV`6hv!r562jH=V&t|PS_vx}Syb0K5RTujB{Ga>I>tH8N -UK!X7ftzjat$yG>HaM6j+{@fh1fcGn@?kx04q)e`njKhSP~wYs6S4Y8Cr`d+Q6l6Nk^KGg3AqA*!FLNSbT16gp0Hl-AjorjcowypECh1TUFf!{j$!~|Pjc -Blg%pj$|AS8nXd$IGmGj0vfjr?GU-FChvq68F#-#Oz0N?j4%Go+H&{77HPd6&xeg?7%W@7gDz0zB8W# -T<|x{77KiU`DGGlST{LGL!0@>rPVH0gTSDx1o&0bw-B8f>jJu*xDOi)Is2scbS;TjDT~FDCmsCRsK03 -WGn?ZR?Uo`>=5TDV39kdccqqxUxHkG8N4e*Z9svLLc32z*VU=O*u#%4g#Q{YW>51_1a$(NdZ4@%s?bZ -z(cLEo&I8y`N|2LA%q5 -g)5%qJimu^j3Vk+^j1pRjvIL?X3`W=J2LWMjqE|Z7Y_sKRuy=)4 -8qxaXtrlKAkDpoWAN(y{fGJc^MC$$@&5d^XWfz{He>(|&97ktOBm?9G`|ltk -&*<>UU8*Rbgn)0XOQ<8Vn!luyyVHlYZTqFhEvVfPd -{8clC=o+7RtMpuf-i4$$L3E$`?kM5iNG7G2!lLuB<_+d9^heZG9EF^tV8$Y&U+@R= -$uzS27r$dL|6iUJ;ITa&dWv4Ek_kexgLF7;d6}%=c3L8X*H8e~IeFEo~V&ho4{Z)eirAhoJ^K1mxF!z -T@hD@%tUW`OS;t{=G{710J?ediWH$Q1n&mq3C3LLw)>;K0)bS7W4W(zJFs$3z;3NeRqBv;F!$~6LU5k -i@@b;&9`+e3gY)t7r^4hN5*h?TT~OKKMY@i2ZJ3NkXpLW`r?ltS{I<3zoO!eCrYaa_iyb>Dlvx&L-^v -Wy}zY8+qwh(H6F0G`3Oyh%RqYG#Bb_mX>A*3pf2UOqnLUFAr5Yf&*NQX`oi)~TS5bU+8V>#k_8n!TLi -l~#1Fl}=yjpzH=-{@^gw`4h>Ij@&GE$UNMonqpRZchOcYDxK%PG@VCZrW`*0PY0D?h~{4(WHMqE-H<_I3>ZqK -X6n0_Bs_IvYSgK#7tQwJTSI;hM~T1se(;rvo}coRL-jr`E7!4$zs-l_eo{<^$xuO?y!_}PoWP9-sJL7 -CdM+XgklP<5HyKJ!MX%;&`gPg2hA`1a3w(TzP>2Mp-2)SFQF(a%pb?#dGm2jH@%d<$c&B`siYGE$2=) -NJqlwk6@4{qAVW&rs!Q*yxUy2Ox`zdIXqhQiO)#Y&q}&KE11W~e&si8fJJcDMSW|(Qa{f8Pk_di%kFU -S}+7B^_32G$8vDbCI23d%SAYM^6?A(~*eI|&R?m~g3n1+T1A5dfnn|Vcir~v$-Qan@q4mP{-R!NkBp} -iCgq4pskrzh`N<)f2BJ;Pe99*l>9;1k-fk>nQ<(yt1>^83#wjc^xjg?v->CxZi{uuy7?@d?B{|KcQEu>fG*63SiQQ*F0-B<-pJ<>T-}SzP0GOeuD->F)8Io1VX+qsmC*FDVDkZU^Hlb0jmA^Nb{7l8Jat!7G;nqxTR?`XQbuTe&S7Vy~RumCnWfz -nniyrPJR%}6r<$svu<<+Z;3v(!lY5PURew0rE& -Q)&P}=wJ-oJhM=HlO8{_)NE{OZ+r=WoxihCyT5rAERsOrby2ZT}lkO9KQH00008045ZePQBDyr+^3m0 -L&Qx03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJ*XRWpH$9Z*FrgaCyC0-*4MC5PtVxL8J(51Fko$FN3iR -XkB*=kh+1LY>x^p(KZ)})JV#XF>HVP?v9i!$#Q{zOp( -koQVAA-Ws=!a~?nPjj&@YpT?Qq!CzbF@+eNFP_8^X=rQ=YRsYqi1J%jSdp;Rfw`@;EYnGmitz>Q%t25?;2+#5sWyY~e? -#EjfA?B(w_2y(zRJ=w_N}#H0@p2zIZ5A35UvEs4N+`BwbwE3A?lx?2-+dQir{ob|aD^7U5J);XC#P?vTs)F-3&(!sOaQ1XLT0fEZHVuqYycqG-eh -bFIXP;qPGu+(P_S2%cD4J^JfPLQI9ddDA72Lw<_-wY;m06t$Oif?`C7yD)53Fo?o(lzBAd -~mT2k#F?*c{lZ#SHHz5Z#Jra0oDH=w+({s5O;jI!5&h2o)$N0a5@;gbS`@D&1k+n^r*jgI7&KsD|ALz -HX4Fzv(yrv=Gh&m(>%kyzIq^-!lFrvm#@v$X3EIy~c<%Qb3$oN<@)}Wb8wIl5@i|%7O{IYdXCmqKQLq -_&pP{Yx3|fgfQ^`hw{ximv!=}Hj()T|gDRn-04O;iomI~G -E1-E_;}8rlPXY^Ur2)?ggy-Y|TeG@)OXq)SfBowN+$#xZLJ~KQv0pmA{qX4CKU`C|6vemVQxRi$TH?hePM`dQV!ab~7~s!S-XYbvdGhlbwWfT!?Zn(93iu@ -0@%6uPnG)oM$|gQi0mTiU_b@QI2kecZypvl6gBCgELbZ!}~b*!nw9i@+tvKS%7PW()2F0eWm!_D17xq -(sg(atFIGKBdYF_ni7$ZfsD0YEhSNApVHx7c#=iOs3p~rV^qcM`;8@UHQ2>kOqa_-2VlHdh#c!CCitG -UY>ZGJ$l9Nr2x=T$vU!+@9EBP?meQw(diItj!OkTr^=@SMTB0!7CFqiu$LyhMoSia@!M=ZTU<}0*<$g -10haWghG^yLPzmye*gkDv-p;1iUpn{yjpd}U5%$vmoSv?x1pzDp&1E_M)<)s-cKER>Tf)G_GK?%6PBN -NrsFwL8>ximlvHBBI@MG%c&;pmbTDrURwR!7U;CW+w$z&*}Z258C71!5_>=mI3OV1UZ+U=bG(*mOgDOjhh`}j~3mfJPxcf@@Tz=+mw<&k%owwi%7(%@IaZszZ+!V%Vf%G+v?;zcP! -37RgKx#on=auKz-@F@M8B8UzO*F~9NZlassJ?qpgzhg9Dt<0{Lo-p=3$BFvETF33Ei;}_*Hyl8g@+v< -Wo2Axnj3f;C@bid<+OgLW%1cI*U(cJ>QN+v#<(_O9gG^z9D4@vd+bjmYiN^TJ<-T0@P$Lxq28mIV2y3(E}O2m6M^h-h -{c?lTxZ177nv@M!Sp%!6U;B1db5+JGOiM^k+V&c=?mn%~P;f*ac93j%PJHvw9Q+B@dB^>m4Jgv|qZ#j -zbal1}3#AD}Qf$$3TVDp<>vIYDm+FF`Yq2~N|;R@bijr*^&8VE{`6r7^;?y)K2EXzrLr`HK2;lrwJ@OB=qtz;9fcR? -_bsjAqtZ^&_{@F(vnAiq@v{$DOX$%vajzbg-mAe!Yq6w+zPBqq>CiW>pna(I{aDtKIpJxc5KD+u?*QozBZy0Aqs2fu?fI_1#b7AIE2#Brm_aMVcRt0!#dJo8KRrCI6unG^dE11kUM$0fC -RrB3$J8SG3guUuNNsk@r}X`%@!&|Ju`x0`=7)t5K~_^=4eYywhx)VH%#z3it|h3MP0(jbReuFxLrC|F -X7?W!bk9H+-o{|4h;@O31x=LYh)ylPIfUlO3k2L&A -g>ni{{c`-0|XQR000O8CKQ-XgZ07=EC&DpHx~c^9RL6TaA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWX -d97G&Z`(Ey{_bBvcnBnKj=CoOP`D7VpiQ>`YghE;!;l0rEl~~|SyV+TjW=w+eRm`!k&>Kr!}KK)#e44 -U;oZ@BEp{YH@@wR?UPO)Jg>090e8<$jVsbXi5i6=_dP}!VwosDa&t| -iX;sEVeC7A*hpS($!aIE)w*+e9k~ju2R;5pPD(MvN@+nP7BY_Az4tn8y7nc#XsU0nWnO+?+Qm^pIol1WT1>K#?d4Wk*W6YWiCvT{d@h7AJ$ -3o9yCle{TYOcGjd00=EJ@}&`qK>{#d1tSKNXiTP9ZFBOD){3W1LF-}ZO7i~oOLB5@`gBRC)Bv*C0!tOk$YyW8o<4t0J}~ -3dv*?*mpD}ebZGaj`n9krOx~^&@3%joX4Dca9ka1(ID2u(v8g0D~td}N`t6JRg3;?MFEltT&kuj@nM4 -3`xKK3C5kCzq_BW&J-`PJ1`eO0!H%1}ch5n~b@$#{Mw=K(n)9uK;$s^0fzvl -_KFMWAnM*c3#&4ys~SrShu$Du`4QNk5ouDRIM3pEO5Pt!V|sw{ZzA(10AKJWy(VB%2Iz-?B3L&#fp&c -$h*C|fz+S$_$F+z`P+HdsQmc3^{(CFR7Sfmsq+*G*D9P8gHV4TAIa%RThH_goYb^{K#=$B3$R_i=B&s -QNp6tpx -+!Cqg<3|uVO7e_|o|tcYyv5ozYn9^gpyN#pKVwx-UE*$7VtTLloNAg(1REnq^C -eT_%{m|Lj?3Fb0GfE5F1{05O%FY0Mqymro|_pE4Ce31U(+&X#qVS`Y(oz5Q{!~xL{@gUHjX-NV03N0< -yMsMw6_C!!zy{I)Q_}1RDX^>{yUECa3;)e1@EGhu^lZctYd;HinrL#Aks1z`X6W=8;0D7-1QkJ)mLq- -80XbEc5|1lO=qHA`&_^WKc=RHhS{W4tSpIpxJYHSD|ZC?7l2q1MH08;LQ5+UbE5;zRD}{4;8oH?pR&( -jBfOhdvGFtWDdq>viaikKMa`;{$S8-75w*Ma~KgD|DszI$+xvi0rLcz*YE{({_|z&|JOPZUM#>C9=1;9Oo__f-%`pt&7;W*?}M?v|yVD~7dl8ZOdN4V -{yUd2!f+ca>IlRDJCZsi%D`MdQM0w9pEgPZpY4%RTHaFURE~ctL{bv*2ZD=-4yYVp!&A-~(iRuXmbX6 -)p@9?BOm!Q0gIgCC4O35+FreUgI9o|*WogZuugFu$z?*Ivw9ObmF3KZ>|JKt@{z)zWTVlGhX( -$zq%V?LeCWxbCcoz3%j)F6w2we7zX3!t%zX%)WFS@eH%18d>ikXv!RR)fbqkoR4~U&|23mU)tQqMakuo3)$oei-*hJc+gLsT+MUg5;K}fNhi9@FT;s$wCIvQ@0G -r1#&R@a50{kI%isPj}v%}9+>twlMz~nw6)7MEyu -Fc`>A5cpJ1QY-O00;mk6qrsVR<$X90{{So2><{e0001RX>c!Jc4cm4Z*nhna%^mAVlyvhX>4V1Z*z1m -aCwzg!EW0)5WVXw23Z7_3Y&`}KvB5JrPwauL)%5Wm!d5sN*cx7P^3yyNqp(I?~tNoTXxb^fMJQ8c{B6 -gaM&2#LY_Ch>kZ~Ph_=(l0WYnVy~BL?PU3PY6t|TS<9DTNtnB!uZIUz|Pv{Zn?araye2nX?&fR6{^-%Vzx`s8+#BK0z;#T8Nv&`DE?xAlS-oClU$4F=Nm642)mCeZd8vCxdkaK$=g7ByM((8Tu;PUpbDTCgu4u{-pG;guxo7Rux@2w7DnD6 -R*;4pm={Ie6u9?^<1sIfCxkznpyjuuu-gg?O|L5N9MH5M4Cs)-hL -}Q56!jKi?TyyOY0DK$xZjFu8++6~zd0Zx{AMq*-*2gSeA0;M`@_Ha_Bh*Vv5%f`oBA!Nipn3^yzQkE9 -XBo~)3)Z0PYI1D_xgiYIFtNc@CF{TCK>!Zpz@1ia4rfGfCd(6g)oKq(}!6381R1c{+&;*E)}&W9Cyp-X_p;G8q3?q+BBdv&HoN7K>*Z6l)j=Ohq1VyeD^|1C=qT@g$A#OYA2xBc>81 -|cG|l6Y%b=*x%NXf-cIQ>fv2$4_Fjs!qxj?|IX6~*F?+`(Sh&B^GF_}zm-d_arWSAs>4=?;z2=|cs!P -3F7X1PyGpK3`x24mF#-{N?@lR-g>me=XKaxkLo!?th;%+wMB7k)!m}CHdz+1Yi@42DosC3(LCrTlO+d -U2K50b+Nm%Ckuvmj>*3&Eb4st4Q+re|4Q1VZEHDc!5p@6aWAK2mmG&m`*SfiEe8X007lN001HY003}la4%nWWo~3|axZmqY;0*_GcRy& -Z)|O0ZeeF-axQRrwOe~{8^^W(pPynNBOvM0>(~z3TmcN=s!kImb^^<}#f57uhs&Wj(Q=pF*_Ff;{q8- -FdG0PH`8E|`nViR&ne+Ia$Bed3y%%}D?b@zUc`o$+P&ciRYg3n9t8)H6vCTzYma1rVT^ZN3?W&@!>(V -!r_0^TGt|pT$lFssIj-&ow6{>2><1a>SF6ye4x>AiDU({8_!w*2!&G_!aho3Ke&(F}aptj4j@m?DED_ -bk0LD@*Mli)(qMOlI_5w -y$sCQ`eNGUPDh~lv@JYeyz2e)Tn=S%Cvzw^!2T3clE~DFb~e3MKtz`cNfruto_vAR8u}u0{0^TdqW3d3rp#|tV?YYg(0rq5o7f8yZq;2oh4r6^*JUY43IdkCt(% -RI%~iJt6*HpUNmSde+=#UjaKanCQ5(_L&;#F5J@(9jh0v`5YS?BLqHbtJS8Y^N9^v#NXqCythn)tEF` -_d}4LVKRbOo3WQ-!T$lbm^>%8fzR&`F6utb=eG@kGG9(6OscJJO6Iom(U$+WU6l&H4?Iy2Dq3+_kWv1z|z5|qmxVgq~+T{+nz_mHh`1hwFr{ZaS -PF(5S6<~2hck0>>O4IF4zsvA{`8SH5e`hIB9q}|sWL_hk1Cj~Ce=c4Tnr83d-NZq8w)8(Zx$Zb?=Bp% -eq5=B4JAH0P|)f}L2%n)D*NH?bV1p5&O&cP^^z}5}zR1_tU9I;TKW5m`Pc(7`++YIR-pcI{H0a;ShGuf!E$l;gl%9gsSy -4lMTbg7wNr_phvviTJ7YG2AoD_9}{h}V`zFe+m -5Jaw=R#N;N;Ln8xYP*Uw@U207Nv}v4u@NSKf{5uc|7Rj)H?D{WZ=EFtgLUr -R(mtZ!zbgp#gDeT2aN(XLYpGX@EZpYPMT0D#x-D7+sMj*7=VxHVQK*}+;3oks%5lB38CSD;AYd{Ev5t -iG3`P6Jm`hqIuedSxCwU#==y}=P*u0$U0ta#FFresT87=t;*LzWYHw!qm;oa7U$le0JhIi0A9I{Ar&u -8^HBvBEn?TeAF<@{zoA&%Aiw=$+PZ>RC5PnJl&&xm`k?==+D-R3{w-B)!7nPzxSf7&kvuBKExIQFM#( -)wFgF0@hg`ozGXxa*ZJ@2C+l4%Hs2wJB3H0$dIGSrDALwo^YjGPd$Wh(w4tTf$(Lw!KE}SM%(})zC3zT%BPiy$?$JoxFK&hR$Pg4(m_2>!oalt&i5LqRoA&a6 -h-5ttlT*ZaW1V5l#o)Zg5vH`M;05=Dlv^2;Jt{{S}JTY~5D0QJ>{dCp8|D6oi -o{P?&U*AR{&1R#?7D_=ARO{&b+<>FxEo87eKkb|YsFh3e(yCIHD#*&4h_Rb{b0_xz#pmY}Pw|^?zH!w -C(8^ekyv&v_=gDv!Xs5VB(QNwHHy_YhqrRR$e|}ZhSK!);djEX-pG@9MU4A}+qukZ?*y5$CW^OJWEp) -$}csrpFoZ80FOu0`Efo+@TGo#AwBB=H9#g_}GB}<&L5M%O>TvuwPS&y(K6}E@X*^nUnx?W>CiA`!bUf ->Ku9+tfB`2mAG)JElqipx^&*BkIH=i-nRB{chZ34fkY@e*Mhf~!#AvXDrz5_uSK2yAPS3X*$@DAkZ=H -=5I2n_DEu90l6(j&$;f1L-%pNIOymU?-&gEV4+l)`eqhGWsr(uevL8%oF(2jVx``I-OnqF8XoP`IT!r#$vu$uaMj1 -9wM38uypI=g3xi5{YIr6YL8T2y(t>Ihv<(vO)vC8!i18ryaAj63sm9+iof}Z}^x~RqDBaj}c~7<*S6p -S$a)@HV8|KEbYU<^7a8Tqz*NXK~oFldKRbbx<@uNrP(v -kj+t`V|P$yq}|thmRbKJtH`;)u7$aNNx>;pz`sp2D=m(pcwTmvGeXYM12rJCK}$Qyw9Sa&UFE`I!4MJIg5C88~+QD~~AI&E;lJ$slBXYSzu^2)^qo^3YLU?DD9f(v2I2=(wjp#H1ELf -wN1joKXx3R!ABVh?t)pRg9Qe2S6@Yl%;w*$~e_+a{#fQ5CT>uIi3It5e}^dRw|$Wo}`AU|K&QS`YL0s -=0z4_&TNwkEaHx41s91@|135qseUX_`L|7Dk9+QdH_#3GO$115LSg^}HAhq@WOmP<$-NKnfM;j# -YOZpdgDUh^1L?EG-bN8OCpP2}*Jjb@`KjqiUD4tO-~(%2{}3pt^bm9byzE_gQ-SN`Icvq)Z-}9$gQCQtK${;fp -q!PE}3of5t8$!gZuGkrP?i{D* -$ym)H%UEpXgQiJuPjC6Ih$=+Ajd00Txf-p&Tr-*dustTj$;*rkW>6gi`V%mHl0i`#`iKN{U}eeKJi|X -aW`D9cFdB@WHc^N}taZYtM@Lqddap~_V2E&ziN?ut-B_|WjH=S$hTW@AUIDpT5s8=4ty7$LhO#{v-gw -f*v|VI_wJ1&X?2rkAHho_8aV$Cual$Yor^V5oC6t{O-T=IagR_7mIgNs!$iQYn8XBg(OD!VG$3GIE0(}3gAW -etFdFTGK0z*YWJ`Fk(1auO5!dZV|;lch}5WoDzX0>>=`NxZI(Tq?9djNekUQ!eD&0H)rCTfSJxHpdQ` -h|LS)$0lQ(L3bMS^WhSP*Y?1`kqjGsKJOS#=Ek|J=b=XcVs`XcnZ^CI&2hYg^`jh|hAzBEXK*P|{Gj- -)>1nbDK!-u6D$R*4j_v@MN~h~vR)26%bg)Bo$X2_#DrNy2Tpwls%MVRQCHbTTpI|n=Gn2-Z;Z7jj@R} -~Os|REw6|^t4il#Q^897h46@0j=3sQCpri`i(vIAN@>lz(}u?;1Z)}2#kyjmp|W^bfiU${;R0la-U4S -3TPI|fw=0n7m)@c==48<_o>_e<{f7EWmEjJo}7=)^TfOzHEWGYa6ZZ$D1$yFG&sf_>u0h3|Nn6H3$_+ -pK?=;%@Wf8$3tDjrruxU>gQyOf0uiWI{Jf(Tfc(DrBJ+cZNCjS-+@f4&cd^z438+H%s)L6x>f6THb?1 -+>IJYNjq|pB{H}2(v~79%(H6E=*{FY&dmp-Q#{1O4~F!2OP24b#s%Ta?m%&7qe_WS`ou5qe`KfRXyV) -Odv|Uhyw4J#@B@b7um3@_#!0pi?8*V#;QhfF0tMokfzF;Znx-tnx=>^pi^og -JRxL45wj%nla?U^03;OEkV60jply%`ykuG%omL!$`uY22-gOPjn!ON4IT5sr)io3(ARC`-D*Yuo)a8<|Ea?)UJf|1YW_<#Wr4xeM;dq;lWg -e=AG^%1jK7-ZuI{`-ULy1L#3Jzy+1F3dwO{7p&LyAi0bbAZBTn3gabiC+`77g -_!+OiW<4Lun!R)%7J~fn5)T}K4F?IyU!|lgl9kvaVny@*lhKgJ!2u&VTg<0$pwme2W$A~2Q-)F} -+fFI%uBc6Q&zt4K%M1&H(%@M%&QFSoQBddG86aCT4EV}>hz1{gUJ{bm){fd5_p20eI9nD$s6$OVC@sk -$N`3CRMh!ocbwz_hU_!nG*r;dxC-o1Ns@xkF0YAL^KMvzUPx$t96IB@#v7zVnKg}oi;XPj9L=MSFfB# -+!|xe0gY0Et2vcd-CRZT&?p(u2gaqDSAMEVZQ*@Wl;1UsXtsW>UPS@co)k7x@_!!-S_nEO_pCgX9A_B -1GX_jSteqg{z=ZPKykrjd@zKgQLT6vg}^n8pTi*d&n$PW1Rg`SEpM4;p94`DQi+>fqDgn1a2MKye@z9IDYBL}gKlf&b0j(C -RKdwfZhtWBf9)f`HR%)=~#cNy;>rscx@83*DE4#>?}Kggncx#1sPCi{w3iK72y4-i6^Qw%r6e+Llx=f -486p}u^yZ|6fMlCE)jMn1@4lIG|H-2pvRgh2}$KM(KM5)OseWzHy0sQQ2V;yZcjV5K>lY@9yf=*9*HG -WMY9{#xDdw0IDk&6cAEyPeSRxSbK^8A#<4ZHNovF^HWitSAUQoDTE-H$Hblk`SYvyQ^z@e8Yv>*Yrq+ -;_C0}=%KI6tHn=TH;L)SHSzV4|4P;XUTQwWJ1-07Z#{C|ZFjxLUcQU)2kJq>szQ)wAEM@l=dg2p5ROWahzO~Vk22m -z|PKO`@6Cey?;q$u-_vp)ERZ7g>eY&VEjS|1Lfh`1lY6`I=1;n~l<*`S_T`}MbR+cATt0N_Re#ZCf*_ -aHYls^1HQ(PoUJ=SPBX~Y6!+xr|88Lb%&3IQQIL7htf0Dl(BOe{CMW)hZq7r%^(QvU`}O9KQH000080 -45ZePW0!lo@M=0p;;6cxu)WPba8homUUayl(q%m_gwQ->eV{h~~(f~{6rV;U` -1D<+FdX~X!YR(WH@%Ke^9GNMZ|nTtx*rX>^QR;6N9G`W!#*JhO|U8LM_PhauvBYzNeQp@M0P)~Sjbe_ -u%-soDiFj#X)lgVVY;&~267VKm6i}+t7YI7^hPNjA939q*~uWL4ZF;$!2#MaE_6Nc;T?9ARTRrw@J31 -Gnr`7BEY=9t|tYPR1gIz1PKC?PJJ7r>gY!HKFwxn_lhj#=GocNUJj-+%1Ws`x -n3^sFT>J3me!1ysog%>OFIf)LOVJk(p&euP9~QAUaKdWg3*oG@h1t+iTi>-%JPA2RZ*ytnL`Bvl`%S) -X{Qsf&9@-d+8CwY-`oUp#%I(!=*1e@+nRq!;?t>ZY -j)C^$C*`hLHELq7f{xU5rh;GI~wzxx0I?ti6!7t71*SJ)3Md#m#D!0?dv%o8(d*k0y2%awX$O-1}Ucd -RO{DlNGYo%M(_ZpiXvMW#y8io`bvK4$hRxCbnaa~)VuXwT|RDUIa0{9R}U**SIzUC+H7c7^Q(PwgV}* -R@+9XjyLaCKce_KrP_EHAl>vG8YJ8g+q0VL3Uve67d?q#B-I)tu*-|31Mv?dOo*mg;}uAk#m(OW)b{{ -Zsb99zq?=F+`a!0y-a*OWJq`t0{Cba+G -@P6)yt<=;|6muJ+GxHtfkbl&S9q_?O`GjRdZo3})3ZyT3&peXK{L -#&INzmupC!*m=Z>#4m{n?~_9a_~Y}%&Nc6HqQVxa0*aY$#k&6 -dIm)agZUZO~P&r+wv0Sz#d15tDr($OVe;FH;61`_*}5sP`;p|LHXRL3%XQAbQGN_BxWhuh_Zk}?A1Qi -hxD-DiISm`AynaZt_~u<1u(DA6Llbd<(CGgw9J -oMlB;)i#}lw?j51bS}>^8M*N8cGaq=q7HF0{@mK-VQ?Bf8bluEwD!w=6gy)4qT9s!FeuqO$r10kL@xor-P+qzuh+);-VGhw!;Lj?}rRxTiu=tCdq3S -7V5bpe9vpgHtli>!Ye&D(7+BRa$)CIB%V8O<}}6fxuhwCtw^i~bd{pSo#a>PUOr`~KS2-GRB!&s#QL_ -Y~{dKg?CWyLSK0en;B)ddE9%ZN1+G#Q##+Sg%j&1UyV(4vxiHOlNnDbo|@ds2wwtSLe&MXEvn@=4Z#g -R24tuil?W`Jj$}6euieDgxygix<`|AnwuoJV|QkY8g@j0N4IJV@!RJ&C#HmGcxtDy+b~{)?!&fSZK1b -?n3Q1~d?*Hmo*H~CF~mI_DN_vTonAkHh_6-?cD*%hZ1 -Lo((k0cyJ*a=$NmRYUi2q4Zu$m;=Y6jW!vnQ8kK*w5iRTS9DH_-{yLkUDK+#(g&@^Z`6L!JE57$ji>3 -0dVn2`&_?DppN%Bpk592s<_hkg)92%_aLVgIJ?P^oz707kicmV=64ITk!67KYXRlYDsm(X{vh7| -R*8p`e3yz0tx!df)J=1wb3E_B9GX&($$Q3D>`)imlhaLcqsqc&!`C03x-CjYXGE18}pk44=@OI+pW^ -t5W)2}Y$D%X$szqBFw{POareFl~z(nUmhu`9Lnkwd$wnXKn#<&)uY)|SWzWth!t?t9J#85ilmo*&s{? -GBBtK2=F-wDZ=1KGB4sxX0vi-5WDVfN@(>RyM;eUjH2HJE=GrdNDTKY;eYSR(SQ)QNI>{O+6gS+}iY` -(-ci<^zaHzYxGan1qQJ;A8_|F_L|=Awo~;Bvk~nVTiI{wMgI>_O9KQH00008045ZePRaQACO8`a010F -O03QGV0B~t=FJE?LZe(wAFLiQkY-wUMFLGsbaBpsNWiD`e?L2F98#j{Q^($~xrARu|M3QsKo;KR7Ez4 -`|+LlXF&b#GxkwX$BCmPOh=OKps;ePw|1Hb?na3t5}a`)j_iA>G_jqXOH(Jx?8jM%(l3RO3l#*E -o!bL~IK%4AD|nZ{e#f2IFxSuR -#Kb2L}hUG%icv@gj{Y$*e90`SfSNad>t>+?~q>h;5Q3)p$H8Wx9YDLVfUOG+rb{S&ge=2gBVJwe()k< -0^(X(|+H30pq}Pl;LPDak_wp5*`kQ_Q-&ETvde{d?XNg3xz_$ddh@qH87A>!v<0_gaU+kS%8v-$nuJw -HV>^4@Wp}O+G9Ylqe01{azKM0ggEu}IS-{@wZJw|-gi#tGip511(1SbL2?~6Y0WOBw3uM0XS{0=*9J?eSU61ME_1&Ax8};xOo}SRt+mA2azP?#=-MZ6mf?RD$m9zfnu>2k@gAV!KLGNs937N%Ds){)vnDkrjj== -=zZ4b!jHYBDdA}P+TpuypTknh!>SCM75HF79kq|dnA4D)Z5%^^#$(x_ys^X(%+_#5r2`U`4)H@Cn;=i -Vi^}x*pEd#Lk`7YNr)s9IS^BbB@7^VM=pcV_Rpnh5htD|QcJy=xH_vr*^M3Dt!NHQ(BmUN!fJ<4U!o? -1OIs_GcXe7NEp38Od%Yg3EHq1QUSE8F`uwCJ>1rWB?csu1qeMwCz~(SBU;)JsQcR`HM7#l02sW)M7cr -2I_`saRZ27=cS?VR5lPJbj(`jV`efQJt9Vm)S7Ra1fT%diNRY#Yqg#oo9iw`7PrgH|ECS_F;xEXg68Y -oB%KF$m50Y6|R&sNPwyplVyl|Y+9DKcCM>)H`;VlK;;%AGTFOPHKbs1o&q!8$@ib2AtY#RB<=I1q@ag -aNBTf7Bm-ZU$SVb-D7jx?^=H=1MI6AlplyA^?2N6?n&`=JI%|Dq;!Cjh6z|JRlX$~?y7jZTh%)B`)y`#BY%{Z_CZfeVD20pB3$|LoHR6R7rpG1i!1U4ty2QHC}88?=Ec3@;_#}zIi6w;{#6$5(;Z -`DexAXLTQ$mXsxjLrxKHb!QSl_qes8SdaCXCi=JoCx4cnj%%IH_$b&(LqEKUPC4M3h -#a7ioR7NGYaGjfH2q$HcAwW3L*#9Bs9>!sM##RlBjG7?wNw*iQI_!hQb!8@!=8m!(Tk!3^B9nBX#)a# -IyJqURv&PdkJCjV6zDUk47JJ(>FMK}0&(#Rfuwji)LsGeY!hJVzutXw=~287Ja1dmghEvr?7)+N6;TM -oY$vz46PqkB#P5v7Y@xakfwcmZlxtZP7f9aq*y^bn`D#ATv4y|)aEr+%cYEL;SUxYpbou?@pUowsvcT -))4&e1A87b$N09iam}`tUyPiKWD|*|ID$L%U4%7mlt>A+q)NcKiytZ+vmq8Bk}zB6#qQOKi}h@-+kV@ -FQP=B_W?SiT%M!HG(!DS)#dr|NZ^J8YY4xBwkY8nwP;&!xM9vJZ09ZIb6!^Ny5om!D6Ive5ZdHd+CQ_Jz4?s -<0Ri(5(4L_khD62W2GQhIXadZWat4+izDk-k()e5FVgNt1e?q%9B8sLPp{zWV-l#Wpf-OD8h#odI-~t -oTFpNUTHaTeNt-+kunvIc+}tcHrvQp*_;oLW?>E)zyY#Ot8qN%iC>;kxf7tn| -Fx2)^PKIw>`N(Enf}&q(aV<0z`eB<}>n{eb-MrBlx*pI_NKn|(k6HKt6ayVNc1K!8+%pRyK!Zj>R_KtQYM3bJxMj)g -58gZLP-E4%L`OB|rEVq-L#7;b2H}To9sS9%YJB-e?I$)70`MP -w#1F-5bh*%@%^Q!FT}2reX#zS?8Q0=C`j+NZJ&#&b5?Cls{KD1Crq^P#zYi^|Sqz4?WAqL8(bzDfGm_ -$OGuRbWCgtDubhJ}+1C6+~rYo7IT}$|Sip~qEpR8U_fv=$WXfFjfXI5)9%0)SQhz=_6{jVsNSTP@IP -?`wyL4=G5~piDu61>nl-4SaDo&rQBSg`pQP0H&dMKd4NZJa8mN4IA+w%u#@zrX{U!3e&291kQ^cRc!z -|fvTxoVC)w?O)@evVeKW|?G8 -nwx8g;Kf!L-z&LoIC;M6oD0a+WO6Wm;np79`ILX_P2^0eDj>bXYDHC>_u<7{3VgMU@hHtb*;SLLuLzEXs=kvGa#p&xDX%^;Wt{Z9mV8BT*5D6I;Gc5I_z8Fu+W9EX|Zg0u{x3yg -9W#uBASXGL>H#!->j0SxdmVAspnux`*r9_eVRTA&yoS8!mH?u~zX|CjgIAKy0|Z!K37WkG4N4BduhkF -d)CIChA_$RrV=RZ_`Iq$JNmd6*Q>joE*;SlO7`gVW=0F&Oym5Dnau<74rIjt2p!PvJL>U~lS_zIk)`; -#J?p)A0YeWq8}+m&S0=iKQ+#NmfVohL)#^)?nNqnbwsgBVD3ej*DH`GB^ZbsN|W}fyOsi_6G9`bstXl -Q371dO0Y{FFt!LoX(emHyEW?e)I8NuCIh|85_u#%V2o%@F6g76Wzrf{J5GMIcyBR`iGDe0J|C{Pw9_W -{=eKMRWXC5yNjEwXf?%mlB(dqSkG9YIbgLP87*-Zv$bv?4xs8>P^<&s0&iiU$dj$JclRl!v>?WpiG2D -G&uiNAZDZx@EhQh?9kn2jZ-zD$J?7QR*GwIb*<_@o5GhNZqc65{+i1KKfF6y1* -n4-J^Sodf0Q%v6{vbl?6&vL9vbvq6`_)TNfqG^>C-b3()BMKL9o)n?KGp|y{R>F`VQK$jHcX?#L{ivp -;2FBLuG>L3D(i5JOgqVEaO=03gaRlu4wb#w5p0L~Y -`zo^FRcIT|k+_a$Xa#k1?gE>D`MCvW@tPH8IRd)5nfUU`))SE^6ENuq}8Ys4q1Mmn~o6Zblvr2R$;J7ZKTNa+mvW@7|o;^X`EOwd2sVL6 -ZM$0%jtl(mN(o7Y!=eRp{#uI7@|-&Xdqp5b2l8EQ;@sPKzlc8&`<>MF7W5EfJHs`7y1bQx1BLcpw(6;=c)3OJ@j`$mPXe -znD#E)BN)u>}%$a!Na4$c-b(2Gc%CUqZ3vfgGN3pnrkp(L(?`#*iGn#{OJkjY39R^=HhIpuZ;(!&a}auq&pW)M`<|641z -`3gb)loPe@icg@l4jaMB%Nl}X-r2~iQFpyzer!D-Z+i;xQ8H+Y4o!3vM90X}xYEs(;(B)crG_+v~m&(gD4F?@6g#6rF$~aUB+*#aYQH&hV2yt?k2oy3T!-nX -|sTWNcCco%ydZ+K@5PyibdEy$!G#zapsB&QDd>n(G*$uOk#dI)jtiqD$hIEvM*cX^23s&AS1NI5`IpN -RAE;Ja$yyV4@|wax;$vgLV5BI-96Kmb>E&?lL-lULnC#6G1!#L2WW2u1qEla+8T=Fsbq|AkO8?8(6gKdbY -9zu~IUPh(#z1I@UU8>d6O({qH`3ZO@(Tshq{EGsHZXB`Ul%*mW3jEy=JU1d$fXi5Q2C&Gbc`rVcnWuP -r*d{EL6Blo3CVl`~q1I2`Z7qr^qeT16$g$PX%!_eNJ@ycVgh)5=$tO*ddlQb|2wT$QhW)L5>b?r??{i -79N2ni5<6NvNC<7>+A#m)BrhWtFPdjr?+5oHrma$!f4^^5Wi4!0>qutbK)Xp+7CA;bfwYa9DT@u0bCb -oalgoClipzrkq%RFh?>BE-9;uqVX6FO|3vcFr?I~%L-I$1#`V&aDFD-^@aVi8|Pq_en`unM{%9BVJp% -B{0gIiA21PasY2rF+AKfvD6~rJ4udQkn| -5}TrKiqeWbM2>`c6@m&=_l>!Ua}*N=ydXx{r_W+AiWYG?$I3oRxHpa*yQ+e!-Wku=GJ>Xt}p-Wl)lYbwH)8msd>A?`HG4}n%n+?ENA@7?fU6sS96TkWf8gWVVeB-dtJ -*^Mn0hdn%d>Bp-KWo%{VtoPCXL$-ZL!o1R`M$wn`1~0%U$LbBO^wKx -kP#CEqB(cf@br-a9TGH;7-tGxG6HxQ2ZGQ3DZ`yl;)qmX?F>QjKKLNpZ5GAM -z|0G>o}1I@&rgh+CCPhN>utbMVca;KOudjI}_nyD*uw&k7aj@rT&aoR=x^q($rYkS{*A1N}by?K#`sY -->Jm&Guu5bRy79YgjOT-W^2Qf_wU8xRE0@<|L5mf9NupXNhVKSRY#9* -R&i3wN_st1>#}j-QINMCtt=j+jfbQM{qv~jb;&@j9wmzZO?q*#jf;w{%*J;ak*;mZ(bQ-ouat(GvN;J -#!`$Ya6H(A~U+>Djxz(iv4lbOH%rk~CXgwHS*ehI-ajV$LhY~Od)&0wW!sjG>+P`o3cDd_D|g=QNgEwDM6!1+fI#GD0tx&t -yws@K=9?xG>eSSysdNhn&ZZ=%>@HGf&JDL}Q<6}#IsaE)pD*2rDe-Ad|$?(&0Q_|TkrEVS0#hPk_0$sm*azXW>uBg{1Y;ansu)<{4z_*x!lt+Q# -15r~}zFJVd5E`OqPxK0=CRG#N#CTeEiBzKHm&kV|J9G!b{c#yD#QN^->~sw!8{$3y30$ ->Q(oM>eJxbRPG(IGA7OX?Ke^+WiS75Kpdl=&W*xv(6%iP>sX?S2O%35zo#XyQ$8+k=p{R5Guk3W|Y1L>Xruj0NIa_h#Q-+SA>S9L!isfJ}d}H=gWt=`=8mM{a_>pMeYH_B!^%0CJ; -yKy=|2;IfhoZSgph-gIyDZA1~q&T3(QLPMYMeAS@T`U+d1*6{Z%gYn=g&$MC?NS}p -Z3L98Hat(&++1aMf28CqaJBScPy2nvUmcZzetW;FgXz0k(1j0;bm>$)S($X%oa?i5H@etFAI4v=H9F-chhS_dC2Mx7Fe|Ql9t=0KT{z3zV*i45gi*aSks~J4fN8J)Z>xVLucU7{y14pRk9 -bNUE$K1xZozO%xISe$Il_2Sh!GuW)zeUyAM0NAer-Gx(?W!g$e*NhgnS44M6^xAp^W;>twmAo@r2+SP -uXJtG&eCpX=OHEG8kXo$a>quAMvgXURXb)4|L=wK;$8sKn`DHJ%4W0n>Xe7)EN3`FrvA>`Y%DgeRAty -h5Jl%2}k*d6guzI2pxTJXKpJm`B!?!)U+}ntjBxAErCJqA&_V7~<9S)VpgvdffWRd2p)^`S(^)4u$1< -PgTQTu2qeVxkRPadCAC)+Jg|SpKjiA)yr0yQe|G_orPr7C8cFZ>E2fh`$k0W+}s!GbTSwApaE!EFV=R -~B-goskxQSw%ZR$u#ri%sKMaV0Cc8ld2vm8o>xcq+Ek7Nde2!XIFm**t?TDg%gW7)sP)h>@6aWAK2mm -G&m`(ry0006200000001Wd003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ7`X>MtBUtcb8c>@4YO9 -KQH00008045ZePVO(B=Mn(`0L=mb05Jdn0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJEDBaAj_1X ->Mg-Wo~w9a&K-faCxPX!D_=W5Jd0#ip3Y%P~3YV2Sb&RL)_rF>7f+k#9K#TYlS46etwmZ65DA?OZO&r -n0+$}f`H`*X`!X6YY?=dURLPeSSkySphAax2kwB7XbnQuQX!z~r6JX#axn|M36rfRp8`tPUzDPu|UGY1ZmyN{;W;5W@6aWAK2mmG&m`((DUlDK&006ow001Ze0 -03}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj_1X>MgMaCx;_ZIj!!5&q6!fy$GSE~Dew@wb~Q -or`^TZeqt*pWIBR%}^8xNyw1|Lx8$dJMC}pF5U?z3+k%q1;d_= --K~hq4UXU`a(k*R>+@+GV0$#l3d<%qEbxp3TEvx8MM5|99-@TzS+mSok>{&+1pLbH$;_~7mD|nm7TQw -=pczKc5HC6L2a-NBc`XG0_x@enXgABf1C2^wrUHEe)nJB}0^-jD-t8v+6pEK_pEq!VB68cGSTwfsok3RZ0+i$Gq5ZULx$5tG03mSky#W+0 -bYkqU9S8d`Bh9+=!Yx#MmJOj#x4LY~vjhGvrO0jw2z<$+|Z$=XuLw93%Lf)u>k;$O8B*Ukjb#nLN)eqOpyX5=j^7h@$cjS^xWz*7W6upee%?9} -^{3*1NRR=Eerl5}u7)MW5;l|9k0M*PDXKQyA0{}*O+T@Y7eb3~GA>K-&V8^Qs+qR8TJONiw+5yzSep$ -n-l2($qeaF!RGEAgmaguCW2`Wtz8*tOL;6*EGqQ6IGm~s15@a+~I&3t`Gn+m=P%`cAYG`j~0MJ(83T= -G3UX~@ExM!2{RW4~}#MRpo}%&75YLork4K{H%84R7Y|>rZ+`J@7t#{77YU@MvxuE_ucaZ)nL%3d-_E? -(W{HZ_$|(!9-BI{zv`wJq11Iq9YPD2+FRJ|V)AeW;%UJ^}6=1 -_kNSfw^Z%kY;p`FmOg?-Xo -jRqug*gbKSDTO%PSy7NCWtfYqFkSYnxPl6-3#woHIa6i%bf2;ULs0Ay*^nwFEo-F@9sghs>}n*u& -QUj;7R1td!HeRet#z;xN7qV;b#uY~rIK;URW$*-d-0rFTc_ALa9DhD|*$WlPzd|(k%8`zSEq7jS)D#YVMPB#$cS;b_M%mghqbFu@ -d(nc)M>E{Ha5To|nJ}p=dh)puuNVY-0po=9Wz5~QgaCcsFKtbdP5o1%uWc -{JqLF+GU!M-$5H45cz!VPsu#-wcj(8qhHC8Tct%WxwlJlcRa&yVd4K)k(=z1t_188DB=-+zUR%*wLK! -B3!pYifX8v}odjNB_oc-udCb6W*F^oKVMNNU_#1R6uZ0rdCv>?xalUhRJFV6Z=(dNAlkFokc6bx+>4A -$wP;Ay@^A`dB@Bf5ksnQy>X%+fazEDUC$%fipj5{7yXhYJFSq>sWzfBjN$zAJYk -To-Z&%)WGY4&IU>Cf-%V+wm`m)Az7YZ#|F%~k5cTtde(o!=B$Pxrt%WPVdA(I8YGV+)yfDmf=b+HC0* -6BIQ6Gdf7Kod8cwwfN}@09!k`mF9k`g1i!DMa95WU&1ngJXd3!dhxtmD_NnggCv1E2u1Dnl(SQ6dd(j -y1pFx_EkSg3UgYrg1a0*?U1Kj54Iv>4UM+s7+_s4Y+1{a6Ph;ov>oylhj@r!{Xr!vKlda8OeiPX2=*F -Paf7Q9t>229lfs>jtj-bneKUz&Wr@GLyy^Icxm*gukAz!&P=*x!%QsRYa9gw`RW^$I~Nsn|k8t1!)z- -6v}-s={AM!ttw33Z``@n5`*s7I25>&{wLDP7L$3mxl(IhZo*01ZwPyzcA!8F{s%*}ZD@-9ncC&;e)11 -Ha3gXupJ4POQ)O%ZUu!eA4&P{w0AYU|%}|TKpDjfdzT_{AEawAJa%Kh&uj{0-B)G=nOR|B4bu%4aL@B -)~mU!G>e{WbCTelluBJ^!2-r}dKwxRLmBvp=ErCJAqMcYfE8$OYoQXYgrcCdP5@~NIfq$qTDU;Lw{cF -_?RGZ#Xym~D>MKFczeTrp3LXGF8{p~ZFPMDP4nJ*y6ScX_sDTTr=dkq^e*hf_&i -&Ro4=<*j&^gv%LBBOJKh%BXZ1}09wR!Wc1JP0RA^Hr=?1zWP~93pI}2iv-rH=d;B8#076Wi~PmgL_Vk@df`8F7~tEOQ)6C(B_G9TXJ9 -UPG3J!drPSfnyn?L!fs~n5eukishr}4!M(Yle8AKBYKlr%MI3J%0Lfn831_>ux~DmTE-#IJSd44|G-b -#KnzAGqJ%V|$s0$`%llidTu#;j9hM8mDr#qtlP-j15#WA18Dh)aA9t3#90N-ih*QfrK*=zvR8@#^E&6 -Q0~jT)fhf8fpi9Q9hZ(EHWE4(~J(%*G<1*#R#w9xLd1!N4k9-L~|Bt|AcQ@ppLMfAeA1-?d>o=-o@PU -5sfbffs#B8`MU1*(cT6VnC?}6VSk*{qF@9_a+Qz$JP8L8~?v;CqT#|82OC-tB^f<7Ndi-J(1~MQn;&H -L5`dS26-D5jE9Pdv)6d;>|f+fRh&-SLdN~5k0;*v(~y}MTuqMTW2r0eruW^u=ox|NB@c^&7aDjGxXJi~ -2pY!_4T(O~$tsUYQy>)p->Zh5bGq3-~&1QYaZQMUP6gA{zT0;%`rLKWBtNY~zY2tT~{Ig4*)v%syE-QC*Tgakiq3 -{s&M?0|XQR000O8CKQ-Xgi6!-tpxx8YY_kdCjbBdaA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OZggy -IaBpvHE^v9xSKn{jHV}UIU%{maBz3A{uj`8eVK6c;4VI=w9quHFz@sVx+WrBtzELrTu`kfgj&f~_hA8CiWMAlQ8h83?HaEk>hDDJvk)Cg -YGufGOE3RZh>&Ql3Gy;e3-rl=9tKc~*%$XRDWIOfQgU87Ru~Usx7T#-kHNuoiqrl4M<}NH(+$W-vQN>D -Kj4*4DM@pN)O^LkXf#4ZB<_ItNm9@q<`Lk#G^bJ$O>sY_e*{M`9TEI#M)d#XuFPSFktLx88B~cEDi|ltdW0KFqI^}gnS*6N`eSUS%)Sl`VPr+DmD`Tp5NE{s)6 -f5*1yJ_FoaF8Pcr28!}}|Oa1cCpia^+SNtHG!1y=~xHki&a+B?z+w25Bzk)fYjwx|SO(N+GLFzfTzw{ -K>b*SEL&t)`x=x!6(Fxhm_{QHkZKxyZDMd7#%sM-!1%iNze2PIr604x&9_hrDzi&@O8Eh+Ag*uLZ45q -On2JOFk*7z~b9Ckt}njeDC(w3(4dl269Z1i`ZGV9N$G%sWUjRb)q$vle@kJvK1p`PHPlUC%UanZ#Z>- -M&5zYWLt7gk8ZK#a!c>Q)>uM{Lv7!8of(mZ?ggISgL1s>Dyhf{$UT&b@Dd7AZ&?mRz@I1_dJqJb(1wI -8>ccLoUD8F6v(^e?;F>vfXQtp0InAt^NtClwc`Chd@2LA73u=2K+H$GFUip -L3-oqBC)==d5Z?EetZ%Vx10m>J%oIQZ|Wp9qTCw7UR+8Mgzg8gL#z;ldb=~&fu{ld`-@Ve+4ESen1kF -OEO4t6bd_Fi8(=%0}rC^AyOhAU=eXa`cFZXPDM?2zAKM88L&XUIop$*IxlC>4M}6a6^3o?pCOT+SBr< -jwr%W_B_6-BAgGV^w``Tciy>)xN{_F6gBnHSOek7xRVJuTw~_c>zZj>K=~ma#VWFH}M=h -KHh1&#*P0q%+?E$imJ+Bwy^bT`^;V=HVYEhdG+T -?@@+!}o02!&7+Tu=>ZfTxFv4KIm>dH5Lnmo|FGKIGMEuFc#YZW*oUhwtBEw0u;?=w?!p%>E>iZLvA^r1DDT=L@0PjNqpGvzKV^fHJV@>U_9?`+>=R0(T$ -0!VjLUM4VIV_H?>3Lf`9M490;J2J^bfs>4kc^h#wk8`XIe$I7x|&~KbW$>4=b)H7sZVnQO`3gJyq;e# -F3(+AIz;y{XCuwg=ioijra=q!zxHqf+?v5$Fr9A&35wkr*~A$_L%M{?a`G3IkO%n{jCqEmWBZVPu89W<({o4J8CI?v -V+4S1fzcdP)h>@6aWAK2mmG&m`)=U^q8v?007TD001Ze003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^K -VlQxcZ*XO9b8~DiaCzlBZFAeW(ck$iFwWeF%E^qKTs!x;Ri{2jZZvglKbCUoHItzz5|UU`1PhW@bT`- -E-rWU2f-kb2o9D~ZdfE#~EEfBY-34@XbmYutS8Nv-8#cS1`p0>hWkMEgB_zAu7aNhX*B-kRNg{Tv*zl -aQIL!-LhD9vWoW(1)7bV+?GKridzUQnE?19U8wP%Pq1yf-)&s5-(*SV* -reV^D-61OL(v`uyDh}`#4?yffh|Uk8n8v3Zf`Rf`SA{k@rMIki-#8avCJSJel)k$Qr9d}C5An*h -%OAexsB@c^a&o*4*FoTJ#%-AM)KuJiR1V#M70bs>*r)*OTGr9-3GW6dpDoo66>J-++$=v$odlGC{lC`7O=%4j|(1_c_Fs(&wR0PwjwGMF -m>>#pkP6|X97ecSrKnJtJi|jEK86(uw%7w&dMAYUMvj7i;;FRSo=)NvXJ{TdcePUOYVD64i(^6Ny;74 -JpLu*S;3~X#zaaX>xHu*&mHF)qQqWX1X|h|Fn?B2&w^Yzu8>>M+Fpf?5y&KBaRF8X)?fk#p_b?R&>j0In5w26UG_ZL0*EvF+We^Gqx#;EI)hoil^Q#zK=5=#epZ}`W3#tn -sEv7#lH@=+@GeAwm_O4O0-eM>QiV)EIx=REM;8mef}j&L|hD=BiLlf(R_bZ79bYiH)a|vbCHw<_tm@O -=JDQ>%@%5+Y!{O^&Y#Axmz;VhG&fAZEqmv?6Iu?QhHWP%+H(Os7lvSrRiZ3Lj3Zqrycv -xXnQB5T4Db(ou;=NGL()L{Z($dKFtPv-A#-j2F+Ak;pbHmA_1YR0c1@D;{ -yh(OYXxgdzm9(Or+~jOKnF8V@`#a2tYnZAB*)GW@)Vz_5HUT5C-#0&Hu!nB2|%>znIIbFm*Mchk$CXkgTYy} -6xFZ?4a;df{&;le-rD-Q<5iOz$Rd>xgz>9{aX$769P6fP?}fih)78y!x}_I1u1qP=`5h&5J8|zn$`SLF;(L#PaW2u>h1g6Jb1h^~+uZYtPXGDav(G>? -o=Xa4O^H@A~(RFjUY&B=WbN=AL5yAsle6sp&)B`M59mwToQn!c*VNaz6neTwdrLC0baO5+j87T1@Ma6 -cg!1)?PLn2wcvFn7d%e?+gr&OosNhp1FM$W2XpoIsImDr1EQi&!kMpoRd99^sj9q}b(bVdWAF>|sE@y -{Dog6-5ngR)-CgLt+tOn*pp99D8A>T;uVnce?lk%?%!cIKliIp+pives6;BBYC06OBO`VMAN^{w53$Fml<#On3C|F-M0}_Nq6}iF%Pjugqk&D&z|>CLIL}oNK-XSqk*dc6>AeTisc?4 -xj^=XD$_!9ORFetzKz$G_f>XZZ(mT>#{KD$1oOq|-(ViJB1*i@S$VO_5q1C`H;}lU-9nP6g#el*Wm|Y -5)r)Y}B9EaLWU^OWKYqcNNIx*XUTF_|WZw4)8?_+w`#jvFj90Xku5nm_yiuY%W{VSzTB5ep=d0v#}6v -?X{&BfQ2*Fp3ENfl6Tv*>z;1tOc3lu(~1kRztl8=}wPn+f&eRMSUpQF##tGWekO=mHcQ$Vhkj_DUI?t -pP<9#-xt=dDTKBXb2mK -iBK4H0+o!-3EZiuQ=xh;*qIO&-EXjUM$HC;FjS($M?>L59Iy}b%j55vi;OF=t6-S}U$^@Y3edj>M+9qxX1^ -Y*tgW`e}wkxqK$QDSHr-)jdp%$?(MU9Dw%(OxTnO78|bt37ew--E!IMQ1Vm>&f7t=G$x>g~pv2iYC$= -h8$E)xxZZwfl554Im*jt>Q1ZS$rx7FFh#r%7HideAe-D2scQZ2Yv(|iD{Ip<_^2C_($3s(?6dQo>su0 -d!e;GC?G8{cM#-Z977rNEwcovwCnWDJ`AMm2LcF%lpIQlQl(=t3?8FkFB{WaDnL8+p)$#WOwW3Ch<2sPy{+mNggbKc(+}O=HhfNrKzZFdXLY@?)cHv -!jjz(x<4>9_+?xM3?g<5#8Vy!mMR&sKSJszA9>WI^KD1cqiZ3z!cUI0FJeml*{0PPBE3^s8SdgxRq2&KqLKo&B|A@#$~Y -t^98J@s17YfQ{gz?ova#ka+Y-OO`a{lSsNCvEjr1_K+3>HV%CEg@aZ&aYXOn0f3xzi$RMfK3D)Wk6VR -<6@9&WUC-Y{Xo=70YYRbmZ}Lo>~{QB)=yN`S)_L$FLWF3MyY52j$XkHJ?aG6{ePNPWue!ixD+Lx?9@8 -B7GS+#YZV0}<2ooBzRij~^~1fk%YOQ7FGPuz_qJ5WB79O~>+5Kay1ZFnf8i;YL4v%^_ZdeNwA)e?8e% -TdFwt`p@yT(hh*%+)_0iTpOUlTwrEh#s8xCqaFD)6qfYN{rLZwMy`8p%5`G->5+XXTOZ8vpvR8xX!4F -39%vHk}N&g0_lE!piz -Ycp0q3c|FtjhoJ*y#2=itwyPk=o4aLU1MGZhC9H3w;@fRDOq=4Fjw*5NeC{w+{tELHmG7ylMGd9c%^$ -kDl-8*I5uHlfj9zhij2R^hfv9$LfR)&_@ZH8Vgl(^`>EE5;>$2>YU~yYz>fHtD_ZH9bK44(O>`@*Rg5U#}s;Y1TXE&8g*j?ino-L0Ur}~T -_oVOi!)XoY50)wfg$)2Y>uvKSi>jq2z-&sF0crt4HL?NKrVx|l3ys21Qvi12!Yu?+k1vmr>Y8kNVVd^ -$78`{HNvV$(=^iOJtH~~Me+DDSg(2HbFs?D*gmuJ47#yVPsaVOdT9dbQ>3v*-x};$3PF25Hzzj51yfF -1<6$DO-mThOhJT!s3gUj)$xkhUJq=i;6c-}Hh9F%tpHV|Lm_qxBl$ihxyx^kJtYfd_Bg)N7zK}co6l}ff%xdIvs_q -2m%O(R0*)I@~R1!pZ2SBPDH#inycVRGm4tJIdKVgxb`6i74`)>LO_4&W -vQEXaTj-oLBzwnlm|43hXHdp^Oo^rq>D@Vv{@{}j&x5xKSYnFkxvJj}XA|J}8IPvkOo<@ugXkk@XBr) -@7GSTt3HVKy5;6g6pZAzwJryuc@w@0Z56-&p$zge?g?G8IIc-1UUOa2u3PlSnjsXk}5bPd%?lJx7N5J -iyqbZ}!QTuM#W;2#p5!w+?16KKBko{u1wr$rC=}E<@9gwCulo(3 -~ArH;pQ?{UNyYnBNkSwIE`Bgscmvql&UFE8QAkOz(2CnXV`ly&8-f=8w&6D36l;!VNnPCKp}l(H$9lJ -R?+~sz|I|(zS`23aSFvTy3}?|8M`GWebU#rAyoZ8(;*x>wsg^7adz+SOb3)Uv_(Vjgyw;y7nR$rv35s -NtqGUYtI7PQ+lhZZyFMLtpsfa`wdgMmxPfj#56)P3IoBQFooaz -+$1XEEY`R@zhkvVKa!j7=#HQO_f2KC+0Rec6bUdR{@mVy4Tw|%U&#MI;#~3A9W#<1b<6n-?{9bpSC(B -nG}TxMbcKQ`Hp85oy&q|@N>%)!s1Ko%Ak>H1Lv?cP3Rq|)9#=jU(}7#M%Uxd>X@b2SDa}yk2OKeQW}M -Rqoj_@UPL2C&9;u!*EHA177allQUm2G9ES*3SM_{!iUY(SycqbYUXL1s7N()@Z2#H%*ygmo@*!>wKMK -AXqYvIa{6x4uHv_RD5sekywi;|^=Dz+lg8_&9Wz*4YleXR&Ev)L75Jt25tr?u-oPO_-hTPTTBfMPgp& -3)RwUzv7AZ!(?r|MMOKG5xwtDt>6oiYnq#3mw$3@3DaXBlJ|VEh_me;Hqp(dq@WO?qiErKZ@O=@t`#j -*jZ#APa;F7kmsAjgR%iGo;batD?j(*dl>ib_Yp#3bp>-fUEEf+hWJ$#}79_oEm|{2Sv<1-&?ZBE6F<{ -qqe~7^&xGrb18+DwnNt-ZE$8VK8H6nB7z5smu?blmr($_+ZP|Ily$M8(7w&UW_NK2!~!W2**&Wk>C*) -gtk1@QS4F928gF;iL{}oi9Z`3KwYcyF>qYvt5B>&9rM}(NkWdJJ1DjmFfo<6rsjo9(N(LV3+4m#UYnl -zCt(P$E*`9RX?N%~S3^X%tD=4(q=mdx7q%H^OrD~w@rQIvGUBm#nTN7{4oJQs*c5A8Q?ECw0zFkH -*&zfVXf;=OW^RnQ%W@t^FY*<0qeWZ%?(#UsGFo*N4AkiV9{>Plb^rh_0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PWn*=6Wpr|3ZgX& -Na&#_mdF5SgbK^FW{;pqvcxub?MCOjiNjBw+H|x=OGOnH2KFhOHd#MydQIN%$BD8$5MtgPt{rUwU0g# -ksXSeS5PL;}7B+zIy8r_Y?188q=Z!nQ@mCM^a%2p~bMNzHj-?_>~m8WSkJr)m1B;s3J#qEcQh#sOOji#v-rK$;3h0F_~GN>0{O~g7W7pf{nxsU^RCDdF%18TWSQke&WT -7dteOe9NWCdz;x8I{1Nn94Z9I#5?!Z-7oFuA}%qx|4&8Y$iWr#ie>kvO8n|N~@&=>cHB=QSkau<%f&p -ZXt64EIr741g*@7*i6o&DlNs;N@kPEhe5fBKpKl=RS>_Lb)cT9QpC}U`UsrQ6t<=5BlGYyOE+R2ZIFX -p7Ak#^K#n^FkM2-bOpXNu9gWgb=30zUp(+#T7?efMR=I+6>B2Pswk;fx%^v|XPBr7Eh(u{`&ibMAkRTUtvRA -qOEAcLjXeWEeZ5*EK^K0?-SI00wX)5G{%*qP5+6WT4&>}A?$=Y0i1WU1AB=KUff>DFNK -|CP*T$ac^m5)_c=E)RvXjY{%5N|4Eo5rD7;KV>4M_4nH)RBQ{Oro|z_ek}S-kga-n?P6VD*X3j6k9U@ -Ufm}!u4+E;o1Um32x#1(wJ4V;Odf2i#>GaWfM%i3JXJ_XlI&L*L#yS<$zUMhqu=T280dzAf^?=dIzvS -tDHAa55TvIM|Yq0=@N$YPazL#bFt*Bp=i(E!HJm$e#M)$d#517{=sO5yz_*v-pf11z;7pClxq(-wZDL -13~ud&LCawNtom+w@S%_3Ck!9gEcm`Y&^8l1Xx!>E8MQihodK>!NORT$&MBp}LR5{gd4pdA{naV}{$tGgY|4NdhC%Zf8zj -RxOJYgcDuhO7ox>yq0z6ih9|a34%M#3Dg2 -oXFMK3>3|pK8+!P6I>}2(rZ@qKCK*nif?EL_I#bzx3IB)A -;(MTlLN0#4h6xKUQZs2}Ua&KVB8AFOzGRB;6qJk#sE_WiI3bqca|B{5jh|boqDZu`kQ_Qbiau)I3hY --#k&w#fDb(g5Datk&6A@n|d?2ca&1mDDQnM40%yB>#Q8SFb^x^&fOw97AD3h4IItUzCUuQs#;v$)&g^ -5ry)F`>{8TiRCuC*)#17E-_)V4nO1podeN-O!c?lSlIk|n5*RvBRa=$rdD& -0N#b<9-3NXNgi{)q}YOJ^*5Ks_&0yWls7`zhV3ax7xGh}sy@iKa8XhlZN!CGQtU~d)_MPqCL -t%jd&E^g1mHy^IXf1X_Y$2s)i=$qqjzZzKLR~5u&5Uo8#DYyibTVtQzp1(W$_~AAjUtGUGznL)e^7AU -9n2q8U1*FgeJ|r^;wM3k(D3-2J8i74EXF7OuLQeQ^q1I?@-Dnkp<*dY*4x>D7J)C@mzD&@TJ06z&Y5; -*ocy>MsUw{2g_`~?eaPs~P`Z?+;Ievcz|Gj<{USECq>(TM6udzH-?JJLzk6wRkC~qlwK7RZD9REK#3q -M`lzJCH!T=nL;6}>i}!tTw}D`K^`lgU$AeP$0^t?ka_Gy2v$hT}Km=Z)d675m$KUV~2>23_Z=gT7m}= -Wy89)RX7I<1F^fgIz23xB0vVpQO;w7`NT4J%_`-ruynU!yr6kRzE}EpCRg}>UqC>X$|rwDs-%4+$AmU -xV(6HeT)$Tgt{3<6BJ)Y0s|y9M{kemD2f*#Mu#W?{d}FGdIz*%shPua48vNP7LpP -gt3>BqqEf)?0)in3r63$HRjkqw7E;S3gXPv|aLWHl9fYVM@VGh=L$}-a(C)RSapbL!-IuQqMuYzv3?M -XIL`77V`4H%j#Gc#2-oXhkAUhcQsm;*Oz$~w&+aq!hB~0tDTddhHiNL`ltQ|j%wc}k`JKo0H@uRHKxb -Myy72nF*&I7s|YvEIw3wLL4JAb<}_ynEP6?SH@t#;1aT^M{4bI90^Gv^pg(qJa%qBG^kZDOJi|NT*A_ -i}T%ib`0yo2);r2)#)E5Z89FLVy+y^;SdRQ0mH-0M8y7lSZj)G$|RAjd6)>d4B=l&&MBc&TntdE+^Ml -H@7C`=eYi2;9gn661m -_vJjWop;__|twne;8;My|M&Y!Y&vBcEzQB_8u3UtayqCErTYpXIB+!}_IzHhn+vL{lUC5$jw}-6|u_- -2g(7Q^V0ig{5POLet>YP`o6Qouu6Z5OJ31}7bQxw6SEL{N{)Ri$=;?{?LU^@+c{4m3wJ&}11Dshp~_E -K7xpGJjjm~p8GI)6842$P7Q01p7v=opTlUj5uuDU+qdgh7iobW^_@HXWqgwkZ8B%#=k+$VZv -RzAi(|KfmZ{-U3lmhne)LCZv0X>k!?YJE`8rBqx~rVjcxZ`qWC$H}6QS-!Nl~j531CQj9Kre7 -4`&ybBe9P(DDAR;Fldp<L;t(rWe&_U@v-5B=-a`CdEc@U5hi)OQ27R9i$57z7yUv6v -fp!FnPRM~x4B!8E{g(bEim+=ExzoD7-4NDyos0aMZQ;TNTP*bL|F0plF8?sx*u79SDQ&q^>58w&pyh= -MMOreSUM)!IDWN2%`0cMyzHq9K70dIvlFM)S{uM^Ou&lvvm(=Seity}Gmbx&tft=@61+dQqQkFPE-Z_ -X#@w>X#lm)959=iMTGRGep1vpwll!x_}bVV6GGCe_lPFWPfxXVdx#cSqh}!q_&LRQ%Pz8sKyK2lutzv -F$YOW(++;=bF+`)+9m5e&bu+fOfx>#r|jcUn2f&2Mm!E@8yFhE+|vY`vaLQaZ~93pA(*LN?BmU&T{Q_ -!S-~3QrgBBWe!F(jLM-isxHxkf2jYaQQO6HQ^D^%UjE4*o7(v2x@^C;_CG8Y+v~xj84XLj4wY`ao3u@ -s`RKhJSRevxOWuJ=!EK9Jtu|)glJ{~h_Ln4!qT-#$T<#Yg^p+K@;vR6540q)en3!c!5Uho^tWmKLei3 -xK5v`d&H7uVrO8LLr*^zwx(*H7U&eaZJo0JEnv29}g-*apZK;T}=6)HMzK&}x&f$Qr6D1r5pS&UoxY4 -RXxKbrQv!Muqd#``liO|;pm5mz#6dAOK>5mAZYo3h^Pj|48}8NsH(UqED@14}?}DVHkWFs@FlHL@ZIf -@%T(n?|!h{8dJa5mntU7*?Tjc>D(54crB@8Gn->0ij@8;0DUP0~UsE>4Smi?|Z6$!a`i%Ef4Nt5T_AX -mQOrh6B@1|OVx`8&aN*G5eyiW$uvoUv>xP~Q`rOs+OPM^J?MxYsDKskQi0Zr8s|fvdL+VGu2#bX-W7* -uFiOJ%gvrt1^lSUuaF%rVYHr(uiJ4+`IhtHW^nieixdx}o2ZnGSA`~RKgB -dcby|M<^X3zkk9!h1A`n$|k6Bf?UiW{`Rnz5_E7UIK@$~*_&W`wvfpreJfi0KwJ*oWaIsf;u-)9{0A= -s*&|tGUrP?kQls?Xu>Z` --MV8hyFk$tc%_56KQ+KgqnOJmgZYp*8c!Z3gm{-@8l-3`yqO#{s|`+5Xd>J>1kp|4hl$`H|)ZY*kqndU*V>ofaDXfmi(X=hk$7<95w~-_;ea*HZGm`CM -y?^Ng-B8!x)C+U?{(EdGXr4agp6e>wyFO_Lhw*gL{Y=vbv1C%oB9j^r(nB)nLr0|TzPY$iZelxj(Ka;9W~V?^x1x*^K$P-i2}6q<*TSgN9=rL_k2M>&S~H96yy4Z4fgjvBm -IAFRMQ2NPNNAVVP9k|63`V$&kRl%pMJjOpoa-55pcZ0|%A{@eqWtYDyqNmpXcQka;pkOl1zQVbzU}t4FuSoEBN5wA=BuDT$(L!%-)y7eTIiKVb%|}v@!2XR?r;s3?8CPpml@@-HVS_p%-oEJ`= -oe_k(M)K%e&ZwYD^@R}%?X%Dl?JwXKwH4_>RO_BHjqpZEjK{|98(ia7UAv~XjChQwmvWrBn8G^!=B;5 -4{cg1m;g>8SlZ{)eOjr`+lxE9Bq-%Pp#1VBjF+o-4c3=K#b)Wd>DoH(WuR&SWY$t@--JbE$6tE?k-K7^ -xFa3h4DW4Kx6VtiIG&;_xur34>O2}F-ra+e{l+5@RWyyq!IN2m3$gGoLES*d)CQ1E#Ifr>1+S0hUackI(|Y4j>fH>P3Svwu#LJSX}azM(g_Fn)gA -(Ocylvux-tx@}6AI)q(A{6wvoCmH6}Pkc4$Q4#kLQ!svaBQZviMn8QrmU-!o@wU>nRl~CT#_s52d#O_ -Qe4;NZ^^qBpGX$^Jda8;c{s!;pAad~IW2&4{{Fv!;OL8{az1DTEVodY2hs6k2k6yspRX!8h@aQ?d_RM -UFa4&9@TzgMg&EV`E>C7Y=sT1+L*`D}akK?jg^0casZ*a|BETVfI*mUGK`8;h1YojuYAjs?}qNAaXH; -%9Ec#kM04N2^L9ev*R+RAHed3`TCS!>>gE0|ZSMGhL;w>&nRR{CfPJ7PQ*UCXcWC3yudsDhv>G6!6y& -C<-xhq2S*gIE~cPwONXrzdmI6}d6lI~@(`s1etLNtr~cm?jV)kRLPd79&mwo$M4UJ7VI_@sT*BGi>u3dK{(LxlQ -|28LE;+k3xD%v?m!T%Mw=?jB3M-UIpJ$WPY9y8X5E8qF6Knt8 -b6L`RWgD6i*wAx&m~--{@`oqMGK3=S=Jy^xE1a@MV1jm&jh@a2c{x2h!{pbbdf?)cWyMJx@MrWldJgT^EP}mK(XigXaE%`mU$rb -Rx`Tc_wYliC-(2IBpRCS$a~jmyWE|`}7ie=JDI0Ug33gl)+Ig(@IYZ1`VbV&FtD|`WE_gwNC~<43@dg -5=J1uf%d26yf);c?)l-mi`B7?Z5Olgf`0lHCUXI`;cG?PhYQs{;3Nrw>3!A>#s2GxB-HG$|7M&XLmo{ -vnI*4qwmYLk0|^1R9>B+WDERhvQ$rZ%6a&o4(MI3y#%cWH$!MJx1kMdj{^jYQ`jS;w^s-qNmrK-6@6|IV6Ts9)&`H;$j*NJrcq-jjDz2iV&ewAou>{D(%HB7&T7Q;q5~yMFh3@6>M61ha_GTq -*pMHyx3*VD^P&d)?6tu=GJUl9X4Z@q9`q{ZteX!#K3NtkU4_&7~p1*DwlI9!py4)D49*8Dq4_Q4?`e?DPLWi -f~s7;9X?>cImEvK3}gfr`nfN3=^lD}Jg)hKKO!lorpsBwDycBpGLl?cg02OIQ8SQ|0z*U^|Pe*M!)L* -i$DTnKyVFwd0h9uWPED4e46vAXj@AnHV4kp$y)e)TTcO>{M+$Z>wuNH@Y#zdNNcj=8dCem}aM>uG3vB -Vej-YOgSX18P4DO(QiG1dfNzzB+z(He{Vf3S$2i)r2{=?{Sej~n_IfN1hFxM5Y+78MAAF->n3%N -D`nb!+~Z5W@J1Yq6!ovz3&cd<>x1FVNbiYb3%*?)xs_WG`H_L{)o(7Hp1CQ8ywU%^koX$bwMu*PQ^K8!}hLw3Xxm<(vJXO)@$J0*CEU1fdYM5?i1A@)A@t)n@5iLijW3(M2^m5oWki -K&CmoaM68gRa~XQ@iOA_iB&FsvF@Gt-Yx=tSJJ5pw%;F=7#p#fH@cJd6Cl#7=R>$< -zHIgGDpZk3*(NL#laK229NEEWt4p-yg+22L35z8RCgX2w-W->+7gc!|*n~Xo`p!%vxg- -(w3s;8dLH(PZ~VGmL?2^B{*BBbj?mpZM>3&aALRAMs52DD*abO2%h< -v-(YKk4w5*1rsH@*^lVgPCo5xF7`MNj<^;vwV@{r<&!70f!Khc6Z*gZCuOh;`iWm#O<~mPT)@%lv-mN -pGDx);44@uO@L5n8q<#)|6`Y~tL00hkuf}fh2Cl-+}MaT6}Kf42O7q`*m)RRS3;>}zBgxOh@o$Nl@rH -+*wwiMSdo#^uR>h0BuF)|lutm9OI|22$}`TbtJRq&GXpr!i$u{FSV;;3s4P$O_#X$wO~bNz%3O}Ddtw -QZ|M*)G -+gb!UYz@CLlX9lOs*;##$r@`-7w1lw3E$hW=(}>Q -V5pl#8_zKqp!sc6%{c36C=vcoj5!!aV{bTCF-y32G!CB$=-{{^pVGxC+g$mHzO$xl*1wE(>>|WUEqr>0_>nBETF027dY*g|Qx@RIbGWW<18iAJmxd)UfFNs?{);D@pKsBTWXE`R8-MLA*5E -m^1YfuT&OGI}5K?GLLAx5+a9csd3>JR<^!sdhIQf@fJ~A(Q$7~@^zNP?_c<8d;n8bPp-W4xN| -Yg|g^bh)r5RG7htK%eSeZHw-L0(S;=;#py$m_|l^*Ks5vzlmMhd+q%>OZ+f^3(8lIH0%|nHkcQ4qIhJ -)M^E!@p;qP52$UK@_mZ&II{;!Y8dm*k(V5;|ZSz)qf&!5xJ8@%WD5++Y_cbCYH1v)z@SBggV_2n9^ad -M6E7>jlF+gz+r)9UKU8E&gZl+55su%uf{7l?1k>U&_hhjqs~at+|Z=&e%s--~(!Ap3szKBL!oytmr*7 -_i_gx63@XM5+%JTN?=&ski4hoMvj{Z?)#z+<0dGEtD8yOPwqj8ZH~w=};ivilC4rboT=l7#b1>Z4z}F -wU5Lb=+$+Z_tCJX@b(kv7Q>I@6HQ}Jgc7#-`v+hhO@7Ao)H(~mhY`IsOjp?Vr4#n?iN@XbFS^$*za{v -@OUA5A*>}1c9=SHObfmgeGif#<x6B8!o?EM-!vJXg^cfO;MMlycCC0G;|O>ULf8_o$kic>dC~H{!#DT&d>o|>tt<5S4VuY#=lCBaa8*TQmb -WOvhI^iQ?S)A!MoRn6LW-(QPQ{?*7FxPChNNs2pb387G}ExXDwRQ%3gkzxvHl4qdDgVW-b%5n%2@=X4 -MjxdUS5nw1a0H&D`=*0Q|#D9IBcnA2v#dhj;}{CV6f)0-;s>$%jp2pIjrq93hMgmU0MV@;CMLnI*pe- -cvTm1n8mA-+Xnm2c)fMW?Vk52)YJipC+)N;NNYSss|sMZJ8Y_uiaJywm~6!lD_?vA`QmpH@D%<`M-a> -xH*5@L^axg(Gjh>*yYvbxo*uO?)TPjx7}mUM&h)^mg{YaHebYtzM;~zgUC&NuvgOx@hoA7-cJ-COs5^ -k?tIT$CU}{LyLrCWxdHV0c1nR@ev96e9{&=XjI{QStRK~AZe^ga1Vz)lrz+-+X^RqH$)%a6*n@6N$}} -3X{lgBC6Wrh++vNC{t(rqQ^~5&G5Srk0O5eIXg^q5zP<3;jS`Q(KT_4#45%Wn1+`PwxBxkK~U!RJN=x -jR__F^rQW(RAE2>7+WHHmUPGRnc9<AwrEY$0P@gV#51jkyC0DY(Iva^Z=*)B& -k3Z8_F6uA14r~LLuKrA-GQW6}Hd!xSg^WJabtOgAx1e#KCl`G~m*xONGyWMR&^OsF6Z~|Be9SaD9`1= -JLJO6ug$EC?#z;U!XUP#28*d@qHljP+^ -^F!Yxa^ML|o-5y>9!Jq`2d?oQ4^spbX0>Lli!Bxoxbx`nmA2Zi@uc(anuWs&`tCaFVEAnjojSy%^;Eq -XXT=x`Wqd=`sjIpU29M4%-47C3VURm68M8Ptk%=eA}K;u!Noie>?Z^8f@LSts;0hoqd1l>OH|lJ$#qi -MS0q*{9#zQsj2-6ec>?b_$*$lcN30V|syS(W6som>L$%r6%@1&MI{eB>5Lbx))yIV+T`k*&Ir(d*4GW -Xiidki5c&ZiXFU+I;Qu?tN!@1vjgSbMZ`J|xowqK*R)THF!;ym@Zi4zP)h>@6aWAK2mmG&m`u=mP692Bhf^ZP*uCb -QyksJ;S_(R|(XwY73oSpW9B2c)}te1#HswCyjqUisAGkoZ|a-BB&!IsFGALq>(J!2Q=7c5tWkoOzb*x -kjyX(c&3J4^2N!mvseO$kULEf>3Wa!5+18`Z-Dp#kPeY|FnhCZ>SR{K8oS~gT^D<%V?ajl#7%vJG-H@`c%d22oigaAA|c=Nu68ty_DowbBEk1J@GGY22DSDNQ|#6FyLV12xD3WPbeF(n)-}!|Ak*2+H2|(WL-`?HbT(^5`_kP}*BIr#y8}hivuGkMsqDPXv#2V$ZvXgB&w7|;qQ -4-SsSFA3v9$Z)~#Lh1LoRYIF`+sOOy&ea>GNL#o9G#5%#9oIs~Ui`JV*?^E^B`|BNg8<_D&W+5h5vT`gwSh_ -n?EeEvpb0$ys%2@BPl%ly;cH+-jHM7SWu1-XX7u;kIps71re3%0u^PC3o`y|LbH_7%GH|@`JH=%hrjS -zPqIX$!+GZKW|d463;bDEcSPVt30?U};MlKn4=>v*w^ba>_)Z9!c)zZclzBF!F3ykoYgw6JtvSFT^$ -f~y)zVxx87M_Te1=@1VC1DjlblMlynQa9olLi>w~5XzCK1dF#{tC( -zj2Lvi^|K7>bB2!qp}4|!?^5hb+mm)+TEeRSE6btC6Axe?l^Z}meJFRAHAYW_gfAQ3NDIMd}c(;4i}N -l8Da_eG*1y(bmT7;Jm=J)fV~{bvM(tAI<>H9e=rXsn_k#eY=@)h@`v=q6A5?db?&+Rlv#LOG&qZ`kKf -+xz8oDR6g-*Cn-^qeG{_wCn1<@d(2F}hYF~B9nPDJ&7A4iLqgN1ygfzwd#^1Yjt-%T(s+}$ofJ(u>-Ia0f1Q>p*;E -;+Vy^!Fw>9PvFVKL2_x!xGjw8Z0rgzi18LU8!+hJ_k%CQBQ03AsiOne8qfQ{c0_6&Hl}QfBfJ3? -C$-|>nwaP>+?{HiKK6M*=um1eB{vm*E{u2H%~kC#h*I!#b49(1^;@djx-(L{{B+@iI)w`T!v@w{Fhz2 -x4?p~utJ0a5e0IeEBrm!=E7X(??<{wMe*EnbTp%x|F;3yXtLW3tuxH_{t&l`=622BDKa;$wPf@*B5Oy -oO_x6-pg44G+PoT3xY26k+|zD!qyMz_{4)N`@gWAlbolOl_vqLD$(N6TL~Su_E8*!P*nI;WdvoqmmMtBUtcb8c>@4YO9KQH00008045ZePPbW$eOC_v0GLDo05|{u0B~t=F -JE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT49QZe(e0XLBxadCgmUZ{kQ2|DR9M -m(?mDF&u;>lUePY&M{_!mH@(JvZK`s8EAqp#_jVX3H#}yAO)DzMi(!nR}!AAFP99xPy4YuKK{T)# -sWJ4&9IVUZnmDKWWR$7L_(h7up@EcW`rqA%1U%4`Icg%UhU4B)1oM{VCUEbG8|)sV9UQ5(NDfbeh*%# -KTa|3IEx=5Y|O%zY-WroZbngb&ti!vPv(Wq<&8V|sK$Ua0GVXfzyEa-uB@K#ysYN7J&%EweZ09%0_vJ -vd;1Wv*PqJ#>g-6KXSe&jOEZ=*mao>=k5!_MN#0F)mqI#vi8r1hUaJu3=idIPf}T$Xoz#_{61#$LzMC -;Q+iH3#<)UQEn`_(iKv9!3+PkV*ZY-4kU0b0MtMC0N0w@=t;m16%pQZ@25tCz>mtDgKIwRe9~OE$VIn -z^#T4|Cq|N=U*Y3FUsv$CV^jYhf^SCMz3Fi$0X}Tz6}lN(fNt6l6_ld$);q&}qHRQJ*azZ(ThXg4-!N -@-fWc+00fTTgi1OIhf5mo3#D?dwwP}D%vSI6B4}oA{o0F|+L9{lpanAIR8TrnhSoh#(NZ3VbN^u#h)^f -Ce`G9U9uB;9QVmf(>DaMJRdr^6r8T_CuG6*xj)`(sD_$Rp7F1;M$;CM8k%G3%TZh(Y22yD1OT<=yPZ$ -#LmX#{U(e6?5oBK0*KosV!>uUz!p%jQJkc;!zynF9TG!NIFMq`5GG2dxd?-IOX$7?J2vmH8IwC9jysL -$)8XP#nQLUEli7Uwbu`ch}qsgF6v|nd)P1nhE&c%)HXXB -9u<)eu@ei)1E1 -BA-$SQF~NKy|E)?%QOb+$&!+&NT%|!cHU=NXg@!hQ+8?fnRkonoiIpbvjwh;cFW#o-bnd$C0kJi83GQ -09lwhpMn~6F>p<}AmE*7LK3<^-AX`$-yd`>jcK4MW00w%0GXlFID@eVhYYe@ZUY}u{&GpoJw^t^pvNr -eHB0fm(Fn^O%kUvP?ggJ1r#gWTIWr{K!hp35^RG-4)i*_wS-voHvvi>QE=}9-U*HGKPol^(|Da1BKdl -bfbJxotrV1=(Kj8=dKa{p&%xbiX^r?gKxJ_o$(PW{`+e95cOw`4n$1V`tXsj9doPXsht{8|4M8lXSfm6g>3 -sqWR8MbKD{T#P>XKz5eQMcLpt^0da56!n_K;#FGMVouWX+lf2qcOYVIhN@+&pYR>76+c<`k6F)-8Q*t -$*`dVbI801f6k{iOg5%E`IYp#og1D9ZTd=GJ|Xb}2hGHB4o&#c>-^}QlOIXKk3X_n0N+j*^nQSyI=v+2@5D&{iYk(~zmCiSoRSTZmq2AXga4>TqOl=o>Gm3BIHZg21K(I#w4i1nhGYzvR5@>(bkPF3TfSs85Ewc9uxw7ZP#E^brYLJ6G8 -himhR<9<5KC%IbsYwOn7e(B@Ng{_P~vP5!SE9IdambfO?sKP*eYpkEWG -B5u^kJEfLtbi6$VYI3g2K227e$4neqG}$wD -*@>YogHnA?`^#aQ;a3QaqI>?%LO=63VOS2s6P-jl8KGrFp4hq3?U8CW<2a#Q)gw{zlK?jxuV!ZrJev7 -kU+{fBdQQWnX!pJ+hz-m>}MDZn2mBmh>oXQAF3zY&WFDgj~A=B?wp2C%iaD9}P8aZ;Q6Mmt-$b%^t=Q -R|vB)Xz(n%5O|$GVF0^mVj=1M4bCk=BtdnXbYL+ozAP>chw@i%NN*Xy>D~qz%i}Bp`DMv>Gj}&B}4+W -gW*A36$LyS(Rr5YCaI(L%%nksOXu+V4_$}+!g275>&;)Wngh8C=bfS(UO&A%^J=P+T|WBP6Nq!)GF(~ -m2m3x=qP~*3B?w~OBbmmT(IQ4o|J^MzA6&QSSgW}8JmH6igg2O(K74O%8%#{1=Z0#`$g4z7bg!xsd-m -rPA`F)(pw5tAJ3_=83y*6hkUqdY{uP*Waj~GX;GWZ8pKMr)ry2Z0t$MP)I=7pgz8s>Se+M<)}h6H9;LsRVB!hm@7weTHeXBD1pCYP-W878n -hs{hH0l3QdwuYi{*I3d;sY!BIK0&~RwO3X>>>VUj6?2WfGp6h@sQJjdVqY!)fcXC8N1 -;>f01S(fv2PIEC|1+3EdmWsr#k@b!bb`H(BA8xJg8d5Dwc)OpSmvIV6zV#lTw6`7-vwoQEnl#(tYOBx -41lhz*|_EN*T6rXNHW?_3Xo#te@S$_59VL#+7nE8r;q6q^Z7}rVEi8NE8Lvbb~4InU+HVOEB{Wok(gR -ovpQ=fQdoQ9@X5Ey-iI>Ty(>eRR#IoB!YQFcD)t(tL(=@HEN&AJwI_*{TK*hJJU>C8UQMJ`GsL5MYD3 -jt3@a#~X%_*@H*&PiTDI0pYpRXyOKKLZvcN8j#sp>+f+BhHh6+FJsf9)HIqgYtC#2Vg7pXX5a|}8a-* -X6i=4sn^nSJk)H37DAS%*&PmSCsmUPU8pYTx|S^-7BQg!NTgY27tUI-A~`C&P^-R4iQbI^K!SC=1Za8B_`;gQ{bsY{g!$etm^y{Lcza&FlgyrxPaA<;QuHZ4(Cd?I$5!sA -C}ITq2D(pg4TGAkQy^IIg@%OzE)%OF&wyb>8W=@6f0e#ru=@XYyiv}sKV(#R7vVV;1o$j5wA^?l4p*} -yLh74zZgN!7X4DIt=bL{=#)J;W?z0=vf4e)4xm4uOs-Pvn$Lt;@J>4?eAk!TRbWL2~m%H*|{m;9RIpYiF3?hcNSibplf1|l*`aF7xSttP#lNao62CxNUNOgA6HUq#=yBSgO~3m6mAe55mYzRMO++ -lxB^| -f2#ud_cU`WeKEf#X&5vI6QJ}r-zyFElu7XHExxUS4J&9aE;BR_9(7d%x{GB+w)ABuJVH`HI?dV9Jp`3CxPxI)5MIe -HN%Dru_72`p48>jcBr1$ecQXabt;JqL0x6d0`YUyzsS&XdaQ*S7dn46PSade#LsrGn^~1&0#dTjI!R< -BhKhNKyzAwcj)Qeaslyebp#PLm7;^8i=*CCG-dOW0A$An16r<^bgg`^y~(3!<#Y8^6&M?nTYJ`GbYB) -O%g4(>Gkt1C-wUT2JrdCSn5qNY8DRo?@0^%z_L9U -9SYz?JE5g!!b*`-A@%73Lt@oi*gNx44<^)ZKB?)nKrpR)+TwDo7#Fpj;>NuNl4$jtafflotS=oTitwl -2BnsUkUGp8$HYg}NBo10mjMJ$?H`NTJj=)0dZKptR8vXR4i!OO014dsu{y|e442(n8Y0j3Yl)AjlMYm -)dk%_;i+h?{E;(mnzd~}J__*YV^6IGAkW$KRB^LGi-Cl~Oz(qil_*1=8;P;}toK45ypynzgt>5?$P)h ->@6aWAK2mmG&m`;LoOO106004q70021v003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ8FWn*=6Wp -r|3ZgX&Na&#|jZ+Bm8Wp-t3E^v9RT6=HXwif^2pMpy>SB1vy?(G~_RQLz?T) -F>&g_v!C>kRmDD>Eqr2TWy&6hdMYon7r2Oqe?xfN-R~?DAS5U8__M5xKUYe)UAJ>q=d>uv2#QORYPRmquk>wGl>DvQxR}G?8AGcT0Qf*}Kbjvgqv|m8rI -sW`hgwRELXK_<60(eJbGCjVSA^>T@_+ABw}Kn*&t=$P(J8#AY3VV-_l8q(GMl6Z6 -X`^+?W#dK)>{@D*8%D;H~W>92_b~8LOU5=PI2XfT7A2TS2z!m*?(V)@>Tqx^HEtOs91t(u|)0VjpgE0H=23;R2HK-q0(BGxE;e{~MV?k1DT6VM!J%BZ`(l18X6jX`yT+Tkh4NH)JSav|Pb -yb-Wp3RE1}OVSfCUtWQTbNDhpzqr1=nO|RsQy`dTdes1T$wa{4;@}AXe!KYn@~yyim#;3*&u%a1>8Cn -LpZ+@iRMWSMw=cI=9L$j7%d6Y7*RLm2;5%1^m}kWtIhv#R^Tno9Z9@O=45(pxLIpe!) -y+Mv*x|A1_I=#b4m>g0xwZQ-KoV-&Q@SjRaEg%e4YmK_x9VWcy53l`?5`uu)xa>X8Xjrg}~cu!it&wC -Mi))mc^POm^D5RE6xTZWakpsXCOH=tSBnDXbwPSw~&pRG=jOXODs^@MpBIO%1%(>#9bV*I7yV0HhdBh -@}orZp(iZcm(ol51!DHC*lL94C`W?ErNaGUTruCA7s_5mi&$)TZvY#l+Y%3x~8S4BI!OJf93>8EA45x -!qT8M&-SbVg*if7*1Cm2y#}p59ZNP%p5mr~f7rn_Q*jfm1pc -vwK<0%_)TW_?YHmxHy%IQ7y2>#_q@~dzAiDRCdBZ_gIOuyGvYn361^8(*iW0emZ`9qp33X{XWD~?{+18iF16)w6Un*-{Y*LqI -ApV0qj00c7Cpatex1xrrxv~jpC6$C5gV@sK04l{PQGj$D@~7{w>!~{4&gmpPHKU`_G%}KJ;jC!)UM&&Q_ -&wDdI1M^`opW6n@)CpD}HVd#m_c34a$iPv>k-w1*Zrd)0>;u7oHCL>u6=dEcpD3{vnN#7DO~^mB4>or&D{AxY>+iWD<=nUwJ;i%paIYH<0^PxBg@p}F>A{9c|SSvp$$BVEQ -87=T#eS*p=qZx>W5BuHX;LwX|yZg9e2bee@KEcPvbP`4bLY0PNIzN~TI^S#2HvmK=b@?)hz|NLfejTxi_16&(91qlP6L+NWWscq236cC*8+6%}Nt#%{1D){s%Sj2J~?$f~u&lV -LBcN6LUuj=B<>rv`uqY|aTTh9}}c%fZ67b1{NxBgG(KA@S&?e88Ac{)`5Cj#g*)%FY8>cc2iY1v>uIE -<_XI90ySa2Ek~2GqW>Fgp~LM!Saa0ONb40(a0Yp4-*i<*!gRCAj4u5yj!|a;UKjgnc%b)=Z_3~blt(; -7AH|7bo0K3zx-KHAZ*jSIfYkSRN9CrfooQtt>g&-V;)IejE`^Ev&{T7D1c}-KIT1N}eBcSP -x>I4v_KLFRCWU81DXf^5XM!XEQeh(AOxuIQcw9j^9|1C;Tj+w>{$K7Oms$aym?v)75>BpA(z*om%GPQ -6v?9O8)|TClQg^Al@{!91W}olRv#4s+o0_Nc&~is;Wq%vqwoYh%cKiTW*+kFB=cdB8faU#X+Uh?$kea -kNlHY;A6pP4BM|g2-lqyqS&p@n|U8p^oM+)3`9)lk#1%fuugXkb$>XrEnHp+$I!Nb_^pwtT&<|I%;#8 -1TE?(wz{KxC1?_3{@M;E<9&VTkB-0{D<@9FIWQCCLRy$zS1=M!1PJbAl?i#~X721{R#x*@?ceub-2IIX -!3-&~u4TBv!wtP@fW$fiCReg*R60=igrSj6jA>MBkUPwY5+M7$N!F1U?;0*PpGt$;>muzf)3m=- -TjW0sw($)cRzl(FB98G7iA6AFi7mcL8$Ba?7cmB>>yw7*?r;;F+dWQ$53U{2nJ+T3Cnow%Wb32Do?Sv -jc<-$!>+i5(n}h0vrv39YwzFcezkxW4WbJ9gBI}*jvJiDLO9EcsOiG;OYeLP>BF`|bbVJ-cja1U@UNK -Gx8Qib=oe7i6b%kY1<*;8M -3x@D2r!nOz!lc>C0BPRZ76G`@*Bp%jjqZJ(z9gB)*_j+ZGhv -B!Vr`EW$e8P=_#}R89e4so{GiA1p2EQ5&dZAaWN76Z*!kVargDo`}Yj56C%eja6`kuOxxQ#F~?M@O)@ -(;ZcS+cm!jpsAgS{$%?i>b6*7A?ojBE*w{M2@Dj8LZJ%76Skm0hOAz*Im`3_B0kVUZ@K`>Kwq(65LFL -F&+x9#ifK;M;gZQqP4s8Rs;oS)4P!J)m*yTlbwgRUew!xb$mfV&WKQOPDSZosAnUQ?ALtLDoFF03>d5 -H4Vkv2!mX(!lG$7NAWCO#kMbw?Pom-`1JgtZ)qu`L%|?V4DwB3h -?>ZZ?0G-@(32VP|D?FJE72ZfSI1UoL -QYWsE@zfG`XM?|DUTRS;^3%@6aWAK2mmG&m`<5kOkqPUB>o26yX>S>A{pzkc)jd-(4M_JK!#x|;y7c*au^M}t=Yea+KNAVdIU0>Rci<;y -L*OWi2r{+O*&&RM)--r7y?_?TreRJCOZ;j?&|xj}@ixxieq1#$qJt$~n;SJ|VRa^lPtBK86oC^A3x@( -qtNH^UlNK?rTMvNdPJg~Aw)s2ZQUAoM~KB)-fu$P}3A@d&Y?E&mDqA$W+a0S)XSYH`USL18@!3N}-s5}5P2 -jyKiT1jy4WPa~+76P6!?=&05|xtC!MBCO&tj31>AM1Fwn67Q+|ZlKg%#t)pDB)dI|GvHYAfqjvbU95` -4+6_athlc)i23C5<_~uDkxefDVE>q1o{ib`_v`s|v0ztoAU3K?0j}Hy8 -*H{S5&1UHk&Sx+{JW$`U#Sg53}>x%^zbR^>KD{iF7|+&Dn%qPv$qX)6eIVIlKNmzrI>bfrT?5d^x-PI -EQ+s7t_ld8|sBTHvJ6}Z1HJwevXv^waI5_!yLI}r&rg1%xAxTx?!KL&d;Wh`C$s&O+K7YWo6K`)APyf -V$9Aa7n5J7gmndUu!RUHd1PNcO)(SeoWQ@+o7vSRHs7lQy_ntEv92Ona>s|mXGtR3v4C -|7I3bJ3}9YPB^?xcwQm3f)1Md9f+RbePR@ba0+D4yHMl((tWr=}$64iBo^r=w!3H$}G)}}J3=c=92Lq -MA$|Em}<51{~04z-Y4?Bs+UL-E`0; -T0WQ;Tf;mH8Qe$|ze> -p}b`fx#?EtF1Hy<84E5Zzb|J0J5|hX+$RzIiw}4xcq>;+S8$ot&YXqZu`rJAMlC#A#H8$G`xJ|A;BnO -8I*$UJ=UO<&_Q;A?#BdV28T9GK1}l|j0!_a){L_7Kha<^9{=H)VE$2u#d~~-0t-oMzkAZY1>;kHk1hm -1j-mss3VsGD!*!S#>?8|8b(z*IP&6qmzxwDoHx*cPl1C4; -&XI_~-K#47-qnHd`>=tc(`vzm&t6jF{rJD9+Mt6&8qCzgweGk;$Jto@DF_v~vZs$}~;mw2JZyB=kK*X87hYP^52+X6b7e{~#>`+B|1i_WJZK{Rn0R-*L<71o8WRH(T&g_GaG)Ux2a<94z^#!%8swW1OXI -Shu|gctxQHI&dl+GkBd{*JTP@Lb0pA4vxi}bEeiwo#20jm$3MQf-7ew-|Xq83m5SoAv|?mCBgeBqGpKEaQ(o1Kj|GW*80Cid3^>N^rHor>Tr;dW*eR -2n!PiC579gxesobW4R(^IeIt~rG|o+wTva|sLnOzR)?$VZ8^co1kG^!k6h|xgVv5tmW?g!nMx|%)&*w -eevme&6Ko~U&tHcM1H5&3#H!%=wg&fi0K_M0VbG((6s{g*^&3=C$JK*J+|~t0WF%AIXy!{|7Yv4gWn1 -VoKu^uq(Q6@&GeV-3}S#+!V=9IS^%pUf|k?SrwX_~7w~HTRB5M~%JyafwiE)Mf8#nshE$_K+o6py&TVOn3Y)SBo --P3F+RfI|2jO*RK>HXIwgEtxma?^4prJPs>&2P~o@^XMf_4PJ@5Pn9@;huviKb#%FCc{+T`8QHucy~< -Umvqo5cxn7(ZkqtO?xqbp3*&=W7VrtBZ&7El<%)EWrd$WrSf+D(vfZ;J+X4O(c0606h -W@zkKIF!xdX7^z}3Bme$Cqc(Ifjc%jOp)va#EF43mB#a8t?CE?oeFaR5u2$;&TC)0gHnfNEzs7~dBi3 -jzgw9%pAr0D`L!VbuSqJuOdmUrarn=>W;bpeFS#4DS26uIik#OBJ-PPEJ3)$WJvaK3cxpn{G+ZKl|bp -yef9A#8&4QWJ3We0yA)Fp~DhLz~SZi>`!RuJX+Euno*57yT>B3x(~l4)(Lv1E8=BP(93G@;66Foa*W$ -msJx1QG58dfcKxVfdl7b*Ur^|F=0|O>0hoj+AoY!<1vTt*vU9)WlL5Ie~Bz*SmM`dU`;cPW+oo8d;iy -+6Quf6TyAm)wD)YB<*sY{sq7|S9`2rf!8tZ;DR*4Af_p9--?8LOd4%LX0bq4=JBoljsce(E$zD>jK#0 -XplamW6@_=&(QD+o;m8Ho%}`1N#Z8r7dCco0Q_AMAJV@~*ATR}sA}J;c?wic^aEE%%9{?kV*72v!p{NHf_%JBX4zlS>Z8n_PjIjHd3RQ^3iGPHIqJ)IttyNf*w>P5Q;80Pv@S1Zbc4=p#@p%Kv3< -UOx7tFWd3Ur)3v@>PB~bhYX(zAo!Klj?m7Uu?Cm|`9BC+Dv -`&ImmTV3AGziuw2;i#o8);Zqw*9T=YlPtO96G|qhX;xOd2t=P#bf}ew9(y9!8O47a*NP%D(t?b8&uMqzFCf?ik5@7(fl0<4VhANgF2LxIyS_0+{tTIp_*hLL?~P -zL;H1FPhm1ZkOOY=tgnWK^lCRF6tGe9TngaS(WfjC5H$S&<;X)idQA{p^`&{2&jz^!hX8BxnA(}L3Ud -+hq^<^WE+jsUuRW>M#e4*3-UdyIBj{m=y=zGcQ5BT<1vv>Z3utmJSUj{p@%k*lqaduOMGmF5wUmAGg0 -zR=|wlAhMh1hMvtw??#UHGup9N*1LpXF8^&bw&Wa~hW~;J3biBq>lK2RzCK&^!kCgCIoalV5?+caI+O -Ek};Ccy?UX|tt$RCZ4xxHA~J%OtqjRna*ESSCM3XYH+SxIUdWoB;=N4}(?9*W+Ld -KCyb2;M4#)T@I`H!`~Bj4etlX_bc#?p)!p -KKHQ#5CLFC7ef;OUHb?&iZ-@kT=2JbEn0s8InQ0@vfw<`Xw_bM7(0-kc29rdW%ayuB9XM_!!>YkB4l` -Z#SRyQN%0d4zkWU&oon>+gwV<=SscW{eZMgzQVB9D6vKAI<*xUE#r8w}+6%1L!AsiAel( -V(3#D%Fe)N5<(U9c9Q<4JdNVA$Q1L6>Zz=^PuVg#zANm5FihwhAz6ID$56etfo4A%TczVeB1@4iN6_}ft@chLEfZ}y5%yxXPmR5N4LYX39n;(n&vVrDa+R;!?xvc#TE07HT=GD_*^Ddw*~*MdS^LkppX -cY(s*`-&>n|IqxJPm*?kTKqV5Hu}@nWq{?OI2DL8V=9+grPz-V*LXdP|tSdfU#|bM;m!OPAhOMZ8OIi -?vW2iJf|zaxhOK`(~P}=v8%BW$v%NfEOn`YF9vAMdukGxc_13AOYT?!#haek%9jb0(j7ioqG)6t?Iu6 -AE1skjYIJ7c$TE`liG@ZF7{j%AJXzG653gS*BiPl$PN-{f6n;I1#h41$0s-P!vi}4Y0bG$?7WnYJPo- -{V~-1QVA}xuY5NjJXgmFd4Y>w`@EE85#oafd@g>OCs=wyk4L1kToGe9_x?TqD3%p65tzX*6Z$gN=>zh -#0?K=zb*z#L6@Y_(L7JfUXUW&hX2?5-*eG&f4_&;^MHGd(E&kmbfX)2+ZR#5xpV6*w|FIT7k<0{+U4===fNuMgM3(p+v~-4araz5ws0OhJ=vO|cloj!y -zb2wWcKi9MG{BfaPw0Wtb4RFcYl`_#Ho+gThvL_(V>rk>xHr4Yw$o0C4lc3zXZ42lP%G^#zKdz_8klo -{lL*6k#`J-4hEk;9<=iH42Y_RYyiyu>atgBN9&E<#nIE&eJ*+u7`y -^b*`jvnA(;2{hHUq>9dv3?B#C#YaU4MRKaRbbd%eqh@I~~f(D(Y+|4+18=6K}?M32xI{TywoUhM*E2>(VHH<)7xwj^| -WA~ExFyC}_@TC|B?{;HE7Kff3XK0k6lF2fB!ZKM%kmwTSDVOCcQJ_l*d<#St!&9})mpc| -hmg`g%<}QqvZm2+10wKybm8wk$HuTum0w}`At_GOtwiXnLt|nA6I@(~Samp_A!Sx^T!i0mjt}*xyy=( -iF4OI7ELhl*_%G)I~})yogumg_c -$*VT260h-pkinBMLb~bfA2b#`4V{Q&06PQhBtD^T>B}y!+8l|i-UB;Pfo?7+iF09TV -HLctO=76PCSE9-wPBG&pOqaboi{^O4{n96)Vjf83xBQMQEzGqOaGNY2}UmvLPsU?Rei)zok6{><3bQpbv6Qju#*nQ<3|)a?#9Glz!&b+Xwyg&Z0BSgf$?L|`KsDUb5_Y31m^KT5M(dt$g@v -zu|Ly*<&E5eW-zFe}F!UMAC@9Eod%VdJ#GV -X-*Z6EZ7&3-AkNEG%jR88%-A>U7hsjaMK|I+CRwlvLYx(IQSwW7|j50`_!tA6O>_>2CVeQ_rLSRkD8D -Q$^DfEv=UMPuTKOm^H-vLeckc%tc$?ia{9|Pj8J51N=`JIx0w(=AMko7DU-Gh6R){_8`|@(2q6z`NME -zs0ZJnZ`4~VHtR6@GP7+5 -IHPGKg^rhnybh%RzHPkPeoE_5YaKWGTX}fAs#w+$EPVe1RdL9`6HFG214Z*=;OHcs;p4EDX%BkRumatQvgs#V}^yr`eJQ_3nfd>pwp -kN#>JU7wX7loF}hq_u~R@nxnch<6ngE;je|Lf~p(-apfXf5;Am<1hZ`RZ$MJ8I};@p3X=7Q<+`R`K?# -jW36f5qo56ZAC#1-7R%hXI6E&M`dX*z);!eY2#j+SlGJd82waamW5>4LUKTh@|?=?jjT$!+Hk2gLB*W --o15MVIT7NM>VaA~BnjG(!pN#)SL!mFdvIk2ja{|9te(yq%t?ShanCWr)yX{^{n|4~9|27JpK{u)v9d -%>X=9cxTcY>KIC!m*v2=*MEU`un6j%r0?FNo^0HXlQa5&krZNo?+V6c-C$I6yQ46G7tP%}@|a7*syfX -vWa7mf`6A#gKxj0JlvkZ5c6HXe22LClcIV=_N%43 -acV^yQ7e)@{$gu>tt}krQ&kKF5E%7AgdTPw)(hdfjID&NeR=LiUiZ*l>=GBJBYBCe#t(q6c3b9Xq#Ly -6!M7-g?v1E-%=lvb8yGhQuOfIk>1*SJ!hABO<9;qR!hsB*b-SXN|J45^ye4xxktt32-t&SV+;)vm_xE -&gFz5Oxm_~CE>S2Ixncb>zhR&%0}f-(NBr@7k!?dRG0NQx^c;%VZ|^Af+p+yaWgxB+U{w;flQ^LOGk5 -@s(ifQ@=UK%90eGvbOFLWL*}+dGaLacyx3;x|@esje8E=mv(AWrS-4bFML8MbGNmc+}v6+k&h1_FsCR -_)QkB$+t=HHp=!K5K`dCq@G5`QZe-}lMZiIVqf!crih~bBdLc#0G2RV)Ap()^rDX@k%8C?OO -WluB(P~+z&&8smd$@0{clSqn6lw18LhdyqBsuLOHbd!q=BQYYY`0WN)1#cf3;nyO+)^bj-f;U=@fP1z -aK)-d%iR7LwM^5)>IaDH>-R71zvq+fRf8dnD{vlG;`LdN)~xH8(DKGke&37e3C}(O<@ -8|pD_0ksQz1~+`Ts$?Pd}Tc^E`S;B-Kg@D6|Z=rn<@DN?0u_+Ju)%t{ -5mM9O#H(towpT(5tDNk;FxFo(NhLnam6@Q-wyVc>qravILb3HJ2!cgd{bb+E+bB63jCJTISxN@+8OdbX*QWoHywtP(|w>wL6WkOX0m6 -l^)Au>L$X%{}YT;2=4xorP3pIl#0=gwrYnEiT*A9-2SFA?O4kDn)MLHc}sHo2KD47uw{F$#4 -31Zh>-FX&)xtg9OVeia=SS_+(Qwy5V8w}&-Csw$QYf0C+iGNhKXv_iwc!E|J1;S+Q>`9tLehT_@|=Bv -Xsa%EgrpccNJ3hAH9n2|cLe~inzBy=PCHp6>znU;9vo&`R4QGLL=ZrppUg<@bSS_OR?zG&S;{s0Ri{2 -G-y+Et$?QlELE%R{v5BrwV`o^=%=H(yb;u7{x~4bG`dQmaa$eqxB{fRB!2d7;qp!!hh9MN@(tf7Irh5 ->0tGf)#+~76BeK+M0C1z?dCn95<5i+b5KBG-lRl%>MmbRN5%T4rq&RW6F;<%SsfaL^hj<#EEYy+XP=VtdReddj-q+hg;4T+I*ZY+oZmWX}_cW<`V2Ca -~VxlEJc)>H8$pT~46aoPpX&D^VeW?cABh1PvU$uZ53M2be3Rhl&8Y@wg4q>t&T+t?N0Hlh@k0Uw9de( -Q!Al=q|RaxkFVrUDEB_INGD1ORAQ*g-SLm%R&7*xbt0ZswNNG_IqMC`Mf_ZGkCp<^hoK>>BpalA>C(1 -vOCJ9b(zq0jF^wXcJ1A1j`qsLF&P1^N;Q?o3k9@gxbi`okba)Lf)QF_XWXBs0pss+}yb+#ml8Ff*PHU-+K%qj4VDz|A-`Gehq^xN==Ro-?*^{l?rWAWZx<-ERP2N4^T@31Q -Y-O00;mk6qrr`00002000000000o0001RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb -1z?CX>MtBUtcb8c>@4YO9KQH00008045ZePO^IqgH8ef0I&rB05Sjo0B~t=FJE?LZe(wAFLiQkY-wUM -FK}UFYhh<)b1!0HV{344a&&VqZDDI=W@&6?E^v8uRNIc)Fc5wBSBzY(1T93Zs!A2wJQNiqq^i5xOOg5 -lhD?e}Vk6sWimLY8>svyAY#t!-oH;XdeC$^+em#b*%((b5fy(6Lk8XufO38+8_XnwrPD-}NoEJ#`T|I -xcun97I%b@40C9PSvBnpG#2>?N||9w6&=B*%5zkN4M&-~nQqhKIKaRfDj+A097C}fSe5wKhBdXH% -y$h1bQM1!}8Zgj&1Q%A?Lx!`BDXS9)4mdMeaK7ii%E*e@m)+We&t)jA<c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQb8~E8ZDDj{XkTb=b98Q -DZDlWCUukY>bYEXCaCwcA!A`?442JJ{ieK!|O{#jCc0q6ffy4zKA<7zei)iC2aX0$*r0EziY0`3vV*C -F;+i_jbK@i8Nl!WnKA)N(2hJemUz1Mq=;!Q_r249O~4;LYOLYy8=#JbuPu|#AX3GCYuN8<&;Cn+~OOe -I$p8#pNER|c*}M#A#hmUy_&Y&n))-*;6UDTA -d8wU-K|uvYXWzOvHhWZrXa3ywGqk^oNnJXE!(fluWZAH@Wk3tJ%Du=eG -!dN9LeKD|GAt$wKpuhY5Gmw7#Pf_V))lx@Z%)Fr+oz(*GEbv5@Y>Dk4uv`z5kn=knr@f|c(g!{`OO?_ -(ZAfc8Vp&{@7bS}S^2JJh15ir?1QY-O00;mk6qrt;ALDAX2mk;?761T30001RX>c!Jc4cm4Z*nhna%^ -mAVlyvrVPk7yXJvCQb8~E8ZDDj{XkTb=b98QDZDlWCX>D+9Wo>0{bYXO9Z*DGdd97G&ZyUK0{;pp!kP -&F*$m=-nBe&NXN*6{uaxV!R?3BxPCs^?ioiSKIOB+Eai;;mgc3GtazG!{P91DQP8qw -wx`E^IEKAGN#2^XI>di3u{(%vGq%QKTPpwLee>@y%Gg&mQvH&DSb_sm+#Zza5xz3(3$aaN>@weXrT&8 -_;;;yX~{#=#pOFHR3^2PBwSd^OwNC;q>I{ktqd9=%=x@f^OT5|-j~z;{oG_OjoYcQ*ZYV2mAG{2SH)n -UR;96?tgOGetz%TG6nSoeotDr$mq0!j*$p3&Ie9}b(^t<)X{at0^qnq9dB(1^^P(tl2rd9N2DNowt|l -;D@*!Ma3Z28$(~ILu$)&Wn(jFJVp^g&I?$|&xP(YMo+oBbFhv^SvGLURH3IdHTwv-!sdv+P)0`~$>@F -#GXjl6$*-bV$FJikv&1nR&*g$D(e)uHhkI_Ty||lJCkn -anD_A?BT`N~Yg$z1^;MA3c@`)X#qj3em1_Y06)k3fvPJMn6QFbN9jf3fzh^_G{w(9F?X4cv#quoj@jB -Jnn)DJ~#_YR#p2MX>S{P@?`FQz1JjmjyP8l}ULSs)Vj7P(9FEdVWI9a$Mj>)Z&Xjk*M=RxuwiIB1(e-u_duGu}m?&3(407N7Rv9nhmFiuaZS{E?X&_(U6J?wKM>mwqX^V -tq%y@><5m3QgDyncKn4j%-TyK&6&|t8q#yFoT9gvX&WI5Olc2`W(^aEcwAbK6)b1Q0 -&hELFA~)KTsPI9m!UGLKU*xwLRH>K+whE{j+tBPsX}^K&ooJ8Y-5D_Yv42JMczl>8^REUa;57Y&h^g3 -3EtEGEo@fIX$%~=6cXZb -w_2G>mx)p)wL8bPi=FKH>AY^JlMwDEq`C_Xe#vdcR=xlS}{(bYGaQx2cs9`J05Xa8U2=y(yvD8gr$t*(!T -&5hfn{0cK+ey&GF^Qc+jaBIGD!9TQhT9_hoNpYpr;0OU(RhMNcqXxiBp0EUZu1!DHB&^T3qWgMrcuLw -}>>aMIy5jstl|D59eA9j-eX3707atda|?I~sA^GC%5}#gz(NGn7VoIJ~P -<2Tfy?C&QquS>cZ|=P^xC^!uT^pBQrB#b9S9wpnd}x;vWJE4mYt9 -~qAbvbVRalyD!(F)U(quQ%r`OV>Z(6<#Tut(GO77MQcheZ%m#+_A2a?vIj%KV2t`^ACh2f!F<`bGDcw -LHwZEm}mG%+7XY+VJBLia}mu9snW2rr5S0=z~R(z!-lA;_UbFwpu5*72%iZQ(u8BTm))+1gIu593KYU -MIuY$Dm)E?gTQq7Z*@X=G^;+y-}w388S;<@HGqM|M81M-uch~NUG4NpOWzAp-$U<)m{os?Z=lwpU0`QS0^K18C7pR~{D}JSTOZkajkDO{a);bJ!os(1;E`T($5gRLwHh3ekBI0$}FNPC8a>d{-SEvg5KAY|NeMh6&ZU -Hz=_Bt9lxi}8LN?x1YD@c$07d1uEHT@LZgTZMyRh2K+9{!y&*_=}Yf!)!oI`Pn504ATZ`O-BgFsTa~_ -j{}OW`W@E`e~f$IwnqrCopERJy<8kj<*98lw{+Vc>*(Wg8T0g(|^5`SzTiQW;xZN5&uK5>;mIK^|@4@LO0pVF#U^v*wFc__Mjz -;}oP)h>@6aWAK2mmG&m`+l4;lHE-000yO001Na003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cFUukY>b -YEXCaCvP~!EW0y487+o1niIw2>J&*6h(#=7}6k44?7WxO*cYpOC{-K{rgF==-SDAGT$SqM?Ti%TLVz{ -(h~w0*9K2w?16pL3&IdDzL}q%%)yqYi=~Q9>Dyq%9bDt&b7cbgv#T&yvyr0}(=%2^yg8sbBH`nrPH#P -yzU#0Q=R1AOF?@kgkq-f@oK5)ABa5cC_JnXmTOsk7!NGTolWui@vhh4NVQ$9B9u_8kMe+ODcY=Rqb&Y ->L6;NzmhTx@u?Vs1}dK0roq*y<{?biF<)27(I?)C$2nUMr)*S#YJa$Rm0HTmX@P$o8xz;ih1ImZd&xC -4=Z3)ukd%M->X-?MUYE&5*O;>(^0JAp(F_4^?$)s0&b`qZ*r3Nq1CGw=3}0!PnTd9cI?F)0fR(cm~AD -gTxjRd=!OMp{Ck_7sP<)oKo1$O$He0Jdr3t^LSF%e?*NP_Ufte}dgOpv;$*id@IlAg@Nls9%5Y%~NK& -V8#A>q!V(yImL9Z8jqV*V0z1n-5t&?F*zNjCLWE@{GJq^xpN0z{aHqX{sB-+0|XQR000O8CKQ-X*VSN -XF$Vwu9})lnCIA2caA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCx0qOK%%D5WeeI4D5 -p>!(Hc9w-Atnn>vlr#5Q83Jru=?+NC5W6uBk2QntUoGkokrQVO&>XeBQB&HJ0-%IGcR`Korc;du^XTW -RBfEv=Td<9YZ$ipy3PU$`5s=uoz2!lnK9`ghjM@k_Y3+C2Gfx5j953A8O=X_Fhy%6K#@v~or))A5{D6 -<2Gac+S;M7_CO5QOQ>zY>rzMFPzXSFO9~1<%E`|Gk|k=l*}Ra_B&hgLaanF0{onvo%!cSj#eoPb5nB= -D{vbQ9UOu~L=5|+3}YRk)PY6&HRF2EF`mbw%9mVNwLh{&F7DATI2=j#sq-D$Pl -?jRAi%`d#Riy#WdqUM)9etO0_@kEX}TbtA0+@Gv!z6T?>7QrH{5X8a&!_1H%1wptCSOmG6s1(Aqy~SV -#{^yUO&s81vl}p1+V_49R8=Q--W+)#h%YD}fI36%`6Is~Ql>r^jRCHn{CY_5)al8Ny7780b91 -OaqQvEaqA`p21C7B8t=K0Si{F6(cGj0a{_wECO_{E0Sv$8Nxg$4y-H%tuP5&U6K_nDdslJ!5+8lw7_~ -2s`R<2;qGyF4VIf7Hx^+^VGE7FQ9Nq>^Ziq*QQKI@w@_+s)!1Q%?|3+y%x6-#Ci4tYU^tMcy7Zr*W`< -kaMJGBZ|Kw_|DZ8R{UZy*=Xy6{zRkG#bWyJ@&F!@wtO`3U9f^l4{#B^bpf95x -Z@`9k&T2C-(yzvfrX;>_p9GD^KwW`a;4>^rDXl;8@I)d|d;c#Q*YURh(W!{^9fc=)rFR*|#W=ecZZj -GGF`jm`=!L&dn~bRN{h#B=U&i1oO6wry96q(_vSSii)YA=HBM{LkB=Af@yG -9f_*q+ka*^MrAuHVx3vWNGA-o`t=nxr|_mFS4hHH^1gj^N+VTA9{gctFXZ}6;exOw9}VRFonuv0pdG` -+MvAlKy21NJZWvv@p_x0m;9g#Ne&pb5-GO=!1!6!L{-9J6vz6n!NOXbw0J%Vqr6*qp6XP)#dX9g$JRb;uqebm%FEhffl+d#`&oyfcU+j(;8yPK!{?(w(l -&Pyi_1RY1c)D4?b3^&Z?qS{@1hU?sR@_H3VH)OHcB2}~?R8e+#@o2d$3Bk2E^U~@$O~w#L<8~gTp@I4 -y85Yg3-bJi%HAcE2Fm&f%wRSAdD-liA+a>lJy=u?-Vb!b4{k%X#1)pgqz(61rQIZcWO*%OFr{JH5UPH -~1C8kuI<5kRB*`((5#JRt<*xA+98k<|aMAq0|)kfkd{<3`vYin+=p1*o^og#O9CC>0N+$~x(c&Wcmri -X>ncb`ahX34$%+fnQCRKqR?vWT~bJ)>L3wh|I+A@%0#3Y2n#)xS>}C?VXlBv3uP52eQ;qkqU?ULBJ14vELVBk|aS`@Ot+3Y#ag#Q3gO9KQ -H00008045ZePV_8$F#G@j0Pz6;03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g(jWp!mPaCvP|%}T -^D5WeRr2KLeg30l0kuvbqjD0>i3r8JXeFwLZ$M#ZN$NxQVDfk62F3H5=;2|9KTyNTF~vLpAPb!fZy_J -RU5ON73DQ#xU~=Z{r1M2x5u*(}%3Z}mYzIy-pD1khE81}u+BWDwBWR4u?Bp3d+}-tebrIAhjJa_#E+L -6@ARWe#fvn&_jTX?ix%VKd{Y&GXP6;PL+UPAS#7Rs>FDx$srlsLOjl&ogMDAx~2!=B0R;d6c@6*oBLDyZaA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsZb!BsOE^v9JS8Z -?GHW2=I{SWHjYb?-ijNvv6c6o)B>b(c!MT!`x0#{i -}xv(PHJUa$xq7QPO40-3w)!q{h2Y^1i{Ja>Dh;?`<;g2w?g{j*w|0Dz|A -=N~7=h$%EreTDB%hMY^fqoUc4u7>54u#|>GYR?b4M4bYQlgd-+k@b3z(gNAw>c=1&!jMzeN$ExFYp2P -L^m8tOhn(WFl3sI_-B43b?S6*f5RiXxS3_0;ck9#T`@lSx*d-HUBm;A$0gSg&8dK3dKE#Hen -=H^Oa&diqQJESz@`Uk4=-tsoi{#R8%}ANZ~Zh`t@?Fl``AWcXfvzijUrcvKDFM%|!6r7rfhzL5Fx!lX -NCrLs<_6sJTM9NzhA)VVnF-2oQg(dR0k08C`K6EC8e3wNqMAG~Andnl6*-$^&__~U^W|01OcOwju4Pz -UIM1|epQUba&|)LJ|BLH4lvFn>CLL&ew|GOVx~uf#iG3WC*Lw_1oE?@o{&AW$>_ -k!;E17-f>B&PU}P&v{KdOr?(K+T}*12u?2T1Ql?(ads-F3Ba~mfA`tKU>q9K*Lwt$ylYnBcPR{H1DRx -0=D`Nfl+ugxs7lnM+-_lZ!T#rn4PrLOm-O2z!A>jwsb6O$XIHd16*#M_1?sp6pt8iK(ytjm3F|BzxPA -E<|IshU_sE8C5=OR*EDyL!=j-6kA-AoV!d*lkcTWj}{?;|)KNJ>dg}3^u$`deCi?8V -_B{zmtcVaWV|3f0zaNtAG@Z6H;{nuBm)5ax081_Vwz)L2s8cgPEkXpzTc%5RozxC#xEx_pW_M{#X|B7 -MnG-PC#3gyZ~EDaJ(I>Q)V)q9^pfqe8iZ=`7crCgdQiLx8F;=nkE#Vwh7g>txkN9Vcx94kZ656S?TAG -WMYTgDgWzSG=d89@P7xh@I(RfC(vnH845_9UbXCSkq#ej@kf3_pAmJO>-aw9(C*`KP@}Ci?5;t24vPF -S)}Is~47!SMNTbHmTkvDd!`4vGKCAq4CytshoXR!T-$hYj!>_Y$TQMS~YYrUhHtvhZNQIm))VM*?dQY -4B6B~!{#OwD-Fc1C#P)h>@6aWAK2mmG&m`>I^X>l|J000^a001Na003}la4%nWWo~3|axZmqY;0*_Gc -R>?X>2cYWpi+EZgXWWaCxm(OK;;g5WeeI44i`{z!8e((y9m+!Pc#F*fuEAVsA1njVv}2sU;~p#-jhd! --pPzV1WYl#g@n!&dm3qD3jumfgk2=--J#FOy^$<`S)8$3O -QBbgUj}6~NLm<8v*cmRx7_dQBqIzLUbFp75B~=tfC04+7UfEPqV;Rfc-$@n$eHM#_`~FyC@uuNeqp48 -=gFQc>fQmPG-|#mC3c?YCKA-)()_5IgBoy|HbUfDmFzPe~-uW_M%XKI;*-|E@%?h -}Hf@y@8lc}Y6fKs9sO9L7WZ2j(SI?MFy2A;L<5$=Bc{)h3sLIOnCn$qbEx9Ud;PsS*|BZ%DWrqVj5^* -1U$a0WCukX6MC&YG$J`_TW9ozh!n_#*y?5_sh+7;$1yNMRTkgl8oQQz0F;*U;3=%+l@AXsWP58g~g&P -+c|awWS%vnC?^9yuQBtfx08!VREyps@n5Xz{hoO7r(nAVEqzKfs9I`gWT`(T@Ntm@ -rc*LhCa;|m^3F>k_K*64_D^o_jQ33gVJFn=fUrYSf$oa}wXXW6Ie|@R>2Jf=??$nL;!zZ`7gQfj3~k{ -WoJ1`m3U%KYq6UOoh7*E>eixMWC>6<%ChYkQ59j&{5n0f;w(~fk;#DA3W=ElP*&dR?AF0CUNql6eHh~#7~8oiIypkR$q*SFqO3oYs-~WjQ1njMch3#l9e}OX6s{| -3+#nwXkIeID0CDd4Q3XUohyDk%Nj>vdSSBs(Er? -1?tcimerNiXWK4L7kA3b=0!_;L`cu1lrJQ8kPs}W_<7q_AiD>GF!<@!;BU7y(R&jQz!OF%%mMR1&_p$L=6Hg9(u -&%e)jI}z44IaOset7ByhL4kKgU??VdJev1f6-Y3imFam>>Fp(ty{S5=WUwTR{SBlWmW_d)T8pwSip&hC`FnA@OEW`J?0K5$FQqt=^P))Ht;NBk9UL+ExhV1+7 -F_^SMN`kqvM9&&;s<_rCF=6tdGxj{>H@fQ9$g8Zbmv})>HsSV=h0<;!?QGb1>*%g3N>E`zJAZQ!f;ik -cSlD@pcgjN+KINJehnW*8N@MaB#uKE^N79RHD^^_HfvNo+Y}{8d?-aF@*3u`dMDUk)I7m)#Rgvfrx8_ -M!3&PcshX^2Y0fx&21%o%D>>j*TGd5)4;)zi2P6OGXw2Rn1Myvv9FN&?Q)c*|K!J~?#GmnVT-Cg8Dx^ -?~BrU-paaOE3+Uxii6n35Qs$yi2pjiDI282^u<@oqmJ_h*Yn{?ZhG%Gryw{yPUN#Pi;Yq3An>^99Zwk -`#)1qhytTQyx$h1d0tH3v|cNEnz5L>{xMAZnmbScd0pC0NBbBD)9LO(hbw8WKvulxj#KHfau2cm)f=7 -mn&iBXM>B3{R&=Mo*=hIa4C8B`Rmn#_)!l5heJZcBbR00Xd{rUcgM^1rYtvUGLk_@2 -n~DofVnnW(BG7XrMr;*61;)b^SK)2P@rZ%8~t)UZ(U)M9aZ;3Wr#nS+lkYMxDv3Ksa4<;{L2O6e8k!g -axTmKC=VTYyuo7&wx(NJPFCWNKEx>Lu*5Cak)34ZBc+W6Ty*Ug^M6L{9No|`-!|tSK0l^F5T|rK81IN7GD!JLSvJQy8~<-FpfyJ -f;3qXGyJAV(PFSoA+RVvkrle{dhi^}CD|)3^4M%`HKA) -lrHcHr*v0%nydhAbeBljSTVbtsE9VBTHn^RZ-_)Y?RCLRI9Vz7iM)9lTb>#3pzX$!m)~Ep3Ct|Y!%l!_leNuV}rydRHSEL2->0tAH#9pWS)b6j&u -8>muXk6H*hxj^B<#;|I=2KlKdugtpHq( -;9ZCjwv_wbLt-c)DK!Ua$1S)=;i+!V>ov?YWR^?$HU>kkMFy#vVfhcj6Cj?nB~!f^c6&|hOua>bKm*~ -gMBkc71jq>tw!=y#oZus>UD0GopI>@@uTzLI4lHs?u9PArtxEYC)Eb5r*hA!A3UFSA4m^ZJy2d>j?15 -SeVcaIZghtw^kk~R3QGkRM695MN($Jzos9+IBAf{kbNFvMWk|KEYV*c{{r`L=4hxy{wn-}rVuPzt!*O -%9e9s_U(fjU-M=@2}qrUA{jEj)F0UL|!8xD?=PrQ%)0wG~f9biPjpaCb320~FxCPbre58_(M*lhP27s -11qb(#GFBQ8Sera6zo+KL}kH4}?wlXR10e!$q)VD(9 -`j}8T&b|_WHjt;hH*|u10s3$wgn+Z|4XSJpCnnS$(!58{XJ!-Ia8P92&`BU<-vhW*rYKXnDih*>rg9T -k{Q2NB|B*dr!Bh4aet)p(9A$gjt9)c9>{RE>1Zm<1vn**^Us0&!Npy-D2UScrO}?HkBjRW2@MfrCdi8 -D+O~6-8qNnuxEBGBn(Jw}!iWAK1B#B&LCIIx= -H9mV+BVN*75XH_VZ3)B0AP^cT-~>E>r7s#oZ24@EWso+{H)_%6y>&? -tm=l<{|b~7-H8DyE9(G-sCx*`HQ}A28SRgVIy%}cPwSd?U{lE=x}e7KG2lf(U{N=?q?|mc>^8hF#R!P -RtONIPhVWBIMt@}S+@j76ioIh7$i-J^(12}PDdv|9q46>4hxQD5?pD%hKv^C#4;k{$gy% -wNW3T$51UR9Dc0+zgvBCRUXT;PYv62PO_nP3A<(ayEc;9f+Qotg`QMn_PQ0Tsk+qqEsKgWvmxY3pbMj -JhIK~ps`P%}7A>{3^tNG&UAMyFi#r!J1UYsv}x{fd2yqI4v(fW|X4+JE6yi+_@-d=J7ABasy$Bp8ya! -!U+`||Q=^fwl07H4^qVi^d4&Al{JV$+^mAe+HK=n5oVIaDO=96ZuhBPrWZ5N9)F@>e)ziaK~_h>Tv%& -tG7jK$Q#L{zU)1n7^Jc=J@H&+r{OZAFuJ_;_CcjKKex$ECzJ#FZ9(ZB*b4m{btObP0sXG&EwVl#pTuf -Vi6+~^Q-Il`D<{HU2aF`4aAu;{goC=gv0|;Vqj0r&;gImouV;Ns -&r<1Whdd@Hmt2&kbsFG;;RboD`gURsXqCy>9{*1Q~58H+n6a8AGwa+-FB43%HW1P=qFQ8WHVvLCjN`I6< -`F-KWejSUUyEP4!afzhH>W+Fp0Y%^k=rw1~c1_{0XfDY1RT)i}4--JI@BD7!$Of_``RmG;e}oDMMvj( -qWX6T8Cb?i3|akhzz~7&LbDM%5OY={QfqyK%tm|;(~*(0}m$B!&s>M8%lc}7w^jZ7>qkE$ODw|MGlI5 ->K$*?iyD7U$1U|@)SuIGQ9V!_KfHBj{eT;o<%->U=+Dre&IMbG=CCjO1Y``Eu!Vw1_FDn~h}#jte(j1Hj=~ZAvq>L`?tcE&NW8 -5Z)*~6HD2KswQnL4g-hQj`hEz`hI&{e9L?vx0(Q6g5&HaNa0ayaf`F+r1|0?3qoQL>Z2!0%(nPR?o_B -slM^d)bOQ*4qY?83`5Nq%XltO~%QDXw=5^Mk$TYO|`%(Xj&rfrm~pe5;LD4v7g~E$7SVL7o%j=3Mm6L -sb~+!ZCLKc6q75R76+HxyeMs=T7|Y0)Twf5vj|;^CUcZGLvKNaJt7L6ASrD7`hFeqM7+6PEH(G1#(_HfGB(-CIxzIugoC>%@ClIQ5o5S_aq`vC@@YcAP?M2&+ywK((B=9IjSdkHy(mx^ -|j~R3cjE^W?!(u#qG+N_2QXj|DJYxo276-RStm@Nr0w@o>$ewzh#pll~0b^SX1wOkJJYyd9ZD{rthh( -DO61uj>@ib(%e?-%z4$SL)Ir}hBV$1*(qH+WRAmDGH>S&MJSYufZT{MYLn -DFB2`))}+zlfIPk&WM$%E7}QEEObR-(I_DBP1WR$06KRJTeV%qW_o9-=vK|aRa?+=JTXeD_s5x!*enP -1Tv1=+OyTw>@6~^yJ0UA_&pQ^OF%*0hsb5ybA(!muL_jK{Hb#lNYLe{Y9Vu-qtqpNl(l`h6$4UG!X++ -;uM`qG%CHt-TdjV@8bns~p7XIhg{t63o0MSiSmBUes2uOlrP-6`Hjt`=KcNQ&KZ5}7#E8UStVccH6j( -X1W^DuLji#aa+_un?zJZ0`Zc_^6-(pId;?_g1jtb}L3$JL72yc}vw$|DV@x!#)9zjb_2SASvDH=ybKI -+nv_Bn5^zbnGTn)NMAxXlLb!4eYf#ia^mssw@FB%P_4G7agVnYsQL`6msHCKAxuTwLRsEvXlrF9wg5$ -SlL52IwEiqHgU+=<|88N}5?Y-+`a5-Nh5Pk!kGl9SfdQ=ex+QUgRAk*q3!#*fQM>FH@WXXMqNL*;T9Mv}{xR@mBlt7)t3FRN>tR-f6j)xwsZCYO~R0sPLfZjb#Ja9J=^@)r(a2_YiAVBdD= -Y=mK~Xk2#cg%q_cI1C_%+wZ;5a~=jxwU(%VqAcgyL;ti8N_2ugHi!BPt}6l6nPywxN%6p7oGfez+)!h#8&!93s*|(qJGVrMA5ytG_QJC%#dQL ->O0h%&%8UiN&8q2f(P;Y|8cr#Xw#1h>4eONcvKB$}6spg$YTIiyO%G)F{>h -(%~R0G_P{e9ZBtvc)dr&u#_7V2DsHB&Gk=_~TfHm7rQua)!&469E)eO@=DkKIdT_(OFxbAv_q-+85Tn -FKvB2JlUjW$yjWsT2}bg^E{cFC@HDUk}GSzcE7lRm$P<_K3Z3uJ}@qQ)Nsi^6-pI)4a%6KfSC{EcVdn -fC{8EGE~U(VC9_tblb?X=`wHl)+NZ+af)7_%-E?VXq!#$&UdyLHJgkd=qo>Zp24QO+P~oy-kIw!?ApA -cOWdO-f1ek(`KUD+UU_xQZf$JVI^%*4B+QJf?oF$us@v97d8^!p-?g)Rt*HKX+3&QgI~@X(w@SYaU7P -uqr1?G4JIQvx+?dA>2uJYwO>a`qYWIn|HOEKnQpYFs)GHy`EjFg4pb(d(@9_fFv&jTpVT(j>md43D% -Cn7kB@rKY+qkZ(yg$r}zMua%zq-7L=T}#6uDaIgvwZvZuQS2(S`V7ks#J~cn0A=w>$mfZ%a@wzNcNzD -hnGmitR+C$neb^7+t#z!iT)B#v+f8=ix_tm4&*fbV3@H0^RfC?;d;p%0I%pe_bv~Hf;G<)t4_;F6(b(#PlL -veZN8y9m2WDrscP!5w)Ss4rIr$Q_w$iO$=C^tSKy!M-GxcX3aBe-hIgP#nop|@Y&EM*sg-8DbP)h>@6 -aWAK2mmG&m`?N|IJ5o{0049|001BW003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cZb8KHOaCyyJZFAem -k^atKF(*|W$t(%UqV43EQl%K0KB>x>MDxz+^G)6>( -_FHiT(uJUZd!f>@Kcew~dCO6wGFBxAJS+XldsGmFLwaD`{vk!Zor!svk?DKlVBm29^qHm(?bXLTEDN| -lVQd;I~@tnxjVZe5&`KjsFyjUl4X~{P6y8$cK{EhnW#k=>0T@Z-pNNh`)rG=%P&p*xbJj(~{IxR$mwc -I7VTxI#@M=j-m&2O$h%c8(<^U8AD^5`3X6pmLRpF5onI8L*)6wf8QWH(tVI#-i<2qt*^$df{JuIJ(1* -W0_<4M_c$^V#&v{p{g>ax=fXy?=0@I;ZS2-xjP~3zmrVv0Srk#W;&4CNEi;;rBL!gv&%IU9iu`q%bOZ<1U|q>COOuw{R&MxUIVsDG!Ll$HC;2vX2G#9wwivFnm4Q+#=fb;*qgI%?4V`;hMhlPje(HFwvc``LVceS7ob953;}PMkl -#IahxM_<5m!dSg89ida!}$dT_3Gg8fx94lC=;_=*m -Z(+jU`u-UYckfxK|wkuhL``vkq`mBf}0-%B`8$`XyfGG$Y&P3F7zYCmn%*{)6J+_SWt1R&ImvNu)6h) -9kb3*>R*4ot#9yaKNCV(sM(#2#_G6Q=o}Nj|jBa77aT3Ltn90`X`7*l*OXgRcWc)uhAM;b`k}08=9YL -hQ1cD#o9<)Hth_Ht%&4GMq^4I+6?}or5Q2&ts!%xkb1v#+_3P7_xO)Zj15R*)mw<51^H@-N9v-lk;a)6LG6Qfw`@fpwjy7Vr$K!HIx*=w7tw+BK -3vVtW>fsPKkyl;S1f~|jDFAtEJaxwPP7Lw(b@=}9@u0yAO83Bv&v=DHOJqJbIrtlo&It90y7!}eoUJI -Hmb(ma#qY7>!pY|`7mi2%MwE#MIwO$OA*r$MnNRoY_e1{i)FzHj@*3t^oj8uygkJ}DRUaI&mZ2g&y#7 -Pr2jCVD>L_1)F%ehwe(j=RC1Gnw{&QYPQUF1;BINn&6Vl6pA5nv8z;*5p -F-eR?&)-;49%-R-BZZ${_uhzbMhRK(@Y#qTT^?>p_#5BQ8PwO5v}eR)LHLSuP(?2lep8c0*8u}}B&Nn -1DpRzB73xMp2Cp!v$qy|m~n0TTePZF&~^ev=-n(~csIQ@tY -6Qf26H_#s?%OVLJB5GmE!${;nsitZ;BFIeTLKyLQG={EZB3>N*O&nhRZsMc;UfYKx=5D0ESEwLEOuM+21G{St1N-{82c_x`t_w1$j(Odc0uYXRC%R!5pJJ+$~spMgd46F&gqQkOx -Nhmye*KYFO?}bCbk88KtFm%8tG1e)po*<8rs{fBKZ@S38e!AQITnY;;<3jV_pUdYF|XXvXYNT3n*Zz6 -5(4o^){EtI)Jp4JvRKnbY^PdMY|1qRYSol6_NHJRLm<#6tJ(^PNUQ9W6t5Es+3N}9vjxe&cqR_JWaR) -eUT-A?*yU)_OS&#k#<{!vq;7)I6%~iktX9T0&>jGM0$oO2`qHR<0s16@o-o0N1>ol3%gSSId-F3YQY! -U8#TH*p8W=HkA>?G)Mhh&+8x&%_;}W?b$Uzbf<_CeaZg8To?qY^=Hf4o){C?)eOyONHREXPaCo6ZJ4&wrE1>znp8y8E2CB!zWXh);1Ro5 -W1z{QXo_Zbl-Jm)r-YhebbWh7BvA)qBvzg3PdC*NTjOt>_d@=Foc-5htb9 -F**?o*1k~$0T&R$^9gTvf>O#GVmsRJ~pDeJv&7{h`T-V92SJ`7f(C>SO)aazOv()qW434GgzoqhBOzN?Ak^NZhca!{0t!=CW%2Z(F6+9X1YV;nz5=;q@mjwv#U84Mh-^p7zn_ZOC)xw(w?5QH_zC? -xhleHsQ~=+O@%l_|_<*FZcZR+8E>t^U9<9Q&j#et`JQm;uK3yeIm;F -$2>^Fs`-mc$`c9aco@bc)3{*cIT;@ExuaYZ&8#{VwrbaMT3Dve;Jr3el9qwuM!WKYAkrm-s2&#(3PO@ -U|!8rb1gL)d^xlDH^U=+?6eD&+IjIVP7v+Fp=hUvnJ|i!!MJpw9!LxrTnD&V -`{i!9GKM`Mt1d!h2{ZX249bYw?72z8t_659APi#0_7k*fBU;csJDoQ=m-snzUB2NufjN||^EC7~M;xr0G^9lT%!{U*ID{r~fl{hu1 -?oknPRzB&mj%~#9tbi;bZZdsJFgpk5U0gl -g~}>%n5BMXcpo1wjiA5?j2_>7K6sroMF4Z0+m8kZmqY*0fiDkbAJP~JTc-(B?+0;`xpx2u8jF+Gct-N7)78e_L^t(2;AA^C7ezimJh(o15g0FU -kK>UCrE$|EVFjOQ?GY{RV!#;h9Ld|W>&+jB!TTv<15tv-Y=rFE&?J}qhCPyi+t-*MzBP|gNUPuBi0t`Vwc2d@f3RFL8jsQ%Z0&o!SzJd>RN@;HV#w+Ez -t)BB8emgvUcTOJ9|gYtQD-7~P*lwJX)SII5GSK#7n2RI{K|~>g(oQDQ_wvLkC~MU(P*Bz!yu{c{wTe@ -(oeVW$@sDcPYrCMIxVgX?ct`z%bP&=7Fz)`fgV6{pnGQ<_*xM{;eZ7a}J{q&T4Y -jrZdo};;aIVD>$355AP0S1^cz2BYS!~R;><|4tzM+NdI*aY8f)6iyUN?t}8xJa|>I?yM4DcXO%vi5W} -ph;y)ob9&V_2J61mE|aHjCnGDr2NuE0^#$^@ZA3Hroysp|tM0nvu8 -n<1$t83iqm+sD1t9G0_<-+E*no;dujVJ628|d2bKDR0X+5_QR)w-h~^1ZZk5&X7ZW!Ia3UM)@6rA8x7P_U0MVVJ -?kY?sD*GF=X!o>8t3lH0lZ;4#oxSldBKcMatePsoOMX+k%V=z0=mA03kDmMTGkTrPK|Xs*$4|9jRr3P -#FWmg115ac#NSA`$4BE-&?z!R+RCcJuJvvqsTBR-Aexl2(MEHq;f_>TIPACHSU{&{AgV#1+eRXjP51t ->(Rew_%MxN))~Og7s|eqt{L~`*8((EQ;4bwz+!TKFm9LK0b4{AR8fmFYGP1Mm|z~!IWL!*_&^)+q$ep -ZZZrook$fpG$DZWvlKd3@F>c11%RNP`;XJnySMLw>viK}6uhZ=^?ESf>!ZWC>Y5vtsq-LxatERecBaw --4KhsJyz0~wV|aSl^8*UUovP`*WwfOKz$&%ZYte$;b7h?LAdAplSZfaG*Ub%c9bZ!Rx^9@$-ryweugu -h2_ER}T+&b5*KSuYgL8rGOm}d>E*mFc!gj`sNzDA;Ig%3f=28Hn_O&*$ -noDu8cJgyva{gdf1v!5j5H9JDctlyIv$yy+Xl?(``>!AZ33wPlJh<|NTP-%~G8==@ti_decqb)|2lBP -kRvlFFW=A7oK>(dfI(_U*CS|*ITkL7@R!=s=0Je)&p{cyu3Lm0G3%xN$s)X98$eXXi$Z22< -r(2rNixvKx*-04P)h>@6aWAK2mmG&m` -+tv&LDFO0012(001KZ003}la4%nWWo~3|axZmqY;0*_GcR>?X>2caX>Db1b#yLpdDU85bKAxhe%G(qk -wznO27%PLZdx?z#I+UIGfwOo%jqMz1Q+DiAQr_gM6(b5?LFu01-k?&%V|5)>LDhH-E%+Rxgb@ic5Jbz -dee7ev0!r7s?IRJ(yH!_SlI7p7wmp3*jiM)uMN|x{3HxBawk-8GS+LcW~&3+8q?Nt#f)OIS<8|e!OWH -$)+m3N?YRbOx)r6Yq`hWMcY-WlzkT=T7jGA@?tXmn@$LQM{>@K!?>^q2xyMNL%-+j$@wp -VOk*d-D_Pu5L!GI)pU8lM;;QfMW(HPl?nmzEk7he*0T3EOOwEC_Fg`b@*UOCg;GPU}fD9vnshP*y%L8 -S7XYLropESanrf8es_t6Jn|W#4rm%>oa><&6MQO*g}@89NWR&NE8}|AUmvnrrRVn^~6g;*7!H`T4njz -)ICra?^Jlt&*S7bN5WMk~eHcP6b=687Rtwhbz^=w^pgTDC{--^G3N1oPj|DtZ%=~Z!*>izP|k~znO;% -7!Yv!J<$1yH+&h*Yv0TQ|HEMC%`gq)#A3y$EHXT$NSYpH>xq{>b5e=`4z~p`_K}oe+K^R$EJGmHd)+CiD33=Ioej -wr>>0JCQklRZz3fM~{!YDdN$x(~Spi3ELd&0&Tv1?7v-Zc1opd=n3vusAMl-WW+`y1YrC?L1`Fy4tF( -=$d1fC7%9|B*{5mEHpKfS3V6oIbn-Y!vH!@TtQL@;Um=Ju1wh70$?LFac?kv8q1oeHvt^H5%B;A+jn5;L371)UzP%-XYY2>#%>a~R!g5_v2(l`j2g(Hl@1# -C`5PH)JGFxJIItx?-PG_cqUUJH##M*BJp^jsyCB|f;8(K+oKxNAy0o9KD_M){-`zZ0{dWEQ56`}P{`> -2J^#~kkq2^UU8@ZSAf&DY2yLVhK?*e8*l;@Wo_EQU{D)EYRnA)pvlpU4E?Shmkq;tDdB -`aRaL8>XtXv>FAPC80T|D?R@y;WDjdRxLr*&qa@PFvk#Chb8$32(lfXGI~2n_}9z$#uE)mhBvRYeJ~6 -&@^7Z=z>h|A2<<1himHAO{5ga)19mcrLgNx5Sk;J;YXwjY5<)j34go{a+ySiu -In`JvTJy1Y@TCii5PHVikS4y;k{+@t>wY~%;8t$7?B)B94D1G&NMH4yw-z2DCN>oGebZ101b@KEJv@- -AljZ1&lS!4$kR| -kWxv^PS-OHHS(@X}u6^`0Mef)*v$P|&fjb-b81V96cYPgug>(hjmiRt9kkKua}i5T1{!KN#rS8-Kv2E -E%$s8%jp3>A+O=5LB@N>7?PG2CHf036|f<1_l`_vfi?B09EXu`i^ZB9F_J|kA4DeAfG*XULhEA3m?Ii -d+guJ8lod<5;6j2=sY`y5sN|YG-Bs_Zb}H|a}eGlX~d6d$b-o1#5(s)y_NZ*i02pE_`}f_VuXI&B+af -544QN3{?Qx-jp3;Y>&!tpOos@Si^WWfy2@-kyOz^8pnm*uO{o7mFCuT$Rle{|!L9oaa>+G}UB1!u9WA -t`?$g!$hy+>fG(m-lWHHmHr)Z)rNN_5`U-!)Mo@<=xqPu`pcXF{S!%;9vPTwa=%$Y!XhMV7UG(@1$Iu -?SJm1Y(ZH7rS&K!VhLVuLwnu`vBp5Cpbg%RsQD;ROf)qA(Os-$I15Rf4)-vWV2gJRtlF?PP -quZz%8#n@t89M3{)$snb7e4bhGt%el= -=^inAwy-g~xUc&eosHAFGab4%!SqEaot!M_uXV_}iXpFI8BQZQS%mE2hCzB+_s^ndR}0aE0zhjFD^u!Tn*VCN56=m -^vLM6b@mmM2y^TX}jcJuEksWbkB=_)I)@qGptow;v#)$zd}78*d%3l*5HOIbW>qs3vbEoD~>Ve5ScI2 -cO>KB9QwhG6*vKhLUKHGEk|9!R1Dc2$aLt$DV(?`3BsfBL$0F-^utqz!a=4{PrH*A9FF%L$&OtOFMJt -*$u5#V3I&3GCl_af38~^_=9KD;%k>7+KA<0+qjvV?ezN)3(;tNmcy#XSN!tCxhAVm664-@2jNg23m3!;`3XE{d$yC9KT89^*ZU-}{NMQKR0^KHYL}`{;*uPl;&Qa@x -WHF5_<~^arSQl`QE=r6ov*2a6j?ExC9mEP)nvaiKiRd8j1+Gd>Jb3PmVToDCLz?R -@Ko_*ne<~7fK2u;P)h>@6aWAK2mmG&m`=kUZ4nF!0037R0018V003}la4%nWWo~3|axZmqY;0*_GcR> -?X>2cba%?Ved8JwVZ`(K${@s5CQKOKJx=J6wqGw#1J~q8A(Cv29^bWWn=h6~w6Qx8gNhS6E_4f@)$&~ -Fh_b|{{rsmC=Z-(s3=!z{CtJbwfEEY^wjW&+)rPZo+ViA6iRzy~4r9|PRu5CwG^GcMiZIl=VnmiZZ3( -*XSKInqe!Y6L5I5$R{(P-2fwcySf%TC!NVYc+JGJIW$+GW?H( -U|>1FkP!HyXCcGPP1B@iYxi2U{GY)t#lj4Yxc|K<)_K#DGT~?Fygh6%jZniD*tg=3p-oso;n$ -qK(TIxMh|W!3myF`hIF$7f^g=Ehj6_WUm|e#!^#EEZO2XO -U-!6oNu)rC4FT7PpJVq)>JijX9;b%^0Oad?d@_BPB)m$U6crE&cdZiDX^2_@6Pz^pPts!Mk2-=YQnZa -pNpy!6ZA$5^DN*@>7Nv?2-SG$_lm*8DelxyQEY4Rv37nu!W$*gh(rEb}YY!ay`?j|2mKvGr+bDmXTvK -hR{y)BXJHP4$%#P4KY0o=N%s(6{XmQ1CHk~y3#kIoaVd8oPXyP`p%rq=cB< -^zI^$TeL?p2hJ{8pKRH=zy;dSeRi0E_D&XNEV@}~uSMOv#+lJpj0h2*b -Q$QQHKl=RpUBDvTTARf5L{9*SDr0!Hy!>iDZvhhA3sJ0P^u(c25N6R|8g$E%&i{L`ax?KHtZb%{@vwG -dXZLK=(cT`wjeFY*ssL4zQds_uG6g|CsnY@*~Ku(%A^!p=a*_Vv41neniB!LDO8Uq_J*-7GDY_E4w#S -{td%gO|z}f7Z3TEBc&6DFBKqi71(HjrUa6R+1lff7mSG#;2G_UggLti_Mp8)mWF01FP%6m?vPkz!Vx@ -tzw(jtB4N`4u;7aY!}T)JoP1S$+qakhXrwlctL#ucY}h2u -TKE&usIRtjkF`C?tCISN3F>$%UpPNGk^8O=ku6j5Jca4b1VyP{ht={5^QnnO+7B$E9~m1M|Al*hN2x= -+>|1k?k7kebtG0#GcNv(5sFWwQGp@cSj|)G+;;RJaCk3?hkzE_2_V4lY=sjU6?x`i`6RNo0o+72R|!6 -ECc~GnQ6*w7mlzwdnbh|1F&FXxBVW+77c$rOWx(ZlwPD<2w4U<^k&E@$}Z -Ubbn~ec0AeP;Vp}DX4KB7cWK{=K!ZN6GdU(6(TLe0IV}EA*9mGE^=s}`bNn>w`Lo#kPYG92-za(f16u -t?Dmua-p$lCK^mNNGu^GkVSZZCV#V&CLSA{(f#ax3!1 -1~)B~8X$sqHMNCmDiz5f3*vr3Ok_B-b_>Ign?%akAnn3PM+S`)TVoy3YF|rSycgyJ{S>a~eh{0=XpsKqL;7Ui>eoVNKTYsp3^*puo#}q!A#5Dj-;H=-R>R-icY}$ip0TIXPS`sc -dmTZ$M2)l8a6=n9#a;>nVBs#_#f;e`R+G~jwJn8P<=U)IHm*`9W>wJD$=HU=w#U!&XCZYw&XBK**xCu -Plh)+lUu7r0$Dfza -qULQ+@nX~W>Wi>-;leKiQ}`%gDNbsCA5QXAh_Pp;W1rm3rJr##Hy2b*;rnqqm*rUf&8q|I8+M&F?*7bc -vx8wykH7aP9};$Ur?3ulQ%Prur2oq`Kc20H^Yw -IOI{TS!%8>%1^mpTj7vQkkI>F1~B;5>dLHdk|rZ#!(R&==+XPhSQ?l$S!|9{E90Z>Z=1QY-O00;mk6q -rtKr?zmu2LJ#Y6#xJr0001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlacVTICE^v9(SX*x!xfOobuVCc|% -c-om4HgTeQ5PwYMT6biLE=Ro7J)#`oRL_~kh3JmV*&l~`yF0JBU#R-Z>^A67xH{O_w#X7(;DjqS*y*Y -vZfJLrweaP?SzVJt+ZardXm06s;Th9x4oNqyMH|qcm;W{8p@)L(Z(CCiU~ay)Oztg{Qk~bW1kTTpQRg -#PF5>f*Q=FSieIO<=Cj=2AnJaYTwu%nmMoOVf8QJ7_boYLD)IKidnfj$6NS{Gb0nZq08n}}!g -wwG7Hd)$dtf!DB#SjKJyl&DL29)lL9MClm%HCO>S!*cE`yw@u|ICF2^J3fffYmclI0exTmlYZcMI{4 -&a-!ouJ?i-h}{Hja8~xW6b@diDd{03{sm!RF@9lfyAsHNY;wpB6EPRJli|!x$V+$oHHfOe3AMesx;cgQ$6%GIm{6sx4F*)z2_8-mq#9+GdXHrs36HEZN+DJlhjmgEYnT5qh2In -o*hW8t=_rBET}m3jmopB5a6lasb=Yip^ZV{gE;&q|l3#||IL1321b&>570;x$R<#fQD$0#b~CvVdddmA^u=bv|fu>BQYnhukxx;|Awtz>v#+s~mgwSy%o|w6#>DNcG0<91PbKP5NYBkIrGc -$LSC&l5=<82Yac;YTA@MBR<2b+8H(o=ZiHbD4aVSiQ@}7>}Qub(-0@s+L|5G2ySSU<5E~mCaU5#yugt -T`mdC(jQIOf%wEmKcd3hAh=0X?5`8?6`C`dig^YnT`@xCz9(hp7uJ%C+pT&wd?NT5oSzep4+4<}{^i1|jQa(mIKW>et!&(HAB|=FU6IE@bpH1P2>D933pwJnKVcNjkf6 -nJjhTZ*^OXS{mCkVsj8^6vtW4sJ^d*D((q%>1!3GZ0+i -iapY)$T%E(n8ve`}O9_B@zvt8jX-!NXm1ZxHf(}Xvu*a13y7TU|00J~&7!M^9Fs -#%J(y3j6X9vFmZf&I*mv<&C&G4}1)M^G7(#}cW<&S6 ->7+!(Mb -j!fdB5H#oJQIp73e_Z6Rd+=*R&XqEz@nb^Mv9?Fadzdgoe3`lABT{kg}eJPTxw*E@8Nc`Jhr&7?Q+<2 -nfN(tV3`>Ld!gBs7II<83N|>ERs0X!aAi6#x_&NjwdGf%$H -?!oD%|8y=#Qs>W1WiMVV#b0i24$U=X!=P;foIFXDle9`_A95=vjPA}P%nKe!bMfNEuIEol-x%@dFMm^=N! -T_0)~N?s^JPdrfJJjtnC2r_OeI%5Fi}>~B?HlV+oHB0h8s+9bZ$cFCN+v%Bw_iZDD^Z -oF+M6elTW(4y=pkj2bkjjq(DvvG)Xw}>nY19C_ER{DZ#KcR)|HoAtDf%wJyBop77{L78S4Fw+}F+1Wm -UrjuIodoMBx^r<8H)g`})`NF~!BgTbiE2D0l%c$%=n*?e%UpgbBHtGO3+~4y)p8&2W!!kd?TRfweWH`TI%^`h)#*N!xWxtigS -nC&W5{rulT70!haIgqim8DYCa(a9g_~wFZ{Zx%^Fki#8bHmJ)hG2IuYUla;8nENC6G^Rf!wL!3jhF9DF6T@0001RX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2 -ZUtei%X>?y-E^vA6TK#U@MiT#DPq7!HpoB_{lU#c)5gV`_r7`L_LFBZ!O9E;|t}NEnQs6Ev>xu?>jRW -ppE>ChZ`#~;0cM;GrAaOqi6 -HQYl9wB~$T&%stCTGnmsBS3HJcN;U}XB!v*XL3z9(ZNjtEJ4O!HU?dAyKv72LmXH}l1cMgDq0<@(Cc@ -~ittQ=d#2Bd^BCPo9s-Jj+SUBu!G`Yc+x>TW#{>Y9Rx1YCn>P`wt$H*@jG#C8#o?tAuOnG>I4&EFdS7 -Cqp7Y^7+~6_+ru&tt>Imvn2_`c_E9Og(03W%Oxpz0@|`LO(e@{DtbM$fKMY~`23X4SSl>j`SHp4eA4U -nejLA=oV~aphs4|WzwsY<@NADvvLz#&E*UWJ%2+gqrLx{QKpz7Z> -5h@$>Nng#V(>>m?!^9UOe~-RNMHc!B%f8)}N%(UL}^2n?5kage6=-B7`^gv(4UECC#ma=W@tc$}@p=- -_XE#r0@~AAariPLEHYjZqo++>6H$b9N({hMWJNwjlX`Rl#7H|tA9s;wt|WKdzKpXYnUTW=5v-qtP_QG4D?{ha4O}B+)`2fP%nC0@(S;Sa<-ay&cix+I87wZG;92wky2D~qqAqa%B0z+ -vH?(CF>OFF%aWe>}S&le6zHe!a@Gg2!Hsg9^bQW(}i0OMgHPQNoNy*LU!^2siu#@|VM=tesiyo?En5a -xhup`=0iXLN&<>iBU0QWKM-tfS}ywE?;7-rBpJbijD<~eFZ+&_n;~qcmu1m582ImY(hHCvg=~iS1>if -Z1p*ZC51iMxWqGLgZ#gMen3W- ->O_s()nmx-LEyqnZ>x6bdvE1i{&xO0C*DAV0_ -zbl=+fnbC5@NWVlvn3;5a-{Wd#Eze5jt4o{Uc6!>N*c8 -zM<)NQhgO!-UVXk_BAO>H=1(wua`&ZZR$O9g<3G``QDiZ)(gcd1A0h0*tC`A)ts@WJMZdJgQ>u*ThsR -!sfb-@J(Pjva78fn_8q96)Q;})wTLp#Dxc|?4ngzKKI_{LVU~woVSXH8$Pt#Py5q*W#y&# -d#kUD6OBLJ|H^@s3bhi}m?aY>xCeSVgBw)7@6e#!?)P)vR_~**R<2=vuogxz8xS)bcnYWEHgubV=y*F -sZLyMu;j1J@Qwz)qYC+djAIZoeuZO&0|Bm(kP?vbzB+6=b9L7BD!nKo<%fL8!*=wl?_1ImhB?I{YZ?} -EI(d^$SNbzDV81cru4D7z|ESrlR_W@CHbCus0wR!9~EDg>+YeoCQXNFti*G-2)>mHHh5oNQ2v!M+MKF -F;QBEyhY5mMj$D7^lgs1mAlTwx{@Z2IA`|#1~#GKv_>YxN;qtl-aKIG4|L{o+WmTSevlZrxH3 -_;613|@2RUOwih8RJoxr}+*o_?ZOUL-ub#A5XRPc^Ov94!RRI-vPSX^-w=%O03By1E`e)@51UAq}6&lswH#BFl0LILj$YaW;q7aDYUi_ov1Et-s!5q1Zcskwnk~zR%`VXF -8YMg92zXJ-ISH~#~T#~uj(teqh-sHfV_I4Y*FZ>I?I+0IXv7Tnc3E&%C#{PoKiyaYx0 -p@o%uz#hK1_&N=Pe(- -s1qP9SN`lU(3khl^qfyZl_hH^#H#YJoKZ13X{Ct*G80SxH(m=yz~+l`}OYRe2U8yXtyinOA!Neax1aa -M$=8d5zumB`6U!5dB#Rcg1#nrf^p+tZbnVtqIF2=3uBXe;YO!YXwlv^Xdgu_wBGYW2iHBbxz2cUQz)Y -D%Tm0a@|Cyx`oQywXuvf#e2m#s46q$4xN|_%LN;KW|vmAH`EQZukSD8h}-X>v -b+-W>}^MN2SMA}bqWh$<@P&cHyds_DawRl)25B;vIm}w~RC~hZ#a0B@~y2hUr8VSbiZw2->VKp*S}oiQDgI1R&V1}kowh~ZL83RSEzEL8ueFzJ)0#bi7wXP#7qn0lJ1pEd?zBnH42Roku6gR2=R -rD8I86^P^TL_0{FZZm;*47?*?DY@*WUlleXUJ*GDwH8njoi8enG$U@x#BdN`CzCA5$l_tj;>wtdFhWa -X9{gR)68vX=r@EgLy;P8vX!u}BQSy7=!XC1Y$ -IYg`QFBTR4JNv{xd#F1DxC_`oLqz -FP;=$B8jRt$4Q<43YLYLt!Cq)54&R$=r@VfX7%)Q#^WTS()?(|GqTKb=VC{10E -C$2>pvMi#|z%fwwjoij7O>;Q^CDBYEK<#)~ZM6|9EgCNL$T9sRk`Kr&!WQicB_w_{ox;}+f%Z9-~1n%AZSbz-L$ne7j;h -t9m3yFKDuL?*HOuLx?42DXUjCO1JLZ#A;fGiTc!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZY++($Y;!Jfd5xM)bF(%OfbaPgYI^V`%2;4N?3o_=ejGZJ_L -3gn8-uZ8E5_gf+&JyDzrBDlNV_Y*IV4^lR{JHf?BwzB@!^5hpAWf}S(5KmwlAO4cq`MgmH&r7w;O(s& -+L8&yWPO5oK**@3YNtu`F!IxNq+t;)c#Oy*w_1?%vlPDZ9mzoI^`LAjn68((Wy#gR>}?g^7`$Gl~S^o --@bnTDEN+ofcezLvHWD!? -#*DQTH-mHE;e?C0C{QBkl%PaeZ{nMJUxMZq!O>$BHT&g!7E;g;W{qw0~db$2V3`PJG`aVY3LTyjYl@3 -bI6b7NP`@R{0D1_2f=4l!V%Dc-cn#R*TxRqh;&Lz*i{XE83YA4 -7gZMgIM7RxUvO&h2l8F#tx(d-h=6CJm4!M;0PwbA>c{<5J>BTzPV`ty&lvqQyM*#8IShbgPB=b!sEfr -c$UmS(3@jpG}p!sq%+flaS?A}aCERg!{hRl^I#d;Y%~x1M&wI!D-fWX0k*l;ttCL2oZ@=NSS#E|x%TN -e5+K*S83)xQ*i?@bOfQX190AdDngXM_UUwk<-dt|7gzLtGRGxh>=e+^#*SU#6T1QD#EgYXYRVYY -0>5&d`Wg9s#X|8=}n2Sh@r0GrR}?QspI1XT)(xA${V8_1T3ZNuFmKn&$iFjR>qyqC;u;qycra1J^hD9 -~;@E(z9#{gTyMwNE0N86RuDi=i9tQ9&W$~f1UH);qgfgnnDJ&!g$4C<-$x4;nca}5k)J5 -ZVCTHPzP~||j7lBgq1`@q;N-v4Fpcpei5C#a^009gTb_04e&Po+s-RBh-Yro$+I@*t6;xbWq50YrRJR -a@PXejWRLZkg@O4gr_HWNFnmPY%kCTkU1rmJJe{IDKtd|Xh&i6?dYZCM8%M(A -tOuM0i_KGo7N)4<1P(#2?Jc(02del2YnRUf_VI+p+uwLSxOt9!fRU%psCv`oP%Peqv+Zm0X$NhWow5v -^|~hNbr`F8Q}t?2;1EuthK#I%6{rC?nIRL~fTIR@gaICHfCmhKBQ^?cLENZos81N+(+2p!063+g&=w5 -F38#0YHofsV5La_l~jzz38)wgaII60_HmJ;~3*l&-+!Lr -{vu7KyILDXB%3vXC>f3oQWr2!HVfe-`_%}1v}-~pIPbjKNpxlUX;rNvxDgi9B7k$3TZmh*S5h(nijaR -+YIo;ZwdVh!PkW0{nOE*(iSPAD>wl3L0@uKY@<0b1lGIUjd#r|LaE$6f6#Y9W6=-=XdsT*`#5oWcOqm -X@=09D{4~*hn=}7mbriSsv6|^{&itw!)~9-d~f-=on}3u>C+>E8sw#jf-Y*5V3IggTfW>y2psSa!MoS -+SDG=OLUWvV=+K=9eVy!Xe}Xvx^Gne2dHl?%qP1E9rHpOZ=WPoMoHAz#C4;_ptTiheH#x!4Mms&&^n<86n}2=~{uZ3*gV?}OU~l3SU@5I_z^?pK%7X9YTm3ZIY0oD^{Pghe!~alA0|X -QR000O8CKQ-XP=7HWL;?T+83h0UBme*aaA|NaUv_0~WN&gWcV%K_Zewp`X>Mn8FKugVVPa)$b1rasy; -Dt(+At8k=T}Urke!NV+dU$2=Kw?p3k^#JRY}YmdRJFf-{gDK*RC}x=C64{(jpsejU@*us@ -Z*4Ml$ENv+}fh~DcBl?jXQt;HB!)b+@fTLIRv-EOOC_pP+AlN7-g1~I -8m)KY0?oP`N22_a9Z&?~pz_9_K@Wg5B&XsvN7xW)}g*8C5L-os+CfCmLqIl!8`cYf)|j$7Dpf#APv?^ -MGaub2?0UXD7X?yh8^PgyqmayOmLy)3^ougfZ)r7g-!6@SB^2DPCVK1EcX7a|C+DcO^J)Z-!IJDHXw= -t5Q(;JgQi0xN&ItuiOzGG09IFsm(X?@6@L-yv4hyr|K$A|=dLoWJJjo$)*!=aTdew-t8iSVMrGPnwD+ -s|0M=u@or17Jf$ktS$Q-J&K+Ojue@nFI#~}hq9)9N)lc}J04p99z96{L!d1S@y`dKUBZuWPL`(}`SsD -?O3t(n$;lsb(I$ix&x%VLLAh@izJam~G-VkYjFe@=xGYQ3wvF#9NBe#vJLmNH=B5*@uo|o4uw(A9EtJ -{boSP}w80>igP)h>@6aWAK2mmG&m`-OnaHqKi005&I001EX003}la4%nWWo~3|axZsfVr6b)Z)9n1XL -B!fWpi|ME^v9ZS4(f(Mi9R1S1b|)qykBhTqLms_+Z5nU_fyS$T?XCv7}b^HZ&=4m$7{5q5UJh7AVl(d -vp6s`b#?dB9|}gVMnk`ayj2OkDZ+vy+%R2q|wa?rF_*rZoPW-s?|d9xhFn})H~MWgmEU9f3AF#_$l%+ -qX80DLUX*Pk&+H+Kq5v)XgojbAVvt9oqwE -M%qNn2NjRn<18QmXDv9rq=dDtnCdBg)y<5i#M`=XC1mcBYQi4OK1$*Yb8^-b1blpL-)A3|B?*Ofk?;z -#&&!l+LvDaiM#M+n3>2bT&YAwkMVa7`7V-Z -H&L`m7Lkx&@Ey6q21FUUh$ABQ?Z*dx3#Ug0xz`xs$KQ%5xOPwHAJ5Ox{jE5&Y>fk=4{JG=b0uk;cTb~ -be9yXrqjyKOR#FyskB{FCyMw)8A?7sN4>CKwJijp_;`hU#Gl-Jal5$Klci#uF+e~V009qCVZ4}SJ6ltuC5!UteWax)$x}Jlrag|RxP=1$)rL+lU^QJN -oobAQ4ne|jc|B!nWUr)QdXBN(S^Rj5)J8PJ5|}DCc%m!1_b#ShRAelBn|*WI3eg84xv1&^g}$3^8}QK -1QLJ|?y4N@fp7{vsNJq)qfR-2$&Z(~+KEmhsZAw&vB;bDHj_NEapY~*cNUw;bg>za;S1N`hs6dD!C6N -$I_+&#rc*or{Js~i(Alr9_l6q1`$6l*goDu8Kw+V+4bd4~Y`0ljFE+=05iC<_RekyImp}3nlf7#{#ZV -DGgel*2)m#;a+|FXx-AW*btHa?AW&x#{0lz-l9Qs`oNqrU<32RIe=U2`t=$`UhH2(al)u3QHfiIBv`- -=_PPTn27_lc!o@V+~q5-%y9`DpFS -Hh}PYPl#_pbc_qF+nVrn?8G~3+2gUtcmmUfOCvcMu3)hBaq!hMV}~_1WYc3dk`$-NMvBr8Q<$`RKgBd -MbENHNy>YS=+gt27JAlMcdl*iJvVw)s?}WZ3VHj88YI#QnM@&%9rwKzz^gNm@=c^GBjdVwjnl^f1gtK -%i(mEY|KK0G_QGjzb6?VKxr_<@#o+=zOEX$kxpB=7eyHxVz;B%okYOMJ4@$X$ZO7qS$JSt5!&);qx=V -^5>lp6i;a=LCaR&&@l-4qDAP^oD|mgclVW__3p<&iB{_}cF1n;KjA6>b|{_^J6Ms#r$%z(GiAkd@}#q -&55HC%-StWSaC-Eq7lwH8H;&pKtS-{=Stj%P>i&6UVSOC7D(uv$33H8&Al3TGr&5Qny3`cGLm;0{Hri -%>aL1Y?i~FR^vfQx1kcSG@CFo_4b1Z?77^Vufhst&VMoKH2 -V;o!L%pO2`O$khyK8K{<1Yi#`wP)h>@6aWAK2mmG&m`>XU{MMxe007ev001fg003}la4%nWWo~3|axZ -sfVr6b)Z)9n1XLB!jUv+b3a$jU+W@&C^WG--drI&4c+cXr0zvowol#+y{Ax_se4hzur1qx%7bueHrL6 -(jhgX09*p)D`_?I`w9^rT%s>>^+8b1X|b_p#io-V$oA)BJKImZjMlHk!?5qaobyiW17}v7&c9Sr%j`n -oOFLuEyWq|Em``%tbm|WHh6^lw~^4#oUN;O5%EFwb%|XCj2hFdfG_M7dJM&oR%YTLXQ -7P^p&G_UW@Qbl<|Bk}m+xGM@G@#O62ybaVgrmb}KTEvu`zCAZ)#SGIn_*-2Ha_5HXz!du_h8+ -RIHHa>Ozr}ym3YMI_W&3V~>{jOq<>Aqrl1d4rESKp`D&5mvqd#kNj>_urw&R*EnnQT{wtLqoWA>MuAr -retPjHJG2YCW_$b#=toFT9w|^)jQ?X?KgRrcTn_%*9yXX+Lw9+SMAloYA>D6hM -o4YYor}a=89!NdIj_)3*JGa&=Y~0F^v%a;c>}_Q~##Z3)Rn^xqHo4pAaEFfhfr;m<2j;Gc^P6(&{v_> -=T)g^|qg+A4%KVbrgT4LENGxocm+jVSgKgUq+d@s}clU?|9)B9}Z6{p-_%e!tUcY@Q3(_PW -ijSJ(Z1YaK=*9E5N;gbzcw7sCAz9)xh{!_o(N7)(N_d}zZp3ZYqtQK&Qul}4e`C{!ASN~2I|6e^8ErO -_~iaR_AyL$#3#p$=iFH}drg<_F9sbBp;QbDQ~5&1S1v=WV{;VSdbf!0a-2m_6nvOy4ZuDc>gFBi|t39 -p4(?7vB`$krDG#<|F2q`5E(b<`>LE=40j&^O$+UJY{~#{EB(T{F?a<^9l1?=2PZ(%yZ`V%xBCC=5yu` -%paLAm_IRpX8yu_=^yng4qh|gFel7knf@I4L*!48KR*8K_=9uFoHA49Z_MAB8FR+;Z`Yi;VE)1MuUEn -JujP{YC-aJV&Aeg$#r&K35A$E<+x0teuzqKk=3v;zB*J8X$u1@jG1&iP0xUpBQ~4`bhMV=p)fbqK`x$i9Qm2B>G77k?14QN1 -~5JABjE^eG>FZ&?iBk1bq_pNzf-jp9Fmp^hwYsL7xPD67)&XCqbVCeH8jA^ik-e&_|(y_`e^jg=%dj`qmM=(jXoNEH2P@t(deVmN28BMAB{d5eF%LBeF%LBeF%LBeF%LB -eF%LBeF%LBeF%LBeF%LBeGK{-^fBmT(8r*UK_7!Y27L_r81ymdW6;N-k3k=UKF0ZU>VL0K_ya^#|Mxa -FzvaT$hySulmT9Kjx4%vQ15ir=0u%!j0000803{TdPMH5nbQb^s02KfL01p5F00000000000HlEc000 -1RX>c!JUukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`-N@Pvb`c003_S000jF0000000000005+cL;wH)aA -|NaUteuuX>MO%E^v8JO928D0~7!N00;mj6qru3qg%Na1pojx3jhEa00000000000001_fw%zx0B~t=F -JEbHbY*gGVQep7UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`+Sf-XSFk007_|000^Q0000000000005+c -1qT2CaA|NaUukZ1WpZv|Y%gMUX>4R)Wo~vZaCuNm0Rj{Q6aWAK2mmD%m`V>WaCuNm0Rj{Q6aWAK2mmD%m` -=ssY!O8#002vg000>P0000000000005+c8z}$)aA|NaUukZ1WpZv|Y%gSQcW!KNVPr0Fc~DCM0u%!j0 -000803{TdPCc!JX>N37a&BR4FJ*XRWpH$9Z*Frg -aCuNm0Rj{Q6aWAK2mmD%m`?vr(~s&d005Gt000&M0000000000005+cw_E@KaA|NaUukZ1WpZv|Y%gh -UWMz0RaCuNm0Rj{Q6aWAK2mmD%m`)#5(^qZ^000yl000^Q0000000000005+c)r$ZCaA|NaUukZ1WpZ -v|Y%gqYV_|e@Z*FrgaCuNm0Rj{Q6aWAK2mmD%m`?PpF}N2H002lc000{R0000000000005+cdzJtIaA -|NaUukZ1WpZv|Y%g$Sa5OSCbYW+6E^v8JO928D0~7!N00;mj6qrsy2IMbE3;+NmDgXc)00000000000 -001_fy<@<0B~t=FJEbHbY*gGVQepOd2n)XYGq?|E^v8JO928D0~7!N00;mj6qrsZoE7Oa5dZ)fI{*L} -00000000000001_flRXi0B~t=FJEbHbY*gGVQepQWpi(Ac4aPbc~DCM0u%!j0000803{TdPKD;r=fp1 -n0Ogc!JX>N37a&BR4FL!8VWo#~Rc~DCM0u%!j0000803{TdPR@ -7gG-v<-0E7Sl0384T00000000000HlGf^Z)>GX>c!JX>N37a&BR4FJo+JFJE72ZfSI1UoLQYP)h*<6a -y3h000O8B@~!W@a4dpS_c3C!xsPmBLDyZ0000000000q=8WN003}la4%nJZggdGZeeUMV{Bc!J -X>N37a&BR4FJo+JFJfVHWnW`&ZEaz0WG--dP)h*<6ay3h000O8B@~!W;z+Y?y%_)i1zi9D9{>OV0000 -000000q=8Qh0RV7ma4%nJZggdGZeeUMV{B@0%X>c!JX>N37a&BR4FJo+JFKuCIZeMU=a&u*JE^v8JO928D0~ -7!N00;mj6qrsvlkVAv3jhG3Bme*#00000000000001_fg&ma0B~t=FJEbHbY*gGVQepBY-ulWVRCb2a -xQRrP)h*<6ay3h000O8B@~!W+pKr?eE?y-E^v8JO928D0~7!N00;mj6qrtZx0!e20RRA&1po -ja00000000000001_fvhV>WaCuNm0Rj{Q6aWAK2mmD%m`)kL=AZ5e002}U001Wd0000000000005+c<39laaA|NaUukZ1WpZv| -Y%gPPZEaz0WOFZLZ*FF3XLWL6bZKvHE^v8JO928D0~7!N00;mj6qruxuqb~01^@ux82|tx000000000 -00001_ffh*t0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WWN&wFY;R#?E^v8JO928D0~7!N00;mj6qrs%F_c -F$1ONcL3;+Ni00000000000001_fm2Wc0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WW^!d^dSxzfc~DCM0u -%!j0000803{TdPWghuS=<5u0Fed&03HAU00000000000HlG$Q~>~RX>c!JX>N37a&BR4FJo_QZDDR?b -1!INb7(Gbc~DCM0u%!j0000803{TdPJvxS8Px#*073)+03HAU00000000000HlH3R{;QUX>c!JX>N37 -a&BR4FJo_QZDDR?b1!IRY;Z1cc~DCM0u%!j0000803{TdP9#6m=@bc!JX>N37a&BR4FJo_QZDDR?b1!Lbb97;BY%XwlP)h*<6ay3h000O8B@~!Wg?DcI+6n*wwkH -4p9smFU0000000000q=7(h0RV7ma4%nJZggdGZeeUMV{dJ3VQyq|FKlUZbS`jtP)h*<6ay3h000O8B@ -~!W4*TzM92IC005H<001KZ0000000000005+c-iQGJaA|N -aUukZ1WpZv|Y%gPPZEaz0WOFZdZfS0FbYX04E^v8JO928D0~7!N00;mj6qrt22uDzd2LJ&78vpbYEXCaCuNm0 -Rj{Q6aWAK2mmD%m`>FkRK%14000#P001EX0000000000005+cSd{?)aA|NaUukZ1WpZv|Y%gtZWMyn~ -FJobDWNBn!bY(7Zc~DCM0u%!j0000803{TdP9q~7==A~s0Llme044wc00000000000HlE{mjM89X>c! -JX>N37a&BR4FKusRWo&aVW^ZzBVRT<(Z*FvQZ)`4bc~DCM0u%!j0000803{TdPDbJ@7s>$u03-we038 -4T00000000000HlFrngIZCX>c!JX>N37a&BR4FKusRWo&aVX>Md?crI{xP)h*<6ay3h000O8B@~!W^i -}}3kp%z%uMz+N8~^|S0000000000q=9Li0RV7ma4%nJZggdGZeeUMZEs{{Y;!McX>MySaCuNm0Rj{Q6 -aWAK2mmD%m`(ry0006200000001Na0000000000005+cG@=0jaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?G -FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!We^K*hO9lV{^%DR9ApigX0000000000q=9&%0RV7ma4%n -JZggdGZeeUMZ*XODVRUJ4ZgVeVXk}w-E^v8JO928D0~7!N00;mj6qrtuuuJP7~*9RL6T0000000000q=9C}0RV7ma4%nJZggdGZeeUMa%FKZ -Utei%X>?y-E^v8JO928D0~7!N00;mj6qrt??u(Tt4FCX#EC2u@00000000000001_fq}^Z0B~t=FJEb -HbY*gGVQepQWpOWKZ*FsRa&=>LZ*p@kaCuNm0Rj{Q6aWAK2mmD%m`=CJ9(H>W005FT0012T00000000 -00005+c=hguLaA|NaUukZ1WpZv|Y%g+UaW8UZabIR>Y-KKRc~DCM0u%!j0000803{TdPFd}F5g;c30E -Cc!JX>N37a&BR4FLGsZFLGsZUukZ0bYX04E^v8JO928D0~7!N0 -0;mj6qrugT)mY*2><}J9smFw00000000000001_f%^^u0B~t=FJEbHbY*gGVQepQWpOWZWpQ6~WpplZ -c~DCM0u%!j0000803{TdPLSc!JX>N37a&BR4FLGs -ZFLGsZUvzR|V{2t{E^v8JO928D0~7!N00;mj6qrtLDn=dl7ytl4S^xkd00000000000001_fwCL|0B~ -t=FJEbHbY*gGVQepQWpOWZWpQ71ZfS0FbYX04E^v8JO928D0~7!N00;mj6qrr`00002000000000V00 -000000000001_f#@{?0B~t=FJEbHbY*gGVQepTbZKmJFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W< -93tkC<_1pwj=-m9smFU0000000000q=6?k0swGna4%nJZggdGZeeUMb#!TLb1z|VaAaw6b1rasP)h*< -6ay3h000O8B@~!WhmVcyK@0!@XCVLp9RL6T0000000000q=Ab;0swGna4%nJZggdGZeeUMb#!TLb1!3 -WZE#_9E^v8JO928D0~7!N00;mj6qrsJog%or1ONaC3;+Nk00000000000001_fd@_k0B~t=FJEbHbY* -gGVQepTbZKmJFJxtKa%E#-bZKvHE^v8JO928D0~7!N00;mj6qrtg=M^V00ssKQ1ONaZ000000000000 -01_fdf+l0B~t=FJEbHbY*gGVQepTbZKmJFJ*3HZ)9n1XD)DgP)h*<6ay3h000O8B@~!WLO=oM%mDxZ- -U9#tApigX0000000000q=9i&0swGna4%nJZggdGZeeUMb#!TLb1!CTY-MwKb97~GE^v8JO928D0~7!N -00;mj6qrs`wKH691polj3;+Ne00000000000001_fqYj20B~t=FJEbHbY*gGVQepTbZKmJFK29NVq-3 -Fc~DCM0u%!j0000803{TdPP*~=1bX>c!JX>N37a&BR4FLi -WjY;!MYVRL9@b1rasP)h*<6ay3h000O8B@~!W{Yh&&H4Oj&mn{GQ9smFU0000000000q=A=W0swGna4 -%nJZggdGZeeUMb#!TLb1!UfXJ=_{XD)DgP)h*<6ay3h000O8B@~!Wm1T=>NhSaQvVH&n8vpc!JX>N37a&BR4FLiWjY;!MdZ)9a`b1rasP)h*<6ay3h000O8B@~! -WkubPZ_y+(0>=pn39{>OV0000000000q=E340swGna4%nJZggdGZeeUMb#!TLb1!dobYx+4Wn?aJc~D -CM0u%!j0000803{TdPHw<{yS)Pd0JjPN03ZMW00000000000HlE>paKAJX>c!JX>N37a&BR4FLiWjY; -!MgVPk7yXK8L{E^v8JO928D0~7!N00;mj6qrsHqVh_+0000M0RR9e00000000000001_fgq#;0B~t=F -JEbHbY*gGVQepTbZKmJFLPydb#QcVZ)|g4Vs&Y3WG--dP)h*<6ay3h000O8B@~!W5!tnt=LP@(+Y|r* -9{>OV0000000000q=6u%0swGna4%nJZggdGZeeUMb#!TLb1!sdZE#;?X>u-bc~DCM0u%!j0000803{T -dP8$Or4_*QQ0A&OK0384T00000000000HlFLtO5XVX>c!JX>N37a&BR4FLiWjY;!Mkd2nfNXD)DgP)h -*<6ay3h000O8B@~!WH3&C`j1T|-^fdqg82|tP0000000000q=DV80swGna4%nJZggdGZeeUMb#!TLb1 -!viE^v8JO928D0~7!N00;mj6qrsc7of>T6aWAPO8@{J00000000000001_fuO$v0B~t=FJEbHbY*gGV -QepUV{bYEXCaCuNm0Rj{Q6aWAK2mmD%m`)JBSdf$i005s1000{R0000000000005+cA=Cl@ -aA|NaUukZ1WpZv|Y%g|Wb1!0HdSPL5E^v8JO928D0~7!N00;mj6qruy$E*9H4*&q5G5`P=000000000 -00001_f$rD>0B~t=FJEbHbY*gGVQepUV{=}dc~DCM0u%!j0000803{TdPE9@4;ZpVe03H -AU00000000000HlG%=mG$6X>c!JX>N37a&BR4FLq;dFKuOVV|8+AVQemNc~DCM0u%!j0000803{TdPU -nrvePap$0Oub703QGV00000000000HlFb?E(OBX>c!JX>N37a&BR4FLq;dFLQNbc4cyNX>V>WaCuNm0 -Rj{Q6aWAK2mmD%m`?Rsje!{k001r$000*N0000000000005+c^!EY)aA|NaUv_0~WN&gWUtei%X>?y- -E^v8JO928D0~7!N00;mj6qrumUj{Tl5&!_>UjP6W00000000000001_fkOTQ0B~t=FJE?LZe(wAFJW+ -SWNC79E^v8JO928D0~7!N00;mj6qruxZmG*9CjbERr~m*J00000000000001_fwm9>0B~t=FJE?LZe( -wAFJx(RbaHPlaCuNm0Rj{Q6aWAK2mmD%m`*N@iz0qI008Va0RR{P0000000000005+c4mbkeg=WO8M5b1rasP)h*<6ay3h000O8B@~!WFobuJ|K7ytkO0000000000q=CY70 -|0Poa4%nWWo~3|axZXsaA9(DX>MmOaCuNm0Rj{Q6aWAK2mmG&m`)*kyb8|=008tR000*N0000000000 -005+c_gVx1aA|NaUv_0~WN&gWa%FUKd1-EEE^v8JO928D0~7!N00;mk6qrtEzg*Go9smHuegFUx0000 -0000000001_f%{|x0B~t=FJE?LZe(wAFLP;lE^v8JO928D0~7!N00;mj6qrtk0whkX0000k0RR9b000 -00000000001_ffZgg^QY%gD5X>MtBUtcb8c~DCM0u%!j0000803 -{TdPD-13rvd^101pKK03ZMW00000000000HlEjg#-X_X>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eUt?`#E -^v8JO928D0~7!N00;mj6qrtU7M&J|1pom55&!@r00000000000001_fk%e~0B~t=FJE?LZe(wAFJob2 -Xk}w>Zgg^QY%gJCVQ_S1axQRrP)h*<6ay3h000O8B@~!W#$vopG64VpB?ABeApigX0000000000q=68 -P1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zE^v8JO928D0~7!N00;mj6qrthmShtW0RRBE0ss -Ia00000000000001_fq{+$0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZE#_9E^v8JO928D0~7!N00 -;mj6qruhwv5__4*&pyH2?r600000000000001_fzyu!0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZ -gg^QY;0w6E^v8JO928D0~7!N00;mj6qru)(f%6x0{{T!2><{m00000000000001_ft{ZO0B~t=FJE?L -Ze(wAFJob2Xk}w>Zgg^QY%gYMY-M+HVQ_F|axQRrP)h*<6ay3h000O8B@~!WlqGFmuLS@A<_`b>CIA2 -c0000000000q=DR{1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasP)h*<6ay3h000 -O8B@~!WxKRxc*$4mtDjNU*B>(^b0000000000q=C<=1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWp -Zg@Y-xIBE^v8JO928D0~7!N00;mj6qrsFuAyD$0001=0ssIb00000000000001_f$Opa0B~t=FJE?LZ -e(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP)h*<6ay3h000O8B@~!W8NawNHvj+tRsaA1D*ylh00000 -00000q=6H(1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8c~DCM0u%!j0000 -803{TdPV&hS!4U=k08tPC04)Fj00000000000HlGFv;+WfX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV_{ -=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000O8B@~!WsK-IyX8`~JSOWk6E&u=k0000000000q=E0c1O -RYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!mbWNC9>V_{=xWiD`eP)h*<6ay3h000O8B@~!W5 -m;ebHUIzsGynhq9{>OV0000000000q=BNm1ORYpa4%nWWo~3|axY_La&&2CX)j-2X>MtBUtcb8c~DCM -0u%!j0000803{TdP6_W6?=t`Z05t#r03QGV00000000000HlExy#xSoX>c!Jc4cm4Z*nhVWpZ?BW@#^ -9Uu|J&ZeL$6aCuNm0Rj{Q6aWAK2mmD%m`?o{2Bzp%0sv-L1OOfY0000000000005+cg}np-aA|NaUv_ -0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo=MP0Rj{Q6aWAK2mmD%m`>kP>w}sA007zm000{R000000000000 -5+csT2nQaA|NaUv_0~WN&gWV`Xx5X=Z6JV{dY0E^v8JO928D0~7!N00;mj6qru%&ks}N0ssIP1^@sb0 -0000000000001_fqWGQ0B~t=FJE?LZe(wAFJow7a%5$6FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W -IlqJu?>PVf7J2{x9{>OV0000000000q=B6n2LNzsa4%nWWo~3|axY_OVRB?;bT49QXEkPWWpOTWc~DC -M0u%!j0000803{TdPRr+KW;_D`0Nn-v03iSX00000000000HlG*QU?HVX>c!Jc4cm4Z*nhVXkl_>Wpp -oMX=gQXa&KZ~axQRrP)h*<6ay3h000O8B@~!W;8`d=JqZ8+!z2IzCjbBd0000000000q=7_M2LNzsa4 -%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGdc~DCM0u%!j0000803{TdPKjA0h;jq~0Lu;l0 -4V?f00000000000HlG&Uk3niX>c!Jc4cm4Z*nhVXkl_>WppoNXkl`5Wprn9Z*_2Ra&KZ~axQRrP)h*< -6ay3h000O8B@~!W;Fn=qzXt#S_7eaABme*a0000000000q=A2A2LNzsa4%nWWo~3|axY_OVRB?;bT4C -QVRCb2bZ~NSVr6nJaCuNm0Rj{Q6aWAK2mmD%m`+^#H%O!f000IK001cf0000000000005+cfNTcZfA3JVRU6}VPj}%Ze=cTc~DCM0u%!j0000803{TdPJD*tWk~`60B -!^T0384T00000000000HlFyat8o#X>c!Jc4cm4Z*nhVXkl_>WppoNZ*6d4bS`jtP)h*<6ay3h000O8B -@~!Wy+WEXXafKMKL-E+A^-pY0000000000q=D~r2LNzsa4%nWWo~3|axY_OVRB?;bT4CYIW#$Na&KZ~ -axQRrP)h*<6ay3h000O8B@~!WLgTaCuNm0Rj{Q6aWAK2mmD%m`)%!#Ly}Q0 -05;9001HY0000000000005+cQilfsaA|NaUv_0~WN&gWV`yP=WMy008PV001BW0000000000005+cyo?6`aA|NaUv_0~WN&gWV`yP=WMyc!Jc4c -m4Z*nhVXkl_>WppoRVlp!^GH`NlVr6nJaCuNm0Rj{Q6aWAK2mmD%m`)8T)3TWo000g)001KZ0000000 -000005+c)e#5)aA|NaUv_0~WN&gWV`yP=WMypj00000000000001_fv+S80B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5E^v8JO928D -0~7!N00;mj6qrs1c_nI26953aOaK5K00000000000001_fdEwq0B~t=FJE?LZe(wAFJow7a%5$6FKTd -OZghAqaCuNm0Rj{Q6aWAK2mmD%m`?C$$;u!L001X4001cf0000000000005+ciD(D_aA|NaUv_0~WN& -gWV`yP=WMyc!Jc4cm4Z*nhVXkl_>WppoWVQyz*d2(rNY-wX{Z)9a`E^v8JO928D0~7!N0 -0;mj6qru_yRRu~2><|)F#rH100000000000001_fjEE&0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXJ>L{ -WovD3WMynFaCuNm0Rj{Q6aWAK2mmD%m`;yotr)!t002=e001Tc0000000000005+c<%tLYaA|NaUv_0 -~WN&gWV`yP=WMyc!Jc4cm4Z*nhVXkl_>WppoWVQy!1X -klq>Z)9a`E^v8JO928D0~7!N00;mj6qru6GQ(uZ3IG6JD*yl|00000000000001_fi|iL0B~t=FJE?L -Ze(wAFJow7a%5$6FKl6MXLNOPYiV<6ZEs{{Y%XwlP)h*<6ay3h000O8B@~!WAWpXZXc~DCM0u%!j0000803{ -TdPBwKIP2B_l096eD044wc00000000000HlE%ya)hrX>c!Jc4cm4Z*nhVXkl_>WppoXVq<7wa&u*LaB -^>AWpXZXc~DCM0u%!j0000803{TdPOZ}ssB!}U0Ne)v044wc00000000000HlFD!3Y3wX>c!Jc4cm4Z -*nhVXkl_>WppoXVqa&L8TaB^>AWpXZXc~DCM0u%!j0000803{TdPHFbx59JI10EuG&0384T00000 -000000HlHP#0UUzX>c!Jc4cm4Z*nhVXkl_>WppoXVq2mo+ta4%nWWo~3|axY_OVRB?;bT -4yaV{>P6Z*_2Ra&KZ~axQRrP)h*<6ay3h000O8B@~!W){$p2AO!#bz77BYApigX0000000000q=CNP2 -mo+ta4%nWWo~3|axY_OVRB?;bT4yiX>)LLZ(?O~E^v8JO928D0~7!N00;mj6qrtRfJZ%W4FCYeFaQ83 -00000000000001_fgR)s0B~t=FJE?LZe(wAFJow7a%5$6FLiEdc4cyNVQge&bY)|7Z*nehc~DCM0u%! -j0000803{TdPW8XMJw*fn0L}^k03iSX00000000000HlG_@dyBLX>c!Jc4cm4Z*nhVXkl_>WppofbY? -hka&KZ~axQRrP)h*<6ay3h000O8B@~!WN5_!Yxc~qF@&Et;9smFU0000000000q=8rV2mo+ta4%nWWo -~3|axY_OVRB?;bT4*ga&u{KZZ2?nP)h*<6ay3h000O8B@~!WlLpr^0{{R30RR91BLDyZ0000000000q -=8KL2mo+ta4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8c~DCM0u%!j0000803{TdPWL9XpP&Q) -0M-fs03`qb00000000000HlGC_Xq%RX>c!Jc4cm4Z*nhVXkl_>WppoNY-ulJXkl_>Wprg@bS`jtP)h* -<6ay3h000O8B@~!WZAzfivH$=8?*IS*AOHXW0000000000q=9q%2mo+ta4%nWWo~3|axY_VY;SU5ZDB -88UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`*+wr(cT$007(x000~S0000000000005+cWBmvKaA|NaUv -_0~WN&gWV{dG4a$#*@FJW$TX)bViP)h*<6ay3h000O8B@~!WBk*i@_ua4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4c~DCM0u%!j0000803{TdP8)AUa)SZ@ -0DA`j03rYY00000000000HlG^3<&^mX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<=+>b7d}Yc~DCM0u%! -j0000803{TdP6!(e5l{sH02~zn0384T00000000000HlGH4+#KpX>c!Jc4cm4Z*nhVZ)|UJVQpbAcWG -`jGA?j=P)h*<6ay3h000O8B@~!WqA1qp?ganOV0000000000q=6t62>@_ua4%nWWo~3|ax -Y_VY;SU5ZDB8WX>N37a&0bfc~DCM0u%!j0000803{TdP8*_L`CI`207U`-03QGV00000000000HlFS8 -wmh#X>c!Jc4cm4Z*nhWX>)XJX<{#5UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`-Ne(&;ZN006w90012T -0000000000005+cc!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL0JaCuNm0Rj -{Q6aWAK2mmD%m` -Md?crI{xP)h*<6ay3h000O8B@~!WOp>%zMKb^Zbjkn#9{>OV0000000000q=EH~2>@_ua4%nWWo~3|a -xY|Qb98KJVlQlOV_|e}a&sc!Jc4cm4Z*nhWX>)XJX<{#JVQy(=Wpi{caCuNm0Rj{Q6aWAK2mmD%m`=90h-L!@001Kq0015 -U0000000000005+cAkql{aA|NaUv_0~WN&gWWNCABY-wUIZDDe2WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`? -5gg%biL008Wq0018V0000000000005+cU)Tu%aA|NaUv_0~WN&gWWNCABY-wUIZDn*}WMOn+E^v8JO9 -28D0~7!N00;mj6qrtq-GmaT3jhEPDgXc=00000000000001_fu8*d0B~t=FJE?LZe(wAFJx(RbZlv2F -LGsbZ*_8GWpgfYc~DCM0u%!j0000803{TdPEX#?6S@-s0RBJ#03HAU00000000000HlG02?_vkX>c!J -c4cm4Z*nhWX>)XJX<{#PV{&P5baO6nc~DCM0u%!j0000803{TdPHv@lC#$jm003$M02=@R000000000 -00HlF>9SQ(&X>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cx6ya0Rj{Q6aWAK2mmD%m`=6@qPy500000000000001_fl8AL0B~t=FJE?LZe(wAFJx(RbZlv2FLiWjY%XwlP)h*<6ay3h0 -00O8B@~!W_Gl<9P8k3IUt0hG9smFU0000000000q=CQE3jlCwa4%nWWo~3|axY|Qb98KJVlQ@Oa&u{K -ZZ2?nP)h*<6ay3h000O8B@~!WEr?>m)UE&k09*k88vpc -!Jc4cm4Z*nhWX>)XJX<{#THZ(3}cx6ya0Rj{Q6aWAK2mmD%m`=Xn)X%de0079F000~S000000000000 -5+cZ(0oiaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%XwlP)h*<6ay3h000O8B@~!WBkyPY!vFvP5&-}JD -F6Tf0000000000q=8(34FGUya4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y-E^v8JO928D -0~7!N00;mj6qru0iZ5l(0RRBY0{{Re00000000000001_fo6dX0B~t=FJE?LZe(wAFJx(RbZlv2FJEF -|V{344a&#|kX>(&PaCuNm0Rj{Q6aWAK2mmD%m`>tiJZ*p`mb9r-PZ*FF3XD)DgP)h*<6ay3h000O8B@~!WL_!}!Vp#wH)M)_#C;$Ke000000000 -0q=9q64FGUya4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCuNm0Rj{Q6aWAK2mmD%m`* -aR9Nk3%004>v001BW0000000000005+c8ygM)aA|NaUv_0~WN&gWXmo9CHEd~OFJE72ZfSI1UoLQYP) -h*<6ay3h000O8B@~!WbsBC3B@_SvK|ufjApigX0000000000q=B9t4ghdza4%nWWo~3|axZ9fZEQ7cX -<{#5X=q_|Wq56DE^v8JO928D0~7!N00;mj6qrsHH}m9P9{>O-e*gd^00000000000001_fdVoP0B~t= -FJE?LZe(wAFKBdaY&C3YVlQ85Zg6#Ub98cLVQnsOc~DCM0u%!j0000803{TdPQ*rP7QY+-03<5`03rY -Y00000000000HlGUQ4RobX>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4Wo~JDWpXZXc~DCM0u%!j0000803{ -TdPTF~la}ovs0Iv@K03HAU00000000000HlGTZVmu&X>c!Jc4cm4Z*nhabZu-kY-wUIUv+e8Y;!Jfc~ -DCM0u%!j0000803{TdPSy*C?^8$s06sc!Jc4cm4Z*nhabZu-kY --wUIV{dMAbYX6Eb1rasP)h*<6ay3h000O8B@~!WU)FBu4MYF{v(NzmBLDyZ0000000000q=A9G4ghdz -a4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXc~DCM0u%!j0000803{TdPOt+FBDoL%0FFHX03rY -Y00000000000HlG>0S^FhX>c!Jc4cm4Z*nhabZu-kY-wUIb7gXAVQgu7WpXZXc~DCM0u%!j0000803{ -TdPVdvN52gSB03iVY044wc00000000000HlG)5)S}yX>c!Jc4cm4Z*nhabZu-kY-wUIUvzS5WiMY}X> -MtBUtcb8c~DCM0u%!j0000803{TdPH2qZRe=Ej0HOl`03!eZ00000000000HlGk6Au7zX>c!Jc4cm4Z -*nhabZu-kY-wUIUvzS5WiMZ1VRL0JaCuNm0Rj{Q6aWAK2mmD%m`)^BovEe)005c<001Na0000000000 -005+cbQKQ(aA|NaUv_0~WN&gWXmo9CHEd~OFJE+WX=N{DVRUk7WiD`eP)h*<6ay3h000O8B@~!WOHXd -j9RdIV?*;$>AOHXW0000000000q=8%)4*+m!a4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~G-aCuNm0Rj -{Q6aWAK2mmD%m`(ry0006200000001Ze0000000000005+cw;2xraA|NaUv_0~WN&gWXmo9CHEd~OFJ -@_MbY*gLFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WfUpD*!T|sPmjeI*HUIzs0000000000q=Ek#4 -*+m!a4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?XY;b5{Vr6t`V_|GzbaZlQVs&(7b1rasP)h*<6ay3h -000O8B@~!WB7pnEl>h($9svLVBme*a0000000000q=6M24*+m!a4%nWWo~3|axZ9fZEQ7cX<{#CX>4? -5a&s?YVRL0JaCuNm0Rj{Q6aWAK2mmD%m`?M+KNl7Q004mt001)p0000000000005+c>>LjOaA|NaUv_ -0~WN&gWXmo9CHEd~OFJ@_MbY*gLFKKRSWn*+-ZDn*}Ut?%ta&u*LE^v8JO928D0~7!N00;mj6qrtu(P -W@(0{{R!4gdfo00000000000001_fm0w40B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;^X>c!Jc4cm4Z*nhabZu-k -Y-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^v8JO928D0~7!N00;mj6qrsx!2wY6761TMtBUtcb8c~DCM0u%!j0000803{TdPEw2!DO3Ug -0J8=F04o3h00000000000HlFfMh^gRX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*gLFK1?y-E^v8JO928D0~7!N0 -0;mj6qruL)uOES4gdi2H~;`C00000000000001_fgMo~0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo2S@ -X>4R=a&s?YVRL0JaCuNm0Rj{Q6aWAK2mmD%m`(`lF8JFA004s`001Ze0000000000005+cT3`A4*+m!a4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWpr|7WiD`eP) -h*<6ay3h000O8B@~!W8c*uCUkv~NDmMTCF8}}l0000000000q=EKw4*+m!a4%nWWo~3|axZ9fZEQ7cX -<{#Qa%E*=b!lv5WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000803{TdPOWC#2$==|08$nJ04x9i00000 -000000HlGUfDZt0X>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bUtei%X>?y-E^v8JO928D0~7! -N00;mj6qrsSE!sjC2LJ#x9RL6*00000000000001_frW<;0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo3 -6^Y-?q5b1!0Hb7d}Yc~DCM0u%!j0000803{TdPGyR3srLZ@0EGnr04D$d00000000000HlH9jt>BEX> -c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCuNm0Rj{Q6aWAK2mmD%m`=XM@-6BF0071j0 -01cf0000000000005+c9+3|KaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*LcWo0gKc~DCM -0u%!j0000803{TdPL>UvM`#8B0HqiJ04@Lk00000000000HlFWmJa}MX>c!Jc4cm4Z*nhabZu-kY-wU -IbaG{7cVTR6WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000803{TdP7_~k5Xb@m00jvE04e|g00000000 -000HlEfoeuzTX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bXJu}4XlX8Rc~DCM0u%!j0000803 -{TdP5?(-n==3a06G8w02}}S00000000000HlEvpbr3WX>c!Jc4cm4Z*nhbWNu+EUtei%X>?y-E^v8JO -928D0~7!N00;mj6qru)NYv>X0{{Ty3;+Nb00000000000001_fq%008I!000^Q0000000000005+c(W4IlaA|NaUv_0~WN&g -WX=H9;FJo_QaA9;VaCuNm0Rj{Q6aWAK2mmD%m`)X!*;e)n007l3000;O0000000000005+cn4}K?aA| -NaUv_0~WN&gWX=H9;FJo_VWiD`eP)h*<6ay3h000O8B@~!W%rG=tL?QqH!=C^E8~^|S0000000000q= -Ce*4*+m!a4%nWWo~3|axZCQZecHJWNu+(VRT_GaCuNm0Rj{Q6aWAK2mmD%m`=B2^s?px007kn0012T0 -000000000005+cLedWaaA|NaUv_0~WN&gWX=H9;FKKRca$#;~WpgfYc~DCM0u%!j0000803{TdPAHI~ -LKgr402KfL03ZMW00000000000HlFq)eiu0X>c!Jc4cm4Z*nhbWNu+EaA9L>VP|DuWMOn+E^v8JO928 -D0~7!N00;mj6qrr|1KdMz5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`))kynb^7 -000;a001Qb0000000000005+cNq7(daA|NaUv_0~WN&gWY;R+0W@&6?FKugNX>x3DV{2w_0Lm8t03!eZ00000000000HlHcdk_F{X>c!Jc4cm4Z*nheZ)0m_X>4 -ULaA{<0Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`=Ne@VyBI004p&001Tc0000000000005+cT7(b)aA -|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`;%+3E4dZ001}&0 -01Wd0000000000005+cr-={%aA|NaUv_0~WN&gWY;R+0W@&6?FLQZqY-w(5Y;R+0W@&6?E^v8JO928D -0~7!N00;mj6qruu>Q|wG0ssJw1^@sb00000000000001_fhmm;0B~t=FJE?LZe(wAFKu&YaA9L>FJE7 -2ZfSI1UoLQYP)h*<6ay3h000O8B@~!W9n}zr761SM6aWAK9{>OV0000000000q=Dy;5CCv#a4%nWWo~ -3|axZOjXK-O-YcF4RWpZc!Jc4cm4Z*nhfb7yd2V{0#Ecw=R7bZKvHb1rasP)h*<6ay3h000O8B@~!WTr6(~KN|o5J -B|PV9{>OV0000000000q=DR#5CCv#a4%nWWo~3|axZOjXK-O-YcFPDY;0m-V{0yOc~DCM0u%!j00008 -03{TdPJavm7l;7>0O$e$03rYY00000000000HlFftq=fkX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCY -HUtcb8c~DCM0u%!j0000803{TdPGuVrL=*u405Spq03iSX00000000000HlE+uMhxmX>c!Jc4cm4Z*n -hiVPk7yXK8L{FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WW{TS5%>e)aVFLgFAOHXW0000000000q= -9p=5CCv#a4%nWWo~3|axZXUV{2h&X>MmPUt@1=aA9;VaCuNm0Rj{Q6aWAK2mmD%m`-bt9F=kb004*u0 -01Na0000000000005+cezFh%aA|NaUv_0~WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1rasP)h*<6ay3h -000O8B@~!WBJ^Gp^a%g}Dj)y=AOHXW0000000000q=7QD5CCv#a4%nWWo~3|axZXUV{2h&X>MmPZDDe -2WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`)W^p8Vwo003MP001Qb0000000000005+cWWEppaA|NaUv_0~WN& -gWaA9L>VP|P>XD@PPadl~OWo>0{baO6nc~DCM0u%!j0000803{TdPV$IG({C660D^1)03!eZ0000000 -0000HlG8#Sj2+X>c!Jc4cm4Z*nhiVPk7yXK8L{FLQ8ZV`*k-WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`-6mt -(}Jg008g>0015U0000000000005+cJl+rhaA|NaUv_0~WN&gWaA9L>VP|P>XD@YhX>4;YaCuNm0Rj{Q -6aWAK2mmD%m`?FCa_fE#007D^001BW0000000000005+c|KJb+aA|NaUv_0~WN&gWaA9L>VP|P>XD@b -Ta&u{KZZ2?nP)h*<6ay3h000O8B@~!WP5}d;RR910Q~&?~9smFU0000000000q=CEc5CCv#a4%nWWo~ -3|axZXYa5XVEFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W$8flSW(NQOtrq|QApigX0000000000q= -8KD5CCv#a4%nWWo~3|axZXYa5XVEFJEbHUvP47V`X!5E^v8JO928D0~7!N00;mj6qrt_^9=w%1ONbw3 -IG5b00000000000001_f${bb0B~t=FJE?LZe(wAFK}gWH8D3YVs&Y3WG--dP)h*<6ay3h000O8B@~!W -AOZwdbp-$b{T2WK8vpc!Jc4cm4Z*nhiWpFhyH!ovvY;S -UGZ)YxWc~DCM0u%!j0000803{TdPDnn-g7N?W0Cxfa02}}S00000000000HlH52N3{pX>c!Jc4cm4Z* -nhiWpFhyH!ovvZE#_9E^v8JO928D0~7!N00;mj6qruMj+S)K2LJ$r761Sq00000000000001_feHx`0 -B~t=FJE?LZe(wAFK}gWH8D3YWo~w2b!lv5E^v8JO928D0~7!N00;mj6qrsC+V+(O2LJ#V7XSbr00000 -000000001_ffW%E0B~t=FJE?LZe(wAFK}gWH8D3YcXDBHaAk6HE^v8JO928D0~7!N00;mj6qrsgq{LK -4a{vH_r2zmX00000000000001_fmaw20B~t=FJE?LZe(wAFK}yTUvg!0Z*_8GWpgiIUukY>bYEXCaCu -Nm0Rj{Q6aWAK2mmD%m`-6N1J+9c001%q001Wd0000000000005+c;ENFeaA|NaUv_0~WN&gWaBF8@a% -FRGb#h~6b1!gtGcjXtZE#_9E^v8JO928D0~7!N00;mj6qrszX%kCq1^@v05&!@o00000000000001_f -pCox0B~t=FJE?LZe(wAFK}{iXL4n8b1z?CX>MtBUtcb8c~DCM0u%!j0000803{TdPM6HJxTXXE0456n -02=@R00000000000HlE$lo0@MX>c!Jc4cm4Z*nhia&KpHWpi^cVqtPFaCuNm0Rj{Q6aWAK2mmD%m`-@ -$xqFa%FRKFJo_YZggdGE^v8JO92 -8D0~7!N00;mj6qrsg;N7|k0{{SI1poja00000000000001_fhU|10B~t=FJE?LZe(wAFK}{iXL4n8b1 -!pnX>M+1axQRrP)h*<6ay3h000O8B@~!Wc*ke+Q~&?~e*gdg9smFU0000000000q=9aq5dd&$a4%nWW -o~3|axZXsbZ>2JFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WOgs63z5oCK{Q&>~8UO$Q0000000000 -q=EjQ5dd&$a4%nWWo~3|axZXsbZ>2JFJo_VWiD`eP)h*<6ay3h000O8B@~!WZ%4f&=m`J-Rww`f8~^| -S0000000000q=EFH5dd&$a4%nWWo~3|axZXsbZ>2JFK}UUb7gWaaCuNm0Rj{Q6aWAK2mmD%m`<$$+<$ -KY008|1000^Q0000000000005+c7ON2eaA|NaUv_0~WN&gWaCvlZZEP=eWpi{caCuNm0Rj{Q6aWAK2m -mD%m`>srbc!Jc4cm -4Z*nhkWpQ<7b98erUtei%X>?y-E^v8JO928D0~7!N00;mj6qrunt*Tf50002A0RR9a0000000000000 -1_ft0!t0B~t=FJE?LZe(wAFLGsZb!BsOb1z?Cc4cyNX>V>{UoLQYP)h*<6ay3h000O8B@~!Wh^aZd6a -oMMNCW@?CjbBd0000000000q=D4C5dd&$a4%nWWo~3|axZdaadl;LbaO9XX>N37a&BR4Uv+e8Y;!Jfc -~DCM0u%!j00008045ZePMkR|M2r*w04!7h03ZMW00000000000HlE}z7YU$X>c!Jc4cm4Z*nhkWpQ<7 -b98erVPs)&bY*gLE^v8JO928D0~7!N00;mk6qrr`5iTeQ1^@tU7ytkp00000000000001_f%no80B~t -=FJE?LZe(wAFLGsZb!BsOb1z|VX)bViP)h*<6ay3h000O8CKQ-XHt20c!Jc4cm4Z*nhkWpQ<7b98erV{dJ6VRSBVc~DCM -0u%!j00008045ZePQ51=I=~YE0RBe+03QGV00000000000HlFa=@9^MX>c!Jc4cm4Z*nhkWpQ<7b98e -rV{dP3X=QURaCuNm0Rj{Q6aWAK2mmG&m`=I4Y;ijT004aq001HY0000000000005+cQ2h}AaA|NaUv_ -0~WN&gWa%FLKWpi|MFJ*XRWpH$9Z*FrgaCuNm0Rj{Q6aWAK2mmG&m`<%dNAF4m008<8000~S0000000 -000005+c%K;JqaA|NaUv_0~WN&gWa%FLKWpi|MFKA_Ka4v9pP)h*<6ay3h000O8CKQ-X8%lHGc>w?b^ -#T9@9RL6T0000000000q=8Qc5&&>%a4%nWWo~3|axZdaadl;LbaO9gZ*OaJE^v8JO928D0~7!N00;mk -6qruaHj0)xCIA5Ag#Z8^00000000000001_fddE<0B~t=FJE?LZe(wAFLGsZb!BsOb1!XgWMyn~E^v8 -JO928D0~7!N00;mk6qrsDJl=t80RRBE0ssIY00000000000001_fp{(w0B~t=FJE?LZe(wAFLGsZb!B -sOb1!gVV{2h&WpgfYc~DCM0u%!j00008045ZePCw>@*h3%y0F-h703ZMW00000000000HlE-FcJW8X> -c!Jc4cm4Z*nhkWpQ<7b98erb7gaLX>V?GE^v8JO928D0~7!N00;mk6qrs*x@LBL1^@sd5C8xq000000 -00000001_fuc|n0B~t=FJE?LZe(wAFLGsZb!BsOb1!prVRUtKUt@1%WpgfYc~DCM0u%!j00008045Ze -PU(v|d36K;0Hq5603rYY00000000000HlFoR}uhlX>c!Jc4cm4Z*nhkWpQ<7b98erb98cbV{~c!Jc4cm4Z*nhkWpQ -<7b98erb#!TLb1rasP)h*<6ay3h000O8CKQ-Xk&FXPJOls$q6z>29{>OV0000000000q=ATm5&&>%a4 -%nWWo~3|axZmqY;0*_GcR9XX>MtBUtcb8c~DCM0u%!j00008045ZeP89bFCi@Hk0QxBa03!eZ000000 -00000HlEdh7tg9X>c!Jc4cm4Z*nhna%^mAVlyvaV{dG1Wn*+{Z*FrgaCuNm0Rj{Q6aWAK2mmG&m`)(m -1?V{u000j*001EX0000000000005+cJ(CguaA|NaUv_0~WN&gWb#iQMX<{=kV{dM5Wn*+{Z*DGdc~DC -M0u%!j00008045ZePOvU|YfB~o02zq@03`qb00000000000HlGnq!IvdX>c!Jc4cm4Z*nhna%^mAVly -veZ*Fd7V{~b6Zg6jJY%XwlP)h*<6ay3h000O8CKQ-Xz0_N$fCvBp%ozXxApigX0000000000q=7@r5& -&>%a4%nWWo~3|axZmqY;0*_GcRR$V`Xr3X>V?GE^v8JO928D0~7!N00;mk6qrtf^}-G;2LJ#!7XSbq0 -0000000000001_fdbSL0B~t=FJE?LZe(wAFLiQkY-wUMFJ@_FY-DpTaCuNm0Rj{Q6aWAK2mmG&m`)^C -wJClB004vu0018V0000000000005+cY1z?E00000000000001_fh6A&0B~t=FJE?LZe(wAFLiQkY-wUMFK} -;fY;9p~VP|D>E^v8JO928D0~7!N00;mk6qru@=-vpN2LJ$P7XSbr00000000000001_fzR?10B~t=FJ -E?LZe(wAFLiQkY-wUMFLGsZb!BsOE^v8JO928D0~7!N00;mk6qruQ`1mF`8vppk00000000000 -001_fv5Ts0B~t=FJE?LZe(wAFLiQkY-wUMFLGsbaBpsNWiD`eP)h*<6ay3h000O8CKQ-X000000ssI2 -00000CjbBd0000000000q=6h3698~&a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ7`X>MtBUtcb8c~DC -M0u%!j00008045ZePVO(B=Mn(`0L=mb05Jdn00000000000HlFq783w)X>c!Jc4cm4Z*nhna%^mAVly -veZ*FvQX<{#5VQ_F|Zf9w3WnX1(c4=~NZZ2?nP)h*<6ay3h000O8CKQ-X1b1H%a0~zdx+(wwC;$Ke00 -00000000q=Cd2698~&a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj_1X>MgMaCuNm0Rj{Q6aWAK2 -mmG&m`;RB)A_9h003(d001Wd0000000000005+cdL$D7aA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~O -ZggyIaBpvHE^v8JO928D0~7!N00;mk6qrsU6!e&@6953uJpceG00000000000001_fov)h0B~t=FJE? -LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8Iefc~DCM0u%!j00008045ZePNfXg=>H!80A+Rn04@ -Lk00000000000HlFkJ`(_NX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PWn*=6Wpr|3ZgX&Na&#_mc~ -DCM0u%!j00008045ZePN@W-uzd#r0QVRG03-ka00000000000HlGaUK0RtX>c!Jc4cm4Z*nhna%^mAV -lyveZ*FvQX<{#PZ)0n7E^v8JO928D0~7!N00;mk6qrr`00002000000000u00000000000001_foEnD -0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT40DX>MtBUtcb8c~DCM0u%! -j00008045ZePPbW$eOC_v0GLDo05|{u00000000000HlGxW)lE#X>c!Jc4cm4Z*nhna%^mAVlyveZ*F -vQX<{#5b7f<7a%FUKVQzD9Z*p`mVrgzMn8E^v8JO928D0~7!N00;mk6qrteb4!hL4*&pyF8}~J00 -000000000001_foygY0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT4dgc -VBE}c4cfXaCuNm0Rj{Q6aWAK2mmG&m`;yfpnOmO003VP|D?FJE72ZfSI1UoLQYP)h*<6ay3h000O8CKQ-XnOIF)NF4wGl63$8BLDy -Z0000000000q=C$a698~&a4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgicX?QMhc~DCM0u%!j00008045 -ZeP5=M^00IC20000005Sjo00000000000HlFcq!R#eX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVq -s%zaBp&Sb1z?CX>MtBUtcb8c~DCM0u%!j00008045ZePO^IqgH8ef0I&rB05Sjo00000000000HlGZq -!R#eX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb1!XSYh`9>Y-KKRc~DCM0u%!j00008 -045ZePWx@jc!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvC -Qb8~E8ZDDj{XkTb=b98QDZDlWCUukY>bYEXCaCuNm0Rj{Q6aWAK2mmG&m`VP|D?FLQHjUu|J@V`yJ!Z*z2RVQpnEUu -kV{Y-Md_ZggREX>V>WaCuNm0Rj{Q6aWAK2mmG&m`+l4;lHE-000yO001Na0000000000005+c@UasBa -A|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJE72ZfSI1UoLQYP)h*<6ay3h000O8CKQ-X*VSNXF$Vwu9})ln -CIA2c0000000000q=DA6698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cJZ*Fd7V{~b6ZZ2?nP)h*<6ay3 -h000O8CKQ-X^elTY`~Uy|@c{q;ApigX0000000000q=8Gj698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2 -cXb!ByBE^v8JO928D0~7!N00;mk6qrsyVUX7W1pokf4gdfn00000000000001_frh*j0B~t=FJE?LZe -(wAFLiQkY-wUMFLiWjY%g+Uadl;LbS`jtP)h*<6ay3h000O8CKQ-X);no&Gz0(u8VUdaBme*a000000 -0000q=Cr6698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cYWpi+EZgXWWaCuNm0Rj{Q6aWAK2mmG&m`)&1 -M2+te0003y001EX0000000000005+cKE@LOaA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsca(OOrc~DC -M0u%!j00008045ZePV^x-v;GkP0CY0|03ZMW00000000000HlFz*b@M7X>c!Jc4cm4Z*nhna%^mAVly -vwbZKlab8~E8E^v8JO928D0~7!N00;mk6qrs`QqCZA3jhEeCIA2<00000000000001_fvD;e0B~t=FJ -E?LZe(wAFLiQkY-wUMFLiWjY%g?aZDntDbS`jtP)h*<6ay3h000O8CKQ-X!yauB3<&@LR~Y~R9{>OV0 -000000000q=8)a698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cba%?Vec~DCM0u%!j00008045ZePHv~R -aJ~ls02>tm03ZMW00000000000HlGX{}TXkX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlacVTICE^v8JO928 -D0~7!N00;mk6qrtU&>wL!3jhF9DF6T@00000000000001_fuRQ!0B~t=FJE?LZe(wAFLz~PWo~0{WNB -_^b1z?CX>MtBUtcb8c~DCM0u%!j00008045ZePRFeXiv -c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZY++($Y;!Jfc~DCM0u%!j00008045ZePEda_A4CEG02u`U03-ka0 -0000000000HlFh8596;X>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZZEI{{Vr6V|E^v8JO928D0~7!N00;mk -6qrtDIB=)A1pok}82|tw00000000000001_f#4ey0B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!sdb98e -qaCuNm0Rj{Q6aWAK2mmG&m`>XU{MMxe007ev001fg0000000000005+c*dY`EaA|NaUv_0~WN&gWcV% -K_Zewp`X>Mn8FL+;db7gX0WMyV)Ze?UHaCuNm1qJ{B001)qGXYg!006}%6aWAK -""" - - -if __name__ == "__main__": - main() diff --git a/data/test.py b/data/test.py deleted file mode 100644 index 3b316dc1e8d1..000000000000 --- a/data/test.py +++ /dev/null @@ -1,2 +0,0 @@ -#%% -print('hello') diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000000..8e1aa990a2c2 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,393 @@ +/** + * ESLint Configuration for VS Code Python Extension + * This file configures linting rules for the TypeScript/JavaScript codebase. + * It uses the new flat config format introduced in ESLint 8.21.0 + */ + +// Import essential ESLint plugins and configurations +import tseslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import noOnlyTests from 'eslint-plugin-no-only-tests'; +import prettier from 'eslint-config-prettier'; +import importPlugin from 'eslint-plugin-import'; +import js from '@eslint/js'; +import noBadGdprCommentPlugin from './.eslintplugin/no-bad-gdpr-comment.js'; // Ensure the path is correct + +export default [ + { + ignores: ['**/node_modules/**', '**/out/**'], + }, + // Base configuration for all files + { + ignores: [ + '**/node_modules/**', + '**/out/**', + 'src/test/analysisEngineTest.ts', + 'src/test/ciConstants.ts', + 'src/test/common.ts', + 'src/test/constants.ts', + 'src/test/core.ts', + 'src/test/extension-version.functional.test.ts', + 'src/test/fixtures.ts', + 'src/test/index.ts', + 'src/test/initialize.ts', + 'src/test/mockClasses.ts', + 'src/test/performanceTest.ts', + 'src/test/proc.ts', + 'src/test/smokeTest.ts', + 'src/test/standardTest.ts', + 'src/test/startupTelemetry.unit.test.ts', + 'src/test/testBootstrap.ts', + 'src/test/testLogger.ts', + 'src/test/testRunner.ts', + 'src/test/textUtils.ts', + 'src/test/unittests.ts', + 'src/test/vscode-mock.ts', + 'src/test/interpreters/mocks.ts', + 'src/test/interpreters/virtualEnvs/condaInheritEnvPrompt.unit.test.ts', + 'src/test/interpreters/pythonPathUpdaterFactory.unit.test.ts', + 'src/test/interpreters/activation/service.unit.test.ts', + 'src/test/interpreters/helpers.unit.test.ts', + 'src/test/interpreters/display.unit.test.ts', + 'src/test/terminals/codeExecution/terminalCodeExec.unit.test.ts', + 'src/test/terminals/codeExecution/codeExecutionManager.unit.test.ts', + 'src/test/terminals/codeExecution/djangoShellCodeExect.unit.test.ts', + 'src/test/activation/activeResource.unit.test.ts', + 'src/test/activation/extensionSurvey.unit.test.ts', + 'src/test/utils/fs.ts', + 'src/test/api.functional.test.ts', + 'src/test/testing/common/debugLauncher.unit.test.ts', + 'src/test/testing/common/services/configSettingService.unit.test.ts', + 'src/test/common/exitCIAfterTestReporter.ts', + 'src/test/common/terminals/activator/index.unit.test.ts', + 'src/test/common/terminals/activator/base.unit.test.ts', + 'src/test/common/terminals/shellDetector.unit.test.ts', + 'src/test/common/terminals/service.unit.test.ts', + 'src/test/common/terminals/helper.unit.test.ts', + 'src/test/common/terminals/activation.unit.test.ts', + 'src/test/common/terminals/shellDetectors/shellDetectors.unit.test.ts', + 'src/test/common/terminals/environmentActivationProviders/terminalActivation.testvirtualenvs.ts', + 'src/test/common/socketStream.test.ts', + 'src/test/common/configSettings.test.ts', + 'src/test/common/experiments/telemetry.unit.test.ts', + 'src/test/common/platform/filesystem.unit.test.ts', + 'src/test/common/platform/errors.unit.test.ts', + 'src/test/common/platform/utils.ts', + 'src/test/common/platform/fs-temp.unit.test.ts', + 'src/test/common/platform/fs-temp.functional.test.ts', + 'src/test/common/platform/filesystem.functional.test.ts', + 'src/test/common/platform/filesystem.test.ts', + 'src/test/common/utils/cacheUtils.unit.test.ts', + 'src/test/common/utils/decorators.unit.test.ts', + 'src/test/common/utils/version.unit.test.ts', + 'src/test/common/configSettings/configSettings.unit.test.ts', + 'src/test/common/serviceRegistry.unit.test.ts', + 'src/test/common/extensions.unit.test.ts', + 'src/test/common/variables/envVarsService.unit.test.ts', + 'src/test/common/helpers.test.ts', + 'src/test/common/application/commands/reloadCommand.unit.test.ts', + 'src/test/common/installer/channelManager.unit.test.ts', + 'src/test/common/installer/pipInstaller.unit.test.ts', + 'src/test/common/installer/pipEnvInstaller.unit.test.ts', + 'src/test/common/socketCallbackHandler.test.ts', + 'src/test/common/process/decoder.test.ts', + 'src/test/common/process/processFactory.unit.test.ts', + 'src/test/common/process/pythonToolService.unit.test.ts', + 'src/test/common/process/proc.observable.test.ts', + 'src/test/common/process/logger.unit.test.ts', + 'src/test/common/process/proc.exec.test.ts', + 'src/test/common/process/pythonProcess.unit.test.ts', + 'src/test/common/process/proc.unit.test.ts', + 'src/test/common/interpreterPathService.unit.test.ts', + 'src/test/debugger/extension/adapter/adapter.test.ts', + 'src/test/debugger/extension/adapter/outdatedDebuggerPrompt.unit.test.ts', + 'src/test/debugger/extension/adapter/factory.unit.test.ts', + 'src/test/debugger/extension/adapter/logging.unit.test.ts', + 'src/test/debugger/extension/hooks/childProcessAttachHandler.unit.test.ts', + 'src/test/debugger/extension/hooks/childProcessAttachService.unit.test.ts', + 'src/test/debugger/utils.ts', + 'src/test/debugger/envVars.test.ts', + 'src/test/telemetry/index.unit.test.ts', + 'src/test/telemetry/envFileTelemetry.unit.test.ts', + 'src/test/application/diagnostics/checks/macPythonInterpreter.unit.test.ts', + 'src/test/application/diagnostics/checks/pythonInterpreter.unit.test.ts', + 'src/test/application/diagnostics/checks/powerShellActivation.unit.test.ts', + 'src/test/application/diagnostics/checks/envPathVariable.unit.test.ts', + 'src/test/application/diagnostics/applicationDiagnostics.unit.test.ts', + 'src/test/application/diagnostics/promptHandler.unit.test.ts', + 'src/test/application/diagnostics/commands/ignore.unit.test.ts', + 'src/test/performance/load.perf.test.ts', + 'src/client/interpreter/configuration/interpreterSelector/commands/base.ts', + 'src/client/interpreter/configuration/interpreterSelector/commands/resetInterpreter.ts', + 'src/client/interpreter/configuration/pythonPathUpdaterServiceFactory.ts', + 'src/client/interpreter/configuration/services/globalUpdaterService.ts', + 'src/client/interpreter/configuration/services/workspaceUpdaterService.ts', + 'src/client/interpreter/configuration/services/workspaceFolderUpdaterService.ts', + 'src/client/interpreter/helpers.ts', + 'src/client/interpreter/virtualEnvs/condaInheritEnvPrompt.ts', + 'src/client/interpreter/display/index.ts', + 'src/client/extension.ts', + 'src/client/startupTelemetry.ts', + 'src/client/terminals/codeExecution/terminalCodeExecution.ts', + 'src/client/terminals/codeExecution/codeExecutionManager.ts', + 'src/client/terminals/codeExecution/djangoContext.ts', + 'src/client/activation/commands.ts', + 'src/client/activation/progress.ts', + 'src/client/activation/extensionSurvey.ts', + 'src/client/activation/common/analysisOptions.ts', + 'src/client/activation/languageClientMiddleware.ts', + 'src/client/testing/serviceRegistry.ts', + 'src/client/testing/main.ts', + 'src/client/testing/configurationFactory.ts', + 'src/client/testing/common/constants.ts', + 'src/client/testing/common/testUtils.ts', + 'src/client/common/helpers.ts', + 'src/client/common/net/browser.ts', + 'src/client/common/net/socket/socketCallbackHandler.ts', + 'src/client/common/net/socket/socketServer.ts', + 'src/client/common/net/socket/SocketStream.ts', + 'src/client/common/contextKey.ts', + 'src/client/common/experiments/telemetry.ts', + 'src/client/common/platform/serviceRegistry.ts', + 'src/client/common/platform/errors.ts', + 'src/client/common/platform/fs-temp.ts', + 'src/client/common/platform/fs-paths.ts', + 'src/client/common/platform/registry.ts', + 'src/client/common/platform/pathUtils.ts', + 'src/client/common/persistentState.ts', + 'src/client/common/terminal/activator/base.ts', + 'src/client/common/terminal/activator/powershellFailedHandler.ts', + 'src/client/common/terminal/activator/index.ts', + 'src/client/common/terminal/helper.ts', + 'src/client/common/terminal/syncTerminalService.ts', + 'src/client/common/terminal/factory.ts', + 'src/client/common/terminal/commandPrompt.ts', + 'src/client/common/terminal/service.ts', + 'src/client/common/terminal/shellDetector.ts', + 'src/client/common/terminal/shellDetectors/userEnvironmentShellDetector.ts', + 'src/client/common/terminal/shellDetectors/vscEnvironmentShellDetector.ts', + 'src/client/common/terminal/shellDetectors/terminalNameShellDetector.ts', + 'src/client/common/terminal/shellDetectors/settingsShellDetector.ts', + 'src/client/common/terminal/shellDetectors/baseShellDetector.ts', + 'src/client/common/utils/decorators.ts', + 'src/client/common/utils/enum.ts', + 'src/client/common/utils/platform.ts', + 'src/client/common/utils/stopWatch.ts', + 'src/client/common/utils/random.ts', + 'src/client/common/utils/sysTypes.ts', + 'src/client/common/utils/misc.ts', + 'src/client/common/utils/cacheUtils.ts', + 'src/client/common/utils/workerPool.ts', + 'src/client/common/extensions.ts', + 'src/client/common/variables/serviceRegistry.ts', + 'src/client/common/variables/environment.ts', + 'src/client/common/variables/types.ts', + 'src/client/common/variables/systemVariables.ts', + 'src/client/common/cancellation.ts', + 'src/client/common/interpreterPathService.ts', + 'src/client/common/application/applicationShell.ts', + 'src/client/common/application/languageService.ts', + 'src/client/common/application/clipboard.ts', + 'src/client/common/application/workspace.ts', + 'src/client/common/application/debugSessionTelemetry.ts', + 'src/client/common/application/documentManager.ts', + 'src/client/common/application/debugService.ts', + 'src/client/common/application/commands/reloadCommand.ts', + 'src/client/common/application/terminalManager.ts', + 'src/client/common/application/applicationEnvironment.ts', + 'src/client/common/errors/errorUtils.ts', + 'src/client/common/installer/serviceRegistry.ts', + 'src/client/common/installer/channelManager.ts', + 'src/client/common/installer/moduleInstaller.ts', + 'src/client/common/installer/types.ts', + 'src/client/common/installer/pipEnvInstaller.ts', + 'src/client/common/installer/productService.ts', + 'src/client/common/installer/pipInstaller.ts', + 'src/client/common/installer/productPath.ts', + 'src/client/common/process/currentProcess.ts', + 'src/client/common/process/processFactory.ts', + 'src/client/common/process/serviceRegistry.ts', + 'src/client/common/process/pythonToolService.ts', + 'src/client/common/process/internal/python.ts', + 'src/client/common/process/internal/scripts/testing_tools.ts', + 'src/client/common/process/types.ts', + 'src/client/common/process/logger.ts', + 'src/client/common/process/pythonProcess.ts', + 'src/client/common/process/pythonEnvironment.ts', + 'src/client/common/process/decoder.ts', + 'src/client/debugger/extension/adapter/remoteLaunchers.ts', + 'src/client/debugger/extension/adapter/outdatedDebuggerPrompt.ts', + 'src/client/debugger/extension/adapter/factory.ts', + 'src/client/debugger/extension/adapter/activator.ts', + 'src/client/debugger/extension/adapter/logging.ts', + 'src/client/debugger/extension/hooks/eventHandlerDispatcher.ts', + 'src/client/debugger/extension/hooks/childProcessAttachService.ts', + 'src/client/debugger/extension/attachQuickPick/wmicProcessParser.ts', + 'src/client/debugger/extension/attachQuickPick/factory.ts', + 'src/client/debugger/extension/attachQuickPick/psProcessParser.ts', + 'src/client/debugger/extension/attachQuickPick/picker.ts', + 'src/client/application/serviceRegistry.ts', + 'src/client/application/diagnostics/base.ts', + 'src/client/application/diagnostics/applicationDiagnostics.ts', + 'src/client/application/diagnostics/filter.ts', + 'src/client/application/diagnostics/promptHandler.ts', + 'src/client/application/diagnostics/commands/base.ts', + 'src/client/application/diagnostics/commands/ignore.ts', + 'src/client/application/diagnostics/commands/factory.ts', + 'src/client/application/diagnostics/commands/execVSCCommand.ts', + 'src/client/application/diagnostics/commands/launchBrowser.ts', + ], + linterOptions: { + reportUnusedDisableDirectives: 'off', + }, + rules: { + ...js.configs.recommended.rules, + 'no-undef': 'off', + }, + }, + // TypeScript-specific configuration + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', 'src', 'pythonExtensionApi/src'], + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + globals: { + ...(js.configs.recommended.languageOptions?.globals || {}), + mocha: true, + require: 'readonly', + process: 'readonly', + exports: 'readonly', + module: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + setTimeout: 'readonly', + setInterval: 'readonly', + clearTimeout: 'readonly', + clearInterval: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + 'no-only-tests': noOnlyTests, + import: importPlugin, + prettier: prettier, + 'no-bad-gdpr-comment': noBadGdprCommentPlugin, // Register your plugin + }, + settings: { + 'import/resolver': { + node: { + extensions: ['.js', '.ts'], + }, + }, + }, + rules: { + 'no-bad-gdpr-comment/no-bad-gdpr-comment': 'warn', // Enable your rule + // Base configurations + ...tseslint.configs.recommended.rules, + ...prettier.rules, + + // TypeScript-specific rules + '@typescript-eslint/ban-ts-comment': [ + 'error', + { + 'ts-ignore': 'allow-with-description', + }, + ], + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-loss-of-precision': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { + functions: false, + }, + ], + + // Import rules + 'import/extensions': 'off', + 'import/namespace': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-unresolved': 'off', + 'import/prefer-default-export': 'off', + + // Testing rules + 'no-only-tests/no-only-tests': [ + 'error', + { + block: ['test', 'suite'], + focus: ['only'], + }, + ], + + // Code style rules + 'linebreak-style': 'off', + 'no-bitwise': 'off', + 'no-console': 'off', + 'no-underscore-dangle': 'off', + 'operator-assignment': 'off', + 'func-names': 'off', + + // Error handling and control flow + 'no-empty': ['error', { allowEmptyCatch: true }], + 'no-async-promise-executor': 'off', + 'no-await-in-loop': 'off', + 'no-unreachable': 'off', + 'no-void': 'off', + + // Duplicates and overrides (TypeScript handles these) + 'no-dupe-class-members': 'off', + 'no-redeclare': 'off', + 'no-undef': 'off', + + // Miscellaneous rules + 'no-control-regex': 'off', + 'no-extend-native': 'off', + 'no-inner-declarations': 'off', + 'no-multi-str': 'off', + 'no-param-reassign': 'off', + 'no-prototype-builtins': 'off', + 'no-empty-function': 'off', + 'no-template-curly-in-string': 'off', + 'no-useless-escape': 'off', + 'no-extra-parentheses': 'off', + 'no-extra-paren': 'off', + '@typescript-eslint/no-extra-parens': 'off', + strict: 'off', + + // Restricted syntax + 'no-restricted-syntax': [ + 'error', + { + selector: 'ForInStatement', + message: + 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', + }, + { + selector: 'LabeledStatement', + message: + 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', + }, + { + selector: 'WithStatement', + message: + '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', + }, + ], + }, + }, +]; diff --git a/experiments.json b/experiments.json deleted file mode 100644 index ecd95ff6bac1..000000000000 --- a/experiments.json +++ /dev/null @@ -1,118 +0,0 @@ - -[ - { - "name": "AlwaysDisplayTestExplorer - experiment", - "salt": "AlwaysDisplayTestExplorer", - "min": 80, - "max": 100 - }, - { - "name": "AlwaysDisplayTestExplorer - control", - "salt": "AlwaysDisplayTestExplorer", - "min": 0, - "max": 20 - }, - { - "name": "ShowPlayIcon - start", - "salt": "ShowPlayIcon", - "max": 100, - "min": 0 - }, - { - "name": "ShowExtensionSurveyPrompt - enabled", - "salt": "ShowExtensionSurveyPrompt", - "max": 100, - "min": 60 - }, - { - "name": "ShowExtensionSurveyPrompt - control", - "salt": "ShowExtensionSurveyPrompt", - "min": 0, - "max": 40 - }, - { - "name": "DebugAdapterFactory - control", - "salt": "DebugAdapterFactory", - "min": 0, - "max": 0 - }, - { - "name": "DebugAdapterFactory - experiment", - "salt": "DebugAdapterFactory", - "min": 0, - "max": 100 - }, - { - "name": "PtvsdWheels37 - control", - "salt": "DebugAdapterFactory", - "min": 0, - "max": 50 - }, - { - "name": "PtvsdWheels37 - experiment", - "salt": "DebugAdapterFactory", - "min": 50, - "max": 100 - }, - { - "name": "Reload - control", - "salt": "DebugAdapterFactory", - "min": 50, - "max": 60 - }, - { - "name": "Reload - experiment", - "salt": "DebugAdapterFactory", - "min": 90, - "max": 100 - }, - { - "name": "LS - enabled", - "salt": "LS", - "min": 0, - "max": 4 - }, - { - "name": "LS - control", - "salt": "LS", - "min": 20, - "max": 24 - }, - { - "name": "UseTerminalToGetActivatedEnvVars - experiment", - "salt": "UseTerminalToGetActivatedEnvVars", - "min": 0, - "max": 0 - }, - { - "name": "UseTerminalToGetActivatedEnvVars - control", - "salt": "UseTerminalToGetActivatedEnvVars", - "min": 0, - "max": 100 - }, - { - "name": "AA_testing - control", - "salt": "AA_testing", - "min": 0, - "max": 10 - }, - { - "name": "AA_testing - experiment", - "salt": "AA_testing", - "min": 90, - "max": 100 - }, - { - "name": "WebHostNotebook - experiment", - "salt": "WebHostNotebook", - "max": 0, - "min": 0 - }, - { - "name": "WebHostNotebook - control", - "salt": "WebHostNotebook", - "min": 0, - "max": 100 - } -] - diff --git a/gulpfile.js b/gulpfile.js index 608838f2bfb1..0b919f16572a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,142 +9,115 @@ 'use strict'; const gulp = require('gulp'); -const filter = require('gulp-filter'); -const es = require('event-stream'); -const tsfmt = require('typescript-formatter'); -const tslint = require('tslint'); -const relative = require('relative'); const ts = require('gulp-typescript'); -const cp = require('child_process'); const spawn = require('cross-spawn'); -const colors = require('colors/safe'); const path = require('path'); const del = require('del'); -const sourcemaps = require('gulp-sourcemaps'); -const fs = require('fs-extra'); const fsExtra = require('fs-extra'); const glob = require('glob'); const _ = require('lodash'); const nativeDependencyChecker = require('node-has-native-dependencies'); const flat = require('flat'); -const argv = require('yargs').argv; +const { argv } = require('yargs'); const os = require('os'); -const rmrf = require('rimraf'); +const typescript = require('typescript'); -const isCI = process.env.TRAVIS === 'true' || process.env.TF_BUILD !== undefined; - -const noop = function() {}; -/** - * Hygiene works by creating cascading subsets of all our files and - * passing them through a sequence of checks. Here are the current subsets, - * named according to the checks performed on them. Each subset contains - * the following one, as described in mathematical notation: - * - * all ⊃ indentation ⊃ typescript - */ - -const all = ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.d.ts', 'src/**/*.js', 'src/**/*.jsx']; - -const tsFilter = ['src/**/*.ts*', '!out/**/*']; +const tsProject = ts.createProject('./tsconfig.json', { typescript }); -const indentationFilter = ['src/**/*.ts*', '!**/typings/**/*']; - -const tslintFilter = [ - 'src/**/*.ts*', - 'test/**/*.ts*', - '!**/node_modules/**', - '!out/**/*', - '!images/**/*', - '!.vscode/**/*', - '!pythonFiles/**/*', - '!resources/**/*', - '!snippets/**/*', - '!syntaxes/**/*', - '!**/typings/**/*', - '!**/*.d.ts' -]; +const isCI = process.env.TRAVIS === 'true' || process.env.TF_BUILD !== undefined; -gulp.task('compile', done => { +gulp.task('compileCore', (done) => { let failed = false; - const tsProject = ts.createProject('tsconfig.json'); tsProject .src() .pipe(tsProject()) - .on('error', () => (failed = true)) + .on('error', () => { + failed = true; + }) .js.pipe(gulp.dest('out')) .on('finish', () => (failed ? done(new Error('TypeScript compilation errors')) : done())); }); -gulp.task('precommit', done => run({ exitOnError: true, mode: 'staged' }, done)); - -gulp.task('hygiene-watch', () => gulp.watch(tsFilter, gulp.series('hygiene-modified'))); - -gulp.task('hygiene', done => run({ mode: 'compile', skipFormatCheck: true, skipIndentationCheck: true }, done)); - -gulp.task( - 'hygiene-modified', - gulp.series('compile', done => run({ mode: 'changes' }, done)) -); - -gulp.task('watch', gulp.parallel('hygiene-modified', 'hygiene-watch')); - -// Duplicate to allow duplicate task in tasks.json (one ith problem matching, and one without) -gulp.task('watchProblems', gulp.parallel('hygiene-modified', 'hygiene-watch')); - -gulp.task('hygiene-watch-branch', () => gulp.watch(tsFilter, gulp.series('hygiene-branch'))); +gulp.task('compileApi', (done) => { + spawnAsync('npm', ['run', 'compileApi'], undefined, true) + .then((stdout) => { + if (stdout.includes('error')) { + done(new Error(stdout)); + } else { + done(); + } + }) + .catch((ex) => { + console.log(ex); + done(new Error('TypeScript compilation errors', ex)); + }); +}); -gulp.task('hygiene-all', done => run({ mode: 'all' }, done)); +gulp.task('compile', gulp.series('compileCore', 'compileApi')); -gulp.task('hygiene-branch', done => run({ mode: 'diffMaster' }, done)); +gulp.task('precommit', (done) => run({ exitOnError: true, mode: 'staged' }, done)); gulp.task('output:clean', () => del(['coverage'])); -gulp.task('clean:cleanExceptTests', () => del(['clean:vsix', 'out/client', 'out/datascience-ui', 'out/server'])); +gulp.task('clean:cleanExceptTests', () => del(['clean:vsix', 'out/client'])); gulp.task('clean:vsix', () => del(['*.vsix'])); gulp.task('clean:out', () => del(['out'])); gulp.task('clean', gulp.parallel('output:clean', 'clean:vsix', 'clean:out')); -gulp.task('checkNativeDependencies', done => { +gulp.task('checkNativeDependencies', (done) => { if (hasNativeDependencies()) { done(new Error('Native dependencies detected')); } done(); }); -gulp.task('check-datascience-dependencies', () => checkDatascienceDependencies()); - const webpackEnv = { NODE_OPTIONS: '--max_old_space_size=9096' }; -async function buildDataScienceUI() { - await spawnAsync('npm', ['run', 'webpack', '--', '--config', './build/webpack/webpack.datascience-ui-notebooks.config.js', '--mode', 'production'], webpackEnv); - await spawnAsync('npm', ['run', 'webpack', '--', '--config', './build/webpack/webpack.datascience-ui-viewers.config.js', '--mode', 'production'], webpackEnv); +async function buildWebPackForDevOrProduction(configFile, configNameForProductionBuilds) { + if (configNameForProductionBuilds) { + await buildWebPack(configNameForProductionBuilds, ['--config', configFile], webpackEnv); + } else { + await spawnAsync('npm', ['run', 'webpack', '--', '--config', configFile, '--mode', 'production'], webpackEnv); + } } - -gulp.task('compile-webviews', async () => { - buildDataScienceUI(); -}); - gulp.task('webpack', async () => { // Build node_modules. - await buildWebPack('production', ['--config', './build/webpack/webpack.extension.dependencies.config.js'], webpackEnv); - // Build DS stuff (separately as it uses far too much memory and slows down CI). - // Individually is faster on CI. - await buildWebPack('production', ['--config', './build/webpack/webpack.datascience-ui-notebooks.config.js'], webpackEnv); - await buildWebPack('production', ['--config', './build/webpack/webpack.datascience-ui-viewers.config.js'], webpackEnv); - // Run both in parallel, for faster process on CI. - // Yes, console would print output from both, that's ok, we have a faster CI. - // If things fail, we can run locally separately. - if (isCI) { - const buildExtension = buildWebPack('extension', ['--config', './build/webpack/webpack.extension.config.js'], webpackEnv); - const buildDebugAdapter = buildWebPack('debugAdapter', ['--config', './build/webpack/webpack.debugadapter.config.js'], webpackEnv); - await Promise.all([buildExtension, buildDebugAdapter]); - } else { - await buildWebPack('extension', ['--config', './build/webpack/webpack.extension.config.js'], webpackEnv); - await buildWebPack('debugAdapter', ['--config', './build/webpack/webpack.debugadapter.config.js'], webpackEnv); - } + await buildWebPackForDevOrProduction('./build/webpack/webpack.extension.dependencies.config.js', 'production'); + await buildWebPackForDevOrProduction('./build/webpack/webpack.extension.config.js', 'extension'); + await buildWebPackForDevOrProduction('./build/webpack/webpack.extension.browser.config.js', 'browser'); }); +gulp.task('addExtensionPackDependencies', async () => { + await buildLicense(); + await addExtensionPackDependencies(); +}); + +async function addExtensionPackDependencies() { + // Update the package.json to add extension pack dependencies at build time so that + // extension dependencies need not be installed during development + const packageJsonContents = await fsExtra.readFile('package.json', 'utf-8'); + const packageJson = JSON.parse(packageJsonContents); + packageJson.extensionPack = [ + 'ms-python.vscode-pylance', + 'ms-python.debugpy', + 'ms-python.vscode-python-envs', + ].concat(packageJson.extensionPack ? packageJson.extensionPack : []); + // Remove potential duplicates. + packageJson.extensionPack = packageJson.extensionPack.filter( + (item, index) => packageJson.extensionPack.indexOf(item) === index, + ); + await fsExtra.writeFile('package.json', JSON.stringify(packageJson, null, 4), 'utf-8'); +} + +async function buildLicense() { + const headerPath = path.join(__dirname, 'build', 'license-header.txt'); + const licenseHeader = await fsExtra.readFile(headerPath, 'utf-8'); + const license = await fsExtra.readFile('LICENSE', 'utf-8'); + + await fsExtra.writeFile('LICENSE', `${licenseHeader}\n${license}`, 'utf-8'); +} + gulp.task('updateBuildNumber', async () => { await updateBuildNumber(argv); }); @@ -156,10 +129,14 @@ async function updateBuildNumber(args) { const packageJson = JSON.parse(packageJsonContents); // Change version number - const versionParts = packageJson['version'].split('.'); - const buildNumberPortion = versionParts.length > 2 ? versionParts[2].replace(/(\d+)/, args.buildNumber) : args.buildNumber; - const newVersion = versionParts.length > 1 ? `${versionParts[0]}.${versionParts[1]}.${buildNumberPortion}` : packageJson['version']; - packageJson['version'] = newVersion; + const versionParts = packageJson.version.split('.'); + const buildNumberPortion = + versionParts.length > 2 ? versionParts[2].replace(/(\d+)/, args.buildNumber) : args.buildNumber; + const newVersion = + versionParts.length > 1 + ? `${versionParts[0]}.${versionParts[1]}.${buildNumberPortion}` + : packageJson.version; + packageJson.version = newVersion; // Write back to the package json await fsExtra.writeFile('package.json', JSON.stringify(packageJson, null, 4), 'utf-8'); @@ -167,7 +144,10 @@ async function updateBuildNumber(args) { // Update the changelog.md if we are told to (this should happen on the release branch) if (args.updateChangelog) { const changeLogContents = await fsExtra.readFile('CHANGELOG.md', 'utf-8'); - const fixedContents = changeLogContents.replace(/##\s*(\d+)\.(\d+)\.(\d+)\s*\(/, `## $1.$2.${buildNumberPortion} (`); + const fixedContents = changeLogContents.replace( + /##\s*(\d+)\.(\d+)\.(\d+)\s*\(/, + `## $1.$2.${buildNumberPortion} (`, + ); // Write back to changelog.md await fsExtra.writeFile('CHANGELOG.md', fixedContents, 'utf-8'); @@ -179,22 +159,33 @@ async function updateBuildNumber(args) { async function buildWebPack(webpackConfigName, args, env) { // Remember to perform a case insensitive search. - const allowedWarnings = getAllowedWarningsForWebPack(webpackConfigName).map(item => item.toLowerCase()); - const stdOut = await spawnAsync('npm', ['run', 'webpack', '--', ...args, ...['--mode', 'production', '--devtool', 'source-map']], env); + const allowedWarnings = getAllowedWarningsForWebPack(webpackConfigName).map((item) => item.toLowerCase()); + const stdOut = await spawnAsync( + 'npm', + ['run', 'webpack', '--', ...args, ...['--mode', 'production', '--devtool', 'source-map']], + env, + ); const stdOutLines = stdOut .split(os.EOL) - .map(item => item.trim()) - .filter(item => item.length > 0); + .map((item) => item.trim()) + .filter((item) => item.length > 0); // Remember to perform a case insensitive search. const warnings = stdOutLines - .filter(item => item.startsWith('WARNING in ')) - .filter(item => allowedWarnings.findIndex(allowedWarning => item.toLowerCase().startsWith(allowedWarning.toLowerCase())) == -1); - const errors = stdOutLines.some(item => item.startsWith('ERROR in')); + .filter((item) => item.startsWith('WARNING in ')) + .filter( + (item) => + allowedWarnings.findIndex((allowedWarning) => + item.toLowerCase().startsWith(allowedWarning.toLowerCase()), + ) === -1, + ); + const errors = stdOutLines.some((item) => item.startsWith('ERROR in')); if (errors) { throw new Error(`Errors in ${webpackConfigName}, \n${warnings.join(', ')}\n\n${stdOut}`); } if (warnings.length > 0) { - throw new Error(`Warnings in ${webpackConfigName}, Check gulpfile.js to see if the warning should be allowed., \n\n${stdOut}`); + throw new Error( + `Warnings in ${webpackConfigName}, Check gulpfile.js to see if the warning should be allowed., \n\n${stdOut}`, + ); } } function getAllowedWarningsForWebPack(buildConfig) { @@ -204,189 +195,48 @@ function getAllowedWarningsForWebPack(buildConfig) { 'WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).', 'WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.', 'WARNING in webpack performance recommendations:', - 'WARNING in ./node_modules/vsls/vscode.js', 'WARNING in ./node_modules/encoding/lib/iconv-loader.js', - 'WARNING in ./node_modules/ws/lib/BufferUtil.js', - 'WARNING in ./node_modules/ws/lib/buffer-util.js', - 'WARNING in ./node_modules/ws/lib/Validation.js', - 'WARNING in ./node_modules/ws/lib/validation.js', - 'WARNING in ./node_modules/@jupyterlab/services/node_modules/ws/lib/buffer-util.js', - 'WARNING in ./node_modules/@jupyterlab/services/node_modules/ws/lib/validation.js', - 'WARNING in ./node_modules/any-promise/register.js' + 'WARNING in ./node_modules/any-promise/register.js', + 'WARNING in ./node_modules/diagnostic-channel-publishers/dist/src/azure-coretracing.pub.js', + 'WARNING in ./node_modules/applicationinsights/out/AutoCollection/NativePerformance.js', ]; case 'extension': return [ 'WARNING in ./node_modules/encoding/lib/iconv-loader.js', - 'WARNING in ./node_modules/ws/lib/BufferUtil.js', - 'WARNING in ./node_modules/ws/lib/buffer-util.js', - 'WARNING in ./node_modules/ws/lib/Validation.js', - 'WARNING in ./node_modules/ws/lib/validation.js', - 'WARNING in ./node_modules/any-promise/register.js' + 'WARNING in ./node_modules/any-promise/register.js', + 'remove-files-plugin@1.4.0:', + 'WARNING in ./node_modules/diagnostic-channel-publishers/dist/src/azure-coretracing.pub.js', + 'WARNING in ./node_modules/applicationinsights/out/AutoCollection/NativePerformance.js', ]; case 'debugAdapter': - return ['WARNING in ./node_modules/vscode-uri/lib/index.js']; + return [ + 'WARNING in ./node_modules/vscode-uri/lib/index.js', + 'WARNING in ./node_modules/diagnostic-channel-publishers/dist/src/azure-coretracing.pub.js', + 'WARNING in ./node_modules/applicationinsights/out/AutoCollection/NativePerformance.js', + ]; + case 'browser': + return [ + 'WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).', + 'WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.', + 'WARNING in webpack performance recommendations:', + ]; default: throw new Error('Unknown WebPack Configuration'); } } -gulp.task('renameSourceMaps', async () => { - // By default source maps will be disabled in the extension. - // Users will need to use the command `python.enableSourceMapSupport` to enable source maps. - const extensionSourceMap = path.join(__dirname, 'out', 'client', 'extension.js.map'); - const debuggerSourceMap = path.join(__dirname, 'out', 'client', 'debugger', 'debugAdapter', 'main.js.map'); - await fs.rename(extensionSourceMap, `${extensionSourceMap}.disabled`); - await fs.rename(debuggerSourceMap, `${debuggerSourceMap}.disabled`); -}); gulp.task('verifyBundle', async () => { const matches = await glob.sync(path.join(__dirname, '*.vsix')); - if (!matches || matches.length == 0) { + if (!matches || matches.length === 0) { throw new Error('Bundle does not exist'); } else { console.log(`Bundle ${matches[0]} exists.`); } }); -gulp.task('prePublishBundle', gulp.series('webpack', 'renameSourceMaps')); -gulp.task('checkDependencies', gulp.series('checkNativeDependencies', 'check-datascience-dependencies')); -gulp.task('prePublishNonBundle', gulp.series('compile', 'compile-webviews')); - -gulp.task('installPythonRequirements', async () => { - const args = [ - '-m', - 'pip', - '--disable-pip-version-check', - 'install', - '-t', - './pythonFiles/lib/python', - '--no-cache-dir', - '--implementation', - 'py', - '--no-deps', - '--upgrade', - '-r', - './requirements.txt' - ]; - const success = await spawnAsync(process.env.CI_PYTHON_PATH || 'python3', args, undefined, true) - .then(() => true) - .catch(ex => { - console.error("Failed to install Python Libs using 'python3'", ex); - return false; - }); - if (!success) { - console.info("Failed to install Python Libs using 'python3', attempting to install using 'python'"); - await spawnAsync('python', args).catch(ex => console.error("Failed to install Python Libs using 'python'", ex)); - } -}); - -// See https://github.com/microsoft/vscode-python/issues/7136 -gulp.task('installNewPtvsd', async () => { - // Install dependencies needed for 'install_ptvsd.py' - const depsArgs = ['-m', 'pip', '--disable-pip-version-check', 'install', '-t', './pythonFiles/lib/temp', '-r', './build/debugger-install-requirements.txt']; - const successWithWheelsDeps = await spawnAsync(process.env.CI_PYTHON_PATH || 'python3', depsArgs, undefined, true) - .then(() => true) - .catch(ex => { - console.error("Failed to install new PTVSD wheels using 'python3'", ex); - return false; - }); - if (!successWithWheelsDeps) { - console.info("Failed to install dependencies need by 'install_ptvsd.py' using 'python3', attempting to install using 'python'"); - await spawnAsync('python', depsArgs).catch(ex => console.error("Failed to install dependencies need by 'install_ptvsd.py' using 'python'", ex)); - } - - // Install new PTVSD with wheels for python 3.7 - const wheelsArgs = ['./pythonFiles/install_ptvsd.py']; - const wheelsEnv = { PYTHONPATH: './pythonFiles/lib/temp' }; - const successWithWheels = await spawnAsync(process.env.CI_PYTHON_PATH || 'python3', wheelsArgs, wheelsEnv, true) - .then(() => true) - .catch(ex => { - console.error("Failed to install new PTVSD wheels using 'python3'", ex); - return false; - }); - if (!successWithWheels) { - console.info("Failed to install new PTVSD wheels using 'python3', attempting to install using 'python'"); - await spawnAsync('python', wheelsArgs, wheelsEnv).catch(ex => console.error("Failed to install PTVSD 5.0 wheels using 'python'", ex)); - } - - rmrf.sync('./pythonFiles/lib/temp'); - - // Install source only version of new PTVSD for use with all other python versions. - const args = [ - '-m', - 'pip', - '--disable-pip-version-check', - 'install', - '-t', - './pythonFiles/lib/python/new_ptvsd/no_wheels', - '--no-cache-dir', - '--implementation', - 'py', - '--no-deps', - '--upgrade', - '--pre', - 'ptvsd' - ]; - const successWithoutWheels = await spawnAsync(process.env.CI_PYTHON_PATH || 'python3', args, undefined, true) - .then(() => true) - .catch(ex => { - console.error("Failed to install PTVSD using 'python3'", ex); - return false; - }); - if (!successWithoutWheels) { - console.info("Failed to install source only version of new PTVSD using 'python3', attempting to install using 'python'"); - await spawnAsync('python', args).catch(ex => console.error("Failed to install source only PTVSD 5.0 using 'python'", ex)); - } -}); - -// Install the last stable version of old PTVSD (which includes a middle layer adapter and requires ptvsd_launcher.py) -// until all users have migrated to the new debug adapter + new PTVSD (specified in requirements.txt) -// See https://github.com/microsoft/vscode-python/issues/7136 -gulp.task('installOldPtvsd', async () => { - const args = [ - '-m', - 'pip', - '--disable-pip-version-check', - 'install', - '-t', - './pythonFiles/lib/python/old_ptvsd', - '--no-cache-dir', - '--implementation', - 'py', - '--no-deps', - '--upgrade', - 'ptvsd==4.3.2' - ]; - const success = await spawnAsync(process.env.CI_PYTHON_PATH || 'python3', args, undefined, true) - .then(() => true) - .catch(ex => { - console.error("Failed to install PTVSD using 'python3'", ex); - return false; - }); - if (!success) { - console.info("Failed to install PTVSD using 'python3', attempting to install using 'python'"); - await spawnAsync('python', args).catch(ex => console.error("Failed to install PTVSD using 'python'", ex)); - } -}); - -gulp.task('installPythonLibs', gulp.series('installPythonRequirements', 'installOldPtvsd', 'installNewPtvsd')); - -function uploadExtension(uploadBlobName) { - const azure = require('gulp-azure-storage'); - const rename = require('gulp-rename'); - return gulp - .src('*python*.vsix') - .pipe(rename(uploadBlobName)) - .pipe( - azure.upload({ - account: process.env.AZURE_STORAGE_ACCOUNT, - key: process.env.AZURE_STORAGE_ACCESS_KEY, - container: process.env.AZURE_STORAGE_CONTAINER - }) - ); -} - -gulp.task('uploadDeveloperExtension', () => uploadExtension('ms-python-insiders.vsix')); -gulp.task('uploadReleaseExtension', () => uploadExtension(`ms-python-${process.env.TRAVIS_BRANCH || process.env.BUILD_SOURCEBRANCHNAME}.vsix`)); +gulp.task('prePublishBundle', gulp.series('webpack')); +gulp.task('checkDependencies', gulp.series('checkNativeDependencies')); +gulp.task('prePublishNonBundle', gulp.series('compile')); function spawnAsync(command, args, env, rejectOnStdErr = false) { env = env || {}; @@ -395,208 +245,24 @@ function spawnAsync(command, args, env, rejectOnStdErr = false) { let stdOut = ''; console.info(`> ${command} ${args.join(' ')}`); const proc = spawn(command, args, { cwd: __dirname, env }); - proc.stdout.on('data', data => { + proc.stdout.on('data', (data) => { // Log output on CI (else travis times out when there's not output). stdOut += data.toString(); if (isCI) { console.log(data.toString()); } }); - proc.stderr.on('data', data => { + proc.stderr.on('data', (data) => { console.error(data.toString()); if (rejectOnStdErr) { reject(data.toString()); } }); proc.on('close', () => resolve(stdOut)); - proc.on('error', error => reject(error)); + proc.on('error', (error) => reject(error)); }); } -/** - * Analyzes the dependencies pulled in by WebPack. - * Details on the structure of the stats json file can be found here https://webpack.js.org/api/stats/ - * - * We go through the stats file and check all node modules that are part of the bundle(s). - * If they are in the bundle, they are used, hence they need to be registered in the `package.datascience-ui.dependencies.json` file. - * If not found, this will throw an error with the list of those dependencies. - * If a dependency is no longer use, this will throw an error with the details of the module to be removed from the `package.datascience-ui.dependencies.json` file. - * - */ -async function checkDatascienceDependencies() { - await buildDataScienceUI(); - - const existingModulesFileName = 'package.datascience-ui.dependencies.json'; - const existingModulesFile = path.join(__dirname, existingModulesFileName); - const existingModulesList = JSON.parse(await fsExtra.readFile(existingModulesFile).then(data => data.toString())); - const existingModules = new Set(existingModulesList); - const existingModulesCopy = new Set(existingModulesList); - - const newModules = new Set(); - const packageLock = JSON.parse(await fsExtra.readFile('package-lock.json').then(data => data.toString())); - const modulesInPackageLock = Object.keys(packageLock.dependencies); - - // Right now the script only handles two parts in the dependency name (with one '/'). - // If we have dependencies with more than one '/', then update this code. - if (modulesInPackageLock.some(dependency => dependency.indexOf('/') !== dependency.lastIndexOf('/'))) { - throwAndLogError("Dependencies detected with more than one '/', please update this script."); - } - - /** - * Processes the output in a webpack stat file. - * - * @param {string} statFile - */ - async function processWebpackStatFile(statFile) { - /** @type{import("webpack").Stats.ToJsonOutput} */ - const json = await fsExtra.readFile(statFile).then(data => JSON.parse(data.toString())); - json.children.forEach(child => { - child.chunks.forEach(chunk => { - processModules(chunk.modules); - (chunk.origins || []).forEach(origin => processOriginOrReason(origin)); - }); - }); - json.chunks.forEach(chunk => { - processModules(chunk.modules); - (chunk.origins || []).forEach(origin => processOriginOrReason(origin)); - }); - } - - /** - * @param {string} name Name of module to find. - * @param {string} moduleName1 Another name of module to find. - * @param {string} moduleName2 Yet another name of module to find. - * @returns - */ - function findModule(name, moduleName1, moduleName2) { - // If the module name contains `?`, then its a webpack loader that can be ignored. - if (name.includes('loader') && (name.includes('?') || name.includes('!'))) { - return; - } - const matchedModules = modulesInPackageLock.filter(dependency => dependency === moduleName2 || dependency === moduleName1 || dependency === name); - switch (matchedModules.length) { - case 0: - throwAndLogError(`Dependency not found in package-lock.json, Dependency = '${name}, ${moduleName1}, ${moduleName2}'`); - break; - case 1: - break; - default: { - throwAndLogError(`Exact Dependency not found in package-lock.json, Dependency = '${name}'`); - } - } - - const moduleName = matchedModules[0]; - if (existingModulesCopy.has(moduleName)) { - existingModulesCopy.delete(moduleName); - } - if (existingModules.has(moduleName) || newModules.has(moduleName)) { - return; - } - newModules.add(moduleName); - } - - /** - * Processes webpack stat Modules. - * - * @param modules { Array. } - * @returns - */ - function processModules(modules) { - (modules || []).forEach(processModule); - } - - /** - * Processes a webpack stat Module. - * - * @param module { import("webpack").Stats.FnModules } - * @returns - */ - function processModule(module) { - const name = module.name; - - if (!name.includes('/node_modules')) { - processReasons(module.reasons); - processModules(module.modules); - return; - } - - let nameWithoutNodeModules = name.substring('/node_modules'.length); - // Special case expose-loader. - if (nameWithoutNodeModules.startsWith('/expose-loader')) { - nameWithoutNodeModules = nameWithoutNodeModules.substring(nameWithoutNodeModules.indexOf('/node_modules') + '/node_modules'.length); - } - - let moduleName1 = nameWithoutNodeModules.split('/')[1]; - moduleName1 = moduleName1.endsWith('!.') ? moduleName1.substring(0, moduleName1.length - 2) : moduleName1; - const moduleName2 = `${nameWithoutNodeModules.split('/')[1]}/${nameWithoutNodeModules.split('/')[2]}`; - - findModule(name, moduleName1, moduleName2); - - processModules(module.modules); - processReasons(module.reasons); - } - - /** - * Processes a origin or a reason object from a webpack stat. - * - * @param {*} origin - * @returns - */ - function processOriginOrReason(origin) { - if (!origin || !origin.name) { - return; - } - const name = origin.name; - if (!name.includes('/node_modules')) { - processReasons(origin.reasons); - return; - } - - let nameWithoutNodeModules = name.substring('/node_modules'.length); - // Special case expose-loader. - if (nameWithoutNodeModules.startsWith('/expose-loader')) { - nameWithoutNodeModules = nameWithoutNodeModules.substring(nameWithoutNodeModules.indexOf('/node_modules') + '/node_modules'.length); - } - - let moduleName1 = nameWithoutNodeModules.split('/')[1]; - moduleName1 = moduleName1.endsWith('!.') ? moduleName1.substring(0, moduleName1.length - 2) : moduleName1; - const moduleName2 = `${nameWithoutNodeModules.split('/')[1]}/${nameWithoutNodeModules.split('/')[2]}`; - - findModule(name, moduleName1, moduleName2); - - processReasons(origin.reasons); - } - - /** - * Processes the `reasons` property of a webpack stat module object. - * - * @param {*} reasons - */ - function processReasons(reasons) { - reasons = (reasons || []).map(reason => reason.userRequest).filter(item => typeof item === 'string' && !item.startsWith('.')); - reasons.forEach(item => processOriginOrReason(item)); - } - - await processWebpackStatFile(path.join(__dirname, 'out', 'datascience-ui', 'notebook', 'notebook.stats.json')); - await processWebpackStatFile(path.join(__dirname, 'out', 'datascience-ui', 'viewers', 'viewers.stats.json')); - - const errorMessages = []; - if (newModules.size > 0) { - errorMessages.push(`Add the untracked dependencies '${Array.from(newModules.values()).join(', ')}' to ${existingModulesFileName}`); - } - if (existingModulesCopy.size > 0) { - errorMessages.push(`Remove the unused '${Array.from(existingModulesCopy.values()).join(', ')}' dependencies from ${existingModulesFileName}`); - } - if (errorMessages.length > 0) { - throwAndLogError(errorMessages.join('\n')); - } -} -function throwAndLogError(message) { - if (message.length > 0) { - console.error(colors.red(message)); - throw new Error(message); - } -} function hasNativeDependencies() { let nativeDependencies = nativeDependencyChecker.check(path.join(__dirname, 'node_modules')); if (!Array.isArray(nativeDependencies) || nativeDependencies.length === 0) { @@ -604,453 +270,20 @@ function hasNativeDependencies() { } const dependencies = JSON.parse(spawn.sync('npm', ['ls', '--json', '--prod']).stdout.toString()); const jsonProperties = Object.keys(flat.flatten(dependencies)); - nativeDependencies = _.flatMap(nativeDependencies, item => path.dirname(item.substring(item.indexOf('node_modules') + 'node_modules'.length)).split(path.sep)) - .filter(item => item.length > 0) - .filter(item => jsonProperties.findIndex(flattenedDependency => flattenedDependency.endsWith(`dependencies.${item}.version`)) >= 0); + nativeDependencies = _.flatMap(nativeDependencies, (item) => + path.dirname(item.substring(item.indexOf('node_modules') + 'node_modules'.length)).split(path.sep), + ) + .filter((item) => item.length > 0) + .filter((item) => item !== 'fsevents') + .filter( + (item) => + jsonProperties.findIndex((flattenedDependency) => + flattenedDependency.endsWith(`dependencies.${item}.version`), + ) >= 0, + ); if (nativeDependencies.length > 0) { console.error('Native dependencies detected', nativeDependencies); return true; } return false; } - -/** - * @typedef {Object} hygieneOptions - creates a new type named 'SpecialType' - * @property {'changes'|'staged'|'all'|'compile'|'diffMaster'} [mode=] - Mode. - * @property {boolean=} skipIndentationCheck - Skip indentation checks. - * @property {boolean=} skipFormatCheck - Skip format checks. - * @property {boolean=} skipLinter - Skip linter. - */ - -/** - * - * @param {hygieneOptions} options - */ -function getTsProject(options) { - return ts.createProject('tsconfig.json'); -} - -let configuration; -/** - * - * @param {hygieneOptions} options - */ -function getLinter(options) { - configuration = configuration ? configuration : tslint.Configuration.findConfiguration(null, '.'); - const program = tslint.Linter.createProgram('./tsconfig.json'); - const linter = new tslint.Linter({ formatter: 'json' }, program); - return { linter, configuration }; -} -let compilationInProgress = false; -let reRunCompilation = false; -/** - * - * @param {hygieneOptions} options - * @returns {NodeJS.ReadWriteStream} - */ -const hygiene = (options, done) => { - done = done || noop; - if (compilationInProgress) { - reRunCompilation = true; - return done(); - } - const fileListToProcess = options.mode === 'compile' ? undefined : getFileListToProcess(options); - if (Array.isArray(fileListToProcess) && fileListToProcess !== all && fileListToProcess.filter(item => item.endsWith('.ts')).length === 0) { - return done(); - } - - const started = new Date().getTime(); - compilationInProgress = true; - options = options || {}; - let errorCount = 0; - - const indentation = es.through(function(file) { - file.contents - .toString('utf8') - .split(/\r\n|\r|\n/) - .forEach((line, i) => { - if (/^\s*$/.test(line) || /^\S+.*$/.test(line)) { - // Empty or whitespace lines are OK. - } else if (/^(\s\s\s\s)+.*/.test(line)) { - // Good indent. - } else if (/^[\t]+.*/.test(line)) { - console.error(file.relative + '(' + (i + 1) + ',1): Bad whitespace indentation (use 4 spaces instead of tabs or other)'); - errorCount++; - } - }); - - this.emit('data', file); - }); - - const formatOptions = { verify: true, tsconfig: true, tslint: true, editorconfig: true, tsfmt: true }; - const formatting = es.map(function(file, cb) { - tsfmt - .processString(file.path, file.contents.toString('utf8'), formatOptions) - .then(result => { - if (result.error) { - let message = result.message.trim(); - let formattedMessage = ''; - if (message.startsWith(__dirname)) { - message = message.substr(__dirname.length); - message = message.startsWith(path.sep) ? message.substr(1) : message; - const index = message.indexOf('.ts '); - if (index === -1) { - formattedMessage = colors.red(message); - } else { - const file = message.substr(0, index + 3); - const errorMessage = message.substr(index + 4).trim(); - formattedMessage = `${colors.red(file)} ${errorMessage}`; - } - } else { - formattedMessage = colors.red(message); - } - console.error(formattedMessage); - errorCount++; - } - cb(null, file); - }) - .catch(cb); - }); - - let reportedLinterFailures = []; - /** - * Report the linter failures - * @param {any[]} failures - */ - function reportLinterFailures(failures) { - return ( - failures - .map(failure => { - const name = failure.name || failure.fileName; - const position = failure.startPosition; - const line = position.lineAndCharacter ? position.lineAndCharacter.line : position.line; - const character = position.lineAndCharacter ? position.lineAndCharacter.character : position.character; - - // Output in format similar to tslint for the linter to pickup. - const message = `ERROR: (${failure.ruleName}) ${relative(__dirname, name)}[${line + 1}, ${character + 1}]: ${failure.failure}`; - if (reportedLinterFailures.indexOf(message) === -1) { - console.error(message); - reportedLinterFailures.push(message); - return true; - } else { - return false; - } - }) - .filter(reported => reported === true).length > 0 - ); - } - - const { linter, configuration } = getLinter(options); - const tsl = es.through(function(file) { - const contents = file.contents.toString('utf8'); - if (isCI) { - // Don't print anything to the console, we'll do that. - console.log('.'); - } - // Yes this is a hack, but tslinter doesn't provide an option to prevent this. - const oldWarn = console.warn; - console.warn = () => {}; - linter.failures = []; - linter.fixes = []; - linter.lint(file.relative, contents, configuration.results); - console.warn = oldWarn; - const result = linter.getResult(); - if (result.failureCount > 0 || result.errorCount > 0) { - const reported = reportLinterFailures(result.failures); - if (result.failureCount && reported) { - errorCount += result.failureCount; - } - if (result.errorCount && reported) { - errorCount += result.errorCount; - } - } - this.emit('data', file); - }); - - const tsFiles = []; - const tscFilesTracker = es.through(function(file) { - tsFiles.push(file.path.replace(/\\/g, '/')); - tsFiles.push(file.path); - this.emit('data', file); - }); - - const tsProject = getTsProject(options); - - const tsc = function() { - function customReporter() { - return { - error: function(error, typescript) { - const fullFilename = error.fullFilename || ''; - const relativeFilename = error.relativeFilename || ''; - if (tsFiles.findIndex(file => fullFilename === file || relativeFilename === file) === -1) { - return; - } - console.error(`Error: ${error.message}`); - errorCount += 1; - }, - finish: function() { - // forget the summary. - console.log('Finished compilation'); - } - }; - } - const reporter = customReporter(); - return tsProject(reporter); - }; - - const files = options.mode === 'compile' ? tsProject.src() : getFilesToProcess(fileListToProcess); - const dest = options.mode === 'compile' ? './out' : '.'; - let result = files.pipe(filter(f => f && f.stat && !f.stat.isDirectory())); - - if (!options.skipIndentationCheck) { - result = result.pipe(filter(indentationFilter)).pipe(indentation); - } - - result = result.pipe(filter(tslintFilter)); - - if (!options.skipFormatCheck) { - // result = result - // .pipe(formatting); - } - - if (!options.skipLinter) { - result = result.pipe(tsl); - } - let totalTime = 0; - result = result - .pipe(tscFilesTracker) - .pipe(sourcemaps.init()) - .pipe(tsc()) - .pipe( - sourcemaps.mapSources(function(sourcePath, file) { - let tsFileName = path.basename(file.path).replace(/js$/, 'ts'); - const qualifiedSourcePath = path - .dirname(file.path) - .replace('out/', 'src/') - .replace('out\\', 'src\\'); - if (!fs.existsSync(path.join(qualifiedSourcePath, tsFileName))) { - const tsxFileName = path.basename(file.path).replace(/js$/, 'tsx'); - if (!fs.existsSync(path.join(qualifiedSourcePath, tsxFileName))) { - console.error(`ERROR: (source-maps) ${file.path}[1,1]: Source file not found`); - } else { - tsFileName = tsxFileName; - } - } - return path.join(path.relative(path.dirname(file.path), qualifiedSourcePath), tsFileName); - }) - ) - .pipe(sourcemaps.write('.', { includeContent: false })) - .pipe(gulp.dest(dest)) - .pipe( - es.through(null, function() { - if (errorCount > 0) { - const errorMessage = `Hygiene failed with errors 👎 . Check 'gulpfile.js' (completed in ${new Date().getTime() - started}ms).`; - console.error(colors.red(errorMessage)); - exitHandler(options); - } else { - console.log(colors.green(`Hygiene passed with 0 errors 👍 (completed in ${new Date().getTime() - started}ms).`)); - } - // Reset error counter. - errorCount = 0; - reportedLinterFailures = []; - compilationInProgress = false; - if (reRunCompilation) { - reRunCompilation = false; - setTimeout(() => { - hygiene(options, done); - }, 10); - } - done(); - this.emit('end'); - }) - ) - .on('error', ex => { - exitHandler(options, ex); - done(); - }); - - return result; -}; - -/** - * @typedef {Object} runOptions - * @property {boolean=} exitOnError - Exit on error. - * @property {'changes'|'staged'|'all'} [mode=] - Mode. - * @property {string[]=} files - Optional list of files to be modified. - * @property {boolean=} skipIndentationCheck - Skip indentation checks. - * @property {boolean=} skipFormatCheck - Skip format checks. - * @property {boolean=} skipLinter - Skip linter. - * @property {boolean=} watch - Watch mode. - */ - -/** - * Run the linters. - * @param {runOptions} options - * @param {Error} ex - */ -function exitHandler(options, ex) { - console.error(); - if (ex) { - console.error(ex); - console.error(colors.red(ex)); - } - if (options.exitOnError) { - console.log('exit'); - process.exit(1); - } -} - -/** - * Run the linters. - * @param {runOptions} options - */ -function run(options, done) { - done = done || noop; - options = options ? options : {}; - options.exitOnError = typeof options.exitOnError === 'undefined' ? isCI : options.exitOnError; - process.once('unhandledRejection', (reason, p) => { - console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); - exitHandler(options); - }); - - // Clear screen each time - console.log('\x1Bc'); - const startMessage = `Hygiene starting`; - console.log(colors.blue(startMessage)); - - hygiene(options, done); -} - -function git(args) { - let result = cp.spawnSync('git', args, { encoding: 'utf-8' }); - return result.output.join('\n'); -} - -function getStagedFilesSync() { - const out = git(['diff', '--cached', '--name-only']); - return out.split(/\r?\n/).filter(l => !!l); -} -function getAddedFilesSync() { - const out = git(['status', '-u', '-s']); - return out - .split(/\r?\n/) - .filter(l => !!l) - .filter( - l => - _.intersection( - ['A', '?', 'U'], - l - .substring(0, 2) - .trim() - .split('') - ).length > 0 - ) - .map(l => path.join(__dirname, l.substring(2).trim())); -} -function getAzureDevOpsVarValue(varName) { - return process.env[varName.replace(/\./g, '_').toUpperCase()]; -} -function getModifiedFilesSync() { - if (isCI) { - const isAzurePR = getAzureDevOpsVarValue('System.PullRequest.SourceBranch') !== undefined; - const isTravisPR = process.env.TRAVIS_PULL_REQUEST !== undefined && process.env.TRAVIS_PULL_REQUEST !== 'true'; - if (!isAzurePR && !isTravisPR) { - return []; - } - const targetBranch = process.env.TRAVIS_BRANCH || getAzureDevOpsVarValue('System.PullRequest.TargetBranch'); - if (targetBranch !== 'master') { - return []; - } - - const repo = process.env.TRAVIS_REPO_SLUG || getAzureDevOpsVarValue('Build.Repository.Name'); - const originOrUpstream = repo.toUpperCase() === 'MICROSOFT/VSCODE-PYTHON' || repo.toUpperCase() === 'VSCODE-PYTHON-DATASCIENCE/VSCODE-PYTHON' ? 'origin' : 'upstream'; - - // If on CI, get a list of modified files comparing against - // PR branch and master of current (assumed 'origin') repo. - try { - cp.execSync(`git remote set-branches --add ${originOrUpstream} master`, { encoding: 'utf8', cwd: __dirname }); - cp.execSync('git fetch', { encoding: 'utf8', cwd: __dirname }); - } catch (ex) { - return []; - } - const cmd = `git diff --name-only HEAD ${originOrUpstream}/master`; - console.info(cmd); - const out = cp.execSync(cmd, { encoding: 'utf8', cwd: __dirname }); - return out - .split(/\r?\n/) - .filter(l => !!l) - .filter(l => l.length > 0) - .map(l => l.trim().replace(/\//g, path.sep)) - .map(l => path.join(__dirname, l)); - } else { - const out = cp.execSync('git status -u -s', { encoding: 'utf8' }); - return out - .split(/\r?\n/) - .filter(l => !!l) - .filter( - l => - _.intersection( - ['M', 'A', 'R', 'C', 'U', '?'], - l - .substring(0, 2) - .trim() - .split('') - ).length > 0 - ) - .map(l => - path.join( - __dirname, - l - .substring(2) - .trim() - .replace(/\//g, path.sep) - ) - ); - } -} - -function getDifferentFromMasterFilesSync() { - const out = git(['diff', '--name-status', 'master']); - return out - .split(/\r?\n/) - .filter(l => !!l) - .map(l => path.join(__dirname, l.substring(2).trim())); -} - -/** - * @param {hygieneOptions} options - */ -function getFilesToProcess(fileList) { - const gulpSrcOptions = { base: '.' }; - return gulp.src(fileList, gulpSrcOptions); -} - -/** - * @param {hygieneOptions} options - */ -function getFileListToProcess(options) { - const mode = options ? options.mode : 'all'; - const gulpSrcOptions = { base: '.' }; - - // If we need only modified files, then filter the glob. - if (options && options.mode === 'changes') { - return getModifiedFilesSync().filter(f => fs.existsSync(f)); - } - - if (options && options.mode === 'staged') { - return getStagedFilesSync().filter(f => fs.existsSync(f)); - } - - if (options && options.mode === 'diffMaster') { - return getDifferentFromMasterFilesSync().filter(f => fs.existsSync(f)); - } - - return all; -} - -exports.hygiene = hygiene; - -// this allows us to run hygiene via CLI (e.g. `node gulfile.js`). -if (require.main === module) { - run({ exitOnError: true, mode: 'staged' }, () => {}); -} diff --git a/images/ConfigureDebugger.gif b/images/ConfigureDebugger.gif index 359e1a7493fd..41113d65896d 100644 Binary files a/images/ConfigureDebugger.gif and b/images/ConfigureDebugger.gif differ diff --git a/images/ConfigureTests.gif b/images/ConfigureTests.gif index 6da0100d593b..38ae2db551e1 100644 Binary files a/images/ConfigureTests.gif and b/images/ConfigureTests.gif differ diff --git a/images/InterpreterSelectionZoom.gif b/images/InterpreterSelectionZoom.gif index 576a438a7d3b..dc5db03aad3d 100644 Binary files a/images/InterpreterSelectionZoom.gif and b/images/InterpreterSelectionZoom.gif differ diff --git a/images/OpenOrCreateNotebook.gif b/images/OpenOrCreateNotebook.gif index 98256a97f190..a0957d415d7d 100644 Binary files a/images/OpenOrCreateNotebook.gif and b/images/OpenOrCreateNotebook.gif differ diff --git a/images/addIcon.PNG b/images/addIcon.PNG new file mode 100644 index 000000000000..8027e617e9ec Binary files /dev/null and b/images/addIcon.PNG differ diff --git a/images/codeIcon.PNG b/images/codeIcon.PNG new file mode 100644 index 000000000000..7ad46cee077f Binary files /dev/null and b/images/codeIcon.PNG differ diff --git a/images/dataViewerIcon.PNG b/images/dataViewerIcon.PNG new file mode 100644 index 000000000000..6848c600794d Binary files /dev/null and b/images/dataViewerIcon.PNG differ diff --git a/images/dataviewer.gif b/images/dataviewer.gif new file mode 100644 index 000000000000..ce0c81676c09 Binary files /dev/null and b/images/dataviewer.gif differ diff --git a/images/exportIcon.PNG b/images/exportIcon.PNG new file mode 100644 index 000000000000..e5e588040ee6 Binary files /dev/null and b/images/exportIcon.PNG differ diff --git a/images/kernelchange.gif b/images/kernelchange.gif new file mode 100644 index 000000000000..d2b753b84c09 Binary files /dev/null and b/images/kernelchange.gif differ diff --git a/images/markdownIcon.PNG b/images/markdownIcon.PNG new file mode 100644 index 000000000000..04e5d67749db Binary files /dev/null and b/images/markdownIcon.PNG differ diff --git a/images/playIcon.PNG b/images/playIcon.PNG new file mode 100644 index 000000000000..60ae4a2051df Binary files /dev/null and b/images/playIcon.PNG differ diff --git a/images/plotViewerIcon.PNG b/images/plotViewerIcon.PNG new file mode 100644 index 000000000000..e8ecf0d97b5e Binary files /dev/null and b/images/plotViewerIcon.PNG differ diff --git a/images/plotviewer.gif b/images/plotviewer.gif new file mode 100644 index 000000000000..a3c438b761e0 Binary files /dev/null and b/images/plotviewer.gif differ diff --git a/images/remoteserver.gif b/images/remoteserver.gif new file mode 100644 index 000000000000..f979d557aa6b Binary files /dev/null and b/images/remoteserver.gif differ diff --git a/images/runbyline.gif b/images/runbyline.gif new file mode 100644 index 000000000000..1c0679f9a458 Binary files /dev/null and b/images/runbyline.gif differ diff --git a/images/savetopythonfile.png b/images/savetopythonfile.png new file mode 100644 index 000000000000..e4a7f08d3db0 Binary files /dev/null and b/images/savetopythonfile.png differ diff --git a/images/variableExplorerIcon.PNG b/images/variableExplorerIcon.PNG new file mode 100644 index 000000000000..f8363dda9de4 Binary files /dev/null and b/images/variableExplorerIcon.PNG differ diff --git a/images/variableexplorer.png b/images/variableexplorer.png new file mode 100644 index 000000000000..31197571b796 Binary files /dev/null and b/images/variableexplorer.png differ diff --git a/news/.vscode/settings.json b/news/.vscode/settings.json deleted file mode 100644 index 3875b000e2c0..000000000000 --- a/news/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "python.jediEnabled": false, - "python.formatting.provider": "black", - "editor.formatOnSave": true, - "python.testing.pytestArgs": [ - "." - ], - "python.testing.unittestEnabled": false, - "python.testing.nosetestsEnabled": false, - "python.testing.pytestEnabled": true -} diff --git a/news/1 Enhancements/4466.md b/news/1 Enhancements/4466.md deleted file mode 100644 index 197c50dd0b86..000000000000 --- a/news/1 Enhancements/4466.md +++ /dev/null @@ -1 +0,0 @@ -Make interactive window wrap like the notebook editor does. \ No newline at end of file diff --git a/news/1 Enhancements/7892.md b/news/1 Enhancements/7892.md deleted file mode 100644 index c5666a6104fb..000000000000 --- a/news/1 Enhancements/7892.md +++ /dev/null @@ -1 +0,0 @@ -Support scrolling beyond the last line in the notebook editor and the interactive window. Uses the `editor.scrollBeyondLastLine` setting. \ No newline at end of file diff --git a/news/1 Enhancements/8698.md b/news/1 Enhancements/8698.md deleted file mode 100644 index 45f00cc60388..000000000000 --- a/news/1 Enhancements/8698.md +++ /dev/null @@ -1 +0,0 @@ -Allow user to override the arguments passed to Jupyter on startup. To change the arguments, run the 'Python: Specify Jupyter command line arguments" command. \ No newline at end of file diff --git a/news/1 Enhancements/9228.md b/news/1 Enhancements/9228.md deleted file mode 100644 index d45ef8ff3daa..000000000000 --- a/news/1 Enhancements/9228.md +++ /dev/null @@ -1 +0,0 @@ -Added a command to allow users to select a kernel for a `Notebook`. diff --git a/news/1 Enhancements/9331.md b/news/1 Enhancements/9331.md deleted file mode 100644 index 50f020a69292..000000000000 --- a/news/1 Enhancements/9331.md +++ /dev/null @@ -1 +0,0 @@ -When saving new `notebooks`, default to the current workspace folder. diff --git a/news/1 Enhancements/9401.md b/news/1 Enhancements/9401.md deleted file mode 100644 index eac60c2f6835..000000000000 --- a/news/1 Enhancements/9401.md +++ /dev/null @@ -1 +0,0 @@ -When the output of a cell gets trimmed for the first time, the user will be informed of it and which setting changes it. diff --git a/news/1 Enhancements/README.md b/news/1 Enhancements/README.md deleted file mode 100644 index ecc51777759d..000000000000 --- a/news/1 Enhancements/README.md +++ /dev/null @@ -1 +0,0 @@ -Changes that add new features. diff --git a/news/2 Fixes/10071.md b/news/2 Fixes/10071.md deleted file mode 100644 index 842c8c2786d1..000000000000 --- a/news/2 Fixes/10071.md +++ /dev/null @@ -1 +0,0 @@ -Re-install `Jupyter` instead of installing `kernelspec` if `kernelspec` cannot be found in the python environment. diff --git a/news/2 Fixes/10072.md b/news/2 Fixes/10072.md deleted file mode 100644 index 195bfad15543..000000000000 --- a/news/2 Fixes/10072.md +++ /dev/null @@ -1,2 +0,0 @@ -Fix zh-tw localization file loading issue. -(thanks to [ChenKB91](https://github.com/ChenKB91/)) diff --git a/news/2 Fixes/10074.md b/news/2 Fixes/10074.md deleted file mode 100644 index 31bbcd2fe6db..000000000000 --- a/news/2 Fixes/10074.md +++ /dev/null @@ -1 +0,0 @@ -Fixes problem with showing ndarrays in the data viewer. \ No newline at end of file diff --git a/news/2 Fixes/10075.md b/news/2 Fixes/10075.md deleted file mode 100644 index 1b4d7f29dbbf..000000000000 --- a/news/2 Fixes/10075.md +++ /dev/null @@ -1 +0,0 @@ -Fix data viewer not opening on certain data frames. \ No newline at end of file diff --git a/news/2 Fixes/10094.md b/news/2 Fixes/10094.md deleted file mode 100644 index 5345c91c388f..000000000000 --- a/news/2 Fixes/10094.md +++ /dev/null @@ -1 +0,0 @@ -Do not delay activation of extension by waiting for terminal to get activated. diff --git a/news/2 Fixes/10097.md b/news/2 Fixes/10097.md deleted file mode 100644 index 101bb77b5d92..000000000000 --- a/news/2 Fixes/10097.md +++ /dev/null @@ -1 +0,0 @@ -LiveShare can prevent the jupyter server from starting if it crashes. \ No newline at end of file diff --git a/news/2 Fixes/10111.md b/news/2 Fixes/10111.md deleted file mode 100644 index dae8dc293564..000000000000 --- a/news/2 Fixes/10111.md +++ /dev/null @@ -1,2 +0,0 @@ -Mark `poetry.lock` file as toml syntax. -(thanks to [remcohaszing](https://github.com/remcohaszing/)) diff --git a/news/2 Fixes/1877.md b/news/2 Fixes/1877.md deleted file mode 100644 index b2b1cdecfacf..000000000000 --- a/news/2 Fixes/1877.md +++ /dev/null @@ -1 +0,0 @@ -Remove extra lines at the end of the file when formatting with Black \ No newline at end of file diff --git a/news/2 Fixes/2607.md b/news/2 Fixes/2607.md deleted file mode 100644 index 9a13b9ccdd63..000000000000 --- a/news/2 Fixes/2607.md +++ /dev/null @@ -1 +0,0 @@ -Capitalize `Activate.ps1` in code for PowerShell Core on Linux. diff --git a/news/2 Fixes/6370.md b/news/2 Fixes/6370.md deleted file mode 100644 index b12f4d05981f..000000000000 --- a/news/2 Fixes/6370.md +++ /dev/null @@ -1 +0,0 @@ -Make line numbers in errors for the Interactive window match the original file and make them clickable for jumping back to an error location. \ No newline at end of file diff --git a/news/2 Fixes/6900.md b/news/2 Fixes/6900.md deleted file mode 100644 index a040c99fbc9b..000000000000 --- a/news/2 Fixes/6900.md +++ /dev/null @@ -1 +0,0 @@ -Fix magic commands that return 'paged' output. \ No newline at end of file diff --git a/news/2 Fixes/8742.md b/news/2 Fixes/8742.md deleted file mode 100644 index d7717d671ea5..000000000000 --- a/news/2 Fixes/8742.md +++ /dev/null @@ -1 +0,0 @@ -Fix latex output from a code cell to render correctly. \ No newline at end of file diff --git a/news/2 Fixes/9102.md b/news/2 Fixes/9102.md deleted file mode 100644 index e6857380a037..000000000000 --- a/news/2 Fixes/9102.md +++ /dev/null @@ -1 +0,0 @@ -Toggling cell type from `code` to `markdown` will not set focus to the editor in cells of a `Notebook`. diff --git a/news/2 Fixes/9116.md b/news/2 Fixes/9116.md deleted file mode 100644 index d7a2d3d14351..000000000000 --- a/news/2 Fixes/9116.md +++ /dev/null @@ -1 +0,0 @@ -Remove whitespace from code before pushing to the interactive window \ No newline at end of file diff --git a/news/2 Fixes/9174.md b/news/2 Fixes/9174.md deleted file mode 100644 index 8fbafbbea4d5..000000000000 --- a/news/2 Fixes/9174.md +++ /dev/null @@ -1 +0,0 @@ -Fix IPython.clear_output to behave like Jupyter \ No newline at end of file diff --git a/news/2 Fixes/9242.md b/news/2 Fixes/9242.md deleted file mode 100644 index eca1393017f3..000000000000 --- a/news/2 Fixes/9242.md +++ /dev/null @@ -1 +0,0 @@ -Fixed our css generation from custom color themes which caused the Data Viewer to not load. diff --git a/news/2 Fixes/9282.md b/news/2 Fixes/9282.md deleted file mode 100644 index 760b68465ba7..000000000000 --- a/news/2 Fixes/9282.md +++ /dev/null @@ -1 +0,0 @@ -Clean up interative window styling and set focus to input box if clicking in the interactive window. \ No newline at end of file diff --git a/news/2 Fixes/9503.md b/news/2 Fixes/9503.md deleted file mode 100644 index 4de6f7c3acdf..000000000000 --- a/news/2 Fixes/9503.md +++ /dev/null @@ -1 +0,0 @@ -Python environments will not be activated in terminals hidden from the user. diff --git a/news/2 Fixes/9693.md b/news/2 Fixes/9693.md deleted file mode 100644 index 0f682d4babaa..000000000000 --- a/news/2 Fixes/9693.md +++ /dev/null @@ -1 +0,0 @@ -Pressing ctrl + 1/ctrl + 2 to focus on the interactive window will give focus to the input box. diff --git a/news/2 Fixes/9740.md b/news/2 Fixes/9740.md deleted file mode 100644 index 30bb6f62d107..000000000000 --- a/news/2 Fixes/9740.md +++ /dev/null @@ -1 +0,0 @@ -Make sure to clear variable list on restart kernel. \ No newline at end of file diff --git a/news/2 Fixes/9766.md b/news/2 Fixes/9766.md deleted file mode 100644 index f8df99ec60d5..000000000000 --- a/news/2 Fixes/9766.md +++ /dev/null @@ -1 +0,0 @@ -Fixed an issue with multiple latex formulas in the same '$$' block. diff --git a/news/2 Fixes/9796.md b/news/2 Fixes/9796.md deleted file mode 100644 index 82ff822bd1c7..000000000000 --- a/news/2 Fixes/9796.md +++ /dev/null @@ -1,2 +0,0 @@ -Silently skip rendering mimetypes related to scrapbook. -Html won't crash if we find a mimetype that we don't support. diff --git a/news/2 Fixes/9901.md b/news/2 Fixes/9901.md deleted file mode 100644 index 3f04054b0926..000000000000 --- a/news/2 Fixes/9901.md +++ /dev/null @@ -1 +0,0 @@ -Ignore errors coming from stat(), where appropriate. diff --git a/news/2 Fixes/9904.md b/news/2 Fixes/9904.md deleted file mode 100644 index c41cbc380ec9..000000000000 --- a/news/2 Fixes/9904.md +++ /dev/null @@ -1 +0,0 @@ -Improve error messaging when the jupyter notebook cannot be started. \ No newline at end of file diff --git a/news/2 Fixes/9926.md b/news/2 Fixes/9926.md deleted file mode 100644 index c609b86c388b..000000000000 --- a/news/2 Fixes/9926.md +++ /dev/null @@ -1 +0,0 @@ -Use the autoStart server when available. diff --git a/news/2 Fixes/9933.md b/news/2 Fixes/9933.md deleted file mode 100644 index 371d3ed72c85..000000000000 --- a/news/2 Fixes/9933.md +++ /dev/null @@ -1 +0,0 @@ -Correct the server and kernel text for when not connected to a server. \ No newline at end of file diff --git a/news/2 Fixes/9976.md b/news/2 Fixes/9976.md deleted file mode 100644 index 6b79ac7b945b..000000000000 --- a/news/2 Fixes/9976.md +++ /dev/null @@ -1 +0,0 @@ -add --ip=127.0.0.1 argument of jupyter server when running in k8s container diff --git a/news/2 Fixes/9991.md b/news/2 Fixes/9991.md deleted file mode 100644 index 1296552cc995..000000000000 --- a/news/2 Fixes/9991.md +++ /dev/null @@ -1 +0,0 @@ -Clear variables in notebooks and interactive-window when restarting. \ No newline at end of file diff --git a/news/2 Fixes/README.md b/news/2 Fixes/README.md deleted file mode 100644 index cc5e1020961d..000000000000 --- a/news/2 Fixes/README.md +++ /dev/null @@ -1 +0,0 @@ -Changes that fix broken behaviour. diff --git a/news/3 Code Health/10046.md b/news/3 Code Health/10046.md deleted file mode 100644 index d9a87429b162..000000000000 --- a/news/3 Code Health/10046.md +++ /dev/null @@ -1 +0,0 @@ -Update version of `VSCode` in `package.json` to `1.42`. diff --git a/news/3 Code Health/10049.md b/news/3 Code Health/10049.md deleted file mode 100644 index 8db350b7860d..000000000000 --- a/news/3 Code Health/10049.md +++ /dev/null @@ -1 +0,0 @@ -Change select kernel telemetry to track duration till quick pick appears. \ No newline at end of file diff --git a/news/3 Code Health/6911.md b/news/3 Code Health/6911.md deleted file mode 100644 index f7a40ecad97d..000000000000 --- a/news/3 Code Health/6911.md +++ /dev/null @@ -1 +0,0 @@ -Use the new VS Code filesystem API as much as possible. diff --git a/news/3 Code Health/8869.md b/news/3 Code Health/8869.md deleted file mode 100644 index ef4e21f338c6..000000000000 --- a/news/3 Code Health/8869.md +++ /dev/null @@ -1 +0,0 @@ -Display `Commands` related to `Interactive Window` and `Notebooks` only when necessary. diff --git a/news/3 Code Health/9341.md b/news/3 Code Health/9341.md deleted file mode 100644 index 26540c40e8a7..000000000000 --- a/news/3 Code Health/9341.md +++ /dev/null @@ -1 +0,0 @@ -Change cursor styles of buttons `pointer` in `Interactive Window` and `Native Editor`. diff --git a/news/3 Code Health/9765.md b/news/3 Code Health/9765.md deleted file mode 100644 index 51532dde1d80..000000000000 --- a/news/3 Code Health/9765.md +++ /dev/null @@ -1 +0,0 @@ -Update Jedi to 0.16.0 \ No newline at end of file diff --git a/news/3 Code Health/9819.md b/news/3 Code Health/9819.md deleted file mode 100644 index 76445586b312..000000000000 --- a/news/3 Code Health/9819.md +++ /dev/null @@ -1 +0,0 @@ -Add telemetry to track notebook languages \ No newline at end of file diff --git a/news/3 Code Health/9883.md b/news/3 Code Health/9883.md deleted file mode 100644 index bf4fc2168a21..000000000000 --- a/news/3 Code Health/9883.md +++ /dev/null @@ -1 +0,0 @@ -Telemetry around kernels not working and installs not working. \ No newline at end of file diff --git a/news/3 Code Health/README.md b/news/3 Code Health/README.md deleted file mode 100644 index 10619f41f3a4..000000000000 --- a/news/3 Code Health/README.md +++ /dev/null @@ -1 +0,0 @@ -Changes that should not be user-facing. diff --git a/news/README.md b/news/README.md deleted file mode 100644 index 24363e76037e..000000000000 --- a/news/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# News - -Our changelog is automatically generated from individual news entry files. -This alleviates the burden of having to go back and try to figure out -what changed in a release. It also helps tie pull requests back to the -issue(s) it addresses. Finally, it avoids merge conflicts between pull requests -which would occur if multiple pull requests tried to edit the changelog. - -If a change does not warrant a news entry, the `skip news` label can be added -to a pull request to signal this fact. - -## Entries - -Each news entry is represented by a Markdown file that contains the -relevant details of what changed. The file name of the news entry is -the issue that corresponds to the change along with an optional nonce in -case a single issue corresponds to multiple changes. The directory -the news entry is saved in specifies what section of the changelog the -change corresponds to. External contributors should also make sure to -thank themselves for taking the time and effort to contribute. - -As an example, a change corresponding to a bug reported in issue #42 -would be saved in the `1 Fixes` directory and named `42.md` -(or `42-nonce_value.md` if there was a need for multiple entries -regarding issue #42) and could contain the following: - -```markdown -[Answer](https://en.wikipedia.org/wiki/42_(number)) -to the Ultimate Question of Life, the Universe, and Everything! -(thanks [Don Jaymanne](https://github.com/donjayamanne/)) -``` - -This would then be made into an entry in the changelog that was in the -`Fixes` section, contained the details as found in the file, and tied -to issue #42. - -## Generating the changelog - -The `announce` script can do 3 possible things: - -1. Validate that the changelog _could_ be successfully generated -2. Generate the changelog entries -3. Generate the changelog entries **and** `git-rm` the news entry files - -The first option is used in CI to make sure any added news entries -will not cause trouble at release time. The second option is for -filling in the changelog for interim releases, e.g. a beta release. -The third option is for final releases that get published to the -[VS Code marketplace](https://marketplace.visualstudio.com/VSCode). - -For options 2 & 3, the changelog is sent to stdout so it can be temporarily -saved to a file: - -```sh -python3 news > entry.txt -``` - -It can also be redirected to an editor buffer, e.g.: - -```sh -python3 news | code-insiders - -``` diff --git a/news/__main__.py b/news/__main__.py deleted file mode 100644 index b496ec1d0c8c..000000000000 --- a/news/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import runpy - -runpy.run_module('announce', run_name='__main__', alter_sys=True) diff --git a/news/announce.py b/news/announce.py deleted file mode 100644 index d4d7dd1cfd66..000000000000 --- a/news/announce.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -"""Generate the changelog. - -Usage: announce [--dry_run | --interim | --final] [--update=] [] - -""" -import dataclasses -import datetime -import enum -import json -import operator -import os -import pathlib -import re -import subprocess -import sys - -import docopt - - -FILENAME_RE = re.compile(r"(?P\d+)(?P-\S+)?\.md") - - -@dataclasses.dataclass -class NewsEntry: - """Representation of a news entry.""" - - issue_number: int - description: str - path: pathlib.Path - - -def news_entries(directory): - """Yield news entries in the directory. - - Entries are sorted by issue number. - - """ - entries = [] - for path in directory.iterdir(): - if path.name == "README.md": - continue - match = FILENAME_RE.match(path.name) - if match is None: - raise ValueError(f"{path} has a bad file name") - issue = int(match.group("issue")) - try: - entry = path.read_text("utf-8") - except UnicodeDecodeError as exc: - raise ValueError(f"'{path}' is not encoded as UTF-8") from exc - if "\ufeff" in entry: - raise ValueError(f"'{path}' contains the BOM") - entries.append(NewsEntry(issue, entry, path)) - entries.sort(key=operator.attrgetter("issue_number")) - yield from entries - - -@dataclasses.dataclass -class SectionTitle: - """Create a data object for a section of the changelog.""" - - index: int - title: str - path: pathlib.Path - - -def sections(directory): - """Yield the sections in their appropriate order.""" - found = [] - for path in directory.iterdir(): - if not path.is_dir() or path.name.startswith((".", "_")): - continue - position, sep, title = path.name.partition(" ") - if not sep: - print( - f"directory {path.name!r} is missing a ranking; skipping", - file=sys.stderr, - ) - continue - found.append(SectionTitle(int(position), title, path)) - return sorted(found, key=operator.attrgetter("index")) - - -def gather(directory): - """Gather all the entries together.""" - data = [] - for section in sections(directory): - data.append((section, list(news_entries(section.path)))) - return data - - -def entry_markdown(entry): - """Generate the Markdown for the specified entry.""" - enumerated_item = "1. " - indent = " " * len(enumerated_item) - issue_url = ( - f"https://github.com/Microsoft/vscode-python/issues/{entry.issue_number}" - ) - issue_md = f"([#{entry.issue_number}]({issue_url}))" - entry_lines = entry.description.strip().splitlines() - formatted_lines = [f"{enumerated_item}{entry_lines[0]}"] - formatted_lines.extend(f"{indent}{line}" for line in entry_lines[1:]) - formatted_lines.append(f"{indent}{issue_md}") - return "\n".join(formatted_lines) - - -def changelog_markdown(data): - """Generate the Markdown for the release.""" - changelog = [] - for section, entries in data: - changelog.append(f"### {section.title}") - changelog.append("") - changelog.extend(map(entry_markdown, entries)) - changelog.append("") - return "\n".join(changelog) - - -def git_rm(path): - """Run git-rm on the path.""" - status = subprocess.run( - ["git", "rm", os.fspath(path.resolve())], - shell=False, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) - try: - status.check_returncode() - except Exception: - print(status.stdout, file=sys.stderr) - raise - - -def cleanup(data): - """Remove news entries from git and disk.""" - for section, entries in data: - for entry in entries: - git_rm(entry.path) - - -class RunType(enum.Enum): - """Possible run-time options.""" - - dry_run = 0 - interim = 1 - final = 2 - - -def complete_news(version, entry, previous_news): - """Prepend a news entry to the previous news file.""" - title, _, previous_news = previous_news.partition("\n") - title = title.strip() - previous_news = previous_news.strip() - section_title = (f"## {version} ({datetime.date.today().strftime('%d %B %Y')})" - ).replace("(0", "(") - # TODO: Insert the "Thank you!" section (in monthly releases)? - return f"{title}\n\n{section_title}\n\n{entry.strip()}\n\n\n{previous_news}" - - -def main(run_type, directory, news_file=None): - directory = pathlib.Path(directory) - data = gather(directory) - markdown = changelog_markdown(data) - if news_file: - with open(news_file, "r", encoding="utf-8") as file: - previous_news = file.read() - package_config_path = pathlib.Path(news_file).parent / "package.json" - config = json.loads(package_config_path.read_text()) - new_news = complete_news(config["version"], markdown, previous_news) - if run_type == RunType.dry_run: - print(f"would be written to {news_file}:") - print() - print(new_news) - else: - with open(news_file, "w", encoding="utf-8") as file: - file.write(new_news) - else: - print(markdown) - if run_type == RunType.final: - cleanup(data) - - -if __name__ == "__main__": - arguments = docopt.docopt(__doc__) - for possible_run_type in RunType: - if arguments[f"--{possible_run_type.name}"]: - run_type = possible_run_type - break - else: - run_type = RunType.interim - directory = arguments[""] or pathlib.Path(__file__).parent - main(run_type, directory, arguments["--update"]) diff --git a/news/requirements.in b/news/requirements.in deleted file mode 100644 index ab0e1cc5187e..000000000000 --- a/news/requirements.in +++ /dev/null @@ -1,2 +0,0 @@ -docopt -pytest diff --git a/news/requirements.txt b/news/requirements.txt deleted file mode 100644 index 676ca35073cf..000000000000 --- a/news/requirements.txt +++ /dev/null @@ -1,20 +0,0 @@ -# -# This file is autogenerated by pip-compile -# To update, run: -# -# pip-compile -# -atomicwrites==1.3.0 # via pytest -attrs==19.3.0 # via pytest -colorama==0.4.1 # via pytest -docopt==0.6.2 -importlib-metadata==1.1.0 # via pluggy, pytest -more-itertools==8.0.0 # via pytest, zipp -packaging==19.2 # via pytest -pluggy==0.13.1 # via pytest -py==1.8.0 # via pytest -pyparsing==2.4.5 # via packaging -pytest==5.3.1 -six==1.13.0 # via packaging -wcwidth==0.1.7 # via pytest -zipp==0.6.0 # via importlib-metadata diff --git a/news/test_announce.py b/news/test_announce.py deleted file mode 100644 index acc125a7c360..000000000000 --- a/news/test_announce.py +++ /dev/null @@ -1,208 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import codecs -import datetime -import pathlib - -import docopt -import pytest - -import announce as ann - - -@pytest.fixture -def directory(tmpdir): - """Fixture to create a temp directory wrapped in a pathlib.Path object.""" - return pathlib.Path(tmpdir) - - -def test_news_entry_formatting(directory): - issue = 42 - normal_entry = directory / f"{issue}.md" - nonce_entry = directory / f"{issue}-nonce.md" - body = "Hello, world!" - normal_entry.write_text(body, encoding="utf-8") - nonce_entry.write_text(body, encoding="utf-8") - results = list(ann.news_entries(directory)) - assert len(results) == 2 - for result in results: - assert result.issue_number == issue - assert result.description == body - - -def test_news_entry_sorting(directory): - oldest_entry = directory / "45.md" - newest_entry = directory / "123.md" - oldest_entry.write_text("45", encoding="utf-8") - newest_entry.write_text("123", encoding="utf-8") - results = list(ann.news_entries(directory)) - assert len(results) == 2 - assert results[0].issue_number == 45 - assert results[1].issue_number == 123 - - -def test_only_utf8(directory): - entry = directory / "42.md" - entry.write_text("Hello, world", encoding="utf-16") - with pytest.raises(ValueError): - list(ann.news_entries(directory)) - - -def test_no_bom_allowed(directory): - entry = directory / "42.md" - entry.write_bytes(codecs.BOM_UTF8 + "Hello, world".encode("utf-8")) - with pytest.raises(ValueError): - list(ann.news_entries(directory)) - - -def test_bad_news_entry_file_name(directory): - entry = directory / "bunk.md" - entry.write_text("Hello, world!") - with pytest.raises(ValueError): - list(ann.news_entries(directory)) - - -def test_news_entry_README_skipping(directory): - entry = directory / "README.md" - entry.write_text("Hello, world!") - assert len(list(ann.news_entries(directory))) == 0 - - -def test_sections_sorting(directory): - dir2 = directory / "2 Hello" - dir1 = directory / "1 World" - dir2.mkdir() - dir1.mkdir() - results = list(ann.sections(directory)) - assert [found.title for found in results] == ["World", "Hello"] - - -def test_sections_naming(directory): - (directory / "Hello").mkdir() - assert not ann.sections(directory) - - -def test_gather(directory): - fixes = directory / "2 Fixes" - fixes.mkdir() - fix1 = fixes / "1.md" - fix1.write_text("Fix 1", encoding="utf-8") - fix2 = fixes / "3.md" - fix2.write_text("Fix 2", encoding="utf-8") - enhancements = directory / "1 Enhancements" - enhancements.mkdir() - enhancement1 = enhancements / "2.md" - enhancement1.write_text("Enhancement 1", encoding="utf-8") - enhancement2 = enhancements / "4.md" - enhancement2.write_text("Enhancement 2", encoding="utf-8") - results = ann.gather(directory) - assert len(results) == 2 - section, entries = results[0] - assert section.title == "Enhancements" - assert len(entries) == 2 - assert entries[0].description == "Enhancement 1" - assert entries[1].description == "Enhancement 2" - section, entries = results[1] - assert len(entries) == 2 - assert section.title == "Fixes" - assert entries[0].description == "Fix 1" - assert entries[1].description == "Fix 2" - - -def test_entry_markdown(): - markdown = ann.entry_markdown(ann.NewsEntry(42, "Hello, world!", None)) - assert "42" in markdown - assert "Hello, world!" in markdown - assert "https://github.com/Microsoft/vscode-python/issues/42" in markdown - - -def test_changelog_markdown(): - data = [ - ( - ann.SectionTitle(1, "Enhancements", None), - [ - ann.NewsEntry(2, "Enhancement 1", None), - ann.NewsEntry(4, "Enhancement 2", None), - ], - ), - ( - ann.SectionTitle(1, "Fixes", None), - [ann.NewsEntry(1, "Fix 1", None), ann.NewsEntry(3, "Fix 2", None)], - ), - ] - markdown = ann.changelog_markdown(data) - assert "### Enhancements" in markdown - assert "### Fixes" in markdown - assert "1" in markdown - assert "Fix 1" in markdown - assert "2" in markdown - assert "Enhancement 1" in markdown - assert "https://github.com/Microsoft/vscode-python/issues/2" in markdown - assert "3" in markdown - assert "Fix 2" in markdown - assert "https://github.com/Microsoft/vscode-python/issues/3" in markdown - assert "4" in markdown - assert "Enhancement 2" in markdown - - -def test_cleanup(directory, monkeypatch): - rm_path = None - - def fake_git_rm(path): - nonlocal rm_path - rm_path = path - - monkeypatch.setattr(ann, "git_rm", fake_git_rm) - fixes = directory / "2 Fixes" - fixes.mkdir() - fix1 = fixes / "1.md" - fix1.write_text("Fix 1", encoding="utf-8") - results = ann.gather(directory) - assert len(results) == 1 - ann.cleanup(results) - section, entries = results.pop() - assert len(entries) == 1 - assert rm_path == entries[0].path - - -TITLE = "# Our most excellent changelog" -OLD_NEWS = f"""\ -## 2018.12.0 (31 Dec 2018) - -We did things! - -## 2017.11.16 (16 Nov 2017) - -We started going stuff. -""" -NEW_NEWS = """\ -We fixed all the things! - -### Code Health - -We deleted all the code to fix all the things. ;) -""" - - -def test_complete_news(): - version = "2019.3.0" - # Remove leading `0`. - date = datetime.date.today().strftime("%d %B %Y").lstrip("0") - news = ann.complete_news(version, NEW_NEWS, f"{TITLE}\n\n\n{OLD_NEWS}") - expected = f"{TITLE}\n\n## {version} ({date})\n\n{NEW_NEWS.strip()}\n\n\n{OLD_NEWS.strip()}" - assert news == expected - - -def test_cli(): - for option in ("--" + opt for opt in ["dry_run", "interim", "final"]): - args = docopt.docopt(ann.__doc__, [option]) - assert args[option] - args = docopt.docopt(ann.__doc__, ["./news"]) - assert args[""] == "./news" - args = docopt.docopt(ann.__doc__, ["--dry_run", "./news"]) - assert args["--dry_run"] - assert args[""] == "./news" - args = docopt.docopt(ann.__doc__, ["--update", "CHANGELOG.md", "./news"]) - assert args["--update"] == "CHANGELOG.md" - assert args[""] == "./news" diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 000000000000..3991ee8c025a --- /dev/null +++ b/noxfile.py @@ -0,0 +1,161 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import pathlib +import nox +import shutil +import sys +import sysconfig +import uuid + +EXT_ROOT = pathlib.Path(__file__).parent + + +def delete_dir(path: pathlib.Path, ignore_errors=None): + attempt = 0 + known = [] + while attempt < 5: + try: + shutil.rmtree(os.fspath(path), ignore_errors=ignore_errors) + return + except PermissionError as pe: + if os.fspath(pe.filename) in known: + break + print(f"Changing permissions on {pe.filename}") + os.chmod(pe.filename, 0o666) + + shutil.rmtree(os.fspath(path)) + + +@nox.session() +def install_python_libs(session: nox.Session): + requirements = [ + ("./python_files/lib/python", "./requirements.txt"), + ( + "./python_files/lib/jedilsp", + "./python_files/jedilsp_requirements/requirements.txt", + ), + ] + for target, file in requirements: + session.install( + "-t", + target, + "--no-cache-dir", + "--implementation", + "py", + "--no-deps", + "--require-hashes", + "--only-binary", + ":all:", + "-r", + file, + ) + + session.install("packaging") + session.install("debugpy") + + # Download get-pip script + session.run( + "python", + "./python_files/download_get_pip.py", + env={"PYTHONPATH": "./python_files/lib/temp"}, + ) + + if pathlib.Path("./python_files/lib/temp").exists(): + shutil.rmtree("./python_files/lib/temp") + + +@nox.session() +def native_build(session: nox.Session): + source_dir = pathlib.Path(pathlib.Path.cwd() / "python-env-tools").resolve() + dest_dir = pathlib.Path(pathlib.Path.cwd() / "python-env-tools").resolve() + + with session.cd(source_dir): + if not pathlib.Path(dest_dir / "bin").exists(): + pathlib.Path(dest_dir / "bin").mkdir() + + if not pathlib.Path(dest_dir / "bin" / ".gitignore").exists(): + pathlib.Path(dest_dir / "bin" / ".gitignore").write_text( + "*\n", encoding="utf-8" + ) + + ext = sysconfig.get_config_var("EXE") or "" + target = os.environ.get("CARGO_TARGET", None) + + session.run("cargo", "fetch", external=True) + if target: + session.run( + "cargo", + "build", + "--frozen", + "--release", + "--target", + target, + external=True, + ) + source = source_dir / "target" / target / "release" / f"pet{ext}" + else: + session.run( + "cargo", + "build", + "--frozen", + "--release", + external=True, + ) + source = source_dir / "target" / "release" / f"pet{ext}" + dest = dest_dir / "bin" / f"pet{ext}" + shutil.copy(source, dest) + + # Remove python-env-tools/bin exclusion from .vscodeignore + vscode_ignore = EXT_ROOT / ".vscodeignore" + remove_patterns = ("python-env-tools/bin/**",) + lines = vscode_ignore.read_text(encoding="utf-8").splitlines() + filtered_lines = [line for line in lines if not line.startswith(remove_patterns)] + vscode_ignore.write_text("\n".join(filtered_lines) + "\n", encoding="utf-8") + + +@nox.session() +def checkout_native(session: nox.Session): + dest = (pathlib.Path.cwd() / "python-env-tools").resolve() + if dest.exists(): + shutil.rmtree(os.fspath(dest)) + + temp_dir = os.getenv("TEMP") or os.getenv("TMP") or "/tmp" + temp_dir = pathlib.Path(temp_dir) / str(uuid.uuid4()) / "python-env-tools" + temp_dir.mkdir(0o766, parents=True) + + session.log(f"Cloning python-environment-tools to {temp_dir}") + try: + with session.cd(temp_dir): + session.run("git", "init", external=True) + session.run( + "git", + "remote", + "add", + "origin", + "https://github.com/microsoft/python-environment-tools", + external=True, + ) + session.run("git", "fetch", "origin", "main", external=True) + session.run( + "git", "checkout", "--force", "-B", "main", "origin/main", external=True + ) + delete_dir(temp_dir / ".git") + delete_dir(temp_dir / ".github") + delete_dir(temp_dir / ".vscode") + (temp_dir / "CODE_OF_CONDUCT.md").unlink() + shutil.move(os.fspath(temp_dir), os.fspath(dest)) + except PermissionError as e: + print(f"Permission error: {e}") + if not dest.exists(): + raise + finally: + delete_dir(temp_dir.parent, ignore_errors=True) + + +@nox.session() +def setup_repo(session: nox.Session): + install_python_libs(session) + checkout_native(session) + native_build(session) diff --git a/package-lock.json b/package-lock.json index 1423517a5bc2..6de6edae81c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14956 +1,19934 @@ { "name": "python", - "version": "2020.3.0-dev", - "lockfileVersion": 1, + "version": "2026.5.0-dev", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/cli": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.5.0.tgz", - "integrity": "sha512-qNH55fWbKrEsCwID+Qc/3JDPnsSGpIIiMDbppnR8Z6PxLAqMQCFNqBctkIkBrMH49Nx+qqVTrHRWUR+ho2k+qQ==", + "packages": { + "": { + "name": "python", + "version": "2026.5.0-dev", + "license": "MIT", + "dependencies": { + "@iarna/toml": "^3.0.0", + "@vscode/extension-telemetry": "^0.8.4", + "arch": "^2.1.0", + "fs-extra": "^11.2.0", + "glob": "^7.2.0", + "iconv-lite": "^0.6.3", + "inversify": "^6.0.2", + "jsonc-parser": "^3.0.0", + "lodash": "^4.18.1", + "minimatch": "^5.1.8", + "named-js-regexp": "^1.3.3", + "node-stream-zip": "^1.6.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^6.5.4", + "rxjs-compat": "^6.5.4", + "semver": "^7.5.2", + "stack-trace": "0.0.10", + "sudo-prompt": "^9.2.1", + "tmp": "^0.2.5", + "uint64be": "^3.0.0", + "unicode": "^14.0.0", + "vscode-debugprotocol": "^1.28.0", + "vscode-jsonrpc": "^9.0.0-next.5", + "vscode-languageclient": "^10.0.0-next.12", + "vscode-languageserver-protocol": "^3.17.6-next.10", + "vscode-tas-client": "^0.1.84", + "which": "^2.0.2", + "winreg": "^1.2.4", + "xml2js": "^0.5.0" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@types/bent": "^7.3.0", + "@types/chai": "^4.1.2", + "@types/chai-arrays": "^2.0.0", + "@types/chai-as-promised": "^7.1.0", + "@types/download": "^8.0.1", + "@types/fs-extra": "^11.0.4", + "@types/glob": "^7.2.0", + "@types/lodash": "^4.14.104", + "@types/mocha": "^9.1.0", + "@types/node": "^22.19.1", + "@types/semver": "^5.5.0", + "@types/shortid": "^0.0.29", + "@types/sinon": "^17.0.3", + "@types/stack-trace": "0.0.29", + "@types/tmp": "^0.0.33", + "@types/vscode": "^1.95.0", + "@types/which": "^2.0.1", + "@types/winreg": "^1.2.30", + "@types/xml2js": "^0.4.2", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vscode/test-electron": "^2.3.8", + "@vscode/vsce": "^2.27.0", + "bent": "^7.3.12", + "chai": "^4.1.2", + "chai-arrays": "^2.0.0", + "chai-as-promised": "^7.1.1", + "copy-webpack-plugin": "^9.1.0", + "cross-env": "^7.0.3", + "cross-spawn": "^6.0.5", + "del": "^6.0.0", + "download": "^8.0.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.0", + "expose-loader": "^3.1.0", + "flat": "^5.0.2", + "get-port": "^5.1.1", + "gulp": "^5.0.0", + "gulp-typescript": "^5.0.0", + "mocha": "^11.1.0", + "mocha-junit-reporter": "^2.0.2", + "mocha-multi-reporters": "^1.1.7", + "node-has-native-dependencies": "^1.0.2", + "node-loader": "^1.0.2", + "node-polyfill-webpack-plugin": "^1.1.4", + "nyc": "^15.0.0", + "prettier": "^2.0.2", + "rewiremock": "^3.13.0", + "shortid": "^2.2.8", + "sinon": "^18.0.0", + "source-map-support": "^0.5.12", + "ts-loader": "^9.2.8", + "ts-mockito": "^2.5.0", + "ts-node": "^10.7.0", + "tsconfig-paths-webpack-plugin": "^3.2.0", + "typemoq": "^2.1.0", + "typescript": "~5.2", + "uuid": "^8.3.2", + "webpack": "^5.105.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.9.2", + "webpack-fix-default-import-plugin": "^1.0.3", + "webpack-merge": "^5.8.0", + "webpack-node-externals": "^3.0.0", + "webpack-require-from": "^1.8.6", + "worker-loader": "^3.0.8", + "yargs": "^15.3.1" + }, + "engines": { + "vscode": "^1.95.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "requires": { - "chokidar": "^2.0.4", - "commander": "^2.8.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.11", - "mkdirp": "^0.5.1", - "output-file-sync": "^2.0.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/core": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.4.tgz", - "integrity": "sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/helpers": "^7.5.4", - "@babel/parser": "^7.5.0", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/abort-controller/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/core-auth": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz", - "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==", + "node_modules/@azure/core-auth/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dev": true, - "requires": { - "@babel/types": "^7.5.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "node_modules/@azure/core-client/node_modules/@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0", - "esutils": "^2.0.0" + "node_modules/@azure/core-client/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "node_modules/@azure/core-tracing/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/core-util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "node_modules/@azure/core-util/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/identity": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.2.1.tgz", + "integrity": "sha512-U8hsyC9YPcEIzoaObJlRDvp7KiF0MGS7xcWbyJSVvXRkC/HXo1f0oYeBYmEvVgRfacw7GHf6D6yAoh9JHz6A5Q==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.4.0", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "node_modules/@azure/identity/node_modules/@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "node_modules/@azure/identity/node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dev": true, - "requires": { - "@babel/types": "^7.4.4" + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "node_modules/@azure/identity/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "node_modules/@azure/logger/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/msal-browser": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.14.0.tgz", + "integrity": "sha512-Un85LhOoecJ3HDTS3Uv3UWnXC9/43ZSO+Kc+anSqpZvcEt58SiO/3DuVCAe1A3I5UIBYJNMgTmZPGXQ0MVYrwA==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@azure/msal-common": "14.10.0" + }, + "engines": { + "node": ">=0.8.0" } }, - "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "node_modules/@azure/msal-common": { + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.10.0.tgz", + "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "engines": { + "node": ">=0.8.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "node_modules/@azure/msal-node": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@azure/msal-common": "14.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" } }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", "dev": true, - "requires": { - "lodash": "^4.17.11" + "engines": { + "node": ">=0.8.0" } }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz", + "integrity": "sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==", + "dependencies": { + "@azure/core-tracing": "^1.0.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/instrumentation": "^0.41.2", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "node_modules/@babel/core": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", + "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", "dev": true, - "requires": { - "@babel/types": "^7.4.4" + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.6", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@babel/helpers": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.4.tgz", - "integrity": "sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow==", + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0" + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - } + "yallist": "^3.0.2" } }, - "@babel/parser": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz", - "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz", - "integrity": "sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA==", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "node_modules/@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "node_modules/@babel/runtime-corejs3": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz", + "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", - "@babel/helper-split-export-declaration": "^7.4.4", - "globals": "^11.1.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">= 12" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">=10.0.0" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } + "license": "Python-2.0" }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } + "license": "MIT" }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "requires": { - "regexp-tree": "^0.1.6" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "node_modules/@gulpjs/messages": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", + "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "engines": { + "node": ">=10.13.0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "node_modules/@gulpjs/to-absolute-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", + "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "dependencies": { + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } + "license": "MIT" }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } + "license": "BSD-3-Clause" }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "node_modules/@iarna/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", + "license": "ISC" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-transform-runtime": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.0.tgz", - "integrity": "sha512-LmPIZOAgTLl+86gR9KjLXex6P/lRz1fWEjTz6V6QZMmKie51ja3tvzdwORqhHc4RWR8TcZ5pClpRWs0mlaA2ng==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } + "license": "MIT" }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/polyfill": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", - "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "node_modules/@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.2" - }, "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - } + "@istanbuljs/schema": "^0.1.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15" } }, - "@babel/preset-env": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.4.tgz", - "integrity": "sha512-hFnFnouyRNiH1rL8YkX1ANCNAUVC8Djwdqfev8i1415tnAG+7hlA5zhZ0Q/3Q5gkop4HioIPbCEWAalqcbxRoQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.0", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" + "engines": { + "node": ">=8" } }, - "@babel/register": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", - "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "requires": { - "core-js": "^3.0.0", - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.11", - "mkdirp": "^0.5.1", - "pirates": "^4.0.0", - "source-map-support": "^0.5.9" - }, "dependencies": { - "core-js": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", - "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", - "dev": true - } + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/runtime": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", - "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" + "engines": { + "node": ">=6.0.0" } }, - "@babel/runtime-corejs2": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.4.tgz", - "integrity": "sha512-sHv74OzyZ18d6tjHU0HmlVES3+l+lydkOMTiKsJSTGWcTBpIMfXLEgduahlJrQjknW9RCQAqLIEdLOHjBmq/hg==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "@babel/traverse": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz", - "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.0", - "@babel/types": "^7.5.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@babel/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz", - "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, + "node_modules/@microsoft/1ds-core-js": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.13.tgz", + "integrity": "sha512-CluYTRWcEk0ObG5EWFNWhs87e2qchJUn0p2D21ZUa3PWojPZfPSBs4//WIE0MYV8Qg1Hdif2ZTwlM7TbYUjfAg==", "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - } + "@microsoft/applicationinsights-core-js": "2.8.15", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, - "@blueprintjs/core": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-3.22.3.tgz", - "integrity": "sha512-IaxkvJyF+4VCvAjMvyHtJ4qUiQNwgPu4zIxLRo1cBsu30gHjYzwe+xDdssBR7yRnXARguM6bkI523w+yJOerCA==", - "dev": true, - "requires": { - "@blueprintjs/icons": "^3.12.0", - "@types/dom4": "^2.0.1", - "classnames": "^2.2", - "dom4": "^2.1.5", - "normalize.css": "^8.0.1", - "popper.js": "^1.15.0", - "react-lifecycles-compat": "^3.0.4", - "react-popper": "^1.3.7", - "react-transition-group": "^2.9.0", - "resize-observer-polyfill": "^1.5.1", - "tslib": "~1.9.0" - }, + "node_modules/@microsoft/1ds-post-js": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.13.tgz", + "integrity": "sha512-HgS574fdD19Bo2vPguyznL4eDw7Pcm1cVNpvbvBLWiW3x4e1FCQ3VMXChWnAxCae8Hb0XqlA2sz332ZobBavTA==", "dependencies": { - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } + "@microsoft/1ds-core-js": "3.2.13", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, - "@blueprintjs/icons": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.13.0.tgz", - "integrity": "sha512-fvXGsAJ66SSjeHv3OeXjLEdKdPJ3wVztjhJQCAd51uebhj3FJ16EDDvO7BqBw5FyVkLkU11KAxSoCFZt7TC9GA==", - "dev": true, - "requires": { - "classnames": "^2.2", - "tslib": "~1.9.0" - }, + "node_modules/@microsoft/applicationinsights-channel-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.0.2.tgz", + "integrity": "sha512-jDBNKbCHsJgmpv0CKNhJ/uN9ZphvfGdb93Svk+R4LjO8L3apNNMbDDPxBvXXi0uigRmA1TBcmyBG4IRKjabGhw==", "dependencies": { - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } + "@microsoft/applicationinsights-common": "3.0.2", + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" } }, - "@blueprintjs/select": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@blueprintjs/select/-/select-3.11.2.tgz", - "integrity": "sha512-fU0Km6QI/ayWhzYeu9N1gTj0+L0XUO4KB3u2LfJXgj648UGY8F4HX2ETdJ+XPdtsu6TesrIL7ghMQhtLcvafBg==", - "dev": true, - "requires": { - "@blueprintjs/core": "^3.20.0", - "classnames": "^2.2", - "tslib": "~1.9.0" - }, + "node_modules/@microsoft/applicationinsights-channel-js/node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", "dependencies": { - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" } }, - "@emotion/babel-utils": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/@emotion/babel-utils/-/babel-utils-0.6.10.tgz", - "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==", - "dev": true, - "requires": { - "@emotion/hash": "^0.6.6", - "@emotion/memoize": "^0.6.6", - "@emotion/serialize": "^0.9.1", - "convert-source-map": "^1.5.1", - "find-root": "^1.1.0", - "source-map": "^0.7.2" - }, + "node_modules/@microsoft/applicationinsights-channel-js/node_modules/@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" } }, - "@emotion/hash": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", - "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==", - "dev": true + "node_modules/@microsoft/applicationinsights-channel-js/node_modules/@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, - "@emotion/memoize": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", - "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==", - "dev": true + "node_modules/@microsoft/applicationinsights-common": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.0.2.tgz", + "integrity": "sha512-y+WXWop+OVim954Cu1uyYMnNx6PWO8okHpZIQi/1YSqtqaYdtJVPv4P0AVzwJdohxzVfgzKvqj9nec/VWqE2Zg==", + "dependencies": { + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" + } }, - "@emotion/serialize": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.9.1.tgz", - "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==", - "dev": true, - "requires": { - "@emotion/hash": "^0.6.6", - "@emotion/memoize": "^0.6.6", - "@emotion/unitless": "^0.6.7", - "@emotion/utils": "^0.8.2" + "node_modules/@microsoft/applicationinsights-common/node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", + "dependencies": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" } }, - "@emotion/stylis": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz", - "integrity": "sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ==", - "dev": true + "node_modules/@microsoft/applicationinsights-common/node_modules/@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, - "@emotion/unitless": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz", - "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==", - "dev": true + "node_modules/@microsoft/applicationinsights-common/node_modules/@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, - "@emotion/utils": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.8.2.tgz", - "integrity": "sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw==", - "dev": true + "node_modules/@microsoft/applicationinsights-core-js": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.15.tgz", + "integrity": "sha512-yYAs9MyjGr2YijQdUSN9mVgT1ijI1FPMgcffpaPmYbHAVbQmF7bXudrBWHxmLzJlwl5rfep+Zgjli2e67lwUqQ==", + "dependencies": { + "@microsoft/applicationinsights-shims": "2.0.2", + "@microsoft/dynamicproto-js": "^1.1.9" + }, + "peerDependencies": { + "tslib": "*" + } }, - "@enonic/fnv-plus": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@enonic/fnv-plus/-/fnv-plus-1.3.0.tgz", - "integrity": "sha512-BCN9uNWH8AmiP7BXBJqEinUY9KXalmRzo+L0cB/mQsmFfzODxwQrbvxCHXUNH2iP+qKkWYtB4vyy8N62PViMFw==", - "dev": true + "node_modules/@microsoft/applicationinsights-shims": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", + "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" + "node_modules/@microsoft/applicationinsights-web-basic": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.0.2.tgz", + "integrity": "sha512-6Lq0DE/pZp9RvSV+weGbcxN1NDmfczj6gNPhvZKV2YSQ3RK0LZE3+wjTWLXfuStq8a+nCBdsRpWk8tOKgsoxcg==", + "dependencies": { + "@microsoft/applicationinsights-channel-js": "3.0.2", + "@microsoft/applicationinsights-common": "3.0.2", + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" }, + "peerDependencies": { + "tslib": "*" + } + }, + "node_modules/@microsoft/applicationinsights-web-basic/node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" } }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - }, + "node_modules/@microsoft/applicationinsights-web-basic/node_modules/@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" } }, - "@icons/material": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", - "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", - "dev": true + "node_modules/@microsoft/applicationinsights-web-basic/node_modules/@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "node_modules/@microsoft/applicationinsights-web-snippet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", + "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" + }, + "node_modules/@microsoft/dynamicproto-js": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", + "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" + }, + "node_modules/@nevware21/ts-async": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.3.0.tgz", + "integrity": "sha512-ZUcgUH12LN/F6nzN0cYd0F/rJaMLmXr0EHVTyYfaYmK55bdwE4338uue4UiVoRqHVqNW4KDUrJc49iGogHKeWA==", "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "@nevware21/ts-utils": ">= 0.10.0 < 2.x" } }, - "@istanbuljs/nyc-config-typescript": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-0.1.3.tgz", - "integrity": "sha512-EzRFg92bRSD1W/zeuNkeGwph0nkWf+pP2l/lYW4/5hav7RjKKBN5kV1Ix7Tvi0CMu3pC4Wi/U7rNisiJMR3ORg==", - "dev": true + "node_modules/@nevware21/ts-utils": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.1.tgz", + "integrity": "sha512-pMny25NnF2/MJwdqC3Iyjm2pGIXNxni4AROpcqDeWa+td9JMUY4bUS9uU9XW+BoBRqTLUL+WURF9SOd/6OQzRg==" }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@jupyterlab/coreutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-3.1.0.tgz", - "integrity": "sha512-ZqgzDUyanyvc86gtCrIbc1M6iniKHYmWNWHvWOcnq3KIP3wk3grchsTYPTfQDxcUS6F04baPGp/KohEU2ml40Q==", - "requires": { - "@phosphor/commands": "^1.6.3", - "@phosphor/coreutils": "^1.3.1", - "@phosphor/disposable": "^1.2.0", - "@phosphor/properties": "^1.1.3", - "@phosphor/signaling": "^1.2.3", - "ajv": "^6.5.5", - "json5": "^2.1.0", - "minimist": "~1.2.0", - "moment": "^2.24.0", - "path-posix": "~1.0.0", - "url-parse": "~1.4.3" - } - }, - "@jupyterlab/observables": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@jupyterlab/observables/-/observables-2.4.0.tgz", - "integrity": "sha512-M/fhAnPqd6F4Zwt4IIsvHCkJmwbSw1Tko/hUXgdUQG86lPsJiTOh98sB3qwV1gtzb9oFF+kH21XsHnQZ6Yl6Pw==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/coreutils": "^1.3.1", - "@phosphor/disposable": "^1.3.0", - "@phosphor/messaging": "^1.3.0", - "@phosphor/signaling": "^1.3.0" - }, - "dependencies": { - "@phosphor/algorithm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.2.0.tgz", - "integrity": "sha512-C9+dnjXyU2QAkWCW6QVDGExk4hhwxzAKf5/FIuYlHAI9X5vFv99PYm0EREDxX1PbMuvfFBZhPNu0PvuSDQ7sFA==" - }, - "@phosphor/disposable": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.3.1.tgz", - "integrity": "sha512-0NGzoTXTOizWizK/brKKd5EjJhuuEH4903tLika7q6wl/u0tgneJlTh7R+MBVeih0iNxtuJAfBa3IEY6Qmj+Sw==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/signaling": "^1.3.1" - } - }, - "@phosphor/signaling": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.3.1.tgz", - "integrity": "sha512-Eq3wVCPQAhUd9+gUGaYygMr+ov7dhSGblSBXiDzpZlSIfa8OVD4P3cCvYXr/acDTNmZ/gHTcSFO8/n3rDkeXzg==", - "requires": { - "@phosphor/algorithm": "^1.2.0" - } - } + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "@jupyterlab/services": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@jupyterlab/services/-/services-4.2.0.tgz", - "integrity": "sha512-diqiWCYLROwZoeZ46hO4oCINQKr3S789GOA3drw5gDie18/u1nJcvegnY9Oo58xHINnKTs0rKZmFgTe2DvYgQg==", - "requires": { - "@jupyterlab/coreutils": "^3.2.0", - "@jupyterlab/observables": "^2.4.0", - "@phosphor/algorithm": "^1.2.0", - "@phosphor/coreutils": "^1.3.1", - "@phosphor/disposable": "^1.3.0", - "@phosphor/signaling": "^1.3.0", - "node-fetch": "^2.6.0", - "ws": "^7.0.0" + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz", + "integrity": "sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw==", "dependencies": { - "@jupyterlab/coreutils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-3.2.0.tgz", - "integrity": "sha512-LATiUsHuwze/h3JC2EZOBV+kGBoUKO3npqw/Pcgge4bz09xF/oTDrx4G8jl5eew3w1dCUNp9eLduNh8Orrw7xQ==", - "requires": { - "@phosphor/commands": "^1.7.0", - "@phosphor/coreutils": "^1.3.1", - "@phosphor/disposable": "^1.3.0", - "@phosphor/properties": "^1.1.3", - "@phosphor/signaling": "^1.3.0", - "ajv": "^6.5.5", - "json5": "^2.1.0", - "minimist": "~1.2.0", - "moment": "^2.24.0", - "path-posix": "~1.0.0", - "url-parse": "~1.4.3" - } - }, - "@phosphor/algorithm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.2.0.tgz", - "integrity": "sha512-C9+dnjXyU2QAkWCW6QVDGExk4hhwxzAKf5/FIuYlHAI9X5vFv99PYm0EREDxX1PbMuvfFBZhPNu0PvuSDQ7sFA==" - }, - "@phosphor/disposable": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.3.1.tgz", - "integrity": "sha512-0NGzoTXTOizWizK/brKKd5EjJhuuEH4903tLika7q6wl/u0tgneJlTh7R+MBVeih0iNxtuJAfBa3IEY6Qmj+Sw==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/signaling": "^1.3.1" - } - }, - "@phosphor/signaling": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.3.1.tgz", - "integrity": "sha512-Eq3wVCPQAhUd9+gUGaYygMr+ov7dhSGblSBXiDzpZlSIfa8OVD4P3cCvYXr/acDTNmZ/gHTcSFO8/n3rDkeXzg==", - "requires": { - "@phosphor/algorithm": "^1.2.0" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "ws": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", - "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", - "requires": { - "async-limiter": "^1.0.0" - } - } + "@opentelemetry/semantic-conventions": "1.15.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "@koa/cors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.0.0.tgz", - "integrity": "sha512-hDp+cXj6vTYSwHRJfiSpnf5dTMv3FmqNKh1or9BPJk4SHOviHnK9GoL9dT0ypt/E+hlkRkZ9edHylcosW3Ghrw==", - "requires": { - "vary": "^1.1.2" + "node_modules/@opentelemetry/instrumentation": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz", + "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==", + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.1", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "@loadable/component": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.12.0.tgz", - "integrity": "sha512-eDG7FPZ8tCFA/mqu2IrYV6eS+UxGBo21PwtEV9QpkpYrx25xKRXzJUm36yfQPK3o7jXu43xpPkwiU4mLWcjJlw==", - "requires": { - "@babel/runtime": "^7.7.7", - "hoist-non-react-statics": "^3.3.1" + "node_modules/@opentelemetry/resources": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz", + "integrity": "sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw==", + "dependencies": { + "@opentelemetry/core": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz", + "integrity": "sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ==", "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", - "requires": { - "react-is": "^16.7.0" - } - } + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "@mapbox/polylabel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/polylabel/-/polylabel-1.0.2.tgz", - "integrity": "sha1-xXFGGbZa3QgmOOoGAn5psUUA76Y=", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", + "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "requires": { - "tinyqueue": "^1.1.0" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" } }, - "@msrvida/python-program-analysis": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@msrvida/python-program-analysis/-/python-program-analysis-0.4.1.tgz", - "integrity": "sha512-8jCtPTTxXyvN3udvz71inScvFvQil7Wh61newdrq79CjuV0W634GCDGuyGpI5G+kgX9PbBZPQJTc1+BMNMB5sQ==" + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true }, - "@nteract/markdown": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nteract/markdown/-/markdown-3.0.1.tgz", - "integrity": "sha512-Dr79niruytzbcDsLLS5NoPIzvVJ3YkJX18O0hmZAmrVn2Ni8L5VW+ZymWsSgRBogDgrYQzhV4L1MmIC/X6rbUg==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/mathjax": "^3.0.1", - "babel-runtime": "^6.26.0", - "react-markdown": "^4.0.0" + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@nteract/mathjax": { + "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nteract/mathjax/-/mathjax-3.0.1.tgz", - "integrity": "sha512-jL4a2KjY9wzcg7dG3HvufKMXOk+FxWQ6BFH6p3fwJUerbf3SF6H/RlaLxuMgFP+Tv+sHVXo7FHTTTIIsRyuv8g==", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "@nteract/octicons": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@nteract/octicons/-/octicons-0.5.1.tgz", - "integrity": "sha512-7d42YfTbaiL2cF8txcQirDCNTbhmKfSoJSRlFMnEH11D0e0XUk/dxEWRGxxLrbP3SApY84hF/9uP3u1p6jqiAQ==", + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0" + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, - "@nteract/plotly": { - "version": "1.48.3", - "resolved": "https://registry.npmjs.org/@nteract/plotly/-/plotly-1.48.3.tgz", - "integrity": "sha512-1Km5MtjyUL9POZjU6LMzH/npFUYIC6vewH0Gd2Ua1FON3qN1KCRoJ8em5Gkp+K57QJRpMET1F4z4N9d3U9HOqA==", - "dev": true - }, - "@nteract/styled-blueprintjsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nteract/styled-blueprintjsx/-/styled-blueprintjsx-1.1.1.tgz", - "integrity": "sha512-y5HLOPqbjapP7918rpp0o6Y6a8ZGZyINFPUQYoOc7iN8KqIOrNvWnhMISgzGwmXv8T+wDZFycSOnPxDbH7tBUA==", + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0", - "styled-jsx": "^3.1.0" + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "@nteract/transform-dataresource": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@nteract/transform-dataresource/-/transform-dataresource-4.5.2.tgz", - "integrity": "sha512-48m/Xd14+vyNGp11qrnts9APKu8kSqZLaI+VJpgErZieakleESaVbleg4EiTlU6j/p7DvihBSKDTuFXuBOpyUA==", + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/octicons": "^0.5.1", - "@nteract/styled-blueprintjsx": "^1.1.1", - "@nteract/transform-plotly": "^3.2.5", - "d3-collection": "^1.0.7", - "d3-scale": "^2.1.2", - "d3-shape": "^1.2.2", - "d3-time-format": "^2.0.5", - "lodash": "^4.17.4", - "moment": "^2.18.1", - "numeral": "^2.0.6", - "react-color": "^2.14.1", - "react-hot-loader": "^4.1.2", - "react-table": "^6.8.6", - "react-table-hoc-fixed-columns": "1.0.2", - "semiotic": "^1.15.6", - "styled-jsx": "^3.1.0", - "tv4": "^1.3.0" - }, - "dependencies": { - "@nteract/transform-plotly": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@nteract/transform-plotly/-/transform-plotly-3.2.5.tgz", - "integrity": "sha512-tQi47Ly1b/YLNJWhUV8gKVkweJb6ugfGg4XylG2wnLVDoaM8ObJrHAtY74S+Kg9e88N8ExNPy9ulG2xhhSrMag==", - "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/plotly": "^1.0.0", - "babel-runtime": "^6.26.0", - "lodash": "^4.17.4" - } - } + "dependencies": { + "type-detect": "4.0.8" } }, - "@nteract/transform-geojson": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@nteract/transform-geojson/-/transform-geojson-3.2.5.tgz", - "integrity": "sha512-crP5yFXAFNgE8CQzwcvCbBkbcSdJhn7YruiYreo2gU48fbX8YXOXRMwFsk31jVcMqE9/fYh9zA9sHX38UjKg/w==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0", - "leaflet": "^1.0.3" + "engines": { + "node": ">= 6" } }, - "@nteract/transform-model-debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@nteract/transform-model-debug/-/transform-model-debug-3.2.5.tgz", - "integrity": "sha512-vmtuPfMuClpFo9j9LLX9EqwEkT8B6jrYUSO30YeG2Ct9G1fPlmvmGBtIJSgHv7Km3W4FlVvwglsenFBg/ff6Og==", + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/bent": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@types/bent/-/bent-7.3.3.tgz", + "integrity": "sha512-5NEIhVzHiZ6wMjFBmJ3gwjxwGug6amMoAn93rtDBttwrODxm+bt63u+MJA7H9NGGM4X1m73sJrAxDapktl036Q==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0" + "dependencies": { + "@types/node": "*" } }, - "@nteract/transform-plotly": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nteract/transform-plotly/-/transform-plotly-6.0.0.tgz", - "integrity": "sha512-RnKPL/UxY0slrXtsP/7ShqZAgXSQjohOVyQcXBXZzqaC3KSd+esJhHYtYzTK2obaLv4YZwjhlLupcVolslN03A==", + "node_modules/@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", + "dev": true + }, + "node_modules/@types/chai-arrays": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/chai-arrays/-/chai-arrays-2.0.0.tgz", + "integrity": "sha512-5h5jnAC9C64YnD7WJpA5gBG7CppF/QmoWytOssJ6ysENllW49NBdpsTx6uuIBOpnzAnXThb8jBICgB62wezTLQ==", "dev": true, - "requires": { - "lodash": "^4.17.4", - "plotly.js-dist": "^1.48.3" + "dependencies": { + "@types/chai": "*" } }, - "@nteract/transform-vdom": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@nteract/transform-vdom/-/transform-vdom-2.2.5.tgz", - "integrity": "sha512-q6FbWlrSEWUmQpDV1DBPcw5FZpUcQbKOQ2a59vY/qcQ/Qjh1KUCC+gortso+WIE4P36eHZRxKz5ptCu5i47OLg==", + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "babel-runtime": "^6.26.0", - "lodash": "^4.17.4" + "dependencies": { + "@types/chai": "*" } }, - "@nteract/transform-vega": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@nteract/transform-vega/-/transform-vega-6.0.3.tgz", - "integrity": "sha512-sUY9EeCguUfP3G6AI4yg0jUOT2r7eB1VvuQGxjGj0fyhWnYIZR3xv80/aq2J6iACSBxazV+rU2Ne4abWYy6nwQ==", + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/decompress": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.5.tgz", + "integrity": "sha512-LdL+kbcKGs9TzvB/K+OBGzPfDoP6gwwTsykYjodlzUJUUYp/43c1p1jE5YTtz3z4Ml90iruvBXbJ6+kDvb3WSQ==", "dev": true, - "requires": { - "@nteract/vega-embed-v2": "^1.1.0", - "@nteract/vega-embed-v3": "^1.1.1", - "lodash": "^4.17.4", - "vega": "^5.4.0", - "vega-embed": "^4.2.0", - "vega-lite": "^3.3.0" + "dependencies": { + "@types/node": "*" } }, - "@nteract/transforms": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@nteract/transforms/-/transforms-4.4.7.tgz", - "integrity": "sha512-G84BeBfzfdAg3cAV78ES9/yxe2ZNitg7j8MCKKx4iNS9vqeQbO92vyBsBW2D6qlddefU/RB5/HUvvtNUpd0ZRw==", + "node_modules/@types/download": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/download/-/download-8.0.3.tgz", + "integrity": "sha512-IDwXjU7zCtuFVvI0Plnb02TpXyj3RA4YeOKQvEfsjdJeWxZ9hTl6lxeNsU2bLWn0aeAS7fyMl74w/TbdOlS2KQ==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "@nteract/markdown": "^3.0.1", - "@nteract/mathjax": "^3.0.1", - "@nteract/transform-vdom": "^2.2.5", - "ansi-to-react": "^3.3.5", - "babel-runtime": "^6.26.0", - "react-json-tree": "^0.11.0" + "dependencies": { + "@types/decompress": "*", + "@types/got": "^9", + "@types/node": "*" } }, - "@nteract/vega-embed-v2": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nteract/vega-embed-v2/-/vega-embed-v2-1.1.0.tgz", - "integrity": "sha512-5sCymGk2qzb1BC8P8MTkD0L9rG/8gPb8jyQ2Fz5aqftblgZ+DooHNcR4oi4T49mhRv0zLjqstBwDxx5JmzNdtw==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "requires": { - "d3": "3.5.17", - "d3-cloud": "^1.2.5", - "datalib": "^1.9.1", - "json-stable-stringify": "^1.0.1" + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" } }, - "@nteract/vega-embed-v3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nteract/vega-embed-v3/-/vega-embed-v3-1.1.1.tgz", - "integrity": "sha512-tPMGmYI3aJIu4+HI03Rtub6yjCmACuvtVTjrq8+h2/OIgxBIrzaexo/QCdTKgV4bg0Pd88hskwZ8heqdMFDoHw==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "requires": { - "d3": "3.5.17", - "d3-cloud": "^1.2.5", - "d3-request": "^1.0.6", - "d3-scale-chromatic": "^1.3.3", - "datalib": "^1.9.1", - "json-stable-stringify": "^1.0.1" + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" } }, - "@phosphor/algorithm": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.1.3.tgz", - "integrity": "sha512-+dkdYTBglR+qGnLVQdCvYojNZMGxf+xSl1Jeksha3pm7niQktSFz2aR5gEPu/nI5LM8T8slTpqE4Pjvq8P+IVA==" + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true }, - "@phosphor/collections": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/collections/-/collections-1.2.0.tgz", - "integrity": "sha512-T9/0EjSuY6+ga2LIFRZ0xupciOR3Qnyy8Q95lhGTC0FXZUFwC8fl9e8On6IcwasCszS+1n8dtZUWSIynfgdpzw==", - "requires": { - "@phosphor/algorithm": "^1.2.0" - }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, "dependencies": { - "@phosphor/algorithm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.2.0.tgz", - "integrity": "sha512-C9+dnjXyU2QAkWCW6QVDGExk4hhwxzAKf5/FIuYlHAI9X5vFv99PYm0EREDxX1PbMuvfFBZhPNu0PvuSDQ7sFA==" - } + "@types/jsonfile": "*", + "@types/node": "*" } }, - "@phosphor/commands": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@phosphor/commands/-/commands-1.7.2.tgz", - "integrity": "sha512-iSyBIWMHsus323BVEARBhuVZNnVel8USo+FIPaAxGcq+icTSSe6+NtSxVQSmZblGN6Qm4iw6I6VtiSx0e6YDgQ==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/coreutils": "^1.3.1", - "@phosphor/disposable": "^1.3.1", - "@phosphor/domutils": "^1.1.4", - "@phosphor/keyboard": "^1.1.3", - "@phosphor/signaling": "^1.3.1" - }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, "dependencies": { - "@phosphor/algorithm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.2.0.tgz", - "integrity": "sha512-C9+dnjXyU2QAkWCW6QVDGExk4hhwxzAKf5/FIuYlHAI9X5vFv99PYm0EREDxX1PbMuvfFBZhPNu0PvuSDQ7sFA==" - }, - "@phosphor/disposable": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.3.1.tgz", - "integrity": "sha512-0NGzoTXTOizWizK/brKKd5EjJhuuEH4903tLika7q6wl/u0tgneJlTh7R+MBVeih0iNxtuJAfBa3IEY6Qmj+Sw==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/signaling": "^1.3.1" - } - }, - "@phosphor/signaling": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.3.1.tgz", - "integrity": "sha512-Eq3wVCPQAhUd9+gUGaYygMr+ov7dhSGblSBXiDzpZlSIfa8OVD4P3cCvYXr/acDTNmZ/gHTcSFO8/n3rDkeXzg==", - "requires": { - "@phosphor/algorithm": "^1.2.0" - } - } + "@types/minimatch": "*", + "@types/node": "*" } }, - "@phosphor/coreutils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@phosphor/coreutils/-/coreutils-1.3.1.tgz", - "integrity": "sha512-9OHCn8LYRcPU/sbHm5v7viCA16Uev3gbdkwqoQqlV+EiauDHl70jmeL7XVDXdigl66Dz0LI11C99XOxp+s3zOA==" - }, - "@phosphor/disposable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/disposable/-/disposable-1.2.0.tgz", - "integrity": "sha512-4PoWoffdrLyWOW5Qv7I8//owvZmv57YhaxetAMWeJl13ThXc901RprL0Gxhtue2ZxL2PtUjM1207HndKo2FVjA==", - "requires": { - "@phosphor/algorithm": "^1.1.3", - "@phosphor/signaling": "^1.2.3" + "node_modules/@types/got": { + "version": "9.6.12", + "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz", + "integrity": "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" } }, - "@phosphor/domutils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@phosphor/domutils/-/domutils-1.1.4.tgz", - "integrity": "sha512-ivwq5TWjQpKcHKXO8PrMl+/cKqbgxPClPiCKc1gwbMd+6hnW5VLwNG0WBzJTxCzXK43HxX18oH+tOZ3E04wc3w==" - }, - "@phosphor/keyboard": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@phosphor/keyboard/-/keyboard-1.1.3.tgz", - "integrity": "sha512-dzxC/PyHiD6mXaESRy6PZTd9JeK+diwG1pyngkyUf127IXOEzubTIbu52VSdpGBklszu33ws05BAGDa4oBE4mQ==" - }, - "@phosphor/messaging": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@phosphor/messaging/-/messaging-1.3.0.tgz", - "integrity": "sha512-k0JE+BTMKlkM335S2AmmJxoYYNRwOdW5jKBqLgjJdGRvUQkM0+2i60ahM45+J23atGJDv9esKUUBINiKHFhLew==", - "requires": { - "@phosphor/algorithm": "^1.2.0", - "@phosphor/collections": "^1.2.0" - }, + "node_modules/@types/got/node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, "dependencies": { - "@phosphor/algorithm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@phosphor/algorithm/-/algorithm-1.2.0.tgz", - "integrity": "sha512-C9+dnjXyU2QAkWCW6QVDGExk4hhwxzAKf5/FIuYlHAI9X5vFv99PYm0EREDxX1PbMuvfFBZhPNu0PvuSDQ7sFA==" - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" } }, - "@phosphor/properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@phosphor/properties/-/properties-1.1.3.tgz", - "integrity": "sha512-GiglqzU77s6+tFVt6zPq9uuyu/PLQPFcqZt914ZhJ4cN/7yNI/SLyMzpYZ56IRMXvzK9TUgbRna6URE3XAwFUg==" - }, - "@phosphor/signaling": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@phosphor/signaling/-/signaling-1.2.3.tgz", - "integrity": "sha512-DMwS0m9OgfY5ljpTsklRQPUQpTyg4obz85FyImRDacUVxUVbas95djIDEbU4s1TMzdHBBO+gfki3V4giXUvXzw==", - "requires": { - "@phosphor/algorithm": "^1.1.3" - } + "node_modules/@types/got/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", "dev": true, - "requires": { - "type-detect": "4.0.8" + "dependencies": { + "@types/node": "*" } }, - "@sinonjs/formatio": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz", - "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^4.2.0" - } + "node_modules/@types/lodash": { + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", + "dev": true }, - "@sinonjs/samsam": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.0.tgz", - "integrity": "sha512-yG7QbUz38ZPIegfuSMEcbOo0kkLGmPa8a0Qlz4dk7+cXYALDScWjIZzAm/u2+Frh+bcdZF6wZJZwwuJjY0WAjA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "array-from": "^2.1.1", - "lodash.get": "^4.4.2" - } + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "node_modules/@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", "dev": true }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", + "node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - } + "undici-types": "~6.21.0" } }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", + "node_modules/@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true + }, + "node_modules/@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" + }, + "node_modules/@types/shortid": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/shortid/-/shortid-0.0.29.tgz", + "integrity": "sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps=", + "dev": true + }, + "node_modules/@types/sinon": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", "dev": true, - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - } + "@types/sinonjs__fake-timers": "*" } }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, - "requires": { - "@types/node": "*" - } + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true }, - "@types/ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-r1W316vjsZXn1/csLC4HcCJs6jIHIzksHJd7xx+Dl+PAb0S2Dh9cR8ZsIMEfGmbBtP7JNWlf2KKahSkDP6rg3g==", + "node_modules/@types/stack-trace": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", + "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==", "dev": true }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "node_modules/@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, - "@types/body-parser": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", - "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", + "node_modules/@types/vscode": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.100.0.tgz", + "integrity": "sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==", "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } + "license": "MIT" }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "node_modules/@types/which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.1.tgz", + "integrity": "sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==", "dev": true }, - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", + "node_modules/@types/winreg": { + "version": "1.2.31", + "resolved": "https://registry.npmjs.org/@types/winreg/-/winreg-1.2.31.tgz", + "integrity": "sha512-SDatEMEtQ1cJK3esIdH6colduWBP+42Xw9Guq1sf/N6rM3ZxgljBduvZOwBsxRps/k5+Wwf5HJun6pH8OnD2gg==", "dev": true }, - "@types/chai-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/chai-arrays/-/chai-arrays-1.0.2.tgz", - "integrity": "sha512-/kgYvj5Pwiv/bOlJ6c5GlRF/W6lUGSLrpQGl/7Gg6w7tvBYcf0iF91+wwyuwDYGO2zM0wNpcoPixZVif8I/r6g==", + "node_modules/@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", "dev": true, - "requires": { - "@types/chai": "*" + "dependencies": { + "@types/node": "*" } }, - "@types/chai-as-promised": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, - "requires": { - "@types/chai": "*" + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@types/cheerio": { - "version": "0.22.12", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.12.tgz", - "integrity": "sha512-aczowyAJNfrkBV+HS8DyAA87OnvkqGrrOmm5s7V6Jbgimzv/1ZoAy91cLJX8GQrUS60KufD7EIzA2LbK8HV4hg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@types/clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-A1HQhQ0hkvqqByJMgg+Wiv9p9XdoYEzuwm11SVo1mX2/4PSdhjcrUlilJQoqLscIheC51t1D5g+EFWCXZ2VTQQ==", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@types/clone": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz", - "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=", - "dev": true - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@types/cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", - "dev": true - }, - "@types/cookies": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", - "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@types/copy-webpack-plugin": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-4.4.4.tgz", - "integrity": "sha512-D8NyCMfHFWi638Cn5gi88mELGrISQdzDAcmOk4j70bzm0kLey99Zp5xsFsL44qPi+a22tcB39U5jiJiV2XMd9A==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*", - "@types/webpack": "*" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@types/decompress": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.3.tgz", - "integrity": "sha512-W24e3Ycz1UZPgr1ZEDHlK4XnvOr+CpJH3qNsFeqXwwlW/9END9gxn3oJSsp7gYdiQxrXUHwUUd3xuzVz37MrZQ==", + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@types/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@types/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==", - "dev": true - }, - "@types/del": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz", - "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, - "requires": { - "@types/glob": "*" + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@types/diff-match-patch": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.32.tgz", - "integrity": "sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==", - "dev": true - }, - "@types/dom4": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.1.tgz", - "integrity": "sha512-kSkVAvWmMZiCYtvqjqQEwOmvKwcH+V4uiv3qPQ8pAh1Xl39xggGEo8gHUqV4waYGHezdFw0rKBR8Jt0CrQSDZA==", - "dev": true - }, - "@types/download": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@types/download/-/download-6.2.4.tgz", - "integrity": "sha512-Lo5dy3ai6LNnbL663sgdzqL1eib11u1yKH6w3v3IXEOO4kRfQpMn1qWUTaumcHLACjFp1RcBx9tUXEvJoR3vcA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, - "requires": { - "@types/decompress": "*", - "@types/got": "^8", - "@types/node": "*" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "@types/enzyme": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.2.tgz", - "integrity": "sha512-tAFqfBVAxaxOCCcCpFrv6yFDg/hwL1KtJc7dsOaO+BBdSppTcyRP7jO2ze5va7NDa8iSFfAaZ9NeuybmMulu0w==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "requires": { - "@types/cheerio": "*", - "@types/react": "*" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@types/enzyme-adapter-react-16": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.5.tgz", - "integrity": "sha512-K7HLFTkBDN5RyRmU90JuYt8OWEY2iKUn43SDWEoBOXd/PowUWjLZ3Q6qMBiQuZeFYK/TOstaZxsnI0fXoAfLpg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "requires": { - "@types/enzyme": "*" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "@types/event-stream": { - "version": "3.3.34", - "resolved": "https://registry.npmjs.org/@types/event-stream/-/event-stream-3.3.34.tgz", - "integrity": "sha512-LLiivgWKii4JeMzFy3trrxqkRrVSdue8WmbXyHuSJLwNrhIQU5MTrc65jhxEPwMyh5HR1xevSdD+k2nnSRKw9g==", + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "node_modules/@typescript-eslint/utils/node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, - "@types/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", - "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@types/express-serve-static-core": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", - "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "requires": { - "@types/node": "*", - "@types/range-parser": "*" - } + "license": "ISC" }, - "@types/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==", - "dev": true + "node_modules/@vscode/extension-telemetry": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.8.4.tgz", + "integrity": "sha512-UqM9+KZDDK3MyoHTsg6XNM+XO6pweQxzCpqJz33BoBEYAGsbBviRYcVpJglgay2oReuDD2pOI1Nio3BKNDLhWA==", + "dependencies": { + "@microsoft/1ds-core-js": "^3.2.13", + "@microsoft/1ds-post-js": "^3.2.13", + "@microsoft/applicationinsights-web-basic": "^3.0.2", + "applicationinsights": "^2.7.1" + }, + "engines": { + "vscode": "^1.75.0" + } }, - "@types/form-data": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "node_modules/@vscode/test-electron": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=16" } }, - "@types/fs-extra": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", - "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "node_modules/@vscode/vsce": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.27.0.tgz", + "integrity": "sha512-FFUMBVSyyjjJpWszwqk7d4U3YllY8FdWslbUDMRki1x4ZjA3Z0hmRMfypWrjP9sptbSR9nyPFU4uqjhy2qRB/w==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "keytar": "^7.7.0" } }, - "@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==", - "dev": true + "node_modules/@vscode/vsce-sign": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", + "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", + "dev": true, + "hasInstallScript": true, + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.2", + "@vscode/vsce-sign-alpine-x64": "2.0.2", + "@vscode/vsce-sign-darwin-arm64": "2.0.2", + "@vscode/vsce-sign-darwin-x64": "2.0.2", + "@vscode/vsce-sign-linux-arm": "2.0.2", + "@vscode/vsce-sign-linux-arm64": "2.0.2", + "@vscode/vsce-sign-linux-x64": "2.0.2", + "@vscode/vsce-sign-win32-arm64": "2.0.2", + "@vscode/vsce-sign-win32-x64": "2.0.2" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", + "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "alpine" + ] }, - "@types/glob": { - "version": "5.0.36", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", - "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", + "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } + "optional": true, + "os": [ + "alpine" + ] }, - "@types/got": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.5.tgz", - "integrity": "sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A==", + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/node": "*" - } + "optional": true, + "os": [ + "darwin" + ] }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", + "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "@types/html-minifier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.3.tgz", - "integrity": "sha512-j1P/4PcWVVCPEy5lofcHnQ6BtXz9tHGiFPWzqm7TtGuWZEfCHEP446HlkSNc9fQgNJaJZ6ewPtp2aaFla/Uerg==", + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", + "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@types/clean-css": "*", - "@types/relateurl": "*", - "@types/uglify-js": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "@types/html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-in9rViBsTRB4ZApndZ12It68nGzSMHVK30JD7c49iLIHMFeTPbP7I7wevzMv7re2o0k5TlU6Ry/beyrmgWX7Bg==", + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", + "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/html-minifier": "*", - "@types/tapable": "*", - "@types/webpack": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "@types/http-assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", - "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==", - "dev": true + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", + "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "@types/iconv-lite": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@types/iconv-lite/-/iconv-lite-0.0.1.tgz", - "integrity": "sha1-qjuL2ivlErGuCgV7lC6GnDcKVWk=", + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", + "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/node": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", - "dev": true + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", + "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" + "engines": { + "node": ">= 6" } }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "node_modules/@vscode/vsce/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "@types/jquery": { - "version": "1.10.35", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-1.10.35.tgz", - "integrity": "sha512-SVtqEcudm7yjkTwoRA1gC6CNMhGDdMx4Pg8BPdiqI7bXXdCn1BPmtxgeWYQOgDxrq53/5YTlhq5ULxBEAlWIBg==", - "dev": true + "node_modules/@vscode/vsce/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "@types/jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-XHMNZFQ0Ih3A4/NTWAO15+OsQafPKnQCanN0FYGbsTM/EoI5EoEAvvkF51/DQC2BT5low4tomp7k2RLMlriA5Q==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "requires": { - "@types/events": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^4.0.0" + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, - "@types/keygrip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.1.tgz", - "integrity": "sha1-/1QEYtL7TQqIRBzq8n0oewHD2Hg=", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, - "@types/koa": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.0.tgz", - "integrity": "sha512-Hgx/1/rVlJvqYBrdeCsS7PDiR2qbxlMt1RnmNWD4Uxi5FF9nwkYqIldo7urjc+dfNpk+2NRGcnAYd4L5xEhCcQ==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, - "requires": { - "@types/accepts": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "requires": { - "@types/koa": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "@types/koa-compress": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/koa-compress/-/koa-compress-2.0.9.tgz", - "integrity": "sha512-1Sa9OsbHd2N2N7gLpdIRHe8W99EZbfIR31D7Iisx16XgwZCnWUtGXzXQejhu74Y1pE/wILqBP6VL49ch/MVpZw==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, - "requires": { - "@types/koa": "*", - "@types/node": "*" + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "@types/koa-logger": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/koa-logger/-/koa-logger-3.1.1.tgz", - "integrity": "sha512-wp2HaskkPugfwgXgNnc+idnReuJZSTTYQbkcxXjsMhp1kTc342PxDzTL9FXDgBfEvgt9NX1CCGjkwPKX2dlEKQ==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "requires": { - "@types/koa": "*" + "dependencies": { + "@xtuc/long": "4.2.2" } }, - "@types/koa__cors": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-2.2.3.tgz", - "integrity": "sha512-RfG2EuSc+nv/E+xbDSLW8KCoeri/3AkqwVPuENfF/DctllRoXhooboO//Sw7yFtkLvj7nG7O1H3JcZmoTQz8nQ==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "requires": { - "@types/koa": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "@types/loadable__component": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@types/loadable__component/-/loadable__component-5.10.0.tgz", - "integrity": "sha512-AaDP1VxV3p7CdPOtOTl3ALgQ6ES4AxJKO9UGj9vJonq/w2yERxwdzFiWNQFh9fEDXEzjxujBlM2RmSJtHV1/pA==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "requires": { - "@types/react": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "@types/loader-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz", - "integrity": "sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, - "requires": { - "@types/node": "*", - "@types/webpack": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "@types/lodash": { - "version": "4.14.136", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", - "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==", - "dev": true - }, - "@types/md5": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.1.33.tgz", - "integrity": "sha512-8+X960EtKLoSblhauxLKy3zzotagjoj3Jt1Tx9oaxUdZEPIBl+mkrUz6PNKpzJgkrKSN9YgkWTA29c0KnLshmA==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "@types/memoize-one": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/memoize-one/-/memoize-one-4.1.1.tgz", - "integrity": "sha512-+9djKUUn8hOyktLCfCy4hLaIPgDNovaU36fsnZe9trFHr6ddlbIn2q0SEsnkCkNR+pBWEU440Molz/+Mpyf+gQ==", - "dev": true - }, - "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true - }, - "@types/nock": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/nock/-/nock-10.0.3.tgz", - "integrity": "sha512-OthuN+2FuzfZO3yONJ/QVjKmLEuRagS9TV9lEId+WHL9KhftYG+/2z+pxlr0UgVVXSpVD8woie/3fzQn8ft/Ow==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "@types/node": { - "version": "10.14.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.18.tgz", - "integrity": "sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==", - "dev": true + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } }, - "@types/node-fetch": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.3.7.tgz", - "integrity": "sha512-+bKtuxhj/TYSSP1r4CZhfmyA0vm/aDRQNo7vbAgf6/cZajn0SAniGGST07yvI4Q+q169WTa2/x9gEHfJrkcALw==", + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "@types/pdfkit": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.7.36.tgz", - "integrity": "sha512-9eRA6MuW+n78yU3HhoIrDxjyAX2++B5MpLDYqHOnaRTquCw+5sYXT+QN8E1eSaxvNUwlRfU3tOm4UzTeGWmBqg==", + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true, - "requires": { - "@types/node": "*" + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "@types/promisify-node": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/promisify-node/-/promisify-node-0.4.0.tgz", - "integrity": "sha1-3MceY8Cr9oYbrn0S9swzlceDk2s=", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "@types/prop-types": { - "version": "15.7.1", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", - "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "@types/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-Jugo5V/1bS0fRhy2z8+cUAHEyWOATaz4rbyLVvcFs7+dXp5HfwpEwzF1Q11bB10ApUqHf+yTauxI0UXQDwGrbA==", - "dev": true + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } }, - "@types/react": { - "version": "16.8.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", - "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" } }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "requires": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "@types/react-json-tree": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@types/react-json-tree/-/react-json-tree-0.6.11.tgz", - "integrity": "sha512-HP0Sf0ZHjCi1FHLJxh/pLaxaevEW6ILlV2C5Dn3EZFTkLjWkv+EVf/l/zvtmoU9ZwuO/3TKVeWK/700UDxunTw==", + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "requires": { - "@types/react": "*" + "engines": { + "node": ">=0.4.0" } }, - "@types/react-redux": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.5.tgz", - "integrity": "sha512-ZoNGQMDxh5ENY7PzU7MVonxDzS1l/EWiy8nUhDqxFqUZn4ovboCyvk4Djf68x6COb7vhGTKjyjxHxtFdAA5sUA==", - "dev": true, - "requires": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@types/react-virtualized": { - "version": "9.21.2", - "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.2.tgz", - "integrity": "sha512-Q6geJaDd8FlBw3ilD4ODferTyVtYAmDE3d7+GacfwN0jPt9rD9XkeuPjcHmyIwTrMXuLv1VIJmRxU9WQoQFBJw==", + "node_modules/aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/react": "*" + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/redux-logger": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.7.tgz", - "integrity": "sha512-oV9qiCuowhVR/ehqUobWWkXJjohontbDGLV88Be/7T4bqMQ3kjXwkFNL7doIIqlbg3X2PC5WPziZ8/j/QHNQ4A==", + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, - "requires": { - "redux": "^3.6.0" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "dependencies": { - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true } } }, - "@types/relateurl": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", - "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=", - "dev": true - }, - "@types/request": { - "version": "2.48.1", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", - "integrity": "sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, - "requires": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "@types/shortid": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/shortid/-/shortid-0.0.29.tgz", - "integrity": "sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps=", - "dev": true + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "@types/sinon": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.1.tgz", - "integrity": "sha512-EZQUP3hSZQyTQRfiLqelC9NMWd1kqLcmQE0dMiklxBkgi84T+cHOhnKpgk4NnOWpGX863yE6+IaGnOXUNFqDnQ==", - "dev": true + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "@types/stack-trace": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", - "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==", - "dev": true - }, - "@types/superagent": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", - "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "@types/tapable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", - "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", - "dev": true - }, - "@types/temp": { - "version": "0.8.34", - "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.8.34.tgz", - "integrity": "sha512-oLa9c5LHXgS6UimpEVp08De7QvZ+Dfu5bMQuWyMhf92Z26Q10ubEMOWy9OEfUdzW7Y/sDWVHmUaLFtmnX/2j0w==", + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=0.10.0" } }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { - "pretty-format": "^24.3.0" + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=", - "dev": true - }, - "@types/tough-cookie": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", - "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", - "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "node_modules/append-buffer/node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true, - "requires": { - "source-map": "^0.6.1" + "engines": { + "node": ">=0.4.0" } }, - "@types/untildify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/untildify/-/untildify-3.0.0.tgz", - "integrity": "sha512-FTktI3Y1h+gP9GTjTvXBP5v8xpH4RU6uS9POoBcGy4XkS2Np6LNtnP1eiNNth4S7P+qw2c/rugkwBasSHFzJEg==", - "dev": true - }, - "@types/uuid": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.5.tgz", - "integrity": "sha512-MNL15wC3EKyw1VLF+RoVO4hJJdk9t/Hlv3rt1OL65Qvuadm4BYo6g9ZJQqoq7X8NBFSsQXgAujWciovh2lpVjA==", + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/applicationinsights": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", + "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", + "dependencies": { + "@azure/core-auth": "^1.5.0", + "@azure/core-rest-pipeline": "1.10.1", + "@azure/core-util": "1.2.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", + "@microsoft/applicationinsights-web-snippet": "^1.0.1", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/sdk-trace-base": "^1.15.2", + "@opentelemetry/semantic-conventions": "^1.15.2", + "cls-hooked": "^4.2.2", + "continuation-local-storage": "^3.2.1", + "diagnostic-channel": "1.1.1", + "diagnostic-channel-publishers": "1.0.7" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "applicationinsights-native-metrics": "*" + }, + "peerDependenciesMeta": { + "applicationinsights-native-metrics": { + "optional": true + } } }, - "@types/vscode": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.42.0.tgz", - "integrity": "sha512-ds6TceMsh77Fs0Mq0Vap6Y72JbGWB8Bay4DrnJlf5d9ui2RSe1wis13oQm+XhguOeH1HUfLGzaDAoupTUtgabw==", - "dev": true + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "@types/webpack": { - "version": "4.4.34", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.34.tgz", - "integrity": "sha512-GnEBgjHsfO1M7DIQ0dAupSofcmDItE3Zsu3reK8SQpl/6N0rtUQxUmQzVFAS5ou/FGjsYKjXAWfItLZ0kNFTfQ==", + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "source-map": "^0.6.0" + "license": "MIT", + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" } }, - "@types/webpack-bundle-analyzer": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.1.tgz", - "integrity": "sha512-9M9jingj0izx1VfglYYJ+dvd0YCMlFgtrSCeb+C3VIQP8hmTXGJ5qqVeqiBnv0ffMyeKWqyij4K2F4VBcazQNw==", + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, - "requires": { - "@types/webpack": "*" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@types/winreg": { - "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@types/winreg/-/winreg-1.2.30.tgz", - "integrity": "sha1-kdZxDlNtNFucmwF8V0z2qNpkxRg=", + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "@types/ws": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", - "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", + "node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { - "@types/events": "*", - "@types/node": "*" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "@types/xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha512-O6Xgai01b9PB3IGA0lRIp1Ex3JBcxGDhdO0n3NIIpCyDOAjxcIGQFmkvgJpP8anTrthxOUQjBfLdRRi0Zn/TXA==", + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=0.10.0" } }, - "@types/yargs": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", - "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true, - "requires": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=0.10.0" } }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "engines": { + "node": ">=0.10.0" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "engines": { + "node": ">=8" } }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "requires": { - "@xtuc/long": "4.2.2" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "dependencies": { + "inherits": "2.0.1" } }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" + "engines": { + "node": "*" } }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "engines": { + "node": ">=0.10.0" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "abab": { + "node_modules/async-done": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "node_modules/async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "dependencies": { + "stack-chain": "^1.3.7" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dependencies": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "engines": { + "node": "<=0.11.8 || >0.11.10" + } }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true + "node_modules/async-listener/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "node_modules/async-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", + "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - } + "async-done": "^2.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "acorn-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", - "integrity": "sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "requires": { - "acorn": "^6.1.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.1", - "xtend": "^4.0.1" - }, "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - } + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==", + "node_modules/axe-core": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", + "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, - "requires": { - "es6-promisify": "^5.0.0" + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" } }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "airbnb-prop-types": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz", - "integrity": "sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ==", + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", "dev": true, - "requires": { - "array.prototype.find": "^2.0.4", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.8.6" - } + "hasInstallScript": true }, - "ajv": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", - "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/bach": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", + "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", + "dev": true, "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - } + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "now-and-later": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "node_modules/bach/node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "node_modules/bare-events": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.3.1.tgz", + "integrity": "sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==", + "dev": true, "optional": true }, - "anser": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.8.tgz", - "integrity": "sha512-tVHucTCKIt9VRrpQKzPtOlwm/3AmyQ7J+QE29ixFnvuE2hm83utEVrN7jJapYkHV6hI0HOHkEX9TOMCzHtwvuA==", - "dev": true + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "node_modules/bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", "dev": true, - "requires": { - "ansi-wrap": "0.1.0" + "dependencies": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "node_modules/bent/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "requires": { - "ansi-wrap": "0.1.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "requires": { - "ansi-wrap": "0.1.0" + "engines": { + "node": "*" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "ansi-to-html": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.11.tgz", - "integrity": "sha512-88XZtrcwrfkyn6fGstHnkaF1kl7hGtNCYh4vSmItgEV+6JnQHryDBf7udF4f2RhTRQmYvJvPcTtqgaqrxzc9oA==", + "node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, - "requires": { - "entities": "^1.1.1" + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "ansi-to-react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-3.3.5.tgz", - "integrity": "sha512-uAI8NOh+/5PC1poTnLwhuO7whaxPst1lZCeq+7P7hlP0A6GRXjXu1f5qprTwT3NHtjIWyMcFJAL0Im0HyB2XeQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { - "@babel/runtime-corejs2": "^7.0.0", - "anser": "^1.4.1", - "babel-runtime": "^6.26.0", - "escape-carriage": "^1.2.0" + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - }, "dependencies": { - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - } + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "applicationinsights": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.6.tgz", - "integrity": "sha512-VQT3kBpJVPw5fCO5n+WUeSx0VHjxFtD7znYbILBlVgOS9/cMDuGFmV2Br3ObzFyZUDGNbEfW36fD1y2/vAiCKw==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + "node_modules/browserify-rsa/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "node_modules/browserify-sign": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, - "requires": { - "file-type": "^4.2.0" - }, + "license": "ISC", "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", - "dev": true - } + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, - "archiver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.0.0.tgz", - "integrity": "sha512-5QeR6Xc5hSA9X1rbQfcuQ6VZuUXOaEdB65Dhmk9duuRJHYif/ZyJfuyJqsQrj34PFjU5emv5/MmfgA8un06onw==", + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, - "requires": { - "archiver-utils": "^2.0.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^2.0.1" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "archiver-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.0.0.tgz", - "integrity": "sha512-JRBgcVvDX4Mwu2RBF8bBaHcQCSxab7afsxAPYDQ5W+19quIPP5CfKE7Ql+UHs9wYvwsaNR8oDuhtf5iqrKmzww==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash.assign": "^4.2.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.toarray": "^4.4.0", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, + ], "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "license": "MIT" }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true, - "requires": { - "make-iterator": "^1.0.0" + "engines": { + "node": "*" } }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "dev": true }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } + "license": "MIT" }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "node_modules/bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", "dev": true }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true + "node_modules/cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, - "requires": { - "is-number": "^4.0.0" - }, + "license": "MIT", "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, + "license": "MIT", "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "array-uniq": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001768", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz", + "integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" } }, - "array.prototype.flat": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "node_modules/chai-arrays": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chai-arrays/-/chai-arrays-2.2.0.tgz", + "integrity": "sha512-4awrdGI2EH8owJ9I58PXwG4N56/FiM8bsn4CVSNEgr4GKAM6Kq5JPVApUbhUBjDakbZNuRvV7quRSC38PWq/tg==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" + "engines": { + "node": ">=0.10" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true, + "engines": { + "node": "*" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "engines": { + "node": "*" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "node_modules/cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "node_modules/cheerio-select/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "ast-transform": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", - "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", - "requires": { - "escodegen": "~1.2.0", - "esprima": "~1.0.4", - "through": "~2.3.4" + "node_modules/cheerio-select/node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true, + "engines": { + "node": ">= 6" }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, "dependencies": { - "escodegen": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", - "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", - "requires": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.30" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "ast-types": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", - "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=" + "node_modules/cheerio-select/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "requires": { - "lodash": "^4.17.11" + "node_modules/cheerio-select/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "async-done": { + "node_modules/cheerio-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" } + ] + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "node_modules/cheerio/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "node_modules/cheerio/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, - "requires": { - "async-done": "^1.2.2" + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "node_modules/cheerio/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/cheerio/node_modules/tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true }, - "awesome-typescript-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", - "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "requires": { - "chalk": "^2.4.1", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.3", - "webpack-log": "^1.2.0" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" } }, - "azure-storage": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.3.tgz", - "integrity": "sha512-IGLs5Xj6kO8Ii90KerQrrwuJKexLgSwYC4oLWmc11mzKe7Jt2E5IVg+ZQ8K53YWZACtVTMBNO3iGuA+4ipjJxQ==", - "requires": { - "browserify-mime": "~1.2.9", - "extend": "^3.0.2", - "json-edm-parser": "0.1.2", - "md5.js": "1.3.4", - "readable-stream": "~2.0.0", - "request": "^2.86.0", - "underscore": "~1.8.3", - "uuid": "^3.0.0", - "validator": "~9.4.1", - "xml2js": "0.2.8", - "xmlbuilder": "^9.0.7" - }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xml2js": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", - "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", - "requires": { - "sax": "0.5.x" - } - } + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "node_modules/cipher-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "license": "MIT" + }, + "node_modules/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" } }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true, - "requires": { - "object.assign": "^4.1.0" + "engines": { + "node": ">=0.8" } }, - "babel-plugin-emotion": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz", - "integrity": "sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ==", + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/babel-utils": "^0.6.4", - "@emotion/hash": "^0.6.2", - "@emotion/memoize": "^0.6.1", - "@emotion/stylis": "^0.7.0", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "find-root": "^1.1.0", - "mkdirp": "^0.5.1", - "source-map": "^0.5.7", - "touch": "^2.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "engines": { + "node": ">= 0.10" } }, - "babel-plugin-inline-json-import": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-json-import/-/babel-plugin-inline-json-import-0.3.2.tgz", - "integrity": "sha512-QNNJx08KjmMT25Cw7rAPQ6dlREDPiZGDyApHL8KQ9vrQHbrr4PTi7W8g1tMMZPz0jEMd39nx/eH7xjnDNxq5sA==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "requires": { - "decache": "^4.5.1" + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "babel-plugin-macros": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", - "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, - "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" } }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, + "node_modules/cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } + "node_modules/cls-hooked/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/cockatiel": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.1.3.tgz", + "integrity": "sha512-xC759TpZ69d7HhfDp8m2WkRwEUiCkxY8Ee2OQH/3H6zmy2D/5Sm+zSTbPRa+V2QyjDtpMvjOIAOVjA2gp6N1kQ==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } + "engines": { + "node": ">=16" } }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "bail": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "balanced-match": { + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compare-module-exports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", + "integrity": "sha512-3Lc0sTIuX1jmY2K2RrXRJOND6KsRTX2D4v3+eu1PDptsuJZVK4LZc852eZa9I+avj0NrUKlTNgqvccNOH6mbGg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, + "license": "MIT", "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "license": "MIT" + }, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "dependencies": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" } }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + "node_modules/copy-props": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", + "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", + "dev": true, + "dependencies": { + "each-props": "^3.0.0", + "is-plain-object": "^5.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "node_modules/core-js-pure": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "bintrees": { + "node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha1-SfiW1uhYpKSZ34XDj7OZua/4QPg=", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, + "license": "MIT", "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, - "requires": { - "inherits": "~2.0.0" + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "node_modules/cross-env/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==", - "dev": true + "node_modules/cross-env/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "bootstrap-less": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/bootstrap-less/-/bootstrap-less-3.3.8.tgz", - "integrity": "sha1-cfKd1af//t/onxYFu63+CjONrlM=", - "dev": true + "node_modules/cross-env/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/cross-env/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" } }, - "brfs": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", - "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^3.0.2", - "through2": "^2.0.0" - }, + "license": "MIT", "dependencies": { - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "static-module": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.3.tgz", - "integrity": "sha512-RDaMYaI5o/ym0GkCqL/PlD1Pn216omp8fY81okxZ6f6JQxWW5tptOw9reXoZX85yt/scYvbWIt6uoszeyf+/MQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "readable-stream": "~2.3.3", - "scope-analyzer": "^2.0.1", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.2", - "through2": "~2.0.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", - "requires": { - "base64-js": "^1.1.2" + "node_modules/cross-spawn/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", - "dev": true + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true, + "engines": { + "node": "*" + } }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "license": "MIT", "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserify-cipher": { + "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserify-mime": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", - "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } }, - "browserify-optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", - "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", - "requires": { - "ast-transform": "0.0.0", - "ast-types": "^0.7.0", - "browser-resolve": "^1.8.1" + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, - "requires": { - "pako": "~1.0.5" + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "license": "MIT", "dependencies": { - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - } + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" } }, - "browserslist": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.4.tgz", - "integrity": "sha512-ErJT8qGfRt/VWHSr1HeqZzz50DvxHtr1fVL1m5wf20aGrG8e1ce8fpZ2EjZEfs09DDZYSvtRaDlMpWslBf8Low==", + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000981", - "electron-to-chromium": "^1.3.188", - "node-releases": "^1.1.25" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "builtin-status-codes": { + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" } }, - "cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4.0.0" } }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - } + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "caching-transform": { + "node_modules/default-require-extensions/node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "caller-callsite": { + "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "requires": { - "callsites": "^2.0.0" + "engines": { + "node": ">=8" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "requires": { - "caller-callsite": "^2.0.0" + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "callsite": { + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true + "node_modules/des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "engines": { + "node": ">=0.10.0" } }, - "caniuse-lite": { - "version": "1.0.30000983", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000983.tgz", - "integrity": "sha512-/llD1bZ6qwNkt41AsvjsmwNOoA4ZB+8iqmf5LVyeSXuBODT/hAMFNVOh84NdUzoiYiSKqo5vQ3ZzeYHSi/olDQ==", - "dev": true + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diagnostic-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz", + "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==", + "dependencies": { + "semver": "^7.5.3" + } + }, + "node_modules/diagnostic-channel-publishers": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.7.tgz", + "integrity": "sha512-SEECbY5AiVt6DfLkhkaHNeshg1CogdLLANA8xlG/TKvS+XUgvIKl7VspJGYiEdL5OUyzMVnr7o0AwB7f+/Mjtg==", + "peerDependencies": { + "diagnostic-channel": "*" + } }, - "canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz", - "integrity": "sha512-bEO9f1ThmbknLPxCa8Es7obPlN9W3stB1bo7njlhOFKIdUTldeTqXCh9YclCPAi2pSQs84XA0jq/QEZXSzgyMw==", + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, - "requires": { - "nan": "^2.14.0", - "node-pre-gyp": "^0.11.0", - "simple-get": "^3.0.3" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "chai-arrays": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chai-arrays/-/chai-arrays-2.0.0.tgz", - "integrity": "sha512-jWAvZu1BV8tL3pj0iosBECzzHEg+XB1zSnMjJGX83bGi/1GlGdDO7J/A0sbBBS6KJT0FVqZIzZW9C6WLiMkHpQ==", - "dev": true + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "node_modules/download": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", + "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", "dev": true, - "requires": { - "check-error": "^1.0.2" + "license": "MIT", + "dependencies": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=10" } }, - "chai-http": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", - "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "node_modules/download/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { - "@types/chai": "4", - "@types/superagent": "^3.8.3", - "cookiejar": "^2.1.1", - "is-ip": "^2.0.0", - "methods": "^1.1.2", - "qs": "^6.5.1", - "superagent": "^3.7.0" + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "node_modules/download/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "character-entities": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", - "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", - "dev": true + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "character-entities-legacy": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", - "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "character-reference-invalid": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", - "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", - "dev": true + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + "node_modules/each-props": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", + "dev": true, + "dependencies": { + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "node_modules/each-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", - "dev": true + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, "dependencies": { - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } + "safe-buffer": "^5.0.1" } }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, + "license": "MIT", "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - } + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "chownr": { + "node_modules/emitter-listener": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "engines": { + "node": ">= 4" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true }, - "cli-cursor": { + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "requires": { - "restore-cursor": "^2.0.0" + "dependencies": { + "hasown": "^2.0.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true } } }, - "clsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", - "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==", - "dev": true + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } }, - "codecov": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.6.1.tgz", - "integrity": "sha512-IUJB6WG47nWK7o50etF8jBadxdMw7DmoQg05yIljstXFBGB6clOZsIj6iD4P82T2YaIU3qq+FFu8K9pxgkCJDQ==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "requires": { - "argv": "^0.0.2", - "ignore-walk": "^3.0.1", - "js-yaml": "^3.13.1", - "teeny-request": "^3.11.3", - "urlgrey": "^0.4.4" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "collapse-white-space": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", - "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" } }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "node_modules/eslint-plugin-react-hooks": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "commandpost": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/commandpost/-/commandpost-1.4.0.tgz", - "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==", - "dev": true + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "compare-module-exports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", - "integrity": "sha512-3Lc0sTIuX1jmY2K2RrXRJOND6KsRTX2D4v3+eu1PDptsuJZVK4LZc852eZa9I+avj0NrUKlTNgqvccNOH6mbGg==", - "dev": true + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "requires": { - "mime-db": ">= 1.40.0 < 2" + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "requires": { - "date-now": "^0.1.4" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "engines": { + "node": ">=8" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - } + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "core-js-compat": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", - "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { - "browserslist": "^4.6.2", - "core-js-pure": "3.1.4", - "semver": "^6.1.1" - }, "dependencies": { - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - } + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "core-js-pure": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", - "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==", - "dev": true + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "engines": { + "node": ">=0.10.0" } }, - "cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "requires": { - "buffer": "^5.1.0" + "engines": { + "node": ">=0.8.x" } }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "create-emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz", - "integrity": "sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA==", + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { - "@emotion/hash": "^0.6.2", - "@emotion/memoize": "^0.6.1", - "@emotion/stylis": "^0.7.0", - "@emotion/unitless": "^0.6.2", - "csstype": "^2.5.2", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10" + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "engines": { + "node": ">=8" } }, - "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "cross-spawn": "^7.0.0" - }, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "engines": { + "node": ">=8" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "optional": true, + "engines": { + "node": ">=6" } }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "node_modules/expose-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - }, + "license": "MIT", "dependencies": { - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, + "license": "MIT", "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "cssstyle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.3.0.tgz", - "integrity": "sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg==", + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, - "requires": { - "cssom": "~0.3.6" + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "csstype": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", - "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { + "node_modules/extend-shallow/node_modules/is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "dev": true }, - "d3-bboxCollide": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-bboxCollide/-/d3-bboxCollide-1.0.4.tgz", - "integrity": "sha512-Sc8FKGGeejlowLW1g/0WBrVcbd++SBRW4N8OuZhVeRAfwlTL96+75JKlFfHweYdYRui1zPabfNXZrNaphBjS+w==", - "dev": true, - "requires": { - "d3-quadtree": "1.0.1" - } - }, - "d3-brush": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", - "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { - "d3-array": "1", - "d3-path": "1" + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "d3-cloud": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.5.tgz", - "integrity": "sha512-4s2hXZgvs0CoUIw31oBAGrHt9Kt/7P9Ik5HIVzISFiWkD0Ga2VLAuO/emO/z1tYIpE7KG2smB4PhMPfFMJpahw==", - "dev": true, - "requires": { - "d3-dispatch": "^1.0.3" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "d3-color": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", - "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==", + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "requires": { - "d3-array": "^1.1.1" + "dependencies": { + "reusify": "^1.0.4" } }, - "d3-delaunay": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.1.6.tgz", - "integrity": "sha512-VF6bxon2bn1cdXuesInEtVKlE4aUfq5IjE5y0Jl2aZP1yvLsf0QENqQxNhjS4vq95EmYKauA30ofTwvREtPSXA==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, - "requires": { - "delaunator": "4" + "dependencies": { + "pend": "~1.2.0" } }, - "d3-dispatch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", - "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==", - "dev": true - }, - "d3-drag": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", - "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "d3-dsv": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-0.1.14.tgz", - "integrity": "sha1-mDPNYaWj6B4DJjoc54903lah27g=", - "dev": true - }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==", - "dev": true - }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "node_modules/file-type": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", + "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", "dev": true, - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==", - "dev": true - }, - "d3-geo": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz", - "integrity": "sha512-z0J8InXR9e9wcgNtmVnPTj0TU8nhYT6lD/ak9may2PdKqXIeHUr8UbFLoCtrPYNsjv6YaLvSDQVl578k6nm7GA==", + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "dev": true, - "requires": { - "d3-array": "1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "d3-glyphedge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-glyphedge/-/d3-glyphedge-1.2.0.tgz", - "integrity": "sha512-F49fyMXMLYDHvqvxSmuGZrtIWeWLZWxar82WL1CJDBDPk4z6GUGSG4wX7rdv7N7R/YazAyMMnpOL0YQcmTLlOQ==", - "dev": true - }, - "d3-hexbin": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", - "integrity": "sha1-nFg32s/UcasFM3qeke8Qv8T5iDE=", - "dev": true - }, - "d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==", - "dev": true - }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "node_modules/filenamify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", + "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", "dev": true, - "requires": { - "d3-color": "1" + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==", - "dev": true - }, - "d3-polygon": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", - "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==", - "dev": true + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "d3-quadtree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.1.tgz", - "integrity": "sha1-E74CViTxEEBe1DU2xQaq7Bme1ZE=", - "dev": true + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "d3-request": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", - "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" - }, "dependencies": { - "d3-dsv": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.1.1.tgz", - "integrity": "sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==", - "dev": true, - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - } + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "d3-sankey-circular": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.25.0.tgz", - "integrity": "sha512-maYak22afBAvmybeaopd1cVUNTIroEHhWCmh19gEQ+qgOhBkTav8YeP3Uw4OV/K4OksWaQrhhBOE4Rcxgc2JbQ==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { - "d3-array": "^1.2.1", - "d3-collection": "^1.0.4", - "d3-shape": "^1.2.0" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" } }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "node_modules/fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", "dev": true, - "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" } }, - "d3-selection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", - "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==", - "dev": true + "node_modules/fined/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "d3-shape": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "node_modules/flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", "dev": true, - "requires": { - "d3-path": "1" + "engines": { + "node": ">= 10.13.0" } }, - "d3-time": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", - "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==", - "dev": true + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } }, - "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "requires": { - "d3-time": "1" + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true }, - "d3-transition": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz", - "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==", + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", - "dev": true + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "datalib": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/datalib/-/datalib-1.9.2.tgz", - "integrity": "sha512-sV49o/1J3VdtTlJpsvPYT39WfUxyZGTO2rEGhEJt2eNY7LN2Z9K7nq3fOjgYMQtbuL0dVCWvmtxT2hpCgwx9Mg==", + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "requires": { - "d3-dsv": "0.1", - "d3-format": "0.4", - "d3-time": "0.1", - "d3-time-format": "0.2", - "request": "^2.67.0", - "sync-request": "^6.0.0", - "topojson-client": "^3.0.0" + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-format": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-0.4.2.tgz", - "integrity": "sha1-qnWcHlquX6javJq3gZxQL8a1aHU=", - "dev": true - }, - "d3-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-0.1.1.tgz", - "integrity": "sha1-OM4qe7R6QDFhOCPd5GiOWOiSrls=", - "dev": true - }, - "d3-time-format": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-0.2.1.tgz", - "integrity": "sha1-hG45638iZ2aS2GBAxI6fpU/Yvxg=", - "dev": true, - "requires": { - "d3-time": "~0.1.1" - } - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true + "node_modules/foreground-child/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/foreground-child/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "ms": "2.0.0" - }, "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "node_modules/foreground-child/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "decache": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.5.1.tgz", - "integrity": "sha512-5J37nATc6FmOTLbcsr9qx7Nm28qQyg1SK4xyEHqM0IBkNhWFp0Sm+vKoWYHD8wq+OUEb9jLyaKFfzzd1A9hcoA==", + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, - "requires": { - "callsite": "^1.0.0" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "decamelize": { + "node_modules/fromentries": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" } }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - } + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" } }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "node_modules/fs-walk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.1.tgz", + "integrity": "sha1-9/yRw64e6tB8mYvF0N1B8tvr0zU=", "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - } + "async": "*" } }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - } + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "requires": { - "is-obj": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "requires": { - "type-detect": "^4.0.0" + "engines": { + "node": ">=6.9.0" } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "dev": true + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, - "requires": { - "kind-of": "^5.0.2" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "requires": { - "strip-bom": "^4.0.0" - }, + "license": "MIT", "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/get-stream/node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, - "requires": { - "object-keys": "^1.0.12" + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, + "optional": true + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "detect-indent": { + "node_modules/glob-watcher": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", + "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", + "dev": true, + "dependencies": { + "async-done": "^2.0.0", + "chokidar": "^3.5.3" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" } }, - "dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" } }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "didyoumean": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", - "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", - "dev": true + "node_modules/glogg": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", + "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", + "dev": true, + "dependencies": { + "sparkles": "^2.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "diff-match-patch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", - "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" + "node_modules/got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "requires": { - "path-type": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "node_modules/gulp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", + "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", "dev": true, - "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, "dependencies": { - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "glob-watcher": "^6.0.0", + "gulp-cli": "^3.0.0", + "undertaker": "^2.0.0", + "vinyl-fs": "^4.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" } }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/gulp-cli": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", + "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", "dev": true, - "requires": { - "utila": "~0.4" + "dependencies": { + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.0", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" } }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "node_modules/gulp-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@babel/runtime": "^7.1.2" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "node_modules/gulp-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true + "node_modules/gulp-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "dom4": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/dom4/-/dom4-2.1.5.tgz", - "integrity": "sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ==", + "node_modules/gulp-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true + "node_modules/gulp-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true + "node_modules/gulp-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "node_modules/gulp-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" + "engines": { + "node": ">=10" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "node_modules/gulp-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { - "domelementtype": "1" + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "node_modules/gulp-typescript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", + "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dependencies": { + "ansi-colors": "^3.0.5", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^3.0.0", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" + }, + "engines": { + "node": ">= 8" + }, + "peerDependencies": { + "typescript": "~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev" } }, - "download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "node_modules/gulp-typescript/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true, - "requires": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "engines": { + "node": ">=6" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true + "node_modules/gulp-typescript/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - }, + "node_modules/gulp-typescript/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "node_modules/gulp/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "node_modules/gulp/node_modules/fs-mkdirp-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", + "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "graceful-fs": "^4.2.8", + "streamx": "^2.12.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "node_modules/gulp/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/gulp/node_modules/glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "dev": true, + "dependencies": { + "@gulpjs/to-absolute-glob": "^4.0.0", + "anymatch": "^3.1.3", + "fastq": "^1.13.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "is-negated-glob": "^1.0.0", + "normalize-path": "^3.0.0", + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" } }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "node_modules/gulp/node_modules/lead": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", + "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", "dev": true, - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "engines": { + "node": ">=10.13.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.189", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.189.tgz", - "integrity": "sha512-C26Kv6/rLNmGDaPR5HORMtTQat9aWBBKjQk9aFtN1Bk6cQBSw8cYdsel/mcrQlNlMMjt1sAKsTYqf77+sK2uTw==", - "dev": true - }, - "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "node_modules/gulp/node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz", - "integrity": "sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ==", + "node_modules/gulp/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true, - "requires": { - "babel-plugin-emotion": "^9.2.11", - "create-emotion": "^9.2.12" + "engines": { + "node": ">= 10" } }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" + "node_modules/gulp/node_modules/resolve-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", + "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", + "dev": true, + "dependencies": { + "value-or-function": "^4.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" + "node_modules/gulp/node_modules/to-through": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", + "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "dev": true, + "dependencies": { + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" } }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/gulp/node_modules/value-or-function": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", + "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", "dev": true, - "requires": { - "once": "^1.4.0" + "engines": { + "node": ">= 10.13.0" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "node_modules/gulp/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" } }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" - }, - "enzyme": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz", - "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "node_modules/gulp/node_modules/vinyl-fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", + "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", "dev": true, - "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "html-element-map": "^1.0.0", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.4", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" - }, - "dependencies": { - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - } + "dependencies": { + "fs-mkdirp-stream": "^2.0.1", + "glob-stream": "^8.0.0", + "graceful-fs": "^4.2.11", + "iconv-lite": "^0.6.3", + "is-valid-glob": "^1.0.0", + "lead": "^4.0.0", + "normalize-path": "3.0.0", + "resolve-options": "^2.0.0", + "stream-composer": "^1.0.2", + "streamx": "^2.14.0", + "to-through": "^3.0.0", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.0", + "vinyl-sourcemap": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "enzyme-adapter-react-16": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz", - "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", + "node_modules/gulp/node_modules/vinyl-sourcemap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", + "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.12.0", - "has": "^1.0.3", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.0" + "dependencies": { + "convert-source-map": "^2.0.0", + "graceful-fs": "^4.2.10", + "now-and-later": "^3.0.0", + "streamx": "^2.12.5", + "vinyl": "^3.0.0", + "vinyl-contents": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "enzyme-adapter-utils": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", + "node_modules/gulplog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", + "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", "dev": true, - "requires": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" + "dependencies": { + "glogg": "^2.2.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, - "requires": { - "prr": "~1.0.1" + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "error-inject": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", - "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "engines": { + "node": ">=4" } }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "license": "MIT", + "engines": { + "node": "*" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "license": "MIT", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" } }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" } }, - "escape-carriage": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz", - "integrity": "sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint-config-prettier": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", - "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, - "requires": { - "get-stdin": "^6.0.0" - }, "dependencies": { - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - } + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "node_modules/hasha": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", + "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/hasha/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } + "engines": { + "node": ">=8" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" - }, - "estree-is-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", - "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", - "dev": true - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true, - "requires": { - "original": ">=0.0.5" - } + "license": "BSD-2-Clause" }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ] }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" + "engines": { + "node": ">= 4" } }, - "expose-loader": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", - "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", - "dev": true - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "requires": { - "mime-db": "^1.28.0" + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } + "engines": { + "node": ">=0.8.19" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "once": "^1.3.0", + "wrappy": "1" } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, "dependencies": { - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - } + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", - "requires": { - "acorn": "^5.0.0", - "foreach": "^2.0.5", - "isarray": "0.0.1", - "object-keys": "^1.0.6" + "node_modules/into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inversify": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.2.tgz", + "integrity": "sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA==" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "fast-plist": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.2.tgz", - "integrity": "sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg=", + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" - }, - "fast-xml-parser": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.16.0.tgz", - "integrity": "sha512-U+bpScacfgnfNfIKlWHDu4u6rtOaCyxhblOLJ8sZPkhsjgGqdZmVPBhdOyvdMGCDt8CsAv+cssOP3NzQptNt2w==", - "dev": true + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "requires": { - "pend": "~1.2.0" + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "engines": { + "node": ">=0.10.0" } }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", - "dev": true + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "filemanager-webpack-plugin": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/filemanager-webpack-plugin/-/filemanager-webpack-plugin-2.0.5.tgz", - "integrity": "sha512-Yj5XIdKI2AN2r66uZc4MZ/n18SMqe2KKlkAqHHMW1OwveDs2Vc5129CpbFcI73rq/rjqso+2HsxieS7u5sx6XA==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "requires": { - "archiver": "^3.0.0", - "cpx": "^1.5.0", - "fs-extra": "^7.0.0", - "make-dir": "^1.1.0", - "mv": "^2.1.1", - "rimraf": "^2.6.2" - }, "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "filenamify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", - "dev": true + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true, + "license": "MIT" }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true, - "requires": { - "locate-path": "^3.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "engines": { + "node": ">=6" } }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "engines": { + "node": ">=8" } }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "fontkit": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz", - "integrity": "sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ==", - "requires": { - "babel-runtime": "^6.11.6", - "brfs": "^1.4.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.0", - "clone": "^1.0.1", - "deep-equal": "^1.0.0", - "dfa": "^1.0.0", - "restructure": "^0.5.3", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.0.0", - "unicode-trie": "^0.3.0" - }, - "dependencies": { - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - } - }, - "unicode-properties": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.2.2.tgz", - "integrity": "sha512-+WhsOj19c93rPymvnPnFisbgFzrI4LjTV8ejMcCCfwS0XhdllZB4NsMFiYb4xUmpn3+aj3PM40h+wlzoG7PCnQ==", - "requires": { - "base64-js": "^1.3.0", - "unicode-trie": "^1.0.0" - }, - "dependencies": { - "unicode-trie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-1.0.0.tgz", - "integrity": "sha512-v5raLKsobbFbWLMoX9+bChts/VhPPj3XpkNr/HbqkirXR1DPk8eo9IYKyvk0MQZFkaoRsFj2Rmaqgi2rfAZYtA==", - "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - } - } - } + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "requires": { - "for-in": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "dependencies": { + "has-symbols": "^1.0.2" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", - "dev": true + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true, - "requires": { - "map-cache": "^0.2.2" + "engines": { + "node": ">=0.10.0" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", - "dev": true - }, - "fs-constants": { + "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "requires": { - "minipass": "^2.6.0" + "engines": { + "node": ">=8" } }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } }, - "fs-walk": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.1.tgz", - "integrity": "sha1-9/yRw64e6tB8mYvF0N1B8tvr0zU=", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "async": "*" + "bin": { + "semver": "bin/semver.js" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "fs.realpath": { + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isurl": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", + "dev": true, + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/last-run": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", + "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftoff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", + "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true + }, + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-multi-reporters": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz", + "integrity": "sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" + } + }, + "node_modules/mocha-multi-reporters/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/mrmime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stdout": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", + "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/named-js-regexp": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz", + "integrity": "sha512-XO0DPujDP9IWpkt690iWLreKztb/VB811DGl5N3z7BfhkMJuiVZXOi6YN/fEB9qkvtMVTgSZDW8pzdVt8vj/FA==" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true, + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/nise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "optional": true + }, + "node_modules/node-has-native-dependencies": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-has-native-dependencies/-/node-has-native-dependencies-1.0.2.tgz", + "integrity": "sha1-MVLsl1O2ZB5NMi0YXdSTBkmto9o=", + "dev": true, + "dependencies": { + "fs-walk": "0.0.1" + }, + "bin": { + "node-has-native-dependencies": "index.js" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "deprecated": "This version of 'buffer' is out-of-date. You must update to v4.9.2 or newer", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/node-loader": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-1.0.3.tgz", + "integrity": "sha512-8c9ef5q24F0AjrPxUjdX7qdTlsU1zZCPeqYvSBCH1TJko3QW4qu1uA1C9KbOPdaRQwREDdbSYZgltBAlbV7l5g==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", + "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "pbkdf2": "^3.1.5", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pbkdf2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postinstall-build": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.3.tgz", + "integrity": "sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==", + "deprecated": "postinstall-build's behavior is now built into npm! You should migrate off of postinstall-build and use the new `prepare` lifecycle script with npm 5.0.0 or greater.", + "dev": true, + "bin": { + "postinstall-build": "cli.js" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", + "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rewiremock": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.6.tgz", + "integrity": "sha512-hjpS7iQUTVVh/IHV4GE1ypg4IzlgVc34gxZBarwwVrKfnjlyqHJuQdsia6Ac7m4f4k/zxxA3tX285MOstdysRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "compare-module-exports": "^2.1.0", + "node-libs-browser": "^2.1.0", + "path-parse": "^1.0.5", + "wipe-node-cache": "^2.1.2", + "wipe-webpack-cache": "^2.1.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs-compat": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz", + "integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw==" + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", + "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", + "dev": true, + "dependencies": { + "sver": "^1.8.3" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sha.js/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/shortid": { + "version": "2.2.17", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.17.tgz", + "integrity": "sha512-GpbM3gLF1UUXZvQw6MCyulHkWbRseNO4cyBEZresZRorwl1+SLu1ZdqgVtuwqz8mB6RpwPkm541mYSqrKyJSaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sinon": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length/node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparkles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", + "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-composer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", + "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", + "dev": true, + "dependencies": { + "streamx": "^2.13.2" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", + "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", + "dev": true, + "optionalDependencies": { + "semver": "^6.3.0" + } + }, + "node_modules/sver/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-fs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tas-client": { + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz", + "integrity": "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { "optional": true }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, + "esbuild": { "optional": true }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, + "uglify-js": { "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-buffer/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-loader": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-mockito": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", + "integrity": "sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.5" + } + }, + "node_modules/ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { "optional": true }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, + "@swc/wasm": { "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dev": true, + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typemoq": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typemoq/-/typemoq-2.1.0.tgz", + "integrity": "sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "circular-json": "^0.3.1", + "lodash": "^4.17.4", + "postinstall-build": "^5.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/uint64be": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-3.0.0.tgz", + "integrity": "sha512-mliiCSrsE29aNBI7O9W5gGv6WmA9kBR8PtTt6Apaxns076IRdYrrtFhXHEWMj5CSum3U7cv7/pi4xmi4XsIOqg==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/undertaker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", + "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", + "dev": true, + "dependencies": { + "bach": "^2.0.1", + "fast-levenshtein": "^3.0.0", + "last-run": "^2.0.0", + "undertaker-registry": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/undertaker-registry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", + "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dev": true, + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/unicode/-/unicode-14.0.0.tgz", + "integrity": "sha512-BjinxTXkbm9Jomp/YBTMGusr4fxIG67fNGShHIRAL16Ur2GJTq2xvLi+sxuiJmInCmwqqev2BCFKyvbfp/yAkg==", + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "dev": true + }, + "node_modules/v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "dev": true, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dev": true, + "dependencies": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-contents/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/vinyl-contents/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/vinyl-contents/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vinyl-contents/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/vinyl-contents/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vscode-debugprotocol": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.35.0.tgz", + "integrity": "sha512-+OMm11R1bGYbpIJ5eQIkwoDGFF4GvBz3Ztl6/VM+/RNNb2Gjk2c0Ku+oMmfhlTmTlPCpgHBsH4JqVCbUYhu5bA==", + "deprecated": "This package has been renamed to @vscode/debugprotocol, please update to the new name" + }, + "node_modules/vscode-jsonrpc": { + "version": "9.0.0-next.5", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.5.tgz", + "integrity": "sha512-Sl/8RAJtfF/2x/TPBVRuhzRAcqYR/QDjEjNqMcoKFfqsxfVUPzikupRDQYB77Gkbt1RrW43sSuZ5uLtNAcikQQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "10.0.0-next.12", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.12.tgz", + "integrity": "sha512-q7cVYCcYiv+a+fJYCbjMMScOGBnX162IBeUMFg31mvnN7RHKx5/CwKaCz+r+RciJrRXMqS8y8qpEVGgeIPnbxg==", + "dependencies": { + "minimatch": "^9.0.3", + "semver": "^7.6.0", + "vscode-languageserver-protocol": "3.17.6-next.10" + }, + "engines": { + "vscode": "^1.91.0" + } + }, + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.6-next.10", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.10.tgz", + "integrity": "sha512-KOrrWn4NVC5jnFC5N6y/fyNKtx8rVYr67lhL/Z0P4ZBAN27aBsCnLBWAMIkYyJ1K8EZaE5r7gqdxrS9JPB6LIg==", + "dependencies": { + "vscode-jsonrpc": "9.0.0-next.5", + "vscode-languageserver-types": "3.17.6-next.5" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" + }, + "node_modules/vscode-tas-client": { + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", + "dependencies": { + "tas-client": "0.2.33" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { "optional": true }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, + "@webpack-cli/migrate": { "optional": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, + "webpack-bundle-analyzer": { "optional": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, + "webpack-dev-server": { "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-fix-default-import-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/webpack-fix-default-import-plugin/-/webpack-fix-default-import-plugin-1.0.3.tgz", + "integrity": "sha1-iCuOTRqpPEjLj9r4Rvx52G+C8U8=", + "dev": true + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-require-from": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/webpack-require-from/-/webpack-require-from-1.8.6.tgz", + "integrity": "sha512-QmRsOkOYPKeNXp4uVc7qxnPrFQPrP4bhOc/gl4QenTFNgXdEbF1U8VC+jM/Sljb0VzJLNgyNiHlVkuHjcmDtBQ==", + "dev": true, + "peerDependencies": { + "tapable": "^2.2.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/winreg": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", + "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" + }, + "node_modules/wipe-node-cache": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.2.tgz", + "integrity": "sha512-m7NXa8qSxBGMtdQilOu53ctMaIBXy93FOP04EC1Uf4bpsE+r+adfLKwIMIvGbABsznaSNxK/ErD4xXDyY5og9w==", + "dev": true + }, + "node_modules/wipe-webpack-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wipe-webpack-cache/-/wipe-webpack-cache-2.1.0.tgz", + "integrity": "sha512-OXzQMGpA7MnQQ8AG+uMl5mWR2ezy6fw1+DMHY+wzYP1qkF1jrek87psLBmhZEj+er4efO/GD4R8jXWFierobaA==", + "dev": true, + "dependencies": { + "wipe-node-cache": "^2.1.0" + } + }, + "node_modules/worker-loader": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { "optional": true }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, + "utf-8-validate": { "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true } } }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "engines": { + "node": ">=0.4" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "engines": { + "node": ">=8" } }, - "fuzzy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha1-THbsL/CsGjap3M+aAN+GIweNTtg=" + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" } }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "get-proxy": { + "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "requires": { - "npm-conf": "^1.1.0" + "engines": { + "node": ">=8" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/yargs/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "node_modules/yargs/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "node_modules/yargs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "node_modules/yargs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/yargs/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/yargs/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, - "requires": { - "find-index": "^0.1.1" + "dependencies": { + "buffer-crc32": "~0.2.3" } }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "engines": { + "node": ">=6" } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, + "@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "tslib": "^2.2.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" + "@azure/core-auth": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.2.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dev": true, "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" + "tslib": "^2.6.2" } }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true } } }, - "gulp-azure-storage": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/gulp-azure-storage/-/gulp-azure-storage-0.9.0.tgz", - "integrity": "sha512-b6CfmmEtyLDT3afv7wvNin3FJh3eAJy9N26HIXQTbQFP3LzP8XLJrvDe+G9lxFzJt943xgoYFNWUZz3wiJTZdQ==", - "dev": true, + "@azure/core-rest-pipeline": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", "requires": { - "azure-storage": "^2.10.2", - "delayed-stream": "0.0.6", - "event-stream": "3.3.4", - "mime": "^1.3.4", - "optimist": "^0.6.1", - "progress": "^1.1.8", - "queue": "^3.0.10", - "streamifier": "^0.1.1", - "vinyl": "^0.4.5", - "vinyl-fs": "^3.0.3" + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" }, - "delayed-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.6.tgz", - "integrity": "sha1-omRst+w9XXd0YUZwp6Zd4MFz7bw=", - "dev": true + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true, + "@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", "requires": { - "deep-assign": "^1.0.0", - "stat-mode": "^0.2.0", - "through2": "^2.0.0" + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } } }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, + "@azure/core-util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } } }, - "gulp-gunzip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.1.0.tgz", - "integrity": "sha512-3INeprGyz5fUtAs75k6wVslGuRZIjKAoQp39xA7Bz350ReqkrfYaLYqjZ67XyIfLytRXdzeX04f+DnBduYhQWw==", - "dev": true, - "requires": { - "through2": "~2.0.3", - "vinyl": "~2.0.1" + "@azure/identity": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.2.1.tgz", + "integrity": "sha512-U8hsyC9YPcEIzoaObJlRDvp7KiF0MGS7xcWbyJSVvXRkC/HXo1f0oYeBYmEvVgRfacw7GHf6D6yAoh9JHz6A5Q==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.4.0", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" }, "dependencies": { - "vinyl": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", - "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "is-stream": "^1.1.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true } } }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", - "dev": true - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, + "@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } } }, - "gulp-typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-4.0.2.tgz", - "integrity": "sha512-Hhbn5Aa2l3T+tnn0KqsG6RRJmcYEsr3byTL2nBpNBeAK8pqug9Od4AwddU4JEI+hRw7mzZyjRbB8DDWR6paGVA==", + "@azure/msal-browser": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.14.0.tgz", + "integrity": "sha512-Un85LhOoecJ3HDTS3Uv3UWnXC9/43ZSO+Kc+anSqpZvcEt58SiO/3DuVCAe1A3I5UIBYJNMgTmZPGXQ0MVYrwA==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "plugin-error": "^0.1.2", - "source-map": "^0.6.1", - "through2": "^2.0.3", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.0" + "@azure/msal-common": "14.10.0" } }, - "gulp-untar": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.8.tgz", - "integrity": "sha512-mqW7v2uvrxd8IoCCwJ04sPYgWjR3Gsi6yfhVWBK3sFMDP7FuoT7GNmxrCMwkk4RWqQohx8DRv+cDq4SRDXATGA==", + "@azure/msal-common": { + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.10.0.tgz", + "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==", + "dev": true + }, + "@azure/msal-node": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", "dev": true, "requires": { - "event-stream": "3.3.4", - "streamifier": "~0.1.1", - "tar": "^2.2.1", - "through2": "~2.0.3", - "vinyl": "^1.2.0" + "@azure/msal-common": "14.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" }, "dependencies": { - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "@azure/msal-common": { + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } } } }, - "gulp-vinyl-zip": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", - "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", - "dev": true, + "@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz", + "integrity": "sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==", "requires": { - "event-stream": "3.3.4", - "queue": "^4.2.1", - "through2": "^2.0.3", - "vinyl": "^2.0.2", - "vinyl-fs": "^3.0.3", - "yauzl": "^2.2.1", - "yazl": "^2.2.1" + "@azure/core-tracing": "^1.0.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/instrumentation": "^0.41.2", + "tslib": "^2.2.0" }, "dependencies": { - "queue": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", - "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "duplexer": "^0.1.1" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" + "@babel/core": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", + "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.6", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "yallist": "^3.0.2" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "@babel/types": "^7.22.5" } }, - "hasha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", - "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - } + "@babel/types": "^7.22.5" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "react-is": "^16.7.0" + "@babel/types": "^7.22.5" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "@babel/types": "^7.22.5" } }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, - "html-element-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.0.1.tgz", - "integrity": "sha512-BZSfdEm6n706/lBfXKWa4frZRZcT5k1cOusw95ijZsHlI+GdgY0v95h6IzO3iIDf2ROwq570YTwqNPqHcNMozw==", + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "requires": { - "array-filter": "^1.0.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" } }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "@babel/types": "^7.27.1" } }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "@babel/runtime-corejs3": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz", + "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==", "dev": true, "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - } + "core-js-pure": "^3.30.2" } }, - "html-to-react": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.3.4.tgz", - "integrity": "sha512-/tWDdb/8Koi/QEP5YUY1653PcDpBnnMblXRhotnTuhFDjI1Fc6Wzox5d4sw73Xk5rM2OdM5np4AYjT/US/Wj7Q==", + "@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "requires": { - "domhandler": "^2.4.2", - "escape-string-regexp": "^1.0.5", - "htmlparser2": "^3.10.0", - "lodash.camelcase": "^4.3.0", - "ramda": "^0.26" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "ms": "2.1.2" } } } }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, - "http-assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", - "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.7.2" - } + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "@cspotcode/source-map-consumer": "0.8.0" } }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - } + "eslint-visitor-keys": "^3.3.0" } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { - "ms": "2.0.0" + "brace-expansion": "^1.1.7" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "requires": { - "@types/node": "^10.0.3" - } + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "@gulpjs/messages": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", + "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", + "dev": true + }, + "@gulpjs/to-absolute-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", + "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", + "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "is-negated-glob": "^1.0.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "^2.1.3" + } + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, - "humanize-number": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", - "integrity": "sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=" + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true }, - "husky": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", - "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@iarna/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==" + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "requires": { - "cosmiconfig": "^5.0.7", - "execa": "^1.0.0", - "find-up": "^3.0.0", - "get-stdin": "^6.0.0", - "is-ci": "^2.0.0", - "pkg-dir": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "read-pkg": "^4.0.1", - "run-node": "^1.0.0", - "slash": "^2.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "dependencies": { - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" } } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "@istanbuljs/schema": "^0.1.2" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immutable": { - "version": "4.0.0-rc.12", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", - "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==", + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, + "@microsoft/1ds-core-js": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.13.tgz", + "integrity": "sha512-CluYTRWcEk0ObG5EWFNWhs87e2qchJUn0p2D21ZUa3PWojPZfPSBs4//WIE0MYV8Qg1Hdif2ZTwlM7TbYUjfAg==", "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "@microsoft/applicationinsights-core-js": "2.8.15", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "@microsoft/1ds-post-js": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.13.tgz", + "integrity": "sha512-HgS574fdD19Bo2vPguyznL4eDw7Pcm1cVNpvbvBLWiW3x4e1FCQ3VMXChWnAxCae8Hb0XqlA2sz332ZobBavTA==", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "@microsoft/1ds-core-js": "3.2.13", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "@microsoft/applicationinsights-channel-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.0.2.tgz", + "integrity": "sha512-jDBNKbCHsJgmpv0CKNhJ/uN9ZphvfGdb93Svk+R4LjO8L3apNNMbDDPxBvXXi0uigRmA1TBcmyBG4IRKjabGhw==", + "requires": { + "@microsoft/applicationinsights-common": "3.0.2", + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "dependencies": { + "@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", + "requires": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + } + }, + "@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + } + } }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "@microsoft/applicationinsights-common": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.0.2.tgz", + "integrity": "sha512-y+WXWop+OVim954Cu1uyYMnNx6PWO8okHpZIQi/1YSqtqaYdtJVPv4P0AVzwJdohxzVfgzKvqj9nec/VWqE2Zg==", + "requires": { + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", + "requires": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + } + } + }, + "@microsoft/applicationinsights-core-js": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.15.tgz", + "integrity": "sha512-yYAs9MyjGr2YijQdUSN9mVgT1ijI1FPMgcffpaPmYbHAVbQmF7bXudrBWHxmLzJlwl5rfep+Zgjli2e67lwUqQ==", + "requires": { + "@microsoft/applicationinsights-shims": "2.0.2", + "@microsoft/dynamicproto-js": "^1.1.9" + } + }, + "@microsoft/applicationinsights-shims": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", + "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + }, + "@microsoft/applicationinsights-web-basic": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.0.2.tgz", + "integrity": "sha512-6Lq0DE/pZp9RvSV+weGbcxN1NDmfczj6gNPhvZKV2YSQ3RK0LZE3+wjTWLXfuStq8a+nCBdsRpWk8tOKgsoxcg==", + "requires": { + "@microsoft/applicationinsights-channel-js": "3.0.2", + "@microsoft/applicationinsights-common": "3.0.2", + "@microsoft/applicationinsights-core-js": "3.0.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + }, + "dependencies": { + "@microsoft/applicationinsights-core-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.2.tgz", + "integrity": "sha512-WQhVhzlRlLDrQzn3OShCW/pL3BW5WC57t0oywSknX3q7lMzI3jDg7Ihh0iuIcNTzGCTbDkuqr4d6IjEDWIMtJQ==", + "requires": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.2.4 < 2.x", + "@nevware21/ts-utils": ">= 0.9.5 < 2.x" + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, + "@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, + "@microsoft/dynamicproto-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz", + "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==", "requires": { - "ansi-regex": "^3.0.0" + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" } } } }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true + "@microsoft/applicationinsights-web-snippet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", + "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } + "@microsoft/dynamicproto-js": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", + "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, + "@nevware21/ts-async": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.3.0.tgz", + "integrity": "sha512-ZUcgUH12LN/F6nzN0cYd0F/rJaMLmXr0EHVTyYfaYmK55bdwE4338uue4UiVoRqHVqNW4KDUrJc49iGogHKeWA==", "requires": { - "loose-envify": "^1.0.0" + "@nevware21/ts-utils": ">= 0.10.0 < 2.x" } }, - "inversify": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-4.13.0.tgz", - "integrity": "sha512-O5d8y7gKtyRwrvTLZzYET3kdFjqUy58sGpBYMARF13mzqDobpfBXVOPLH7HmnD2VR6Q+1HzZtslGvsdQfeb0SA==" + "@nevware21/ts-utils": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.1.tgz", + "integrity": "sha512-pMny25NnF2/MJwdqC3Iyjm2pGIXNxni4AROpcqDeWa+td9JMUY4bUS9uU9XW+BoBRqTLUL+WURF9SOd/6OQzRg==" }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, + "@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" + }, + "@opentelemetry/core": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz", + "integrity": "sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw==", "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "@opentelemetry/semantic-conventions": "1.15.2" } }, - "is-alphabetical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", - "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", - "dev": true + "@opentelemetry/instrumentation": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz", + "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==", + "requires": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.1", + "shimmer": "^1.2.1" + } }, - "is-alphanumerical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", - "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", - "dev": true, + "@opentelemetry/resources": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz", + "integrity": "sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw==", "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true + "@opentelemetry/sdk-trace-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz", + "integrity": "sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ==", + "requires": { + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" + } }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "@opentelemetry/semantic-conventions": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", + "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==" }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } + "optional": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "type-detect": "4.0.8" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "type-detect": "4.0.8" } } } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, - "is-decimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", - "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/bent": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@types/bent/-/bent-7.3.3.tgz", + "integrity": "sha512-5NEIhVzHiZ6wMjFBmJ3gwjxwGug6amMoAn93rtDBttwrODxm+bt63u+MJA7H9NGGM4X1m73sJrAxDapktl036Q==", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "@types/node": "*" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "@types/chai-arrays": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/chai-arrays/-/chai-arrays-2.0.0.tgz", + "integrity": "sha512-5h5jnAC9C64YnD7WJpA5gBG7CppF/QmoWytOssJ6ysENllW49NBdpsTx6uuIBOpnzAnXThb8jBICgB62wezTLQ==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "@types/chai": "*" } }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "@types/chai": "*" } }, - "is-hexadecimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", - "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "is-ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", - "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "@types/decompress": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.5.tgz", + "integrity": "sha512-LdL+kbcKGs9TzvB/K+OBGzPfDoP6gwwTsykYjodlzUJUUYp/43c1p1jE5YTtz3z4Ml90iruvBXbJ6+kDvb3WSQ==", "dev": true, "requires": { - "ip-regex": "^2.0.0" + "@types/node": "*" } }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "@types/download": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/download/-/download-8.0.3.tgz", + "integrity": "sha512-IDwXjU7zCtuFVvI0Plnb02TpXyj3RA4YeOKQvEfsjdJeWxZ9hTl6lxeNsU2bLWn0aeAS7fyMl74w/TbdOlS2KQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "@types/decompress": "*", + "@types/got": "^9", + "@types/node": "*" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "@types/eslint": "*", + "@types/estree": "*" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "requires": { - "isobject": "^3.0.1" + "@types/jsonfile": "*", + "@types/node": "*" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { - "has": "^1.0.1" + "@types/minimatch": "*", + "@types/node": "*" } }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "@types/got": { + "version": "9.6.12", + "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz", + "integrity": "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=", + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", + "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", "dev": true }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "undici-types": "~6.21.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" + }, + "@types/shortid": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/shortid/-/shortid-0.0.29.tgz", + "integrity": "sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps=", + "dev": true + }, + "@types/sinon": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "@types/sinonjs__fake-timers": "*" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, - "is-whitespace-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", - "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", + "@types/stack-trace": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", + "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=", "dev": true }, - "is-word-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", - "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", + "@types/tough-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "@types/vscode": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.100.0.tgz", + "integrity": "sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "@types/which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.1.tgz", + "integrity": "sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "@types/winreg": { + "version": "1.2.31", + "resolved": "https://registry.npmjs.org/@types/winreg/-/winreg-1.2.31.tgz", + "integrity": "sha512-SDatEMEtQ1cJK3esIdH6colduWBP+42Xw9Guq1sf/N6rM3ZxgljBduvZOwBsxRps/k5+Wwf5HJun6pH8OnD2gg==", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", "dev": true, "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "@types/node": "*" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "requires": { - "append-transform": "^2.0.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", - "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.7", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.7", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4" - } - }, - "@babel/helpers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", - "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", - "dev": true, - "requires": { - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", - "dev": true - }, - "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { - "semver": "^6.0.0" + "ms": "2.1.2" } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + } + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "balanced-match": "^1.0.0" } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { - "glob": "^7.1.3" + "ms": "2.1.2" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "brace-expansion": "^2.0.1" } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + } + } + }, + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "dependencies": { + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "@vscode/extension-telemetry": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.8.4.tgz", + "integrity": "sha512-UqM9+KZDDK3MyoHTsg6XNM+XO6pweQxzCpqJz33BoBEYAGsbBviRYcVpJglgay2oReuDD2pOI1Nio3BKNDLhWA==", + "requires": { + "@microsoft/1ds-core-js": "^3.2.13", + "@microsoft/1ds-post-js": "^3.2.13", + "@microsoft/applicationinsights-web-basic": "^3.0.2", + "applicationinsights": "^2.7.1" + } + }, + "@vscode/test-electron": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + } + }, + "@vscode/vsce": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.27.0.tgz", + "integrity": "sha512-FFUMBVSyyjjJpWszwqk7d4U3YllY8FdWslbUDMRki1x4ZjA3Z0hmRMfypWrjP9sptbSR9nyPFU4uqjhy2qRB/w==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { - "semver": "^6.0.0" + "lru-cache": "^6.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" } } } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "@vscode/vsce-sign": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", + "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "@vscode/vsce-sign-alpine-arm64": "2.0.2", + "@vscode/vsce-sign-alpine-x64": "2.0.2", + "@vscode/vsce-sign-darwin-arm64": "2.0.2", + "@vscode/vsce-sign-darwin-x64": "2.0.2", + "@vscode/vsce-sign-linux-arm": "2.0.2", + "@vscode/vsce-sign-linux-arm64": "2.0.2", + "@vscode/vsce-sign-linux-x64": "2.0.2", + "@vscode/vsce-sign-win32-arm64": "2.0.2", + "@vscode/vsce-sign-win32-x64": "2.0.2" } }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", + "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-alpine-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", + "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", + "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", + "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", + "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", + "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", + "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", + "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "dev": true, + "optional": true + }, + "@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", - "dev": true + "@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } }, - "jquery-ui": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", - "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=", + "@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} + }, + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "debug": "4" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } } } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", - "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.1.1", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.3.6", - "cssstyle": "^1.2.2", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.4", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" } }, - "ws": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", - "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", - "dev": true, - "requires": { - "async-limiter": "^1.0.0" - } + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} }, - "json-edm-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/json-edm-parser/-/json-edm-parser-0.1.2.tgz", - "integrity": "sha1-HmCw/vG8CvZ7wNFG393lSGzWFbQ=", + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, "requires": { - "jsonparse": "~1.2.0" + "ansi-wrap": "^0.1.0" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "jsonify": "~0.0.0" + "color-convert": "^1.9.0" } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-pretty-compact": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", - "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==", + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } }, - "json2csv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-4.5.2.tgz", - "integrity": "sha512-Te2Knce3VfLKyurH3AolM6Y781ZE+R3jQ+0YQ0HYLiubyicST/19vML24e1dpScaaEQb+1Q1t5IcGXr6esM9Lw==", + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, "requires": { - "commander": "^2.15.1", - "jsonparse": "^1.3.1", - "lodash.get": "^4.4.2" + "buffer-equal": "^1.0.0" }, "dependencies": { - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true } } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, "requires": { - "minimist": "^1.2.0" + "default-require-extensions": "^3.0.0" } }, - "jsonc-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.1.0.tgz", - "integrity": "sha512-n9GrT8rrr2fhvBbANa1g+xFmgGK5X91KFeDwlKQ3+SJfmH5+tKv/M/kahx/TXOMflfWHKGKqKyfHQaLKTNzJ6w==" + "applicationinsights": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", + "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", + "requires": { + "@azure/core-auth": "^1.5.0", + "@azure/core-rest-pipeline": "1.10.1", + "@azure/core-util": "1.2.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", + "@microsoft/applicationinsights-web-snippet": "^1.0.1", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/sdk-trace-base": "^1.15.2", + "@opentelemetry/semantic-conventions": "^1.15.2", + "cls-hooked": "^4.2.2", + "continuation-local-storage": "^3.2.1", + "diagnostic-channel": "1.1.1", + "diagnostic-channel-publishers": "1.0.7" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" }, - "jsonfile": { + "archive-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true + } } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "jsonparse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", - "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=" + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "sprintf-js": "~1.0.2" } }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, "requires": { - "tsscmp": "1.0.6" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "json-buffer": "3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "koa": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", - "integrity": "sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==", - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "~3.1.0", - "delegates": "^1.0.0", - "depd": "^1.1.2", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "error-inject": "^1.0.0", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, - "koa-compress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.0.0.tgz", - "integrity": "sha512-xol+LkNB1mozKJkB5Kj6nYXbJXhkLkZlXl9BsGBPjujVfZ8MsIXwU4GHRTT7TlSfUcl2DU3JtC+j6wOWcovfuQ==", + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, "requires": { - "bytes": "^3.0.0", - "compressible": "^2.0.0", - "koa-is-json": "^1.0.0", - "statuses": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" } }, - "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "requires": { - "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "requires": { - "any-promise": "^1.1.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" } }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" - }, - "koa-logger": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-logger/-/koa-logger-3.2.1.tgz", - "integrity": "sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==", + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "requires": { - "bytes": "^3.1.0", - "chalk": "^2.4.2", - "humanize-number": "0.0.2", - "passthrough-counter": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" } }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, "requires": { - "colornames": "^1.1.1" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" } }, - "labella": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/labella/-/labella-1.1.4.tgz", - "integrity": "sha1-xsxaNA6N80DrM1YzaD6lm4KMMi0=", - "dev": true - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "readable-stream": "^2.0.5" + "object-assign": "^4.1.1", + "util": "0.10.3" }, "dependencies": { - "process-nextick-args": { + "inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "inherits": "2.0.1" } } } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true }, - "lead": { + "assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "async-done": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", "dev": true, "requires": { - "flush-write-stream": "^1.0.2" + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" } }, - "leaflet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.5.1.tgz", - "integrity": "sha512-ekM9KAeG99tYisNBg0IzEywAlp0hYI5XRipsqRXyRTeuU8jcuntilpp+eFf5gaE0xubc9RuSNIVtByEKwqFV0w==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, + "async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - } + "stack-chain": "^1.3.7" } }, - "less-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", - "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", - "dev": true, + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" + "semver": "^5.3.0", + "shimmer": "^1.1.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, - "less-plugin-inline-urls": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/less-plugin-inline-urls/-/less-plugin-inline-urls-1.2.0.tgz", - "integrity": "sha1-XdqwegwlcfGihVz5Kd3J78Hjisw=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "async-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", + "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "async-done": "^2.0.0" } }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "possible-typed-array-names": "^1.0.0" } }, - "line-by-line": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/line-by-line/-/line-by-line-0.1.6.tgz", - "integrity": "sha512-MmwVPfOyp0lWnEZ3fBA8Ah4pMFvxO6WgWovqZNu7Y4J0TNnGcsV4S1LzECHbdgqk1hoHc2mFP1Axc37YUqwafg==" - }, - "linear-layout-vector": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", - "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=", + "axe-core": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", + "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", "dev": true }, - "linebreak": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz", - "integrity": "sha1-BSZICmLAW9Z58+nZmDDgnGp9DtY=", - "requires": { - "base64-js": "0.0.8", - "brfs": "^1.3.0", - "unicode-trie": "^0.3.0" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" }, "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true } } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "bach": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", + "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "now-and-later": "^3.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", "dev": true, "requires": { - "minimist": "^1.2.0" + "once": "^1.4.0" } } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true + "bare-events": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.3.1.tgz", + "integrity": "sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==", + "dev": true, + "optional": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=", + "baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "dev": true, + "requires": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + } + } }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, + "brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0" + "fill-range": "^7.1.1" } }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "chalk": "^2.0.1" - } - }, - "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "browserify-sign": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, "requires": { - "es5-ext": "~0.10.2" + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "requires": { - "vlq": "^0.2.2" + "pako": "~1.0.5" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "map-visit": { + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, - "markdown-escapes": { + "buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", - "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true }, - "martinez-polygon-clipping": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.1.5.tgz", - "integrity": "sha1-gc4+soZ82RiKILkKzybyP7To7kI=", - "dev": true, - "requires": { - "bintrees": "^1.0.1", - "tinyqueue": "^1.1.0" - } + "bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", + "dev": true }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", "dev": true, "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" }, "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", + "dev": true } } }, - "material-colors": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", - "dev": true - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" } }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" } }, - "mdast-add-list-metadata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", - "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "requires": { - "unist-util-visit-parents": "1.1.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "caniuse-lite": { + "version": "1.0.30001768", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz", + "integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - } + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" } }, - "memoize-one": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", - "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==", + "chai-arrays": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chai-arrays/-/chai-arrays-2.2.0.tgz", + "integrity": "sha512-4awrdGI2EH8owJ9I58PXwG4N56/FiM8bsn4CVSNEgr4GKAM6Kq5JPVApUbhUBjDakbZNuRvV7quRSC38PWq/tg==", "dev": true }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "domelementtype": "^2.2.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true } } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "dev": true, "requires": { - "mime-db": "1.40.0" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "dom-walk": "^0.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "minipass-collect": { + "clone-response": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "mimic-response": "^1.0.0" } }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, + "cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", "requires": { - "minipass": "^3.0.0" + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" }, "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } + "cockatiel": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.1.3.tgz", + "integrity": "sha512-xC759TpZ69d7HhfDp8m2WkRwEUiCkxY8Ee2OQH/3H6zmy2D/5Sm+zSTbPRa+V2QyjDtpMvjOIAOVjA2gp6N1kQ==", + "dev": true }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "color-name": "1.1.3" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "delayed-stream": "~1.0.0" } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-module-exports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/compare-module-exports/-/compare-module-exports-2.1.0.tgz", + "integrity": "sha512-3Lc0sTIuX1jmY2K2RrXRJOND6KsRTX2D4v3+eu1PDptsuJZVK4LZc852eZa9I+avj0NrUKlTNgqvccNOH6mbGg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" + "safe-buffer": "5.2.1" }, "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" } }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, - "mocha-junit-reporter": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.0.tgz", - "integrity": "sha512-pmpnEO4iDTmLfrT2RKqPsc5relG4crnDSGmXPuGogdda27A7kLujDNJV4EbTbXlVBCZXggN9rQYPEWMkOv4AAA==", + "copy-props": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", + "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", "dev": true, "requires": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" + "each-props": "^3.0.0", + "is-plain-object": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } } } }, - "mocha-multi-reporters": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz", - "integrity": "sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI=", + "copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, "requires": { - "debug": "^3.1.0", - "lodash": "^4.16.4" + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "ms": "^2.1.1" + "is-glob": "^4.0.3" } } } }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "monaco-editor": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.18.1.tgz", - "integrity": "sha512-fmL+RFZ2Hrezy+X/5ZczQW51LUmvzfcqOurnkCIRFTyjdVjzR7JvENzI6+VKBJzJdPh6EYL4RoWl92b2Hrk9fw==", + "core-js-pure": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", "dev": true }, - "monaco-editor-textmate": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/monaco-editor-textmate/-/monaco-editor-textmate-2.2.1.tgz", - "integrity": "sha512-RYTNNfvyjK15M0JA8WIi9UduU10eX5724UGNKnaA8MSetehjThGENctUTuKaxPk/k3pq59QzaQ/C06A44iJd3Q==", + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "monaco-editor-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-oItymcnlL14Sjd7EF7q+CMhucfwR/2BxsqrXIBrWL6LQplFfAfV+grLEQRmVHeGSBZ/Gk9ptzfueXnWcoEcFuA==", - "dev": true, - "requires": { - "@types/webpack": "^4.4.19" - } - }, - "monaco-textmate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/monaco-textmate/-/monaco-textmate-3.0.1.tgz", - "integrity": "sha512-ZxxY3OsqUczYP1sGqo97tu+CJmMBwuSW+dL0WEBdDhOZ5G1zntw72hvBc68ZQAirosWvbDKgN1dL5k173QtFww==", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { - "fast-plist": "^0.1.2" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" + "cross-spawn": "^7.0.1" }, "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "glob": "^6.0.1" + "shebang-regex": "^3.0.0" } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true } } }, - "named-js-regexp": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz", - "integrity": "sha512-XO0DPujDP9IWpkt690iWLreKztb/VB811DGl5N3z7BfhkMJuiVZXOi6YN/fEB9qkvtMVTgSZDW8pzdVt8vj/FA==" + "cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", "dev": true }, - "nanoid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.3.tgz", - "integrity": "sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw==", + "crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + } + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } }, - "nearley": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.16.0.tgz", - "integrity": "sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg==", + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "requires": { - "commander": "^2.19.0", - "moo": "^0.4.3", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "ms": "2.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, - "nise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.0.tgz", - "integrity": "sha512-EObFx5tioBMePHpU/gGczaY2YDqL255iwjmZwswu2CiwEW8xIGrr3E2xij+efIppS1nLQo9NyXSIUySGHUOhHQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "nock": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-10.0.6.tgz", - "integrity": "sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w==", + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, "requires": { - "chai": "^4.1.2", - "debug": "^4.1.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.5", - "mkdirp": "^0.5.0", - "propagate": "^1.0.0", - "qs": "^6.5.1", - "semver": "^5.5.0" + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true } } }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + "mimic-response": "^1.0.0" } }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true + } } }, - "node-has-native-dependencies": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-has-native-dependencies/-/node-has-native-dependencies-1.0.2.tgz", - "integrity": "sha1-MVLsl1O2ZB5NMi0YXdSTBkmto9o=", + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, "requires": { - "fs-walk": "0.0.1" + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } } }, - "node-html-parser": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.1.16.tgz", - "integrity": "sha512-cfqTZIYDdp5cGh3NvCD5dcEDP7hfyni7WgyFacmDynLlIZaF3GVlRk8yMARhWp/PobWt1KaCV8VKdP5LKWiVbg==", + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, "requires": { - "he": "1.1.1" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" }, "dependencies": { - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true } } }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true } } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "process-on-spawn": "^1.0.0" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" } }, - "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "semver": "^5.3.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node-stream-zip": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz", - "integrity": "sha512-zwP2F/R28Oqtl0gOLItk5QjJ6jEU8XO4kaUMgeqvCyXPgdCZlm8T/5qLMiNy+moJCBCiMQAaX7aVMRhT0t2vkQ==" + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "optional": true + }, + "diagnostic-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz", + "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==", + "requires": { + "semver": "^7.5.3" + } + }, + "diagnostic-channel-publishers": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.7.tgz", + "integrity": "sha512-SEECbY5AiVt6DfLkhkaHNeshg1CogdLLANA8xlG/TKvS+XUgvIKl7VspJGYiEdL5OUyzMVnr7o0AwB7f+/Mjtg==", + "requires": {} + }, + "diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "abbrev": "1" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "path-type": "^4.0.0" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "download": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", + "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", "dev": true, "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" }, "dependencies": { - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true } } }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "once": "^1.3.2" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "each-props": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", "dev": true, "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true } } }, - "npm-packlist": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", - "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "safe-buffer": "^5.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true + }, + "elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { - "path-key": "^2.0.0" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "requires": { + "shimmer": "^1.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "once": "^1.4.0" } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true }, - "numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true }, - "nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", - "make-dir": "^3.0.0", - "node-preload": "^0.2.0", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "uuid": "^3.3.3", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -14961,21 +19939,20 @@ "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "color-convert": { @@ -14993,6710 +19970,6388 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "ms": "2.1.2" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "type-fest": "^0.20.2" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "semver": "^6.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, - "p-map": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "has-flag": "^4.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "requires": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { - "find-up": "^4.0.0" + "brace-expansion": "^1.1.7" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "glob": "^7.1.3" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" + "shebang-regex": "^3.0.0" } }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "optional": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expose-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "dev": true, + "requires": {} + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-plain-object": "^2.0.4" } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-glob": "^4.0.1" } } } }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { - "isobject": "^3.0.0" + "reusify": "^1.0.4" } }, - "object.assign": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", + "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", + "dev": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true + }, + "filenamify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", + "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" }, "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true } } }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "dev": true + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, - "object.fromentries": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", - "function-bind": "^1.1.1", - "has": "^1.0.1" + "is-callable": "^1.2.7" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "for-in": "^1.0.1" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "for-in": "^1.0.1" + "shebang-regex": "^3.0.0" } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true } } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, + "form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "requires": { - "isobject": "^3.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "for-in": "^1.0.1" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" } } }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "fs-walk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.1.tgz", + "integrity": "sha1-9/yRw64e6tB8mYvF0N1B8tvr0zU=", + "dev": true, "requires": { - "ee-first": "1.1.1" + "async": "*" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true }, - "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, - "onigasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.2.tgz", - "integrity": "sha512-TQTMk+RmPYx4sGzNAgV0q7At7PABDNHVqZBlC4aRXHg8hpCdemLOF0qq0gUCjwUbc7mhJMBOo3XpTRYwyr45Gw==", - "requires": { - "lru-cache": "^4.1.1" - } + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, - "only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } + "get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "pump": "^3.0.0" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } }, - "original": { + "get-symbol-description": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "url-parse": "^1.4.3" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true, + "optional": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { - "lcid": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, - "output-file-sync": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", - "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "is-plain-obj": "^1.1.0", - "mkdirp": "^0.5.1" + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" } }, - "p-cancelable": { + "glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-event": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "glob-watcher": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", + "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", + "dev": true, + "requires": { + "async-done": "^2.0.0", + "chokidar": "^3.5.3" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "p-timeout": "^2.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "glogg": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", + "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", "dev": true, "requires": { - "p-finally": "^1.0.0" + "sparkles": "^2.1.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } } }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "gulp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", + "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", "dev": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "glob-watcher": "^6.0.0", + "gulp-cli": "^3.0.0", + "undertaker": "^2.0.0", + "vinyl-fs": "^4.0.0" }, "dependencies": { - "process-nextick-args": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "fs-mkdirp-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", + "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.8", + "streamx": "^2.12.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "dev": true, + "requires": { + "@gulpjs/to-absolute-glob": "^4.0.0", + "anymatch": "^3.1.3", + "fastq": "^1.13.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "is-negated-glob": "^1.0.0", + "normalize-path": "^3.0.0", + "streamx": "^2.12.5" + } + }, + "lead": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", + "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "once": "^1.4.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true + }, + "resolve-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", + "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "value-or-function": "^4.0.0" + } + }, + "to-through": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", + "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "dev": true, + "requires": { + "streamx": "^2.12.5" + } + }, + "value-or-function": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", + "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", + "dev": true + }, + "vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + } + }, + "vinyl-fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", + "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^2.0.1", + "glob-stream": "^8.0.0", + "graceful-fs": "^4.2.11", + "iconv-lite": "^0.6.3", + "is-valid-glob": "^1.0.0", + "lead": "^4.0.0", + "normalize-path": "3.0.0", + "resolve-options": "^2.0.0", + "stream-composer": "^1.0.2", + "streamx": "^2.14.0", + "to-through": "^3.0.0", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.0", + "vinyl-sourcemap": "^2.0.0" + } + }, + "vinyl-sourcemap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", + "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", + "dev": true, + "requires": { + "convert-source-map": "^2.0.0", + "graceful-fs": "^4.2.10", + "now-and-later": "^3.0.0", + "streamx": "^2.12.5", + "vinyl": "^3.0.0", + "vinyl-contents": "^2.0.0" } } } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", - "dev": true - }, - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "gulp-cli": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", + "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.0", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "gulp-typescript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", + "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "ansi-colors": "^3.0.5", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^3.0.0", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } } } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "gulplog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", + "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "glogg": "^2.2.0" } }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { - "semver": "^5.1.0" + "duplexer": "^0.1.2" } }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "passthrough-counter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz", - "integrity": "sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } }, - "path-dirname": { + "has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, - "path-exists": { + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { + "has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true }, - "path-posix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz", - "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=" + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "has-symbol-support-x": "^1.4.1" } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "pify": "^3.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", + "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true } } }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "through": "~2.3" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "parse-passwd": "^1.0.0" } }, - "pdfkit": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.10.0.tgz", - "integrity": "sha512-mRJ6iuDzpIQ4ftKp5GvijLXNVRK86xjnyIPBraYSPrUPubNqWM5/oYmc7FZKUWz3wusRTj3PLR9HJ1X5ooqfsg==", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, "requires": { - "crypto-js": "^3.1.9-1", - "fontkit": "^1.0.0", - "linebreak": "^0.3.0", - "png-js": ">=0.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "performance-now": { + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true }, - "pidusage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz", - "integrity": "sha512-OGo+iSOk44HRJ8q15AyG570UYxcm5u+R99DI8Khu8P3tKGkVu5EZX4ywHglWSTMNNXQ274oeGpYrvFEhDIFGPg==" + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "requires": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "node-modules-regexp": "^1.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "find-up": "^3.0.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" } }, - "please-upgrade-node": { + "interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", - "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "plotly.js-dist": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-1.51.1.tgz", - "integrity": "sha512-YUIyji1qj42DMjSuKI/yIE9ryXrCfCoF++Db732s9nK4oVFE6T1Gq6+hYE0rkLpezi+3j6W9e5wrLhI2AL6j7A==", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", "dev": true, "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=" + "inversify": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.2.tgz", + "integrity": "sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA==" }, - "polygon-offset": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/polygon-offset/-/polygon-offset-0.3.1.tgz", - "integrity": "sha1-aaZWXwsn+na1Jw1cB5sLosjwu6M=", + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "martinez-polygon-clipping": "^0.1.5" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "popper.js": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", - "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==", - "dev": true - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" } }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "has-bigints": "^1.0.1" } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "binary-extensions": "^2.0.0" } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "postinstall-build": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.3.tgz", - "integrity": "sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==", + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "requires": { + "hasown": "^2.0.2" + } }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "requires": { - "fast-diff": "^1.1.2" + "has-tostringtag": "^1.0.0" } }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "is-extglob": "^2.1.1" } }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { - "fromentries": "^1.2.0" + "has-tostringtag": "^1.0.0" } }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "isobject": "^3.0.1" } }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "propagate": { + "is-relative": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", - "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", - "dev": true + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "call-bind": "^1.0.7" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "has-tostringtag": "^1.0.0" } }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "has-symbols": "^1.0.2" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "which-typed-array": "^1.1.16" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "unc-path-regex": "^0.1.2" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "querystring-es3": { + "is-utf8": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true }, - "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "inherits": "~2.0.0" + "call-bind": "^1.0.2" } }, - "quote-stream": { + "is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { - "performance-now": "^2.1.0" + "is-docker": "^2.0.0" } }, - "railroad-diagrams": { + "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" + "append-transform": "^2.0.0" } }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-inclusive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/range-inclusive/-/range-inclusive-1.0.2.tgz", - "integrity": "sha1-Rs2KsjevVZKKXDjzpQoXiSDhpQk=", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true } } }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "react-annotation": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/react-annotation/-/react-annotation-2.1.6.tgz", - "integrity": "sha512-r/WT9ylhhTXAbYS/8MJOy/oKgO/G8DQ02fDmeEVPUtPq3VEG1Q7BUGYIJLWgWwNSRmgTLGIo4RIqYbQ9t1f0aA==", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "prop-types": "15.6.2", - "viz-annotation": "0.0.3" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "dependencies": { - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "ms": "2.1.2" } } } }, - "react-base16-styling": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", - "integrity": "sha1-OFjyTpxN2MvT9wLz901YHKKRcmk=", + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "react-color": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz", - "integrity": "sha512-1dtO8LqAVotPIChlmo6kLtFS1FP89ll8/OiA8EcFRDR+ntcK+0ukJgByuIQHRtzvigf26dV5HklnxDIvhON9VQ==", + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "requires": { - "@icons/material": "^0.2.4", - "lodash": "^4.17.11", - "material-colors": "^1.2.1", - "prop-types": "^15.5.10", - "reactcss": "^1.2.0", - "tinycolor2": "^1.4.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, - "react-data-grid": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-data-grid/-/react-data-grid-6.1.0.tgz", - "integrity": "sha512-N1UtiHvsowEPzhx0VPqQKvGgSza/YNljczbisFDGMjawiGApS2taMv7h+EDXDx49CdaA6ur4eYS0z10x63IUpw==", + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "react-is-deprecated": "^0.1.2", - "shallowequal": "^1.1.0" + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" } }, - "react-dev-utils": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.3.tgz", - "integrity": "sha512-Mvs6ofsc2xTjeZIrMaIfbXfsPVrbdVy/cVqq6SAacnqfMlcBpDuivhWZ1ODGeJ8HgmyWTLH971PYjj/EPCDVAw==", - "dev": true, - "requires": { - "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.2.0", - "react-error-overlay": "^4.0.1", - "recursive-readdir": "2.2.1", - "shell-quote": "1.6.1", - "sockjs-client": "1.1.5", - "strip-ansi": "3.0.1", - "text-table": "0.2.0" + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "has-flag": "^4.0.0" } - }, - "opn": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "jws": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, - "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", "dev": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" } }, - "react-error-overlay": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.1.tgz", - "integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==", - "dev": true - }, - "react-hot-loader": { - "version": "4.12.6", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.6.tgz", - "integrity": "sha512-tRXWgF5MhQSEXX3EHIplCOWCzSg+ye7ddHeQLt7Z+CaZMeEfeCL2/uSGITIzWXOQYhefnLX8IZtr2cff4xIrww==", + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "requires": { - "fast-levenshtein": "^2.0.6", - "global": "^4.3.0", - "hoist-non-react-statics": "^3.3.0", - "loader-utils": "^1.1.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.0.2", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-is-deprecated": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/react-is-deprecated/-/react-is-deprecated-0.1.2.tgz", - "integrity": "sha1-MBFI+G6kKP6OZz7KejchYLdXnb0=", + "just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, - "react-json-tree": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz", - "integrity": "sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw==", + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "dev": true, "requires": { - "babel-runtime": "^6.6.1", - "prop-types": "^15.5.8", - "react-base16-styling": "^0.5.1" + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true - }, - "react-markdown": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.1.0.tgz", - "integrity": "sha512-EOHsEAN+aoP8UVz7vTHx6Z63GJfhrO9KItKlfsiBtVVS9tmSWtUaBTw73+2SObrWiOiE2Cs9qUBL7ORsvVhOrA==", + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "dev": true, "requires": { - "html-to-react": "^1.3.4", - "mdast-add-list-metadata": "1.0.1", - "prop-types": "^15.7.2", - "remark-parse": "^5.0.0", - "unified": "^6.1.5", - "unist-util-visit": "^1.3.0", - "xtend": "^4.0.1" + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "react-motion": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", - "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, + "optional": true, "requires": { - "performance-now": "^0.2.0", - "prop-types": "^15.5.8", - "raf": "^3.1.0" - }, - "dependencies": { - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - } + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" } }, - "react-move": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-move/-/react-move-2.9.1.tgz", - "integrity": "sha512-5qKYsJrKKpSypEaaYyR2HBbBgX65htRqKDa8o5OGDkq2VfklmTCbLawtYFpdmcJRqbz4jCYpzo2Rrsazq9HA8Q==", + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, "requires": { - "@babel/runtime": "^7.2.0", - "d3-interpolate": "^1.3.2", - "d3-timer": "^1.0.9", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" + "json-buffer": "3.0.0" } }, - "react-popper": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz", - "integrity": "sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "create-react-context": "^0.3.0", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - }, - "dependencies": { - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - } - } + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, - "react-redux": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.1.tgz", - "integrity": "sha512-QsW0vcmVVdNQzEkrgzh2W3Ksvr8cqpAv5FhEk7tNEft+5pp7rXxAudTz3VOPawRkLIepItpkEIyLcN/VVXzjTg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.9.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "react-is": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", - "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==", - "dev": true - } - } + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "dev": true }, - "react-svg-pan-zoom": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz", - "integrity": "sha512-hmDUarqhNnCwuZumV9Pw7o5inW7lda4sX2U1vDK2B2slrSfNu1jbelOp6aaOEyUF7WzMA1xrpH6NBWvk4UeUTQ==", + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", "dev": true, "requires": { - "prop-types": "^15.7.2", - "transformation-matrix": "^2.0.0" + "language-subtag-registry": "~0.3.2" } }, - "react-svgmt": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/react-svgmt/-/react-svgmt-1.1.8.tgz", - "integrity": "sha512-3xu7iWuHIbqM2hv4eMsAN1mZKz6EnXTPAcE4mMX/NwuYY5uUKJBoKDAmxY+I6KXHx2SpYJtKAqe1a5jEehteZg==", + "last-run": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", + "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "d3-ease": "^1.0.3", - "react-motion": "^0.5.2", - "react-move": "^2.7.0" + "readable-stream": "^2.0.5" } }, - "react-table": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-table/-/react-table-6.10.0.tgz", - "integrity": "sha512-s/mQLI1+mNvlae45MfAZyZ04YIT3jUzWJqx34s0tfwpDdgJkpeK6vyzwMUkKFCpGODBxpjBOekYZzcEmk+2FiQ==", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "classnames": "^2.2.5" + "flush-write-stream": "^1.0.2" } }, - "react-table-hoc-fixed-columns": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-table-hoc-fixed-columns/-/react-table-hoc-fixed-columns-1.0.2.tgz", - "integrity": "sha512-0i2IEhGgFOibxoA1FOvABmuxcA7kCcw2lB5UPMX3RzS2wah1gvq6U128JNjvnG/P+yKvx54X+lwEEQ7ovjzMcA==", + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "classnames": "^2.2.6", - "emotion": "^9.2.3", - "uniqid": "^5.0.3" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "react-test-renderer": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", - "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.13.6" + "immediate": "~3.0.5" } }, - "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "liftoff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", + "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", "dev": true, "requires": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } } }, - "react-virtualized": { - "version": "9.21.1", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", - "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "clsx": "^1.0.1", - "dom-helpers": "^2.4.0 || ^3.0.0", - "linear-layout-vector": "0.0.1", - "loose-envify": "^1.3.0", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^3.0.4" + "uc.micro": "^1.0.1" } }, - "reactcss": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "requires": { - "lodash": "^4.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "mute-stream": "~0.0.4" + "p-locate": "^4.1.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "color-convert": "^2.0.1" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "color-name": "~1.1.4" } - } - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "has-flag": "^4.0.0" } } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "resolve": "^1.1.6" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "minimatch": "3.0.3" + "semver": "^6.0.0" }, "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, - "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" }, "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true } } }, - "redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dev": true, "requires": { - "deep-diff": "^0.3.5" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" } }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz", - "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==", + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "private": "^0.1.6" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "is-equal-shallow": "^0.1.3" + "mime-db": "1.52.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "brace-expansion": "^2.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "requires": { + "balanced-match": "^1.0.0" + } + } } }, - "regexp-tree": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", - "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true + }, + "mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "requires": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.2" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "p-limit": "^3.0.2" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "shebang-regex": "^3.0.0" } }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "has": "^1.0.3" + "has-flag": "^4.0.0" } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - } - } - }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true - } - } - }, - "regression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz", - "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=", - "dev": true - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "relative": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", - "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", - "dev": true, - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "isarray": "1.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true } } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remark-parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", - "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", - "dev": true, - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", "dev": true, "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "mocha-multi-reporters": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz", + "integrity": "sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==", "dev": true, "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "debug": "^4.1.1", + "lodash": "^4.17.15" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ms": "2.1.2" } } } }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "requires": { - "throttleit": "^1.0.0" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" }, - "requires-port": { + "mrmime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", "dev": true }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "requires": { - "path-parse": "^1.0.6" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "resolve-cwd": { + "mute-stdout": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", + "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", "dev": true }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "restructure": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", - "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", - "requires": { - "browserify-optional": "^1.0.0" - } + "named-js-regexp": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.5.tgz", + "integrity": "sha512-XO0DPujDP9IWpkt690iWLreKztb/VB811DGl5N3z7BfhkMJuiVZXOi6YN/fEB9qkvtMVTgSZDW8pzdVt8vj/FA==" }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, - "rewiremock": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.7.tgz", - "integrity": "sha512-U6iFfdXPiNtIBDcJWmspl/nhVk1EANkXLq2GM78T3ZfegvO5EW0TgNzExLh5iHXFJKQr//SmH9iloK/s4O7UqA==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "compare-module-exports": "^2.1.0", - "lodash.some": "^4.6.0", - "lodash.template": "^4.4.0", - "node-libs-browser": "^2.1.0", - "path-parse": "^1.0.5", - "wipe-node-cache": "^2.1.0", - "wipe-webpack-cache": "^2.1.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "roughjs-es5": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/roughjs-es5/-/roughjs-es5-0.1.0.tgz", - "integrity": "sha512-NMjzoBgSYk8qEYLSxzxytS20sfdQV7zg119FZjFDjIDwaqodFcf7QwzKbqM64VeAYF61qogaPLk3cs8Gb+TqZA==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0" - } - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "optional": true }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "nise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, "requires": { - "rx-lite": "*" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" } }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "optional": true, "requires": { - "symbol-observable": "1.0.1" + "semver": "^7.3.5" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "optional": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "node-has-native-dependencies": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-has-native-dependencies/-/node-has-native-dependencies-1.0.2.tgz", + "integrity": "sha1-MVLsl1O2ZB5NMi0YXdSTBkmto9o=", "dev": true, "requires": { - "ret": "~0.1.10" + "fs-walk": "0.0.1" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } } }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "requires": { - "xmlchars": "^2.1.1" - } - }, - "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "scope-analyzer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.0.5.tgz", - "integrity": "sha512-+U5H0417mnTEstCD5VwOYO7V4vYuSqwqjFap40ythe67bhMFL5C3UgPwyBv7KDJsqUBIKafOD57xMlh1rN7eaw==", + "node-loader": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-1.0.3.tgz", + "integrity": "sha512-8c9ef5q24F0AjrPxUjdX7qdTlsU1zZCPeqYvSBCH1TJko3QW4qu1uA1C9KbOPdaRQwREDdbSYZgltBAlbV7l5g==", "dev": true, "requires": { - "array-from": "^2.1.1", - "es6-map": "^0.1.5", - "es6-set": "^0.1.5", - "es6-symbol": "^3.1.1", - "estree-is-function": "^1.0.0", - "get-assigned-identifiers": "^1.1.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" } }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "node-polyfill-webpack-plugin": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", + "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", "dev": true, "requires": { - "commander": "~2.8.1" + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" }, "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "dev": true, "requires": { - "graceful-readlink": ">= 1.0.0" + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } - } - } - }, - "semiotic": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/semiotic/-/semiotic-1.19.11.tgz", - "integrity": "sha512-TIiVTnKFonApiWZTN7AfJ9ltAUOl0wBYK5tFd1NCMFQJcbqDFAGrjfle1VHM2ARovNEbYKnl2a3N6zRwSKfJlg==", - "dev": true, - "requires": { - "@mapbox/polylabel": "1", - "d3-array": "^1.2.0", - "d3-bboxCollide": "^1.0.3", - "d3-brush": "^1.0.6", - "d3-chord": "^1.0.4", - "d3-collection": "^1.0.1", - "d3-contour": "^1.1.1", - "d3-force": "^1.0.2", - "d3-glyphedge": "^1.2.0", - "d3-hexbin": "^0.2.2", - "d3-hierarchy": "^1.1.3", - "d3-interpolate": "^1.1.5", - "d3-polygon": "^1.0.5", - "d3-sankey-circular": "0.25.0", - "d3-scale": "^1.0.3", - "d3-selection": "^1.1.0", - "d3-shape": "^1.2.0", - "d3-voronoi": "^1.0.2", - "json2csv": "^4.5.1", - "labella": "1.1.4", - "memoize-one": "4.0.0", - "object-assign": "4.1.1", - "polygon-offset": "0.3.1", - "promise": "8.0.1", - "prop-types": "15.6.0", - "react-annotation": "^2.1.6", - "regression": "^2.0.1", - "roughjs-es5": "0.1.0", - "semiotic-mark": "0.3.1", - "svg-path-bounding-box": "1.0.4" - }, - "dependencies": { - "d3-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "memoize-one": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.0.tgz", - "integrity": "sha512-wdpOJ4XBejprGn/xhd1i2XR8Dv1A25FJeIvR7syQhQlz9eXsv+06llcvcmBxlWVGv4C73QBsWA8kxvZozzNwiQ==", + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", "dev": true }, - "promise": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", - "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "asap": "~2.0.3" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } - } - } - }, - "semiotic-mark": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/semiotic-mark/-/semiotic-mark-0.3.1.tgz", - "integrity": "sha512-j7CsNannyJi68Yg5DXDZJrw3wEssBTaeGEvGMaTqPuBlM1kPFXYWvS0dpRzsT/Yopn/kRRyooDR+l6zQCwV+EQ==", - "dev": true, - "requires": { - "d3-interpolate": "^1.1.5", - "d3-scale": "^1.0.3", - "d3-selection": "^1.1.0", - "d3-shape": "^1.2.0", - "d3-transition": "^1.0.3", - "prop-types": "^15.6.0", - "roughjs-es5": "0.1.0" - }, - "dependencies": { - "d3-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" } } } }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "sver-compat": "^1.5.0" + "process-on-spawn": "^1.0.0" } }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } + "node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { + "now-and-later": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "path-key": "^3.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "boolbase": "^1.0.0" } }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } } } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - }, - "dependencies": { - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - } + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "shortid": { - "version": "2.2.14", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.14.tgz", - "integrity": "sha512-4UnZgr9gDdA1kaKj/38IiudfC3KHKhDc1zi/HSxd9FQDR0VLwH3/y79tZJLsVYPsJgIjeHjqIWaWVRJUj9qZOQ==", + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, "requires": { - "nanoid": "^2.0.0" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "mimic-response": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", - "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==", - "dev": true - } - } - }, - "simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, - "sinon": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.1.tgz", - "integrity": "sha512-vbXMHBszVioyPsuRDLEiPEgvkZnbjfdCFvLYV4jONNJqZNLWTwZ/gYSNh3SuiT1w9MRXUz+S7aX0B4Ar2XI8iw==", + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/samsam": "^4.0.1", - "diff": "^4.0.1", - "lolex": "^5.1.2", - "nise": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slickgrid": { - "version": "2.4.17", - "resolved": "https://registry.npmjs.org/slickgrid/-/slickgrid-2.4.17.tgz", - "integrity": "sha512-saxVD9URoBD2M/Sl+7fLWE125/Cp1j0YhkRMPke4Hwdk31q/lihNv8I2o70cM5GRmoeWJKW7tnhNraDEe89jEg==", + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "jquery": ">=1.8.0", - "jquery-ui": ">=1.8.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "isobject": "^3.0.1" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "wrappy": "1" } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "mimic-fn": "^2.1.0" } }, - "sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { - "sort-keys": "^1.0.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" } }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "readable-stream": "^2.0.1" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", "dev": true, "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "p-timeout": "^2.0.1" } }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "p-try": "^2.0.0" } }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "p-limit": "^2.2.0" } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { - "through": "2" + "aggregate-error": "^3.0.0" } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "p-finally": "^1.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha1-Gsig2Ug4SNFpXkGLbQMaPDzmjjs=", - "dev": true - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, - "state-toggle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", - "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "requires": { - "escodegen": "^1.8.1" - }, - "dependencies": { - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "requires": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - }, - "dependencies": { - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "callsites": "^3.0.0" } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "parse-asn1": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "pbkdf2": "^3.1.5", + "safe-buffer": "^5.2.1" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "semver": "^5.1.0" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "parse5": "^6.0.1" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==" - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "path-root-regex": "^0.1.0" } }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { - "is-natural-number": "^4.0.1" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true }, - "styled-jsx": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.2.1.tgz", - "integrity": "sha512-gM/WOrWYRpWReivzQqetEGohUc/TJSvUoZ5T/UJxJZIsVIPlRQLnp7R8Oue4q49sI08EBRQjQl2oBL3sfdrw2g==", + "pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-types": "6.26.0", - "convert-source-map": "1.6.0", - "loader-utils": "1.2.3", - "source-map": "0.7.3", - "string-hash": "1.1.3", - "stylis": "3.5.4", - "stylis-rule-sheet": "0.0.10" + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" }, "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } + "picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true }, - "sudo-prompt": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", - "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "pinkie": "^2.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "requires": { - "has-flag": "^3.0.0" + "find-up": "^4.0.0" } }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, - "svg-inline-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz", - "integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==", + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postinstall-build": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.3.tgz", + "integrity": "sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==", + "dev": true + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "requires": { - "loader-utils": "^0.2.11", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" }, "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "dev": true, - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-path-bounding-box": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/svg-path-bounding-box/-/svg-path-bounding-box-1.0.4.tgz", - "integrity": "sha1-7XPfODyLR4abZQjwWPV0j4gzwHA=", - "dev": true, - "requires": { - "svgpath": "^2.0.0" - } - }, - "svg-to-pdfkit": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.7.tgz", - "integrity": "sha1-fbbUfkeziI3OGAYHUajeJBf4V3U=", - "requires": { - "pdfkit": ">=0.8.1" - } + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, - "svgpath": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.2.2.tgz", - "integrity": "sha512-7cXFbkZvPkZpKLC+3QIfyUd3/Un/CvJONjTD3Gz5qLuEa73StPOt8kZjTi9apxO6zwCaza0bPNnmzTyrQ4qQlw==", + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + "prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", + "dev": true }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { - "get-port": "^3.1.0" + "fromentries": "^1.2.0" } }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "teeny-request": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", - "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1", - "node-fetch": "^2.2.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - } + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "terser-webpack-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz", - "integrity": "sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==", + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.6.1", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-minipass": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", - "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.2.tgz", - "integrity": "sha512-sazKNMBX/jwrXRkOI7N6dtiTVYqzSckzol8SGuHt0lE/v3xSW6cUkOqzu6Bq2tW+dlUzq3CWIqHU3ZKauliqdg==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "side-channel": "^1.1.0" } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { + "querystring": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "8.10.58", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.58.tgz", - "integrity": "sha512-NNcUk/rAdR7Pie7WiA5NHp345dTkD62qaxqscQXVIjCjog/ZXsrG8Wo7dZMZAzE7PSpA+qR2S3TYTeFCKuBFxQ==", - "dev": true - }, - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "requires": { - "asap": "~2.0.6" - } + "optional": true } } }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } } } }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "resolve": "^1.20.0" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" + "es6-error": "^4.0.1" } }, - "tiny-inflate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz", - "integrity": "sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=" - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", - "dev": true - }, - "tinyqueue": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz", - "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==", - "dev": true - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" } }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, - "to-fast-properties": { + "replace-homedir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", + "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", "requires": { - "kind-of": "^3.0.2" + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "is-buffer": "^1.1.5" + "ms": "2.1.2" } } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "through2": "^2.0.3" + "resolve-from": "^5.0.0" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "requires": { - "commander": "2" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "touch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/touch/-/touch-2.0.2.tgz", - "integrity": "sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A==", + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, "requires": { - "nopt": "~1.0.10" + "value-or-function": "^3.0.0" } }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "lowercase-keys": "^1.0.0" } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rewiremock": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.6.tgz", + "integrity": "sha512-hjpS7iQUTVVh/IHV4GE1ypg4IzlgVc34gxZBarwwVrKfnjlyqHJuQdsia6Ac7m4f4k/zxxA3tX285MOstdysRQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "babel-runtime": "^6.26.0", + "compare-module-exports": "^2.1.0", + "node-libs-browser": "^2.1.0", + "path-parse": "^1.0.5", + "wipe-node-cache": "^2.1.2", + "wipe-webpack-cache": "^2.1.0" } }, - "transform-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz", - "integrity": "sha1-5ch4d7qW1R0/IlNoWHtG4ibRzsk=", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "loader-utils": "^1.0.2" + "glob": "^7.1.3" } }, - "transformation-matrix": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz", - "integrity": "sha512-S6L67Z8V3WEyPm2/zDh3I3bO0OQwv88dh7IY2dIOVBfIZJ4WQGdEKOsh7phTgYkvfAmHRxfOPNt1ixN/zR6D/A==", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.2" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "dependencies": { + "hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", - "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", - "dev": true - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "trough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", - "dev": true - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "queue-microtask": "^1.2.2" } }, - "ts-mockito": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.3.1.tgz", - "integrity": "sha512-chcKw0sTApwJxTyKhzbWxI4BTUJ6RStZKUVh2/mfwYqFS09PYy5pvdXZwG35QSkqT5pkdXZlYKBX196RRvEZdQ==", - "dev": true, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { - "lodash": "^4.17.5" + "tslib": "^1.9.0" } }, - "ts-node": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", - "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "rxjs-compat": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz", + "integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw==" + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, - "tsconfig-paths": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.8.0.tgz", - "integrity": "sha512-zZEYFo4sjORK8W58ENkRn9s+HmQFkkwydDG7My5s/fnfr2YYCaiyXe/HBUcIgU8epEKOXwiahOO+KZYjiXlWyQ==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "deepmerge": "^2.0.1", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" } }, - "tsconfig-paths-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "tsconfig-paths": "^3.4.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "requires": { + "commander": "^2.8.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + } }, - "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "semver-greatest-satisfied-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", + "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } + "sver": "^1.8.3" + } + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" } }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" } }, - "tslint-microsoft-contrib": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" } }, - "tslint-plugin-prettier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.1.0.tgz", - "integrity": "sha512-nMCpU+QSpXtydcWXeZF+3ljIbG/K8SHVZwB7K/MtuoQQFXxXN6watqTSBpVXCInuPFvmjiWkhxeMoUW4N0zgSg==", + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "dev": true, "requires": { - "eslint-plugin-prettier": "^2.2.0", - "lines-and-columns": "^1.1.6", - "tslib": "^1.7.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "dependencies": { - "eslint-plugin-prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", - "integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==", - "dev": true, - "requires": { - "fast-diff": "^1.1.1", - "jest-docblock": "^21.0.0" - } + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "tslib": "^1.8.1" + "shebang-regex": "^1.0.0" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "shortid": { + "version": "2.2.17", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.17.tgz", + "integrity": "sha512-GpbM3gLF1UUXZvQw6MCyulHkWbRseNO4cyBEZresZRorwl1+SLu1ZdqgVtuwqz8mB6RpwPkm541mYSqrKyJSaA==", + "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "nanoid": "^3.3.8" } }, - "tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", - "dev": true + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } }, - "type": { + "side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "optional": true }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "optional": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true + } } }, - "typed-react-markdown": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/typed-react-markdown/-/typed-react-markdown-0.1.0.tgz", - "integrity": "sha1-HDra9CvB8NjGoJsKyAhfNt8KNn8=", + "sinon": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", "dev": true, "requires": { - "@types/react": "^0.14.44" + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" }, "dependencies": { - "@types/react": { - "version": "0.14.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-0.14.57.tgz", - "integrity": "sha1-GHioZU+v3R04G4RXKStkM0mMW2I=", + "diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dev": true, "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" } }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "requires": { - "is-typedarray": "^1.0.0" + "is-plain-obj": "^1.0.0" } }, - "typemoq": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typemoq/-/typemoq-2.1.0.tgz", - "integrity": "sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw==", + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "lodash": "^4.17.4", - "postinstall-build": "^5.0.1" + "sort-keys": "^1.0.0" + }, + "dependencies": { + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } } }, - "typescript": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", - "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "typescript-char": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-char/-/typescript-char-0.0.0.tgz", - "integrity": "sha1-VY/tpzfHZaYQtzfu+7F3Xum8jas=" - }, - "typescript-formatter": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/typescript-formatter/-/typescript-formatter-7.2.2.tgz", - "integrity": "sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==", + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { - "commandpost": "^1.0.0", - "editorconfig": "^0.15.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "ua-parser-js": { - "version": "0.7.20", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==", - "dev": true - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "sparkles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", + "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", "dev": true }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" } }, - "uint64be": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz", - "integrity": "sha1-H3FUIC8qG4rzU4cd2mUb80zpPpU=" + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, - "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } + "stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==" }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", "dev": true }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "stream-composer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", + "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", "dev": true, "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" + "streamx": "^2.13.2" } }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, - "unherit": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", - "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { + "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "xtend": "^4.0.1" + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, - "unicode": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/unicode/-/unicode-10.0.0.tgz", - "integrity": "sha1-5dUcHbk7bHGguHngsMSvfm/faI4=" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" } }, - "unicode-match-property-value-ecmascript": { + "strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true }, - "unicode-properties": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.1.0.tgz", - "integrity": "sha1-epbu9J91aC6mnSMV7smsQ//fAME=", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "brfs": "^1.4.0", - "unicode-trie": "^0.3.0" + "safe-buffer": "~5.2.0" }, "dependencies": { - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dev": true, - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - } + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "unicode-trie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", - "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" } }, - "uniqid": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.0.3.tgz", - "integrity": "sha512-R2qx3X/LYWSdGRaluio4dYrPXAJACTqyUjuyXHoJLBUOIfmMcnYOyY2d6Y4clZcIz5lK6ZaI0Zzmm0cPfsIqzQ==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "dev": true - }, - "unist-util-remove-position": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", - "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "ansi-regex": "^5.0.1" } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", - "dev": true + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, "requires": { - "unist-util-visit-parents": "^2.0.0" - }, - "dependencies": { - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dev": true, - "requires": { - "unist-util-is": "^3.0.0" - } - } + "is-natural-number": "^4.0.1" } }, - "unist-util-visit-parents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", - "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "escape-string-regexp": "^1.0.2" } }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true + "sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "punycode": "^2.1.0" + "has-flag": "^3.0.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "sver": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", + "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "semver": "^6.3.0" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "optional": true } } }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, + "optional": true, "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" }, "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } } } }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "tas-client": { + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + }, + "teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "dev": true, "requires": { - "prepend-http": "^2.0.0" + "streamx": "^2.12.5" } }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "terser-webpack-plugin": { + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz", + "integrity": "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==", "dev": true, "requires": { - "inherits": "2.0.3" + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true + }, + "schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } } } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true + "text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "requires": { + "b4a": "^1.6.4" + } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "through2": "~2.0.0", + "xtend": "~4.0.0" } }, - "validator": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", - "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vega": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/vega/-/vega-5.7.3.tgz", - "integrity": "sha512-HCg5qgykM9drXPpjo9eJB9VWa/vHoDr5lXkjdk5iZBZI3fTajvAF/oFw6nM1l5P+eWibNlg9TFXn5vF4438uJw==", - "dev": true, - "requires": { - "vega-crossfilter": "^4.0.1", - "vega-dataflow": "^5.4.1", - "vega-encode": "^4.4.1", - "vega-event-selector": "^2.0.1", - "vega-expression": "^2.6.2", - "vega-force": "^4.0.3", - "vega-functions": "^5.4.1", - "vega-geo": "^4.1.0", - "vega-hierarchy": "^4.0.3", - "vega-loader": "^4.1.2", - "vega-parser": "^5.10.1", - "vega-projection": "^1.3.0", - "vega-regression": "^1.0.1", - "vega-runtime": "^5.0.2", - "vega-scale": "^4.1.3", - "vega-scenegraph": "^4.3.1", - "vega-statistics": "^1.6.1", - "vega-transforms": "^4.4.3", - "vega-typings": "^0.10.2", - "vega-util": "^1.12.0", - "vega-view": "^5.3.1", - "vega-view-transforms": "^4.4.1", - "vega-voronoi": "^4.1.1", - "vega-wordcloud": "^4.0.2" - } - }, - "vega-canvas": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz", - "integrity": "sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==", + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true }, - "vega-crossfilter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz", - "integrity": "sha512-wLNS4JzKaOLj8EAzI/v8XBJjUWMRWYSu6EeQF4o9Opq/78u87Ol9Lc5I27UHsww5dNNH/tHubAV4QPIXnGOp5Q==", + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { - "d3-array": "^2.0.3", - "vega-dataflow": "^5.1.0", - "vega-util": "^1.8.0" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - } + "setimmediate": "^1.0.4" } }, - "vega-dataflow": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.4.1.tgz", - "integrity": "sha512-NZASrIGel2ZD+HiJsozMPO7qNB3INLFWQez6KI+gPpKQIhsz7jWzG/TBK57A8NOLJYPc6VBLiygCmdJbr5E+sA==", + "tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { - "vega-loader": "^4.0.0", - "vega-util": "^1.11.0" + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, - "vega-embed": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-4.2.5.tgz", - "integrity": "sha512-3iUv5oU5y/sa7jC+shw79hPmHMpWMhMTGSovtl3+O98hLq7LQgordWKgoxKcqwhSIHMIgj+cInTNPWM4kru7Ug==", + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "dev": true, "requires": { - "d3-selection": "^1.4.0", - "json-stringify-pretty-compact": "^2.0.0", - "semver": "^6.3.0", - "vega-schema-url-parser": "^1.1.0", - "vega-themes": "^2.3.2", - "vega-tooltip": "^0.18.1" + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, - "vega-encode": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.4.1.tgz", - "integrity": "sha512-PtfH+k7Hie7T0ywrg/nI/rhMnpNr8Rg627XR8pzSrM1CbDoMbfFmQsw33tXUT8k/8u/dPLR1klgAtCHUCh7jjA==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "d3-array": "^2.3.1", - "d3-format": "^1.4.1", - "d3-interpolate": "^1.3.2", - "d3-time-format": "^2.1.3", - "vega-dataflow": "^5.4.0", - "vega-scale": "^4.1.2", - "vega-util": "^1.11.2" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - }, - "d3-format": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.1.tgz", - "integrity": "sha512-TUswGe6hfguUX1CtKxyG2nymO+1lyThbkS1ifLX0Sr+dOQtAD5gkrffpHnx+yHNKUZ0Bmg5T4AjUQwugPDrm0g==", - "dev": true - } + "is-number": "^7.0.0" } }, - "vega-event-selector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.1.tgz", - "integrity": "sha512-FGU1PefYhW9An6zVs6TE5f/XGYsIispxFErG/p9KThxL22IC90WVZzMQXKN9M8OcARq5OyWjHg3qa9Qp/Z6OJw==", + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true }, - "vega-expression": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.2.tgz", - "integrity": "sha512-vh8GVkAL/KtsgcdrdKdEnysZn/InIuRrkF7U+CG1eAmupMucPY/Rpu0nCdYb4CLC/xNRHx/NMFidLztQUjZJQg==", + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, "requires": { - "vega-util": "^1.11.0" + "escape-string-regexp": "^1.0.2" } }, - "vega-force": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.0.3.tgz", - "integrity": "sha512-4stItN4jD9H1CENaCz4jXRNS1Bi9cozMOUjX2824FeJENi2RZSiAZAaGbscgerZQ/jbNcOHD8PHpC2pWldEvGA==", + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, + "ts-loader": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", "dev": true, "requires": { - "d3-force": "^2.0.1", - "vega-dataflow": "^5.4.0", - "vega-util": "^1.11.0" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" }, "dependencies": { - "d3-force": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.0.1.tgz", - "integrity": "sha512-zh73/N6+MElRojiUG7vmn+3vltaKon7iD5vB/7r9nUaBeftXMzRo5IWEG63DLBCto4/8vr9i3m9lwr1OTJNiCg==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "color-name": "~1.1.4" } - } - } - }, - "vega-functions": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.4.1.tgz", - "integrity": "sha512-f/smrE+ujMZgSWiTNVmdSNu3npDZMrHGc+MjjQ2pjJixcQRKTz1SbnmpogFhCgvKa6qBSw7hrZX8/TKGh4nuiA==", - "dev": true, - "requires": { - "d3-array": "^2.3.2", - "d3-color": "^1.4.0", - "d3-format": "^1.4.1", - "d3-geo": "^1.11.6", - "d3-time-format": "^2.1.3", - "vega-dataflow": "^5.4.1", - "vega-expression": "^2.6.2", - "vega-scale": "^4.1.3", - "vega-scenegraph": "^4.3.1", - "vega-selections": "^5.0.1", - "vega-statistics": "^1.6.1", - "vega-util": "^1.12.0" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true }, - "d3-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", - "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "d3-format": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.1.tgz", - "integrity": "sha512-TUswGe6hfguUX1CtKxyG2nymO+1lyThbkS1ifLX0Sr+dOQtAD5gkrffpHnx+yHNKUZ0Bmg5T4AjUQwugPDrm0g==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "vega-geo": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.1.0.tgz", - "integrity": "sha512-3xo0hpmfVdhbdB0MWAppBu/DGTHn7+4g+psUVBu9LRii4XUNlmi+YmJzO4Ph6tv2zxrfZfIKMXid9+V5MzWn+g==", + "ts-mockito": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", + "integrity": "sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==", "dev": true, "requires": { - "d3-array": "^2.3.1", - "d3-contour": "^1.3.2", - "d3-geo": "^1.11.6", - "vega-dataflow": "^5.1.1", - "vega-projection": "^1.3.0", - "vega-util": "^1.11.2" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - } + "lodash": "^4.17.5" } }, - "vega-hierarchy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz", - "integrity": "sha512-9wNe+KyKqZW1S4++jCC38HuAhZbqNhfY7gOvwiMLjsp65tMtRETrtvYfHkULClm3UokUIX54etAXREAGW7znbw==", - "dev": true, - "requires": { - "d3-hierarchy": "^1.1.8", - "vega-dataflow": "^5.4.0", - "vega-util": "^1.11.0" + "ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" } }, - "vega-lite": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-3.4.0.tgz", - "integrity": "sha512-RJg9uBNh5g0hA8xTzAcALUfNx0cEq7E7xx+vxPEGSMgI8z+A5KlE9u4jUx6nKu7Mjg1qZO8WOyWCmBS1kdFWPg==", + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { - "@types/clone": "~0.1.30", - "@types/fast-json-stable-stringify": "^2.0.0", - "clone": "~2.1.2", - "fast-deep-equal": "~2.0.1", - "fast-json-stable-stringify": "~2.0.0", - "json-stringify-pretty-compact": "~2.0.0", - "tslib": "~1.10.0", - "vega-event-selector": "~2.0.0", - "vega-expression": "~2.6.0", - "vega-typings": "0.7.2", - "vega-util": "~1.10.0", - "yargs": "~13.3.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "minimist": "^1.2.0" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + } + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-convert": "^2.0.1" } }, - "vega-typings": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.7.2.tgz", - "integrity": "sha512-BReB2qRERA/Ke+QoxKDQ7fES25A9Q3qKRm1CJxwvpLGhAl4k5cGDORx6yW+J3rFHMzpJlmdRM+kb489EuphxZQ==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "vega-util": "^1.10.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "vega-util": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.10.0.tgz", - "integrity": "sha512-fTGnTG7FhtTG9tiYDL3k5s8YHqB71Ml5+aC9B7eaBygeB8GKXBrcbTXLOzoCRxT3Jr5cRhr99PMBu0AkqmhBog==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "color-name": "~1.1.4" } }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "has-flag": "^4.0.0" } } } }, - "vega-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.1.2.tgz", - "integrity": "sha512-Zuxvl0K3jmLWyns+8ACajtp7oGfV+M7IeSQybq3xf7BvlGca2h8XA3qiBUXzYULkwZ4PstB56XoJ0tur2Rgs6A==", - "dev": true, - "requires": { - "d3-dsv": "^1.1.1", - "d3-time-format": "^2.1.3", - "node-fetch": "^2.6.0", - "topojson-client": "^3.0.1", - "vega-util": "^1.11.0" - }, - "dependencies": { - "d3-dsv": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.1.1.tgz", - "integrity": "sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==", - "dev": true, - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - } + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" } }, - "vega-parser": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-5.10.1.tgz", - "integrity": "sha512-NtjFhuXEGlc6ZOc+LeG7Gecmwal/UPu8WDI5wCjBWDogGgpeuRfQQ1haLz2KMsZhq5e2aUmk7iTuH/CuUoeGEA==", + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "vega-dataflow": "^5.4.1", - "vega-event-selector": "^2.0.1", - "vega-expression": "^2.6.2", - "vega-functions": "^5.4.1", - "vega-scale": "^4.1.3", - "vega-util": "^1.12.0" + "prelude-ls": "^1.2.1" } }, - "vega-projection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.3.0.tgz", - "integrity": "sha512-BFOc/XSVVW96WIAAyiUcppCeegniibiKGX0OLbGpQ5WIbeDHsbCXqnkeBpD5wsjvPXaiQRHTZ0PZ8VvCoCQV+g==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "requires": { - "d3-geo": "^1.11.6" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" } }, - "vega-regression": { + "typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.0.1.tgz", - "integrity": "sha512-eeQnLccWHAs2rovu2x3G50reF3Die9QoUGy/dMAO6sbDDA7B5s5qW3uq1NNnG93l3Ch84lO71qytxDBTdaQThA==", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "requires": { - "d3-array": "^2.3.1", - "vega-dataflow": "^5.2.1", - "vega-statistics": "^1.4.0", - "vega-util": "^1.11.0" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, - "vega-runtime": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-5.0.2.tgz", - "integrity": "sha512-Cuv+RY6kprH+vtNERg6xP4dgcdYGD2ZnxPxJNEtGi7dmtQQTBa1s7jQ0VDXTolsO6lKJ3B7np2GzKJYwevgj1A==", + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "vega-dataflow": "^5.1.1", - "vega-util": "^1.11.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, - "vega-scale": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-4.1.3.tgz", - "integrity": "sha512-hpLrEFntN18e+eRAxa8b8malSbNVQyziKmUMGI1Za8ZB64cYj+A/G87ePE0ExSymfrvc/Xulh4VQZNxkPJll4w==", + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "d3-array": "^2.3.2", - "d3-interpolate": "^1.3.2", - "d3-scale": "^3.1.0", - "d3-time": "^1.1.0", - "vega-util": "^1.11.0" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - }, - "d3-scale": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.0.tgz", - "integrity": "sha512-1RnLYPmH3f2E96hSsCr3ok066myuAxoH3+pnlJAedeMOp7jeW7A+GZHAyVWWaStfphyPEBiDoLFA9zl+DcnC2Q==", - "dev": true, - "requires": { - "d3-array": "1.2.0 - 2", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", - "dev": true - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, - "vega-scenegraph": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.3.1.tgz", - "integrity": "sha512-+hzfFFvvZKgGg7L7+RlRMY/II35/Ty8lw7CiEXRyKA2jxsp3eIWuppiaPgB0IQeVooJh6z4UNcKbNq3SUAvgDA==", + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "requires": { - "d3-path": "^1.0.8", - "d3-shape": "^1.3.5", - "vega-canvas": "^1.2.1", - "vega-loader": "^4.1.2", - "vega-util": "^1.11.2" - }, - "dependencies": { - "d3-path": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.8.tgz", - "integrity": "sha512-J6EfUNwcMQ+aM5YPOB8ZbgAZu6wc82f/0WFxrxwV6Ll8wBwLaHLKCqQ5Imub02JriCVVdPjgI+6P3a4EWJCxAg==", - "dev": true - } + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" } }, - "vega-schema-url-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", - "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==", - "dev": true - }, - "vega-selections": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.0.1.tgz", - "integrity": "sha512-cSqsH8Jg2QirQVLRfXfK0Odz+LOMo8iDtL9NANkv6/JehbqXAof0TfhgLu5gmCgzL3z+FUmzj2C4PizQGgkTtw==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "vega-expression": "^2.6.1", - "vega-util": "^1.11.0" + "is-typedarray": "^1.0.0" } }, - "vega-statistics": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.6.1.tgz", - "integrity": "sha512-EX+IkELoYLnygcUXcFhcdWwzmalHzKLvSVTx9deGMyPOsCZRd0Lwu/SGwrIctoYa5r9DBR0/bGxQAC0t/UoSdA==", + "typemoq": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typemoq/-/typemoq-2.1.0.tgz", + "integrity": "sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw==", "dev": true, "requires": { - "d3-array": "^2.3.2" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - } + "circular-json": "^0.3.1", + "lodash": "^4.17.4", + "postinstall-build": "^5.0.1" } }, - "vega-themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.5.0.tgz", - "integrity": "sha512-mkyYhcRhmMBWLfvCBPTVx0S/OnxeIfVY/TmFfYP5sPdW8X1kMyHtLI34bMhzosPrkhNyHsC8FNHJyU/dOQnX4A==", + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, - "vega-tooltip": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.18.1.tgz", - "integrity": "sha512-g/i69QLTVhGeHNT8k646Qr8SFss9kbnt6XmU9ujjqgaW5B/p1FPUrMzFh/88rMF704EHYyBH7Aj3t0ds1cCHbQ==", - "dev": true, - "requires": { - "vega-util": "^1.10.0" - } + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uint64be": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-3.0.0.tgz", + "integrity": "sha512-mliiCSrsE29aNBI7O9W5gGv6WmA9kBR8PtTt6Apaxns076IRdYrrtFhXHEWMj5CSum3U7cv7/pi4xmi4XsIOqg==" }, - "vega-transforms": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.4.3.tgz", - "integrity": "sha512-8GxMm1CecRzNG89zr4JroOfPsWCkb9lWL5owSBsB+AalyJaFjxYwKuCM6L2OsAKID3su3aeQ0oSBQTR3v0nqPA==", + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "d3-array": "^2.3.2", - "vega-dataflow": "^5.4.1", - "vega-statistics": "^1.6.1", - "vega-util": "^1.12.0" - }, - "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true - } + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" } }, - "vega-typings": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.10.2.tgz", - "integrity": "sha512-W/V6oyoBizlXt0FJnuY5/Y46/dsmfcPTxRaUCtFBf0nyoWBsmO66EYj24xCHJ6pgfHEEbBRLPfrfrvlKiRPaMQ==", + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "requires": { - "vega-util": "^1.11.0" + "buffer": "^5.2.1", + "through": "^2.3.8" } }, - "vega-util": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.12.0.tgz", - "integrity": "sha512-eN1PAQVDyEOcwild2Fk1gbkzkqgDHNujG2/akYRtBzkhtz2EttrVIDwBkWqV/Q+VvEINEksb7TI3Wv7qVQFR5g==", + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, - "vega-view": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.3.1.tgz", - "integrity": "sha512-pKbpmR1uz9YOsqocx6KWEHD1EwwpOVIfRH6h8g5xQLiUQP37bohfKZ2vL05MQCupXN2dNYdp51iyETbMJMj7nQ==", + "undertaker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", + "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", "dev": true, "requires": { - "d3-array": "^2.3.1", - "d3-timer": "^1.0.9", - "vega-dataflow": "^5.2.1", - "vega-functions": "^5.3.1", - "vega-runtime": "^5.0.1", - "vega-scenegraph": "^4.2.0", - "vega-util": "^1.11.0" + "bach": "^2.0.1", + "fast-levenshtein": "^3.0.0", + "last-run": "^2.0.0", + "undertaker-registry": "^2.0.0" }, "dependencies": { - "d3-array": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.3.3.tgz", - "integrity": "sha512-syv3wp0U5aB6toP2zb2OdBkhTy1MWDsCAaYk6OXJZv+G4u7bSWEmYgxLoFyc88RQUhZYGCebW9a9UD1gFi5+MQ==", - "dev": true + "fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dev": true, + "requires": { + "fastest-levenshtein": "^1.0.7" + } } } }, - "vega-view-transforms": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.4.1.tgz", - "integrity": "sha512-BgjGsHDLHGTN2FgVRcepuvAcKnMUUtXZVemmJHPrY4LI5iJiCS9+HkZPVcVWD1+vheSNXMmZV7Skn7qn7zAcRg==", + "undertaker-registry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", + "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", + "dev": true + }, + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "unicode": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/unicode/-/unicode-14.0.0.tgz", + "integrity": "sha512-BjinxTXkbm9Jomp/YBTMGusr4fxIG67fNGShHIRAL16Ur2GJTq2xvLi+sxuiJmInCmwqqev2BCFKyvbfp/yAkg==" + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "vega-dataflow": "^5.1.1", - "vega-scenegraph": "^4.3.0", - "vega-util": "^1.11.2" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, - "vega-voronoi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.1.tgz", - "integrity": "sha512-agLmr+UGxJs5KB9D8GeZqxgeWWGoER/eVHPcFFPgVuoNBsrqf2bdoltmIkRnpiRsQnGCibGixhFEDCc9GGNAww==", + "update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "requires": { - "d3-delaunay": "^5.1.3", - "vega-dataflow": "^5.1.1", - "vega-util": "^1.11.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, - "vega-wordcloud": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.0.2.tgz", - "integrity": "sha512-nV9bRKjRGcmcQV5wXvOvWes4T5937t3RF+Rm1d03YVAzZpOcVKk9uBuVSeFYBLX2XcDBVe4HK54qDoOTFftHMw==", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "vega-canvas": "^1.2.0", - "vega-dataflow": "^5.1.1", - "vega-scale": "^4.0.0", - "vega-statistics": "^1.2.5", - "vega-util": "^1.8.0" + "punycode": "^2.1.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } } }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" + "prepend-http": "^2.0.0" } }, - "vfile-location": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", - "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==", + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "unist-util-stringify-position": "^1.1.1" + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "dev": true + }, + "v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "dev": true + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { "clone": "^2.1.1", @@ -21705,13 +26360,68 @@ "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" + } + }, + "vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dev": true, + "requires": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true + }, + "vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + } } } }, @@ -21738,38 +26448,6 @@ "value-or-function": "^3.0.0", "vinyl": "^2.0.0", "vinyl-sourcemap": "^1.1.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "vinyl-sourcemap": { @@ -21793,772 +26471,364 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "viz-annotation": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/viz-annotation/-/viz-annotation-0.0.3.tgz", - "integrity": "sha512-kkZ+mZHx+zfAZhBuA/PGzA7ZpKUZFjtgBqVcbPfCrOIrHjERcHyrNhxYfx1ZZu9uyZLO0i/qcoMOtY5HpavSlg==", - "dev": true, - "requires": { - "d3-shape": "~1.0.4" - }, - "dependencies": { - "d3-shape": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.0.6.tgz", - "integrity": "sha1-sJ4wXPDHxrmpjJDmtC9i2sS8/Vs=", - "dev": true, - "requires": { - "d3-path": "1" + "remove-trailing-separator": "^1.0.1" } } } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "vsce": { - "version": "1.65.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.65.0.tgz", - "integrity": "sha512-1bGyeoaxjhNVz9fVAqUzGWc1e5CxsxZFpVSnS/anRVyZju0y4DJCPi685WkBsRYU/lfp3AI1smpatuSfb2Lllg==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "didyoumean": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - } - }, - "vscode-debugadapter": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.35.0.tgz", - "integrity": "sha512-Au90Iowj6TuD5uDMaTnxOjl/9hQN0Yoky1TV1Cjjr7jPdxTQpALBRW09Y2LzkIXUVICXlAqxWL9zL8BpzI30jg==", - "requires": { - "mkdirp": "^0.5.1", - "vscode-debugprotocol": "1.35.0" - } - }, - "vscode-debugadapter-testsupport": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.35.0.tgz", - "integrity": "sha512-4emLt6JOk4iKqC2aWNJupOtrK6JwYAZ6KppqvKASN6B1s063VoqI18QhUB1CeoKwNaN1LIG3VPv2xM8HKOjyDA==", - "dev": true, - "requires": { - "vscode-debugprotocol": "1.35.0" - } - }, "vscode-debugprotocol": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.35.0.tgz", "integrity": "sha512-+OMm11R1bGYbpIJ5eQIkwoDGFF4GvBz3Ztl6/VM+/RNNb2Gjk2c0Ku+oMmfhlTmTlPCpgHBsH4JqVCbUYhu5bA==" }, - "vscode-extension-telemetry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.0.tgz", - "integrity": "sha512-WVCnP+uLxlqB6UD98yQNV47mR5Rf79LFxpuZhSPhEf0Sb4tPZed3a63n003/dchhOwyCTCBuNN4n8XKJkLEI1Q==", - "requires": { - "applicationinsights": "1.0.6" - } - }, "vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" + "version": "9.0.0-next.5", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.5.tgz", + "integrity": "sha512-Sl/8RAJtfF/2x/TPBVRuhzRAcqYR/QDjEjNqMcoKFfqsxfVUPzikupRDQYB77Gkbt1RrW43sSuZ5uLtNAcikQQ==" }, "vscode-languageclient": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz", - "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==", - "requires": { - "semver": "^5.5.0", - "vscode-languageserver-protocol": "3.14.1" - } - }, - "vscode-languageserver": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", - "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", + "version": "10.0.0-next.12", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.12.tgz", + "integrity": "sha512-q7cVYCcYiv+a+fJYCbjMMScOGBnX162IBeUMFg31mvnN7RHKx5/CwKaCz+r+RciJrRXMqS8y8qpEVGgeIPnbxg==", "requires": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" + "minimatch": "^9.0.3", + "semver": "^7.6.0", + "vscode-languageserver-protocol": "3.17.6-next.10" }, "dependencies": { - "vscode-uri": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", - "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" + "brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "requires": { + "brace-expansion": "^2.0.2" + } } } }, "vscode-languageserver-protocol": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", - "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "version": "3.17.6-next.10", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.10.tgz", + "integrity": "sha512-KOrrWn4NVC5jnFC5N6y/fyNKtx8rVYr67lhL/Z0P4ZBAN27aBsCnLBWAMIkYyJ1K8EZaE5r7gqdxrS9JPB6LIg==", "requires": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" + "vscode-jsonrpc": "9.0.0-next.5", + "vscode-languageserver-types": "3.17.6-next.5" } }, "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - }, - "vscode-test": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.2.3.tgz", - "integrity": "sha512-mKRTNso33NaUULiPBFg6zRjyntjcCpIgkrogyPQuKlvoQREQR8jLKN5UD4L5rkTSD+oBhcKtaLR2/g34FexURw==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.4", - "rimraf": "^2.6.3" - } - }, - "vsls": { - "version": "0.3.1291", - "resolved": "https://registry.npmjs.org/vsls/-/vsls-0.3.1291.tgz", - "integrity": "sha512-8yJPN9p7k+XYyczOVtQmpun4K1CRDsw/hdnIzT/c40r5bIkpptfsBlHmmLemoIV+CAHvrTLdWKEf5OtRvdcn9A==" - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==", - "dev": true + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, + "vscode-tas-client": { + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", "requires": { - "loose-envify": "^1.0.0" + "tas-client": "0.2.33" } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "webpack": { - "version": "4.35.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.3.tgz", - "integrity": "sha512-xggQPwr9ILlXzz61lHzjvgoqGU08v5+Wnut19Uv3GaTtzN4xBTcwnobodrXE142EL1tOiS5WVEButooGzcQzTA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "dependencies": { + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" } }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - } + "fast-deep-equal": "^3.1.3" } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", - "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-walk": "^6.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", - "dev": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } } } }, - "webpack-cli": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.5.tgz", - "integrity": "sha512-w0j/s42c5UhchwTmV/45MLQnTVwRoaUTu9fM5LuyOd/8lFoCNCELDogFoecx5NzRUndO0yD/gF2b02XKMnmAWQ==", + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "dev": true, "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "color-convert": "^2.0.1" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "global-prefix": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "color-name": "~1.1.4" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + } + } + }, + "webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "resolve": "^1.9.0" } } } }, - "webpack-fix-default-import-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/webpack-fix-default-import-plugin/-/webpack-fix-default-import-plugin-1.0.3.tgz", - "integrity": "sha1-iCuOTRqpPEjLj9r4Rvx52G+C8U8=", - "dev": true - }, - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - } - }, - "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", - "dev": true, - "requires": { - "lodash": "^4.17.5" - } - }, - "webpack-node-externals": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", - "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", - "dev": true - }, - "webpack-require-from": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/webpack-require-from/-/webpack-require-from-1.8.0.tgz", - "integrity": "sha512-4vaPWQZD3vl3WM2mnjWunyx56uUbPj44ZKlpPUd+Ro2jrOtZQOaB2I5FE222uIChzeFfS7A7rtcWRLraPHE7TA==", - "dev": true - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "webpack-fix-default-import-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/webpack-fix-default-import-plugin/-/webpack-fix-default-import-plugin-1.0.3.tgz", + "integrity": "sha1-iCuOTRqpPEjLj9r4Rvx52G+C8U8=", "dev": true }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "iconv-lite": "0.4.24" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, - "whatwg-fetch": { + "webpack-node-externals": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true }, - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "webpack-require-from": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/webpack-require-from/-/webpack-require-from-1.8.6.tgz", + "integrity": "sha512-QmRsOkOYPKeNXp4uVc7qxnPrFQPrP4bhOc/gl4QenTFNgXdEbF1U8VC+jM/Sljb0VzJLNgyNiHlVkuHjcmDtBQ==", "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } + "requires": {} + }, + "webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "why-is-node-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.1.0.tgz", - "integrity": "sha512-oLmJ1uZOaKra+GDmYcUHMnVhi4CnZnlt4IE3J05ZDSEAiejeB5dMoR4a4rGcMWRy1Avx24dGTw8yxJ/+EmwPBQ==", + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { - "stackback": "0.0.2" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "winreg": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - } - }, - "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", - "requires": { - "readable-stream": "^2.3.6", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "wipe-node-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.0.tgz", - "integrity": "sha512-Vdash0WV9Di/GeYW9FJrAZcPjGK4dO7M/Be/sJybguEgcM7As0uwLyvewZYqdlepoh7Rj4ZJKEdo8uX83PeNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/wipe-node-cache/-/wipe-node-cache-2.1.2.tgz", + "integrity": "sha512-m7NXa8qSxBGMtdQilOu53ctMaIBXy93FOP04EC1Uf4bpsE+r+adfLKwIMIvGbABsznaSNxK/ErD4xXDyY5og9w==", "dev": true }, "wipe-webpack-cache": { @@ -22570,35 +26840,93 @@ "wipe-node-cache": "^2.1.0" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "worker-loader": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "color-name": "~1.1.4" } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -22620,24 +26948,11 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "wtfnode": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/wtfnode/-/wtfnode-0.8.0.tgz", - "integrity": "sha512-A5jm/0REykxUac1q4Q5kv+hDIiacvqVpwIoXzCQcRL7syeEKucVVOxyLLrt+jIiZoXfla3lnsxUw/cmWXIaGWA==", - "dev": true - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", - "dev": true + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "requires": {} }, "xml": { "version": "1.0.1", @@ -22645,154 +26960,97 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - } + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmlchars": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", - "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==", - "dev": true - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^6.0.0", "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "color-name": "~1.1.4" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "which-module": { "version": "2.0.0", @@ -22800,10 +27058,21 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -22813,33 +27082,43 @@ } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true } } }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -22859,64 +27138,17 @@ "buffer-crc32": "~0.2.3" } }, - "ylru": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", - "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" - }, "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, - "zip-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.0.1.tgz", - "integrity": "sha512-c+eUhhkDpaK87G/py74wvWLtz2kzMPNCCkUApkun50ssE0oQliIQzWpTnwjB+MTKVIf2tGzIgHyqW/Y+W77ecQ==", - "dev": true, - "requires": { - "archiver-utils": "^2.0.0", - "compress-commons": "^1.2.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.datascience-ui.dependencies.json b/package.datascience-ui.dependencies.json deleted file mode 100644 index e39e035098b1..000000000000 --- a/package.datascience-ui.dependencies.json +++ /dev/null @@ -1,247 +0,0 @@ -[ - "@babel/runtime", - "@babel/runtime-corejs2", - "@emotion/hash", - "@emotion/memoize", - "@emotion/stylis", - "@emotion/unitless", - "@loadable/component", - "@mapbox/polylabel", - "@nteract/markdown", - "@nteract/mathjax", - "@nteract/octicons", - "@nteract/transform-dataresource", - "@nteract/transform-geojson", - "@nteract/transform-model-debug", - "@nteract/transform-plotly", - "@nteract/transform-vdom", - "@nteract/transform-vega", - "@nteract/transforms", - "@blueprintjs/core", - "@blueprintjs/icons", - "@blueprintjs/select", - "@icons/material", - "@nteract/styled-blueprintjsx", - "@nteract/vega-embed-v2", - "@nteract/vega-embed-v3", - "anser", - "ansi-regex", - "ansi-to-html", - "ansi-to-react", - "babel-polyfill", - "babel-runtime", - "bail", - "base16", - "bintrees", - "bootstrap-less", - "base64-js", - "create-react-context", - "character-entities-legacy", - "character-reference-invalid", - "classnames", - "clsx", - "collapse-white-space", - "create-emotion", - "css-loader", - "canvas", - "dom4", - "d3-array", - "d3-bboxCollide", - "d3-brush", - "d3-chord", - "d3-collection", - "d3-color", - "d3-contour", - "d3-dispatch", - "d3-drag", - "d3-ease", - "d3-force", - "d3-format", - "d3-glyphedge", - "d3-hexbin", - "d3-hierarchy", - "d3-interpolate", - "d3-path", - "d3-polygon", - "d3-quadtree", - "d3-sankey-circular", - "d3-scale", - "d3-selection", - "d3-shape", - "d3-time-format", - "d3-time", - "d3-timer", - "d3-transition", - "d3-voronoi", - "dom-helpers", - "d3-cloud", - "d3-delaunay", - "d3-dsv", - "d3-geo", - "d3-request", - "d3-scale-chromatic", - "d3", - "datalib", - "delaunator", - "define-properties", - "emotion", - "entities", - "escape-carriage", - "extend", - "fast-deep-equal", - "fast-plist", - "fast-json-stable-stringify", - "function-bind", - "gud", - "has", - "hoist-non-react-statics", - "inherits", - "invariant", - "is-alphabetical", - "is-alphanumerical", - "is-arguments", - "is-buffer", - "is-date-object", - "is-decimal", - "is-hexadecimal", - "is-plain-obj", - "is-regex", - "is-whitespace-character", - "is-word-character", - "ieee754", - "isarray", - "json2csv", - "json-stable-stringify", - "json-stringify-pretty-compact", - "jsonify", - "labella", - "leaflet", - "linear-layout-vector", - "lodash.curry", - "lodash.flow", - "lodash", - "lru-cache", - "martinez-polygon-clipping", - "markdown-escapes", - "material-colors", - "mdast-add-list-metadata", - "monaco-editor", - "monaco-editor-textmate", - "monaco-textmate", - "numeral", - "node-libs-browser", - "object-assign", - "object-is", - "object-keys", - "onigasm", - "popper.js", - "parse-entities", - "path-browserify", - "polygon-offset", - "plotly.js-dist", - "process", - "prop-types", - "pseudomap", - "pure-color", - "react-is", - "react-popper", - "react-transition-group", - "regexp.prototype.flags", - "regression", - "replace-ext", - "resize-observer-polyfill", - "react-annotation", - "react-base16-styling", - "react-color", - "react-data-grid", - "react-dom", - "react-hot-loader", - "react-json-tree", - "react-lifecycles-compat", - "react-markdown", - "react-redux", - "react-svg-pan-zoom", - "react-svgmt", - "react-table-hoc-fixed-columns", - "react-table", - "react-virtualized", - "react", - "reactcss", - "redux-logger", - "redux", - "remark-parse", - "repeat-string", - "roughjs-es5", - "scheduler", - "semiotic-mark", - "semiotic", - "setimmediate", - "slickgrid", - "state-toggle", - "string-hash", - "style-loader", - "styled-jsx", - "stylis-rule-sheet", - "svg-inline-react", - "svg-path-bounding-box", - "svgpath", - "semver", - "timers-browserify", - "tinycolor2", - "tinyqueue", - "transformation-matrix", - "trim-trailing-lines", - "trim", - "trough", - "topojson-client", - "tslib", - "unherit", - "unified", - "uniqid", - "unist-util-is", - "unist-util-remove-position", - "unist-util-stringify-position", - "unist-util-visit-parents", - "unist-util-visit", - "util", - "uuid", - "vfile-location", - "vfile-message", - "vfile", - "viz-annotation", - "vega-canvas", - "vega-crossfilter", - "vega-dataflow", - "vega-embed", - "vega-encode", - "vega-event-selector", - "vega-expression", - "vega-force", - "vega-functions", - "vega-geo", - "vega-hierarchy", - "vega-lite", - "vega-loader", - "vega-parser", - "vega-projection", - "vega-regression", - "vega-runtime", - "vega-scale", - "vega-scenegraph", - "vega-schema-url-parser", - "vega-selections", - "vega-statistics", - "vega-themes", - "vega-tooltip", - "vega-transforms", - "vega-util", - "vega-view-transforms", - "vega-view", - "vega-voronoi", - "vega-wordcloud", - "vega", - "warning", - "x-is-string", - "xtend", - "yallist" -] diff --git a/package.json b/package.json index 874efb52fd1e..2a27cddc0976 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,33 @@ { "name": "python", "displayName": "Python", - "description": "Linting, Debugging (multi-threaded, remote), Intellisense, Jupyter Notebooks, code formatting, refactoring, unit tests, snippets, and more.", - "version": "2020.3.0-dev", - "languageServerVersion": "0.5.30", + "description": "Python language support with extension access points for IntelliSense (Pylance), Debugging (Python Debugger), linting, formatting, refactoring, unit tests, and more.", + "version": "2026.5.0-dev", + "featureFlags": { + "usingNewInterpreterStorage": true + }, + "capabilities": { + "untrustedWorkspaces": { + "supported": false, + "description": "The Python extension is not available in untrusted workspaces. Use Pylance to get partial IntelliSense support for Python files." + }, + "virtualWorkspaces": { + "supported": "limited", + "description": "Only Partial IntelliSense supported." + } + }, "publisher": "ms-python", + "enabledApiProposals": [ + "contribEditorContentMenu", + "quickPickSortByLabel", + "testObserver", + "quickPickItemTooltip", + "terminalDataWriteEvent", + "terminalExecuteCommandEvent", + "codeActionAI", + "notebookReplDocument", + "notebookVariableProvider" + ], "author": { "name": "Microsoft Corporation" }, @@ -17,15 +40,16 @@ "bugs": { "url": "https://github.com/Microsoft/vscode-python/issues" }, - "qna": "https://stackoverflow.com/questions/tagged/visual-studio-code+python", + "qna": "https://github.com/microsoft/vscode-python/discussions/categories/q-a", "icon": "icon.png", "galleryBanner": { "color": "#1e415e", "theme": "dark" }, "engines": { - "vscode": "^1.42.0" + "vscode": "^1.95.0" }, + "enableTelemetry": false, "keywords": [ "python", "django", @@ -35,2768 +59,1438 @@ "categories": [ "Programming Languages", "Debuggers", - "Linters", - "Snippets", - "Formatters", - "Other" + "Other", + "Data Science", + "Machine Learning" ], "activationEvents": [ + "onDebugInitialConfigurations", "onLanguage:python", - "onLanguage:jupyter", "onDebugResolve:python", - "onCommand:python.execInTerminal", - "onCommand:python.sortImports", - "onCommand:python.runtests", - "onCommand:python.debugtests", - "onCommand:python.setInterpreter", - "onCommand:python.setShebangInterpreter", - "onCommand:python.viewTestUI", - "onCommand:python.viewLanguageServerOutput", - "onCommand:python.viewTestOutput", - "onCommand:python.viewOutput", - "onCommand:python.datascience.viewJupyterOutput", - "onCommand:python.selectAndRunTestMethod", - "onCommand:python.selectAndDebugTestMethod", - "onCommand:python.selectAndRunTestFile", - "onCommand:python.runCurrentTestFile", - "onCommand:python.runFailedTests", - "onCommand:python.execSelectionInTerminal", - "onCommand:python.execSelectionInDjangoShell", - "onCommand:python.buildWorkspaceSymbols", - "onCommand:python.startREPL", - "onCommand:python.goToPythonObject", - "onCommand:python.setLinter", - "onCommand:python.enableLinting", - "onCommand:python.createTerminal", - "onCommand:python.discoverTests", - "onCommand:python.configureTests", - "onCommand:python.switchOffInsidersChannel", - "onCommand:python.switchToDailyChannel", - "onCommand:python.switchToWeeklyChannel", - "onCommand:python.datascience.createnewnotebook", - "onCommand:python.datascience.showhistorypane", - "onCommand:python.datascience.importnotebook", - "onCommand:python.datascience.importnotebookfile", - "onCommand:python.datascience.opennotebook", - "onCommand:python.datascience.selectjupyteruri", - "onCommand:python.datascience.exportfileasnotebook", - "onCommand:python.datascience.exportfileandoutputasnotebook", - "onCommand:python.datascience.selectJupyterInterpreter", - "onCommand:python.datascience.selectjupytercommandline", - "onCommand:python.enableSourceMapSupport" + "onCommand:python.copilotSetupTests", + "workspaceContains:mspythonconfig.json", + "workspaceContains:pyproject.toml", + "workspaceContains:Pipfile", + "workspaceContains:setup.py", + "workspaceContains:requirements.txt", + "workspaceContains:pylock.toml", + "workspaceContains:**/pylock.*.toml", + "workspaceContains:manage.py", + "workspaceContains:app.py", + "workspaceContains:.venv", + "workspaceContains:.conda", + "onLanguageModelTool:get_python_environment_details", + "onLanguageModelTool:get_python_executable_details", + "onLanguageModelTool:install_python_packages", + "onLanguageModelTool:configure_python_environment", + "onLanguageModelTool:create_virtual_environment", + "onTerminalShellIntegration:python" ], "main": "./out/client/extension", + "browser": "./dist/extension.browser.js", + "l10n": "./l10n", "contributes": { - "snippets": [ - { - "language": "python", - "path": "./snippets/python.json" + "problemMatchers": [ + { + "name": "python", + "owner": "python", + "source": "python", + "fileLocation": "autoDetect", + "pattern": [ + { + "regexp": "^.*File \\\"([^\\\"]|.*)\\\", line (\\d+).*", + "file": 1, + "line": 2 + }, + { + "regexp": "^\\s*(.*)\\s*$" + }, + { + "regexp": "^\\s*(.*Error.*)$", + "message": 1 + } + ] } ], - "keybindings": [ - { - "command": "python.execSelectionInTerminal", - "key": "shift+enter", - "when": "editorTextFocus && editorLangId == python && !findInputFocussed && !replaceInputFocussed && !python.datascience.ownsSelection" - }, - { - "command": "python.datascience.execSelectionInteractive", - "key": "shift+enter", - "when": "editorTextFocus && editorLangId == python && !findInputFocussed && !replaceInputFocussed && python.datascience.ownsSelection && python.datascience.featureenabled" - }, - { - "command": "python.datascience.runcurrentcelladvance", - "key": "shift+enter", - "when": "editorTextFocus && !editorHasSelection && python.datascience.hascodecells && python.datascience.featureenabled" - }, - { - "command": "python.datascience.runcurrentcell", - "key": "ctrl+enter", - "when": "editorTextFocus && !editorHasSelection && python.datascience.hascodecells && python.datascience.featureenabled" + "walkthroughs": [ + { + "id": "pythonWelcome", + "title": "%walkthrough.pythonWelcome.title%", + "description": "%walkthrough.pythonWelcome.description%", + "when": "workspacePlatform != webworker", + "steps": [ + { + "id": "python.createPythonFolder", + "title": "%walkthrough.step.python.createPythonFolder.title%", + "description": "%walkthrough.step.python.createPythonFolder.description%", + "media": { + "svg": "resources/walkthrough/open-folder.svg", + "altText": "%walkthrough.step.python.createPythonFile.altText%" + }, + "when": "workspaceFolderCount = 0" + }, + { + "id": "python.createPythonFile", + "title": "%walkthrough.step.python.createPythonFile.title%", + "description": "%walkthrough.step.python.createPythonFile.description%", + "media": { + "svg": "resources/walkthrough/open-folder.svg", + "altText": "%walkthrough.step.python.createPythonFile.altText%" + } + }, + { + "id": "python.installPythonWin8", + "title": "%walkthrough.step.python.installPythonWin8.title%", + "description": "%walkthrough.step.python.installPythonWin8.description%", + "media": { + "markdown": "resources/walkthrough/install-python-windows-8.md" + }, + "when": "workspacePlatform == windows && showInstallPythonTile" + }, + { + "id": "python.installPythonMac", + "title": "%walkthrough.step.python.installPythonMac.title%", + "description": "%walkthrough.step.python.installPythonMac.description%", + "media": { + "markdown": "resources/walkthrough/install-python-macos.md" + }, + "when": "workspacePlatform == mac && showInstallPythonTile", + "command": "workbench.action.terminal.new" + }, + { + "id": "python.installPythonLinux", + "title": "%walkthrough.step.python.installPythonLinux.title%", + "description": "%walkthrough.step.python.installPythonLinux.description%", + "media": { + "markdown": "resources/walkthrough/install-python-linux.md" + }, + "when": "workspacePlatform == linux && showInstallPythonTile", + "command": "workbench.action.terminal.new" + }, + { + "id": "python.createEnvironment", + "title": "%walkthrough.step.python.createEnvironment.title%", + "description": "%walkthrough.step.python.createEnvironment.description%", + "media": { + "svg": "resources/walkthrough/create-environment.svg", + "altText": "%walkthrough.step.python.createEnvironment.altText%" + } + }, + { + "id": "python.runAndDebug", + "title": "%walkthrough.step.python.runAndDebug.title%", + "description": "%walkthrough.step.python.runAndDebug.description%", + "media": { + "svg": "resources/walkthrough/rundebug2.svg", + "altText": "%walkthrough.step.python.runAndDebug.altText%" + } + }, + { + "id": "python.learnMoreWithDS", + "title": "%walkthrough.step.python.learnMoreWithDS.title%", + "description": "%walkthrough.step.python.learnMoreWithDS.description%", + "media": { + "altText": "%walkthrough.step.python.learnMoreWithDS.altText%", + "svg": "resources/walkthrough/learnmore.svg" + } + } + ] }, { - "command": "python.datascience.runcurrentcellandaddbelow", - "key": "alt+enter", - "when": "editorTextFocus && !editorHasSelection && python.datascience.hascodecells && python.datascience.featureenabled" + "id": "pythonDataScienceWelcome", + "title": "%walkthrough.pythonDataScienceWelcome.title%", + "description": "%walkthrough.pythonDataScienceWelcome.description%", + "when": "false", + "steps": [ + { + "id": "python.installJupyterExt", + "title": "%walkthrough.step.python.installJupyterExt.title%", + "description": "%walkthrough.step.python.installJupyterExt.description%", + "media": { + "svg": "resources/walkthrough/data-science.svg", + "altText": "%walkthrough.step.python.installJupyterExt.altText%" + } + }, + { + "id": "python.createNewNotebook", + "title": "%walkthrough.step.python.createNewNotebook.title%", + "description": "%walkthrough.step.python.createNewNotebook.description%", + "media": { + "svg": "resources/walkthrough/create-notebook.svg", + "altText": "%walkthrough.step.python.createNewNotebook.altText%" + }, + "completionEvents": [ + "onCommand:jupyter.createnewnotebook", + "onCommand:workbench.action.files.openFolder", + "onCommand:workbench.action.files.openFileFolder" + ] + }, + { + "id": "python.openInteractiveWindow", + "title": "%walkthrough.step.python.openInteractiveWindow.title%", + "description": "%walkthrough.step.python.openInteractiveWindow.description%", + "media": { + "svg": "resources/walkthrough/interactive-window.svg", + "altText": "%walkthrough.step.python.openInteractiveWindow.altText%" + }, + "completionEvents": [ + "onCommand:jupyter.createnewinteractive" + ] + }, + { + "id": "python.dataScienceLearnMore", + "title": "%walkthrough.step.python.dataScienceLearnMore.title%", + "description": "%walkthrough.step.python.dataScienceLearnMore.description%", + "media": { + "svg": "resources/walkthrough/learnmore.svg", + "altText": "%walkthrough.step.python.dataScienceLearnMore.altText%" + } + } + ] } ], - "commands": [ - { - "command": "python.enableSourceMapSupport", - "title": "%python.command.python.enableSourceMapSupport.title%", - "category": "Python" - }, - { - "command": "python.sortImports", - "title": "%python.command.python.sortImports.title%", - "category": "Python Refactor" - }, - { - "command": "python.startREPL", - "title": "%python.command.python.startREPL.title%", - "category": "Python" - }, + "breakpoints": [ { - "command": "python.createTerminal", - "title": "%python.command.python.createTerminal.title%", - "category": "Python" + "language": "html" }, { - "command": "python.buildWorkspaceSymbols", - "title": "%python.command.python.buildWorkspaceSymbols.title%", - "category": "Python" + "language": "jinja" }, { - "command": "python.openTestNodeInEditor", - "title": "Open", - "icon": { - "light": "resources/light/open-file.svg", - "dark": "resources/dark/open-file.svg" - } + "language": "python" }, { - "command": "python.runTestNode", - "title": "Run", - "icon": { - "light": "resources/light/start.svg", - "dark": "resources/dark/start.svg" - } + "language": "django-html" }, { - "command": "python.debugTestNode", - "title": "Debug", - "icon": { - "light": "resources/light/debug.svg", - "dark": "resources/dark/debug.svg" - } - }, + "language": "django-txt" + } + ], + "commands": [ { - "command": "python.runtests", - "title": "%python.command.python.runtests.title%", + "title": "%python.command.python.createNewFile.title%", + "shortTitle": "%python.menu.createNewFile.title%", "category": "Python", - "icon": { - "light": "resources/light/run-tests.svg", - "dark": "resources/dark/run-tests.svg" - } + "command": "python.createNewFile" }, { - "command": "python.debugtests", - "title": "%python.command.python.debugtests.title%", "category": "Python", - "icon": { - "light": "resources/light/debug.svg", - "dark": "resources/dark/debug.svg" - } - }, - { - "command": "python.execInTerminal", - "title": "%python.command.python.execInTerminal.title%", - "category": "Python" + "command": "python.copyTestId", + "title": "%python.command.python.testing.copyTestId.title%" }, { - "command": "python.execInTerminal-icon", - "title": "%python.command.python.execInTerminal.title%", "category": "Python", - "icon": { - "light": "resources/light/run-file.svg", - "dark": "resources/dark/run-file.svg" - } - }, - { - "command": "python.setInterpreter", - "title": "%python.command.python.setInterpreter.title%", - "category": "Python" - }, - { - "command": "python.switchOffInsidersChannel", - "title": "%python.command.python.switchOffInsidersChannel.title%", - "category": "Python" - }, - { - "command": "python.switchToDailyChannel", - "title": "%python.command.python.switchToDailyChannel.title%", - "category": "Python" - }, - { - "command": "python.switchToWeeklyChannel", - "title": "%python.command.python.switchToWeeklyChannel.title%", - "category": "Python" - }, - { - "command": "python.refactorExtractVariable", - "title": "%python.command.python.refactorExtractVariable.title%", - "category": "Python Refactor" - }, - { - "command": "python.refactorExtractMethod", - "title": "%python.command.python.refactorExtractMethod.title%", - "category": "Python Refactor" + "command": "python.analysis.restartLanguageServer", + "title": "%python.command.python.analysis.restartLanguageServer.title%" }, { - "command": "python.viewTestOutput", - "title": "%python.command.python.viewTestOutput.title%", "category": "Python", - "icon": { - "light": "resources/light/repl.svg", - "dark": "resources/dark/repl.svg" - } - }, - { - "command": "python.datascience.viewJupyterOutput", - "title": "%python.command.python.datascience.viewJupyterOutput.title%", - "category": "Python" + "command": "python.clearCacheAndReload", + "title": "%python.command.python.clearCacheAndReload.title%" }, { - "command": "python.datascience.selectJupyterInterpreter", - "title": "%python.command.python.datascience.selectJupyterInterpreter.title%", - "category": "Python" - }, - { - "command": "python.viewLanguageServerOutput", - "title": "%python.command.python.viewLanguageServerOutput.title%", "category": "Python", - "enablement": "python.hasLanguageServerOutputChannel" + "command": "python.clearWorkspaceInterpreter", + "title": "%python.command.python.clearWorkspaceInterpreter.title%" }, { - "command": "python.viewOutput", - "title": "%python.command.python.viewOutput.title%", "category": "Python", - "icon": { - "light": "resources/light/repl.svg", - "dark": "resources/dark/repl.svg" - } - }, - { - "command": "python.selectAndRunTestMethod", - "title": "%python.command.python.selectAndRunTestMethod.title%", - "category": "Python" - }, - { - "command": "python.selectAndDebugTestMethod", - "title": "%python.command.python.selectAndDebugTestMethod.title%", - "category": "Python" + "command": "python.configureTests", + "title": "%python.command.python.configureTests.title%" }, { - "command": "python.selectAndRunTestFile", - "title": "%python.command.python.selectAndRunTestFile.title%", - "category": "Python" + "category": "Python", + "command": "python.createTerminal", + "title": "%python.command.python.createTerminal.title%" }, { - "command": "python.runCurrentTestFile", - "title": "%python.command.python.runCurrentTestFile.title%", - "category": "Python" + "category": "Python", + "command": "python.createEnvironment", + "title": "%python.command.python.createEnvironment.title%" }, { - "command": "python.runFailedTests", - "title": "%python.command.python.runFailedTests.title%", "category": "Python", - "icon": { - "light": "resources/light/run-failed-tests.svg", - "dark": "resources/dark/run-failed-tests.svg" - } + "command": "python.createEnvironment-button", + "title": "%python.command.python.createEnvironment.title%" }, { - "command": "python.discoverTests", - "title": "%python.command.python.discoverTests.title%", "category": "Python", - "icon": { - "light": "resources/light/refresh.svg", - "dark": "resources/dark/refresh.svg" - } + "command": "python.execInTerminal", + "title": "%python.command.python.execInTerminal.title%" }, { - "command": "python.discoveringTests", - "title": "%python.command.python.discoveringTests.title%", "category": "Python", - "icon": { - "light": "resources/light/discovering-tests.svg", - "dark": "resources/dark/discovering-tests.svg" - } + "command": "python.execInTerminal-icon", + "icon": "$(play)", + "title": "%python.command.python.execInTerminalIcon.title%" }, { - "command": "python.stopTests", - "title": "%python.command.python.stopTests.title%", "category": "Python", - "icon": { - "light": "resources/light/stop.svg", - "dark": "resources/dark/stop.svg" - } + "command": "python.execInDedicatedTerminal", + "icon": "$(play)", + "title": "%python.command.python.execInDedicatedTerminal.title%" }, { - "command": "python.configureTests", - "title": "%python.command.python.configureTests.title%", - "category": "Python" + "category": "Python", + "command": "python.execSelectionInDjangoShell", + "title": "%python.command.python.execSelectionInDjangoShell.title%" }, { + "category": "Python", "command": "python.execSelectionInTerminal", "title": "%python.command.python.execSelectionInTerminal.title%", - "category": "Python" + "shortTitle": "%python.command.python.execSelectionInTerminal.shortTitle%" }, { - "command": "python.execSelectionInDjangoShell", - "title": "%python.command.python.execSelectionInDjangoShell.title%", - "category": "Python" - }, - { - "command": "python.goToPythonObject", - "title": "%python.command.python.goToPythonObject.title%", - "category": "Python" - }, - { - "command": "python.setLinter", - "title": "%python.command.python.setLinter.title%", - "category": "Python" - }, - { - "command": "python.enableLinting", - "title": "%python.command.python.enableLinting.title%", - "category": "Python" - }, - { - "command": "python.runLinting", - "title": "%python.command.python.runLinting.title%", - "category": "Python" - }, - { - "command": "python.datascience.runcurrentcell", - "title": "%python.command.python.datascience.runcurrentcell.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugcell", - "title": "%python.command.python.datascience.debugcell.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugstepover", - "title": "%python.command.python.datascience.debugstepover.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugstop", - "title": "%python.command.python.datascience.debugstop.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugcontinue", - "title": "%python.command.python.datascience.debugcontinue.title%", - "category": "Python" - }, - { - "command": "python.datascience.runcurrentcelladvance", - "title": "%python.command.python.datascience.runcurrentcelladvance.title%", - "category": "Python" - }, - { - "command": "python.datascience.runcurrentcellandallbelow.palette", - "title": "%python.command.python.datascience.runcurrentcellandallbelow.palette.title%", - "category": "Python" - }, - { - "command": "python.datascience.runallcellsabove.palette", - "title": "%python.command.python.datascience.runallcellsabove.palette.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugcurrentcell.palette", - "title": "%python.command.python.datascience.debugcurrentcell.palette.title%", - "category": "Python" - }, - { - "command": "python.datascience.execSelectionInteractive", - "title": "%python.command.python.datascience.execSelectionInteractive.title%", - "category": "Python" - }, - { - "command": "python.datascience.showhistorypane", - "title": "%python.command.python.datascience.showhistorypane.title%", - "category": "Python" - }, - { - "command": "python.datascience.runFileInteractive", - "title": "%python.command.python.datascience.runFileInteractive.title%", - "category": "Python" - }, - { - "command": "python.datascience.debugFileInteractive", - "title": "%python.command.python.datascience.debugFileInteractive.title%", - "category": "Python" - }, - { - "command": "python.datascience.runallcells", - "title": "%python.command.python.datascience.runallcells.title%", - "category": "Python" - }, - { - "command": "python.datascience.runallcellsabove", - "title": "%python.command.python.datascience.runallcellsabove.title%", - "category": "Python" - }, - { - "command": "python.datascience.runcellandallbelow", - "title": "%python.command.python.datascience.runcellandallbelow.title%", - "category": "Python" - }, - { - "command": "python.datascience.runcell", - "title": "%python.command.python.datascience.runcell.title%", - "category": "Python" - }, - { - "command": "python.datascience.runtoline", - "title": "%python.command.python.datascience.runtoline.title%", - "category": "Python" - }, - { - "command": "python.datascience.runfromline", - "title": "%python.command.python.datascience.runfromline.title%", - "category": "Python" - }, - { - "command": "python.datascience.selectjupyteruri", - "title": "%python.command.python.datascience.selectjupyteruri.title%", "category": "Python", - "when": "python.datascience.featureenabled" + "command": "python.execInREPL", + "title": "%python.command.python.execInREPL.title%" }, { - "command": "python.datascience.selectjupytercommandline", - "title": "%python.command.python.datascience.selectjupytercommandline.title%", "category": "Python", - "when": "python.datascience.featureenabled" - }, - { - "command": "python.datascience.importnotebook", - "title": "%python.command.python.datascience.importnotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.importnotebookfile", - "title": "%python.command.python.datascience.importnotebookfile.title%", - "category": "Python" - }, - { - "command": "python.datascience.opennotebook", - "title": "%python.command.python.datascience.opennotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.exportoutputasnotebook", - "title": "%python.command.python.datascience.exportoutputasnotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.exportfileasnotebook", - "title": "%python.command.python.datascience.exportfileasnotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.exportfileandoutputasnotebook", - "title": "%python.command.python.datascience.exportfileandoutputasnotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.undocells", - "title": "%python.command.python.datascience.undocells.title%", - "category": "Python" - }, - { - "command": "python.datascience.redocells", - "title": "%python.command.python.datascience.redocells.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.undocells", - "title": "%python.command.python.datascience.undocells.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.redocells", - "title": "%python.command.python.datascience.redocells.title%", - "category": "Python" - }, - { - "command": "python.datascience.removeallcells", - "title": "%python.command.python.datascience.removeallcells.title%", - "category": "Python" - }, - { - "command": "python.datascience.interruptkernel", - "title": "%python.command.python.datascience.interruptkernel.title%", - "category": "Python" - }, - { - "command": "python.datascience.restartkernel", - "title": "%python.command.python.datascience.restartkernel.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.removeallcells", - "title": "%python.command.python.datascience.notebookeditor.removeallcells.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.interruptkernel", - "title": "%python.command.python.datascience.interruptkernel.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.restartkernel", - "title": "%python.command.python.datascience.restartkernel.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.runallcells", - "title": "%python.command.python.datascience.notebookeditor.runallcells.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.runselectedcell", - "title": "%python.command.python.datascience.notebookeditor.runselectedcell.title%", - "category": "Python" - }, - { - "command": "python.datascience.notebookeditor.addcellbelow", - "title": "%python.command.python.datascience.notebookeditor.addcellbelow.title%", - "category": "Python" + "command": "python.reportIssue", + "title": "%python.command.python.reportIssue.title%" }, { - "command": "python.datascience.expandallcells", - "title": "%python.command.python.datascience.expandallcells.title%", - "category": "Python" + "category": "Test", + "command": "testing.reRunFailTests", + "icon": "$(run-errors)", + "title": "%python.command.testing.rerunFailedTests.title%" }, { - "command": "python.datascience.collapseallcells", - "title": "%python.command.python.datascience.collapseallcells.title%", - "category": "Python" + "category": "Python", + "command": "python.setInterpreter", + "title": "%python.command.python.setInterpreter.title%" }, { - "command": "python.datascience.addcellbelow", - "title": "%python.command.python.datascience.addcellbelow.title%", - "category": "Python" + "category": "Python", + "command": "python.startREPL", + "title": "%python.command.python.startTerminalREPL.title%" }, { - "command": "python.datascience.createnewnotebook", - "title": "%python.command.python.datascience.createnewnotebook.title%", - "category": "Python" + "category": "Python", + "command": "python.startNativeREPL", + "title": "%python.command.python.startNativeREPL.title%" }, { - "command": "python.datascience.scrolltocell", - "title": "%python.command.python.datascience.scrolltocell.title%", - "category": "Python" + "category": "Python", + "command": "python.viewLanguageServerOutput", + "enablement": "python.hasLanguageServerOutputChannel", + "title": "%python.command.python.viewLanguageServerOutput.title%" }, { - "command": "python.analysis.clearCache", - "title": "%python.command.python.analysis.clearCache.title%", - "category": "Python" + "category": "Python", + "command": "python.viewOutput", + "icon": { + "dark": "resources/dark/repl.svg", + "light": "resources/light/repl.svg" + }, + "title": "%python.command.python.viewOutput.title%" }, { - "command": "python.datascience.switchKernel", - "title": "%DataScience.selectKernel%", "category": "Python", - "enablement": "python.datascience.isnativeactive" + "command": "python.installJupyter", + "title": "%python.command.python.installJupyter.title%" } ], - "menus": { - "editor/context": [ - { - "command": "python.refactorExtractVariable", - "title": "Refactor: Extract Variable", - "group": "Refactor", - "when": "editorHasSelection && editorLangId == python" + "configuration": { + "properties": { + "python.activeStateToolPath": { + "default": "state", + "description": "%python.activeStateToolPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "command": "python.refactorExtractMethod", - "title": "Refactor: Extract Method", - "group": "Refactor", - "when": "editorHasSelection && editorLangId == python" + "python.autoComplete.extraPaths": { + "default": [], + "description": "%python.autoComplete.extraPaths.description%", + "scope": "resource", + "type": "array", + "uniqueItems": true }, - { - "command": "python.sortImports", - "title": "Refactor: Sort Imports", - "group": "Refactor", - "when": "editorLangId == python" + "python.createEnvironment.contentButton": { + "default": "hide", + "markdownDescription": "%python.createEnvironment.contentButton.description%", + "scope": "machine-overridable", + "type": "string", + "enum": [ + "show", + "hide" + ] }, - { - "command": "python.execSelectionInTerminal", - "group": "Python", - "when": "editorFocus && editorLangId == python" + "python.createEnvironment.trigger": { + "default": "prompt", + "markdownDescription": "%python.createEnvironment.trigger.description%", + "scope": "machine-overridable", + "type": "string", + "enum": [ + "off", + "prompt" + ] }, - { - "command": "python.execSelectionInDjangoShell", - "group": "Python", - "when": "editorHasSelection && editorLangId == python && python.isDjangoProject" + "python.condaPath": { + "default": "", + "description": "%python.condaPath.description%", + "scope": "machine", + "type": "string" }, - { - "when": "resourceLangId == python", - "command": "python.execInTerminal", - "group": "Python" + "python.defaultInterpreterPath": { + "default": "python", + "markdownDescription": "%python.defaultInterpreterPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "when": "resourceLangId == python", - "command": "python.runCurrentTestFile", - "group": "Python" - }, - { - "when": "editorFocus && editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled", - "command": "python.datascience.runallcells", - "group": "Python2" - }, - { - "when": "editorFocus && editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled", - "command": "python.datascience.runcurrentcell", - "group": "Python2" - }, - { - "when": "editorFocus && editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled", - "command": "python.datascience.runcurrentcelladvance", - "group": "Python2" - }, - { - "command": "python.datascience.runFileInteractive", - "group": "Python2", - "when": "editorFocus && editorLangId == python && python.datascience.featureenabled" - }, - { - "command": "python.datascience.runfromline", - "group": "Python2", - "when": "editorFocus && editorLangId == python && python.datascience.ownsSelection && python.datascience.featureenabled" - }, - { - "command": "python.datascience.runtoline", - "group": "Python2", - "when": "editorFocus && editorLangId == python && python.datascience.ownsSelection && python.datascience.featureenabled" - }, - { - "command": "python.datascience.execSelectionInteractive", - "group": "Python2", - "when": "editorFocus && editorLangId == python && python.datascience.featureenabled && python.datascience.ownsSelection" - }, - { - "when": "editorFocus && editorLangId == python && resourceLangId == jupyter && python.datascience.featureenabled", - "command": "python.datascience.importnotebook", - "group": "Python3@1" - }, - { - "when": "editorFocus && editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled", - "command": "python.datascience.exportfileasnotebook", - "group": "Python3@2" - }, - { - "when": "editorFocus && editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled", - "command": "python.datascience.exportfileandoutputasnotebook", - "group": "Python3@3" - } - ], - "editor/title": [ - { - "command": "python.execInTerminal-icon", - "title": "%python.command.python.execInTerminal.title%", - "group": "navigation", - "when": "resourceLangId == python && python.showPlayIcon" - } - ], - "explorer/context": [ - { - "when": "resourceLangId == python && !busyTests", - "command": "python.runtests", - "group": "Python" - }, - { - "when": "resourceLangId == python && !busyTests", - "command": "python.debugtests", - "group": "Python" - }, - { - "when": "resourceLangId == python", - "command": "python.execInTerminal", - "group": "Python" - }, - { - "when": "resourceLangId == python && python.datascience.featureenabled", - "command": "python.datascience.runFileInteractive", - "group": "Python2" - }, - { - "when": "resourceLangId == jupyter", - "command": "python.datascience.opennotebook", - "group": "Python" - }, - { - "when": "resourceLangId == jupyter", - "command": "python.datascience.importnotebookfile", - "group": "Python" - } - ], - "commandPalette": [ - { - "command": "python.switchOffInsidersChannel", - "title": "%python.command.python.switchOffInsidersChannel.title%", - "category": "Python", - "when": "config.python.insidersChannel != 'default'" - }, - { - "command": "python.switchToDailyChannel", - "title": "%python.command.python.switchToDailyChannel.title%", - "category": "Python", - "when": "config.python.insidersChannel != 'daily'" - }, - { - "command": "python.switchToWeeklyChannel", - "title": "%python.command.python.switchToWeeklyChannel.title%", - "category": "Python", - "when": "config.python.insidersChannel != 'weekly'" - }, - { - "command": "python.viewOutput", - "title": "%python.command.python.viewOutput.title%", - "category": "Python" - }, - { - "command": "python.runTestNode", - "title": "Run", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.discoveringTests", - "category": "Python", - "when": "config.noExists" + "python.envFile": { + "default": "${workspaceFolder}/.env", + "description": "%python.envFile.description%", + "scope": "resource", + "type": "string" }, - { - "command": "python.stopTests", - "category": "Python", - "when": "config.noExists" + "python.useEnvironmentsExtension": { + "default": false, + "description": "%python.useEnvironmentsExtension.description%", + "scope": "machine-overridable", + "type": "boolean", + "tags": [ + "onExP", + "preview" + ] }, - { - "command": "python.debugTestNode", - "title": "Debug", - "category": "Python", - "when": "config.noExists" + "python.experiments.enabled": { + "default": true, + "description": "%python.experiments.enabled.description%", + "scope": "window", + "type": "boolean" }, - { - "command": "python.openTestNodeInEditor", - "title": "Open", - "category": "Python", - "when": "config.noExists" + "python.experiments.optInto": { + "default": [], + "markdownDescription": "%python.experiments.optInto.description%", + "items": { + "enum": [ + "All", + "pythonSurveyNotification", + "pythonPromptNewToolsExt", + "pythonTerminalEnvVarActivation", + "pythonDiscoveryUsingWorkers", + "pythonTestAdapter" + ], + "enumDescriptions": [ + "%python.experiments.All.description%", + "%python.experiments.pythonSurveyNotification.description%", + "%python.experiments.pythonPromptNewToolsExt.description%", + "%python.experiments.pythonTerminalEnvVarActivation.description%", + "%python.experiments.pythonDiscoveryUsingWorkers.description%", + "%python.experiments.pythonTestAdapter.description%" + ] + }, + "scope": "window", + "type": "array", + "uniqueItems": true }, - { - "command": "python.datascience.runcurrentcell", - "title": "%python.command.python.datascience.runcurrentcell.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" + "python.experiments.optOutFrom": { + "default": [], + "markdownDescription": "%python.experiments.optOutFrom.description%", + "items": { + "enum": [ + "All", + "pythonSurveyNotification", + "pythonPromptNewToolsExt", + "pythonTerminalEnvVarActivation", + "pythonDiscoveryUsingWorkers", + "pythonTestAdapter" + ], + "enumDescriptions": [ + "%python.experiments.All.description%", + "%python.experiments.pythonSurveyNotification.description%", + "%python.experiments.pythonPromptNewToolsExt.description%", + "%python.experiments.pythonTerminalEnvVarActivation.description%", + "%python.experiments.pythonDiscoveryUsingWorkers.description%", + "%python.experiments.pythonTestAdapter.description%" + ] + }, + "scope": "window", + "type": "array", + "uniqueItems": true }, - { - "command": "python.datascience.runcurrentcelladvance", - "title": "%python.command.python.datascience.runcurrentcelladvance.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" + "python.globalModuleInstallation": { + "default": false, + "description": "%python.globalModuleInstallation.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.runcurrentcellandallbelow.palette", - "title": "%python.command.python.datascience.runcurrentcellandallbelow.palette.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" + "python.languageServer": { + "default": "Default", + "description": "%python.languageServer.description%", + "enum": [ + "Default", + "Jedi", + "Pylance", + "None" + ], + "enumDescriptions": [ + "%python.languageServer.defaultDescription%", + "%python.languageServer.jediDescription%", + "%python.languageServer.pylanceDescription%", + "%python.languageServer.noneDescription%" + ], + "scope": "window", + "type": "string" }, - { - "command": "python.datascience.runallcellsabove.palette", - "title": "%python.command.python.datascience.runallcellsabove.palette.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" + "python.interpreter.infoVisibility": { + "default": "onPythonRelated", + "description": "%python.interpreter.infoVisibility.description%", + "enum": [ + "never", + "onPythonRelated", + "always" + ], + "enumDescriptions": [ + "%python.interpreter.infoVisibility.never.description%", + "%python.interpreter.infoVisibility.onPythonRelated.description%", + "%python.interpreter.infoVisibility.always.description%" + ], + "scope": "machine", + "type": "string" }, - { - "command": "python.datascience.debugcurrentcell.palette", - "title": "%python.command.python.datascience.debugcurrentcell.palette.title%", - "category": "Python", - "when": "editorLangId == python && python.datascience.hascodecells && python.datascience.featureenabled" + "python.logging.level": { + "default": "error", + "deprecationMessage": "%python.logging.level.deprecation%", + "description": "%python.logging.level.description%", + "enum": [ + "debug", + "error", + "info", + "off", + "warn" + ], + "scope": "machine", + "type": "string" }, - { - "command": "python.datascience.showhistorypane", - "title": "%python.command.python.datascience.showhistorypane.title%", - "category": "Python", - "when": "python.datascience.featureenabled && !python.datascience.isinteractiveactive" + "python.missingPackage.severity": { + "default": "Hint", + "description": "%python.missingPackage.severity.description%", + "enum": [ + "Error", + "Hint", + "Information", + "Warning" + ], + "scope": "resource", + "type": "string" }, - { - "command": "python.datascience.runallcells", - "title": "%python.command.python.datascience.runallcells.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" + "python.locator": { + "default": "js", + "description": "%python.locator.description%", + "enum": [ + "js", + "native" + ], + "tags": [ + "onExP", + "preview" + ], + "scope": "machine", + "type": "string" }, - { - "command": "python.datascience.scrolltocell", - "title": "%python.command.python.datascience.scrolltocell.title%", - "category": "Python", - "when": "false" + "python.pipenvPath": { + "default": "pipenv", + "description": "%python.pipenvPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "command": "python.datascience.debugcell", - "title": "%python.command.python.datascience.debugcell.title%", - "category": "Python", - "when": "config.noExists" + "python.poetryPath": { + "default": "poetry", + "description": "%python.poetryPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "command": "python.datascience.runcell", - "title": "%python.command.python.datascience.runcell.title%", - "category": "Python", - "when": "config.noExists" + "python.pixiToolPath": { + "default": "pixi", + "description": "%python.pixiToolPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "command": "python.datascience.runFileInteractive", - "title": "%python.command.python.datascience.runFileInteractive.title%", - "category": "Python", - "when": "editorLangId == python && python.datascience.featureenabled" + "python.terminal.activateEnvInCurrentTerminal": { + "default": false, + "description": "%python.terminal.activateEnvInCurrentTerminal.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.debugFileInteractive", - "title": "%python.command.python.datascience.debugFileInteractive.title%", - "category": "Python", - "when": "editorLangId == python && python.datascience.featureenabled" + "python.terminal.activateEnvironment": { + "default": true, + "description": "%python.terminal.activateEnvironment.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.importnotebook", - "title": "%python.command.python.datascience.importnotebook.title%", - "category": "Python" + "python.terminal.executeInFileDir": { + "default": false, + "description": "%python.terminal.executeInFileDir.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.opennotebook", - "title": "%python.command.python.datascience.opennotebook.title%", - "category": "Python" + "python.terminal.focusAfterLaunch": { + "default": false, + "description": "%python.terminal.focusAfterLaunch.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.exportfileasnotebook", - "title": "%python.command.python.datascience.exportfileasnotebook.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.terminal.launchArgs": { + "default": [], + "description": "%python.terminal.launchArgs.description%", + "scope": "resource", + "type": "array" }, - { - "command": "python.datascience.exportfileandoutputasnotebook", - "title": "%python.command.python.datascience.exportfileandoutputasnotebook.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.terminal.shellIntegration.enabled": { + "default": true, + "markdownDescription": "%python.terminal.shellIntegration.enabled.description%", + "scope": "resource", + "type": "boolean", + "tags": [ + "preview" + ] }, - { - "command": "python.datascience.undocells", - "title": "%python.command.python.datascience.undocells.title%", - "category": "Python", - "when": "python.datascience.haveinteractivecells && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.REPL.enableREPLSmartSend": { + "default": true, + "description": "%python.EnableREPLSmartSend.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.redocells", - "title": "%python.command.python.datascience.redocells.title%", - "category": "Python", - "when": "python.datascience.haveredoablecells && python.datascience.featureenabled && python.datascience.ispythonorinteractiveornativeeactive" + "python.REPL.sendToNativeREPL": { + "default": false, + "description": "%python.REPL.sendToNativeREPL.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.removeallcells", - "title": "%python.command.python.datascience.removeallcells.title%", - "category": "Python", - "when": "python.datascience.haveinteractivecells && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.REPL.provideVariables": { + "default": true, + "description": "%python.REPL.provideVariables.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.interruptkernel", - "title": "%python.command.python.datascience.interruptkernel.title%", - "category": "Python", - "when": "python.datascience.haveinteractive && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.testing.autoTestDiscoverOnSaveEnabled": { + "default": true, + "description": "%python.testing.autoTestDiscoverOnSaveEnabled.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.restartkernel", - "title": "%python.command.python.datascience.restartkernel.title%", - "category": "Python", - "when": "python.datascience.haveinteractive && python.datascience.featureenabled && python.datascience.ispythonorinteractiveeactive" + "python.testing.autoTestDiscoverOnSavePattern": { + "default": "**/*.py", + "description": "%python.testing.autoTestDiscoverOnSavePattern.description%", + "scope": "resource", + "type": "string" }, - { - "command": "python.datascience.notebookeditor.undocells", - "title": "%python.command.python.datascience.undocells.title%", - "category": "Python", - "when": "python.datascience.haveinteractivecells && python.datascience.featureenabled && python.datascience.isnativeactive" + "python.testing.cwd": { + "default": null, + "description": "%python.testing.cwd.description%", + "scope": "resource", + "type": "string" }, - { - "command": "python.datascience.notebookeditor.redocells", - "title": "%python.command.python.datascience.redocells.title%", - "category": "Python", - "when": "python.datascience.havenativeredoablecells && python.datascience.featureenabled && python.datascience.isnativeactive" + "python.testing.debugPort": { + "default": 3000, + "description": "%python.testing.debugPort.description%", + "scope": "resource", + "type": "number" }, - { - "command": "python.datascience.notebookeditor.removeallcells", - "title": "%python.command.python.datascience.notebookeditor.removeallcells.title%", - "category": "Python", - "when": "python.datascience.havenativecells && python.datascience.featureenabled && python.datascience.isnativeactive" + "python.testing.promptToConfigure": { + "default": true, + "description": "%python.testing.promptToConfigure.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.notebookeditor.interruptkernel", - "title": "%python.command.python.datascience.interruptkernel.title%", - "category": "Python", - "when": "python.datascience.isnativeactive && python.datascience.featureenabled" + "python.testing.pytestArgs": { + "default": [], + "description": "%python.testing.pytestArgs.description%", + "items": { + "type": "string" + }, + "scope": "resource", + "type": "array" }, - { - "command": "python.datascience.notebookeditor.restartkernel", - "title": "%python.command.python.datascience.restartkernel.title%", - "category": "Python", - "when": "python.datascience.isnativeactive && python.datascience.featureenabled" + "python.testing.pytestEnabled": { + "default": false, + "description": "%python.testing.pytestEnabled.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.notebookeditor.runallcells", - "title": "%python.command.python.datascience.notebookeditor.runallcells.title%", - "category": "Python", - "when": "python.datascience.isnativeactive && python.datascience.featureenabled" + "python.testing.pytestPath": { + "default": "pytest", + "description": "%python.testing.pytestPath.description%", + "scope": "machine-overridable", + "type": "string" }, - { - "command": "python.datascience.notebookeditor.runselectedcell", - "title": "%python.command.python.datascience.notebookeditor.runselectedcell.title%", - "category": "Python", - "when": "python.datascience.isnativeactive && python.datascience.featureenabled && python.datascience.havecellselected" + "python.testing.unittestArgs": { + "default": [ + "-v", + "-s", + ".", + "-p", + "*test*.py" + ], + "description": "%python.testing.unittestArgs.description%", + "items": { + "type": "string" + }, + "scope": "resource", + "type": "array" }, - { - "command": "python.datascience.notebookeditor.addcellbelow", - "title": "%python.command.python.datascience.notebookeditor.addcellbelow.title%", - "category": "Python", - "when": "python.datascience.isnativeactive && python.datascience.featureenabled" + "python.testing.unittestEnabled": { + "default": false, + "description": "%python.testing.unittestEnabled.description%", + "scope": "resource", + "type": "boolean" }, - { - "command": "python.datascience.expandallcells", - "title": "%python.command.python.datascience.expandallcells.title%", - "category": "Python", - "when": "python.datascience.isinteractiveactive && python.datascience.featureenabled" + "python.venvFolders": { + "default": [], + "description": "%python.venvFolders.description%", + "items": { + "type": "string" + }, + "scope": "machine", + "type": "array", + "uniqueItems": true }, - { - "command": "python.datascience.collapseallcells", - "title": "%python.command.python.datascience.collapseallcells.title%", - "category": "Python", - "when": "python.datascience.isinteractiveactive && python.datascience.featureenabled" - }, - { - "command": "python.datascience.exportoutputasnotebook", - "title": "%python.command.python.datascience.exportoutputasnotebook.title%", - "category": "Python", - "when": "python.datascience.isinteractiveactive && python.datascience.featureenabled" - }, - { - "command": "python.datascience.runcellandallbelow", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.runallcellsabove", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.debugcontinue", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.debugstop", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.debugstepover", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.debugcell", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.addcellbelow", - "title": "%python.command.python.datascience.addcellbelow.title%", - "category": "Python", - "when": "python.datascience.hascodecells && python.datascience.featureenabled && python.datascience.ispythonornativeactive" - }, - { - "command": "python.datascience.createnewnotebook", - "title": "%python.command.python.datascience.createnewnotebook.title%", - "category": "Python" - }, - { - "command": "python.datascience.runtoline", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.runfromline", - "category": "Python", - "when": "config.noExists" - }, - { - "command": "python.datascience.execSelectionInteractive", - "category": "Python", - "when": "editorLangId == python && python.datascience.featureenabled" - }, - { - "command": "python.datascience.switchKernel", - "title": "%DataScience.selectKernel%", - "category": "Python", - "when": "python.datascience.isnativeactive" - } - ], - "view/title": [ - { - "command": "python.debugtests", - "when": "view == python_tests && !busyTests", - "group": "navigation@3" - }, - { - "command": "python.runtests", - "when": "view == python_tests && !busyTests", - "group": "navigation@1" - }, - { - "command": "python.stopTests", - "when": "view == python_tests && busyTests", - "group": "navigation@1" - }, - { - "command": "python.discoverTests", - "when": "view == python_tests && !busyTests", - "group": "navigation@4" - }, - { - "command": "python.discoveringTests", - "when": "view == python_tests && discoveringTests", - "group": "navigation@4" - }, - { - "command": "python.runFailedTests", - "when": "view == python_tests && hasFailedTests && !busyTests", - "group": "navigation@2" - }, - { - "command": "python.viewTestOutput", - "when": "view == python_tests", - "group": "navigation@5" - } - ], - "view/item/context": [ - { - "command": "python.runtests", - "when": "view == python_tests && viewItem == testWorkspaceFolder && !busyTests", - "group": "inline@0" - }, - { - "command": "python.debugtests", - "when": "view == python_tests && viewItem == testWorkspaceFolder && !busyTests", - "group": "inline@1" - }, - { - "command": "python.discoverTests", - "when": "view == python_tests && viewItem == testWorkspaceFolder && !busyTests", - "group": "inline@2" - }, - { - "command": "python.openTestNodeInEditor", - "when": "view == python_tests && viewItem == function", - "group": "inline@2" - }, - { - "command": "python.debugTestNode", - "when": "view == python_tests && viewItem == function && !busyTests", - "group": "inline@1" - }, - { - "command": "python.runTestNode", - "when": "view == python_tests && viewItem == function && !busyTests", - "group": "inline@0" - }, - { - "command": "python.openTestNodeInEditor", - "when": "view == python_tests && viewItem == file", - "group": "inline@2" - }, - { - "command": "python.debugTestNode", - "when": "view == python_tests && viewItem == file && !busyTests", - "group": "inline@1" - }, - { - "command": "python.runTestNode", - "when": "view == python_tests && viewItem == file && !busyTests", - "group": "inline@0" - }, - { - "command": "python.openTestNodeInEditor", - "when": "view == python_tests && viewItem == suite", - "group": "inline@2" - }, - { - "command": "python.debugTestNode", - "when": "view == python_tests && viewItem == suite && !busyTests", - "group": "inline@1" - }, - { - "command": "python.runTestNode", - "when": "view == python_tests && viewItem == suite && !busyTests", - "group": "inline@0" + "python.venvPath": { + "default": "", + "description": "%python.venvPath.description%", + "scope": "machine", + "type": "string" } - ] - }, - "breakpoints": [ - { - "language": "python" - }, - { - "language": "html" }, - { - "language": "jinja" - } - ], + "title": "Python", + "type": "object" + }, "debuggers": [ { - "type": "python", - "label": "Python", - "languages": [ - "python" - ], - "program": "./out/client/debugger/debugAdapter/main.js", - "runtime": "node", - "variables": { - "pickProcess": "python.pickLocalProcess" - }, - "configurationSnippets": [], "configurationAttributes": { - "launch": { + "attach": { "properties": { - "module": { - "type": "string", - "description": "Name of the module to be debugged.", - "default": "" - }, - "program": { - "type": "string", - "description": "Absolute path to the program.", - "default": "${file}" - }, - "pythonPath": { - "type": "string", - "description": "Path (fully qualified) to python executable. Defaults to the value in settings.json", - "default": "${config:python.pythonPath}" + "connect": { + "label": "Attach by connecting to debugpy over a socket.", + "properties": { + "host": { + "default": "127.0.0.1", + "description": "Hostname or IP address to connect to.", + "type": "string" + }, + "port": { + "description": "Port to connect to.", + "type": "number" + } + }, + "required": [ + "port" + ], + "type": "object" }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program", - "default": [], - "items": { - "type": "string" - } + "debugAdapterPath": { + "description": "Path (fully qualified) to the python debug adapter executable.", + "type": "string" }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": false + "django": { + "default": false, + "description": "Django debugging.", + "type": "boolean" }, - "showReturnValue": { - "type": "boolean", - "description": "Show return value of functions when stepping.", - "default": true + "host": { + "default": "127.0.0.1", + "description": "Hostname or IP address to connect to.", + "type": "string" }, - "console": { + "jinja": { + "default": null, + "description": "Jinja template debugging (e.g. Flask).", "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "cwd": { - "type": "string", - "description": "Absolute path to the working directory of the program being debugged. Default is the root directory of the file (leave empty).", - "default": "${workspaceFolder}" - }, - "env": { - "type": "object", - "description": "Environment variables defined as a key value pair. Property ends up being the Environment Variable and the value of the property ends up being the value of the Env Variable.", - "default": {}, - "additionalProperties": { - "type": "string" - } + false, + null, + true + ] }, - "envFile": { - "type": "string", - "description": "Absolute path to a file containing environment variable definitions.", - "default": "${workspaceFolder}/.env" + "justMyCode": { + "default": true, + "description": "If true, show and debug only user-written code. If false, show and debug all code, including library calls.", + "type": "boolean" }, - "port": { - "type": "number", - "description": "Debug port (default is 0, resulting in the use of a dynamic port).", - "default": 0 + "listen": { + "label": "Attach by listening for incoming socket connection from debugpy", + "properties": { + "host": { + "default": "127.0.0.1", + "description": "Hostname or IP address of the interface to listen on.", + "type": "string" + }, + "port": { + "description": "Port to listen on.", + "type": "number" + } + }, + "required": [ + "port" + ], + "type": "object" }, - "host": { - "type": "string", - "description": "IP address of the of the local debug server (default is localhost).", - "default": "localhost" + "logToFile": { + "default": false, + "description": "Enable logging of debugger events to a log file.", + "type": "boolean" }, "pathMappings": { - "type": "array", - "label": "Path mappings.", + "default": [], "items": { - "type": "object", "label": "Path mapping", - "required": [ - "localRoot", - "remoteRoot" - ], "properties": { "localRoot": { - "type": "string", + "default": "${workspaceFolder}", "label": "Local source root.", - "default": "${workspaceFolder}" + "type": "string" }, "remoteRoot": { - "type": "string", + "default": "", "label": "Remote source root.", - "default": "" + "type": "string" } - } + }, + "required": [ + "localRoot", + "remoteRoot" + ], + "type": "object" }, - "default": [] + "label": "Path mappings.", + "type": "array" }, - "logToFile": { - "type": "boolean", - "description": "Enable logging of debugger events to a log file.", - "default": false + "port": { + "description": "Port to connect to.", + "type": "number" + }, + "processId": { + "anyOf": [ + { + "default": "${command:pickProcess}", + "description": "Use process picker to select a process to attach, or Process ID as integer.", + "enum": [ + "${command:pickProcess}" + ] + }, + { + "description": "ID of the local process to attach to.", + "type": "integer" + } + ] }, "redirectOutput": { - "type": "boolean", + "default": true, "description": "Redirect output.", - "default": true - }, - "justMyCode": { - "type": "boolean", - "description": "Debug only user-written code.", - "default": true - }, - "gevent": { - "type": "boolean", - "description": "Enable debugging of gevent monkey-patched code.", - "default": false - }, - "django": { - "type": "boolean", - "description": "Django debugging.", - "default": false - }, - "jinja": { - "enum": [ - true, - false, - null - ], - "description": "Jinja template debugging (e.g. Flask).", - "default": null - }, - "sudo": { - "type": "boolean", - "description": "Running debug program under elevated permissions (on Unix).", - "default": false + "type": "boolean" }, - "pyramid": { - "type": "boolean", - "description": "Whether debugging Pyramid applications", - "default": false + "showReturnValue": { + "default": true, + "description": "Show return value of functions when stepping.", + "type": "boolean" }, "subProcess": { - "type": "boolean", + "default": false, "description": "Whether to enable Sub Process debugging", - "default": false + "type": "boolean" } } }, - "test": { + "launch": { "properties": { - "pythonPath": { - "type": "string", - "description": "Path (fully qualified) to python executable. Defaults to the value in settings.json", - "default": "${config:python.pythonPath}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": false + "args": { + "default": [], + "description": "Command line arguments passed to the program.", + "items": { + "type": "string" + }, + "type": [ + "array", + "string" + ] }, - "showReturnValue": { - "type": "boolean", - "description": "Show return value of functions when stepping.", - "default": true + "autoReload": { + "default": {}, + "description": "Configures automatic reload of code on edit.", + "properties": { + "enable": { + "default": false, + "description": "Automatically reload code on edit.", + "type": "boolean" + }, + "exclude": { + "default": [ + "**/.git/**", + "**/.metadata/**", + "**/__pycache__/**", + "**/node_modules/**", + "**/site-packages/**" + ], + "description": "Glob patterns of paths to exclude from auto reload.", + "items": { + "type": "string" + }, + "type": "array" + }, + "include": { + "default": [ + "**/*.py", + "**/*.pyw" + ], + "description": "Glob patterns of paths to include in auto reload.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" }, "console": { + "default": "integratedTerminal", + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", "enum": [ - "internalConsole", + "externalTerminal", "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "internalConsole" + "internalConsole" + ] + }, + "consoleTitle": { + "default": "Python Debug Console", + "description": "Display name of the debug console or terminal" }, "cwd": { - "type": "string", + "default": "${workspaceFolder}", "description": "Absolute path to the working directory of the program being debugged. Default is the root directory of the file (leave empty).", - "default": "${workspaceFolder}" + "type": "string" + }, + "debugAdapterPath": { + "description": "Path (fully qualified) to the python debug adapter executable.", + "type": "string" + }, + "django": { + "default": false, + "description": "Django debugging.", + "type": "boolean" }, "env": { - "type": "object", - "description": "Environment variables defined as a key value pair. Property ends up being the Environment Variable and the value of the property ends up being the value of the Env Variable.", - "default": {}, "additionalProperties": { "type": "string" - } + }, + "default": {}, + "description": "Environment variables defined as a key value pair. Property ends up being the Environment Variable and the value of the property ends up being the value of the Env Variable.", + "type": "object" }, "envFile": { - "type": "string", + "default": "${workspaceFolder}/.env", "description": "Absolute path to a file containing environment variable definitions.", - "default": "${workspaceFolder}/.env" + "type": "string" }, - "redirectOutput": { - "type": "boolean", - "description": "Redirect output.", - "default": true - }, - "justMyCode": { - "type": "boolean", - "description": "Debug only user-written code.", - "default": true - } - } - }, - "attach": { - "properties": { - "port": { - "type": "number", - "description": "Debug port to attach", - "default": 0 + "gevent": { + "default": false, + "description": "Enable debugging of gevent monkey-patched code.", + "type": "boolean" }, "host": { - "type": "string", - "description": "IP Address of the of remote server (default is localhost or use 127.0.0.1).", - "default": "localhost" + "default": "localhost", + "description": "IP address of the of the local debug server (default is localhost).", + "type": "string" + }, + "jinja": { + "default": null, + "description": "Jinja template debugging (e.g. Flask).", + "enum": [ + false, + null, + true + ] + }, + "justMyCode": { + "default": true, + "description": "Debug only user-written code.", + "type": "boolean" + }, + "logToFile": { + "default": false, + "description": "Enable logging of debugger events to a log file.", + "type": "boolean" + }, + "module": { + "default": "", + "description": "Name of the module to be debugged.", + "type": "string" }, "pathMappings": { - "type": "array", - "label": "Path mappings.", + "default": [], "items": { - "type": "object", "label": "Path mapping", - "required": [ - "localRoot", - "remoteRoot" - ], "properties": { "localRoot": { - "type": "string", + "default": "${workspaceFolder}", "label": "Local source root.", - "default": "${workspaceFolder}" + "type": "string" }, "remoteRoot": { - "type": "string", + "default": "", "label": "Remote source root.", - "default": "" + "type": "string" } - } + }, + "required": [ + "localRoot", + "remoteRoot" + ], + "type": "object" }, - "default": [] + "label": "Path mappings.", + "type": "array" }, - "logToFile": { - "type": "boolean", - "description": "Enable logging of debugger events to a log file.", - "default": false + "port": { + "default": 0, + "description": "Debug port (default is 0, resulting in the use of a dynamic port).", + "type": "number" }, - "redirectOutput": { - "type": "boolean", - "description": "Redirect output.", - "default": true + "program": { + "default": "${file}", + "description": "Absolute path to the program.", + "type": "string" }, - "justMyCode": { - "type": "boolean", - "description": "Debug only user-written code.", - "default": true + "purpose": { + "default": [], + "description": "Tells extension to use this configuration for test debugging, or when using debug-in-terminal command.", + "items": { + "enum": [ + "debug-test", + "debug-in-terminal" + ], + "enumDescriptions": [ + "Use this configuration while debugging tests using test view or test debug commands.", + "Use this configuration while debugging a file using debug in terminal button in the editor." + ] + }, + "type": "array" }, - "django": { - "type": "boolean", - "description": "Django debugging.", - "default": false + "pyramid": { + "default": false, + "description": "Whether debugging Pyramid applications", + "type": "boolean" }, - "jinja": { - "enum": [ - true, - false, - null - ], - "description": "Jinja template debugging (e.g. Flask).", - "default": null + "python": { + "default": "${command:python.interpreterPath}", + "description": "Absolute path to the Python interpreter executable; overrides workspace configuration if set.", + "type": "string" }, - "subProcess": { - "type": "boolean", - "description": "Whether to enable Sub Process debugging", - "default": false + "pythonArgs": { + "default": [], + "description": "Command-line arguments passed to the Python interpreter. To pass arguments to the debug target, use \"args\".", + "items": { + "type": "string" + }, + "type": "array" + }, + "redirectOutput": { + "default": true, + "description": "Redirect output.", + "type": "boolean" }, "showReturnValue": { - "type": "boolean", + "default": true, "description": "Show return value of functions when stepping.", - "default": true + "type": "boolean" }, - "processId": { - "anyOf": [ - { - "enum": [ - "${command:pickProcess}" - ], - "description": "Use process picker to select a process to attach, or Process ID as integer.", - "default": "${command:pickProcess}" - }, - { - "type": "integer", - "description": "ID of the local process to attach to." - } - ] + "stopOnEntry": { + "default": false, + "description": "Automatically stop after launch.", + "type": "boolean" + }, + "subProcess": { + "default": false, + "description": "Whether to enable Sub Process debugging", + "type": "boolean" + }, + "sudo": { + "default": false, + "description": "Running debug program under elevated permissions (on Unix).", + "type": "boolean" } } } - } - } - ], - "configuration": { - "type": "object", - "title": "Python", - "properties": { - "python.diagnostics.sourceMapsEnabled": { - "type": "boolean", - "default": false, - "description": "Enable source map support for meaningful stack traces in error logs.", - "scope": "application" - }, - "python.autoComplete.addBrackets": { - "type": "boolean", - "default": false, - "description": "Automatically add brackets for functions.", - "scope": "resource" - }, - "python.autoComplete.extraPaths": { - "type": "array", - "default": [], - "description": "List of paths to libraries and the like that need to be imported by auto complete engine. E.g. when using Google App SDK, the paths are not in system path, hence need to be added into this list.", - "scope": "resource" - }, - "python.autoComplete.showAdvancedMembers": { - "type": "boolean", - "default": true, - "description": "Controls appearance of methods with double underscores in the completion list.", - "scope": "resource" - }, - "python.autoComplete.typeshedPaths": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "Specifies paths to local typeshed repository clone(s) for the Python language server.", - "scope": "resource" - }, - "python.autoUpdateLanguageServer": { - "type": "boolean", - "default": true, - "description": "Automatically update the language server.", - "scope": "application" - }, - "python.experiments.enabled": { - "type": "boolean", - "default": true, - "description": "Enables/disables A/B tests.", - "scope": "application" - }, - "python.experiments.optInto": { - "type": "array", - "default": [], - "items": { - "enum": [ - "LS - enabled", - "AlwaysDisplayTestExplorer - experiment", - "ShowExtensionSurveyPrompt - enabled", - "DebugAdapterFactory - experiment", - "PtvsdWheels37 - experiment", - "Reload - experiment", - "AA_testing - experiment", - "WebHostNotebook - experiment", - "UseTerminalToGetActivatedEnvVars - experiment", - "All" - ] - }, - "description": "List of experiment to opt into. If empty, user is assigned the default experiment groups. See https://github.com/microsoft/vscode-python/wiki/Experiments for more details.", - "scope": "application" - }, - "python.experiments.optOutFrom": { - "type": "array", - "default": [], - "items": { - "enum": [ - "LS - enabled", - "AlwaysDisplayTestExplorer - experiment", - "ShowExtensionSurveyPrompt - enabled", - "DebugAdapterFactory - experiment", - "PtvsdWheels37 - experiment", - "Reload - experiment", - "AA_testing - experiment", - "WebHostNotebook - experiment", - "UseTerminalToGetActivatedEnvVars - experiment", - "All" - ] - }, - "description": "List of experiment to opt out of. If empty, user is assigned the default experiment groups. See https://github.com/microsoft/vscode-python/wiki/Experiments for more details.", - "scope": "application" - }, - "python.dataScience.allowImportFromNotebook": { - "type": "boolean", - "default": true, - "description": "Allows a user to import a jupyter notebook into a python file anytime one is opened.", - "scope": "resource" - }, - "python.dataScience.gatherRules": { - "type": "array", - "default": [ - { - "objectName": "df", - "functionName": "head", - "doesNotModify": [ - "OBJECT" - ] - }, - { - "objectName": "df", - "functionName": "describe", - "doesNotModify": [ - "OBJECT" - ] - }, - { - "objectName": "df", - "functionName": "tail", - "doesNotModify": [ - "OBJECT" - ] - }, - { - "functionName": "print", - "doesNotModify": [ - "ARGUMENTS" - ] - }, - { - "functionName": "KMeans", - "doesNotModify": [ - "ARGUMENTS" - ] - }, - { - "functionName": "scatter", - "doesNotModify": [ - "ARGUMENTS" - ] - }, - { - "functionName": "fit", - "doesNotModify": [ - "ARGUMENTS" - ] - }, - { - "functionName": "sum", - "doesNotModify": [ - "ARGUMENTS" - ] - }, - { - "functionName": "len", - "doesNotModify": [ - "ARGUMENTS" - ] - } - ] - }, - "python.dataScience.askForLargeDataFrames": { - "type": "boolean", - "default": true, - "description": "Warn the user before trying to open really large data frames.", - "scope": "application" }, - "python.dataScience.askForKernelRestart": { - "type": "boolean", - "default": true, - "description": "Warn the user before restarting a kernel.", - "scope": "application" + "deprecated": "%python.debugger.deprecatedMessage%", + "configurationSnippets": [], + "label": "Python", + "languages": [ + "python" + ], + "type": "python", + "variables": { + "pickProcess": "python.pickLocalProcess" }, - "python.dataScience.enabled": { - "type": "boolean", - "default": true, - "description": "Enable the experimental data science features in the python extension.", - "scope": "resource" + "when": "!virtualWorkspace && shellExecutionSupported", + "hiddenWhen": "true" + } + ], + "grammars": [ + { + "language": "pip-requirements", + "path": "./syntaxes/pip-requirements.tmLanguage.json", + "scopeName": "source.pip-requirements" + } + ], + "jsonValidation": [ + { + "fileMatch": ".condarc", + "url": "./schemas/condarc.json" + }, + { + "fileMatch": "environment.yml", + "url": "./schemas/conda-environment.json" + }, + { + "fileMatch": "meta.yaml", + "url": "./schemas/conda-meta.json" + } + ], + "keybindings": [ + { + "command": "python.execSelectionInTerminal", + "key": "shift+enter", + "when": "editorTextFocus && editorLangId == python && !findInputFocussed && !replaceInputFocussed && !jupyter.ownsSelection && !notebookEditorFocused && !isCompositeNotebook" + }, + { + "command": "python.execInREPL", + "key": "shift+enter", + "when": "config.python.REPL.sendToNativeREPL && editorLangId == python && editorTextFocus && !jupyter.ownsSelection && !notebookEditorFocused && !isCompositeNotebook" + }, + { + "command": "python.execInREPLEnter", + "key": "enter", + "when": "!config.interactiveWindow.executeWithShiftEnter && isCompositeNotebook && activeEditor == 'workbench.editor.repl' && !inlineChatFocused && !notebookCellListFocused" + }, + { + "command": "python.execInInteractiveWindowEnter", + "key": "enter", + "when": "!config.interactiveWindow.executeWithShiftEnter && isCompositeNotebook && activeEditor == 'workbench.editor.interactive' && !inlineChatFocused && !notebookCellListFocused" + } + ], + "languages": [ + { + "aliases": [ + "Jinja" + ], + "extensions": [ + ".j2", + ".jinja2" + ], + "id": "jinja" + }, + { + "aliases": [ + "pip requirements", + "requirements.txt" + ], + "configuration": "./languages/pip-requirements.json", + "filenamePatterns": [ + "**/*requirements*.{txt, in}", + "**/*constraints*.txt", + "**/requirements/*.{txt,in}", + "**/constraints/*.txt" + ], + "filenames": [ + "constraints.txt", + "requirements.in", + "requirements.txt" + ], + "id": "pip-requirements" + }, + { + "filenames": [ + ".condarc" + ], + "id": "yaml" + }, + { + "filenames": [ + ".flake8", + ".pep8", + ".pylintrc", + ".pypirc" + ], + "id": "ini" + }, + { + "filenames": [ + "Pipfile", + "poetry.lock", + "uv.lock" + ], + "id": "toml" + }, + { + "filenames": [ + "Pipfile.lock" + ], + "id": "json" + } + ], + "menus": { + "issue/reporter": [ + { + "command": "python.reportIssue" + } + ], + "testing/item/context": [ + { + "command": "python.copyTestId", + "group": "navigation", + "when": "controllerId == 'python-tests'" + } + ], + "testing/item/gutter": [ + { + "command": "python.copyTestId", + "group": "navigation", + "when": "controllerId == 'python-tests'" + } + ], + "commandPalette": [ + { + "category": "Python", + "command": "python.analysis.restartLanguageServer", + "title": "%python.command.python.analysis.restartLanguageServer.title%", + "when": "!virtualWorkspace && shellExecutionSupported && (editorLangId == python || notebookType == jupyter-notebook)" }, - "python.dataScience.exportWithOutputEnabled": { - "type": "boolean", - "default": false, - "description": "Enable exporting a python file into a jupyter notebook and run all cells when doing so.", - "scope": "resource" - }, - "python.dataScience.jupyterLaunchTimeout": { - "type": "number", - "default": 60000, - "description": "Amount of time (in ms) to wait for the Jupyter Notebook server to start.", - "scope": "resource" - }, - "python.dataScience.jupyterLaunchRetries": { - "type": "number", - "default": 3, - "description": "Number of times to attempt to connect to the Jupyter Notebook", - "scope": "resource" - }, - "python.dataScience.jupyterServerURI": { - "type": "string", - "default": "local", - "description": "When a Notebook Editor or Interactive Window session is started, create the kernel on the specified Jupyter server. Select 'local' to create a new Jupyter server on this local machine.", - "scope": "resource" + { + "category": "Python", + "command": "python.clearCacheAndReload", + "title": "%python.command.python.clearCacheAndReload.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.dataScience.jupyterCommandLineArguments": { - "type": "array", - "default": [], - "description": "When a Notebook Editor or Interactive Window Jupyter server is started, these arguments will be passed to it. By default this list is generated by the Python Extension.", - "scope": "resource" - }, - "python.dataScience.notebookFileRoot": { - "type": "string", - "default": "${fileDirname}", - "description": "Set the root directory for loading files for the Python Interactive window.", - "scope": "resource" - }, - "python.dataScience.searchForJupyter": { - "type": "boolean", - "default": true, - "description": "Search all installed Python interpreters for a Jupyter installation when starting the Python Interactive window", - "scope": "resource" - }, - "python.dataScience.changeDirOnImportExport": { - "type": "boolean", - "default": false, - "description": "When importing or exporting a Jupyter Notebook add a directory change command to allow relative path loading to work.", - "scope": "resource" - }, - "python.dataScience.useDefaultConfigForJupyter": { - "type": "boolean", - "default": true, - "description": "When running Jupyter locally, create a default empty Jupyter config for the Python Interactive window", - "scope": "resource" - }, - "python.dataScience.jupyterInterruptTimeout": { - "type": "number", - "default": 10000, - "description": "Amount of time (in ms) to wait for an interrupt before asking to restart the Jupyter kernel.", - "scope": "resource" - }, - "python.dataScience.allowInput": { - "type": "boolean", - "default": true, - "description": "Allow the inputting of python code directly into the Python Interactive window" - }, - "python.dataScience.showCellInputCode": { - "type": "boolean", - "default": true, - "description": "Show cell input code.", - "scope": "resource" - }, - "python.dataScience.collapseCellInputCodeByDefault": { - "type": "boolean", - "default": true, - "description": "Collapse cell input code by default.", - "scope": "resource" - }, - "python.dataScience.maxOutputSize": { - "type": "number", - "default": 400, - "description": "Maximum size (in pixels) of text output in the Python Interactive window before a scrollbar appears. Set to -1 for infinity.", - "scope": "resource" - }, - "python.dataScience.errorBackgroundColor": { - "type": "string", - "default": "#FFFFFF", - "description": "Background color (in hex) for exception messages in the Python Interactive window.", - "scope": "resource", - "deprecationMessage": "No longer necessary as the theme colors are used for error messages" - }, - "python.dataScience.sendSelectionToInteractiveWindow": { - "type": "boolean", - "default": false, - "description": "Determines if selected code in a python file will go to the terminal or the Python Interactive window when hitting shift+enter", - "scope": "resource" - }, - "python.dataScience.showJupyterVariableExplorer": { - "type": "boolean", - "default": true, - "description": "Show the variable explorer in the Python Interactive window.", - "deprecationMessage": "This setting no longer applies. It is ignored.", - "scope": "resource" - }, - "python.dataScience.variableExplorerExclude": { - "type": "string", - "default": "module;function;builtin_function_or_method", - "description": "Types to exclude from showing in the Python Interactive variable explorer", - "scope": "resource" - }, - "python.dataScience.codeRegularExpression": { - "type": "string", - "default": "^(#\\s*%%|#\\s*\\|#\\s*In\\[\\d*?\\]|#\\s*In\\[ \\])", - "description": "Regular expression used to identify code cells. All code until the next match is considered part of this cell. \nDefaults to '^(#\\s*%%|#\\s*\\|#\\s*In\\[\\d*?\\]|#\\s*In\\[ \\])' if left blank", - "scope": "resource" - }, - "python.dataScience.defaultCellMarker": { - "type": "string", - "default": "# %%", - "description": "Cell marker used for delineating a cell in a python file.", - "scope": "resource" - }, - "python.dataScience.markdownRegularExpression": { - "type": "string", - "default": "^(#\\s*%%\\s*\\[markdown\\]|#\\s*\\)", - "description": "Regular expression used to identify markdown cells. All comments after this expression are considered part of the markdown. \nDefaults to '^(#\\s*%%\\s*\\[markdown\\]|#\\s*\\)' if left blank", - "scope": "resource" - }, - "python.dataScience.allowLiveShare": { - "type": "boolean", - "default": true, - "description": "Allow the Python Interactive window to be shared during a Live Share session", - "scope": "resource" - }, - "python.dataScience.ignoreVscodeTheme": { - "type": "boolean", - "default": false, - "description": "Don't use the VS Code theme in the Python Interactive window (requires reload of VS Code). This forces the Python Interactive window to use 'Light +(default light)' and disables matplotlib defaults.", - "scope": "resource" - }, - "python.dataScience.themeMatplotlibPlots": { - "type": "boolean", - "default": false, - "description": "In the Python Interactive window and Notebook Editor theme matplotlib outputs to match the VS Code editor theme.", - "scope": "resource" - }, - "python.dataScience.liveShareConnectionTimeout": { - "type": "number", - "default": 1000, - "description": "Amount of time to wait for guest connections to verify they have the Python extension installed.", - "scope": "application" - }, - "python.dataScience.decorateCells": { - "type": "boolean", - "default": true, - "description": "Draw a highlight behind the currently active cell.", - "scope": "resource" - }, - "python.dataScience.enableCellCodeLens": { - "type": "boolean", - "default": true, - "description": "Enables code lens for 'cells' in a python file.", - "scope": "resource" - }, - "python.dataScience.enableAutoMoveToNextCell": { - "type": "boolean", - "default": true, - "description": "Enables moving to the next cell when clicking on a 'Run Cell' code lens.", - "scope": "resource" - }, - "python.dataScience.autoPreviewNotebooksInInteractivePane": { - "type": "boolean", - "deprecationMessage": "No longer supported. Notebooks open directly in their own editor now.", - "default": false, - "description": "When opening ipynb files, automatically preview the contents in the Python Interactive window.", - "scope": "resource" - }, - "python.dataScience.useNotebookEditor": { - "type": "boolean", - "default": true, - "description": "Automatically open .ipynb files in the Notebook Editor.", - "scope": "resource" - }, - "python.dataScience.allowUnauthorizedRemoteConnection": { - "type": "boolean", - "default": false, - "description": "Allow for connecting the Python Interactive window to a https Jupyter server that does not have valid certificates. This can be a security risk, so only use for known and trusted servers.", - "scope": "resource" - }, - "python.dataScience.enablePlotViewer": { - "type": "boolean", - "default": true, - "description": "Modify plot output so that it can be expanded into a plot viewer window.", - "scope": "resource" - }, - "python.dataScience.enableGather": { - "type": "boolean", - "default": false, - "description": "Enable code gather for executed cells. For a gathered cell, that cell and only the code it depends on will be exported to a new notebook.", - "scope": "resource" - }, - "python.dataScience.gatherToScript": { - "type": "boolean", - "default": true, - "description": "Gather code to a python script rather than a notebook.", - "scope": "resource" - }, - "python.dataScience.codeLenses": { - "type": "string", - "default": "python.datascience.runcell, python.datascience.runallcellsabove, python.datascience.debugcell", - "description": "Set of commands to put as code lens above a cell. Defaults to 'python.datascience.runcell, python.datascience.runallcellsabove, python.datascience.debugcell'", - "scope": "resource" - }, - "python.dataScience.debugCodeLenses": { - "type": "string", - "default": "python.datascience.debugcontinue, python.datascience.debugstop, python.datascience.debugstepover", - "description": "Set of debug commands to put as code lens above a cell while debugging.", - "scope": "resource" - }, - "python.dataScience.ptvsdDistPath": { - "type": "string", - "default": "", - "description": "Path to ptvsd experimental bits for debugging cells.", - "scope": "resource" - }, - "python.dataScience.stopOnFirstLineWhileDebugging": { - "type": "boolean", - "default": true, - "description": "When debugging a cell, stop on the first line.", - "scope": "resource" - }, - "python.dataScience.remoteDebuggerPort": { - "type": "number", - "default": -1, - "description": "When debugging a cell, open this port on the remote box. If -1 is specified, a random port between 8889 and 9000 will be attempted.", - "scope": "resource" - }, - "python.dataScience.disableJupyterAutoStart": { - "type": "boolean", - "default": false, - "description": "When true, disables Jupyter from being automatically started for you. You must instead run a cell to start Jupyter.", - "scope": "resource" - }, - "python.dataScience.textOutputLimit": { - "type": "number", - "default": 20000, - "description": "Limit the amount of text in Python Interactive cell text output to this value. 0 to allow any amount of characters.", - "scope": "resource" - }, - "python.dataScience.colorizeInputBox": { - "type": "boolean", - "default": true, - "description": "Whether or not to use the theme's peek color as the background for the input box.", - "scope": "resource" - }, - "python.dataScience.stopOnError": { - "type": "boolean", - "default": true, - "description": "Stop running cells if a cell throws an exception.", - "scope": "resource" - }, - "python.dataScience.addGotoCodeLenses": { - "type": "boolean", - "default": true, - "description": "After running a cell, add a 'Goto' code lens on the cell. Note, disabling all code lenses disables this code lens as well.", - "scope": "resource" - }, - "python.dataScience.variableQueries": { - "type": "array", - "description": "Language to query mapping for returning the list of active variables in a Jupyter kernel. Used by the Variable Explorer in both the Interactive Window and Notebooks. Example: \n'[\n{\n \"language\": \"python\",\n \"query\": \"%who_ls\",\n \"parseExpr\": \"'(\\\\w+)'\"\n}\n]'", - "scope": "machine", - "examples": [ - [ - { - "language": "python", - "query": "_rwho_ls = %who_ls\\nprint(_rwho_ls)", - "parseExpr": "'(\\w+)'" - }, - { - "language": "julia", - "query": "whos", - "parseExpr": "'(\\w+)'" - } - ] - ] - }, - "python.disableInstallationCheck": { - "type": "boolean", - "default": false, - "description": "Whether to check if Python is installed (also warn when using the macOS-installed Python).", - "scope": "resource" - }, - "python.envFile": { - "type": "string", - "description": "Absolute path to a file containing environment variable definitions.", - "default": "${workspaceFolder}/.env", - "scope": "resource" - }, - "python.formatting.autopep8Args": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.formatting.autopep8Path": { - "type": "string", - "default": "autopep8", - "description": "Path to autopep8, you can use a custom version of autopep8 by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.formatting.provider": { - "type": "string", - "default": "autopep8", - "description": "Provider for formatting. Possible options include 'autopep8', 'black', and 'yapf'.", - "enum": [ - "autopep8", - "black", - "yapf", - "none" - ], - "scope": "resource" - }, - "python.formatting.blackArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.formatting.blackPath": { - "type": "string", - "default": "black", - "description": "Path to Black, you can use a custom version of Black by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.formatting.yapfArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.formatting.yapfPath": { - "type": "string", - "default": "yapf", - "description": "Path to yapf, you can use a custom version of yapf by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.globalModuleInstallation": { - "type": "boolean", - "default": false, - "description": "Whether to install Python modules globally when not using an environment.", - "scope": "resource" - }, - "python.jediEnabled": { - "type": "boolean", - "default": true, - "description": "Enables Jedi as IntelliSense engine instead of Microsoft Python Analysis Engine.", - "scope": "resource" - }, - "python.jediMemoryLimit": { - "type": "number", - "default": 0, - "description": "Memory limit for the Jedi completion engine in megabytes. Zero (default) means 1024 MB. -1 means unlimited (disable memory limit check)", - "scope": "resource" - }, - "python.jediPath": { - "type": "string", - "default": "", - "description": "Path to directory containing the Jedi library (this path will contain the 'Jedi' sub directory).", - "scope": "resource" - }, - "python.languageServer": { - "type": "string", - "enum": [ - "Jedi", - "Microsoft", - "None" - ], - "default": "Microsoft", - "description": "Defines type of the language server.", - "scope": "resource" - }, - "python.analysis.openFilesOnly": { - "type": "boolean", - "default": true, - "description": "Only show errors and warnings for open files rather than for the entire workspace.", - "scope": "resource" - }, - "python.analysis.diagnosticPublishDelay": { - "type": "integer", - "default": 1000, - "description": "Delay before diagnostic messages are transferred to the problems list (in milliseconds).", - "scope": "resource" - }, - "python.analysis.errors": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "List of diagnostics messages to be shown as errors.", - "scope": "resource" - }, - "python.analysis.warnings": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "List of diagnostics messages to be shown as warnings.", - "scope": "resource" - }, - "python.analysis.information": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "List of diagnostics messages to be shown as information.", - "scope": "resource" - }, - "python.analysis.disabled": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "List of suppressed diagnostic messages.", - "scope": "resource" - }, - "python.analysis.typeshedPaths": { - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "Paths to Typeshed stub folders. Default is Typeshed installed with the language server. Change requires restart.", - "scope": "resource" - }, - "python.analysis.cacheFolderPath": { - "type": "string", - "description": "Path to a writable folder where analyzer can cache its data. Change requires restart.", - "scope": "resource" - }, - "python.analysis.memory.keepLibraryAst": { - "type": "boolean", - "default": false, - "description": "Allows code analysis to keep parser trees in memory. Increases memory consumption but may improve performance with large library analysis.", - "scope": "resource" - }, - "python.analysis.memory.keepLibraryLocalVariables": { - "type": "boolean", - "default": false, - "description": "Allows code analysis to keep library function local variables. Allows code navigation in Python libraries function bodies. Increases memory consumption.", - "scope": "resource" - }, - "python.analysis.logLevel": { - "type": "string", - "enum": [ - "Error", - "Warning", - "Information", - "Trace" - ], - "default": "Error", - "description": "Defines type of log messages language server writes into the output window.", - "scope": "resource" - }, - "python.analysis.symbolsHierarchyDepthLimit": { - "type": "integer", - "default": 10, - "description": "Limits depth of the symbol tree in the document outline.", - "scope": "resource" - }, - "python.analysis.cachingLevel": { - "type": "string", - "enum": [ - "Default", - "None", - "System", - "Library" - ], - "default": "Default", - "description": "Defines which types of modules get their analysis cached.", - "scope": "resource" - }, - "python.linting.enabled": { - "type": "boolean", - "default": true, - "description": "Whether to lint Python files.", - "scope": "resource" - }, - "python.linting.flake8Args": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.flake8CategorySeverity.E": { - "type": "string", - "default": "Error", - "description": "Severity of Flake8 message type 'E'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.flake8CategorySeverity.F": { - "type": "string", - "default": "Error", - "description": "Severity of Flake8 message type 'F'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.flake8CategorySeverity.W": { - "type": "string", - "default": "Warning", - "description": "Severity of Flake8 message type 'W'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.flake8Enabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using flake8", - "scope": "resource" - }, - "python.linting.flake8Path": { - "type": "string", - "default": "flake8", - "description": "Path to flake8, you can use a custom version of flake8 by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.ignorePatterns": { - "type": "array", - "description": "Patterns used to exclude files or folders from being linted.", - "default": [ - ".vscode/*.py", - "**/site-packages/**/*.py" - ], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.lintOnSave": { - "type": "boolean", - "default": true, - "description": "Whether to lint Python files when saved.", - "scope": "resource" - }, - "python.linting.maxNumberOfProblems": { - "type": "number", - "default": 100, - "description": "Controls the maximum number of problems produced by the server.", - "scope": "resource" - }, - "python.linting.banditArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.banditEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using bandit.", - "scope": "resource" - }, - "python.linting.banditPath": { - "type": "string", - "default": "bandit", - "description": "Path to bandit, you can use a custom version of bandit by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.mypyArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [ - "--ignore-missing-imports", - "--follow-imports=silent", - "--show-column-numbers" - ], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.mypyCategorySeverity.error": { - "type": "string", - "default": "Error", - "description": "Severity of Mypy message type 'Error'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.mypyCategorySeverity.note": { - "type": "string", - "default": "Information", - "description": "Severity of Mypy message type 'Note'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.mypyEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using mypy.", - "scope": "resource" - }, - "python.linting.mypyPath": { - "type": "string", - "default": "mypy", - "description": "Path to mypy, you can use a custom version of mypy by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.pycodestyleArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.pycodestyleCategorySeverity.E": { - "type": "string", - "default": "Error", - "description": "Severity of pycodestyle message type 'E'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pycodestyleCategorySeverity.W": { - "type": "string", - "default": "Warning", - "description": "Severity of pycodestyle message type 'W'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pycodestyleEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using pycodestyle", - "scope": "resource" - }, - "python.linting.pycodestylePath": { - "type": "string", - "default": "pycodestyle", - "description": "Path to pycodestyle, you can use a custom version of pycodestyle by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.prospectorArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.prospectorEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using prospector.", - "scope": "resource" - }, - "python.linting.prospectorPath": { - "type": "string", - "default": "prospector", - "description": "Path to Prospector, you can use a custom version of prospector by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.pydocstyleArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.pydocstyleEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using pydocstyle", - "scope": "resource" - }, - "python.linting.pydocstylePath": { - "type": "string", - "default": "pydocstyle", - "description": "Path to pydocstyle, you can use a custom version of pydocstyle by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.pylamaArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.pylamaEnabled": { - "type": "boolean", - "default": false, - "description": "Whether to lint Python files using pylama.", - "scope": "resource" - }, - "python.linting.pylamaPath": { - "type": "string", - "default": "pylama", - "description": "Path to pylama, you can use a custom version of pylama by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.pylintArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.linting.pylintCategorySeverity.convention": { - "type": "string", - "default": "Information", - "description": "Severity of Pylint message type 'Convention/C'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pylintCategorySeverity.error": { - "type": "string", - "default": "Error", - "description": "Severity of Pylint message type 'Error/E'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pylintCategorySeverity.fatal": { - "type": "string", - "default": "Error", - "description": "Severity of Pylint message type 'Fatal/F'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pylintCategorySeverity.refactor": { - "type": "string", - "default": "Hint", - "description": "Severity of Pylint message type 'Refactor/R'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pylintCategorySeverity.warning": { - "type": "string", - "default": "Warning", - "description": "Severity of Pylint message type 'Warning/W'.", - "enum": [ - "Hint", - "Error", - "Information", - "Warning" - ], - "scope": "resource" - }, - "python.linting.pylintEnabled": { - "type": "boolean", - "default": true, - "description": "Whether to lint Python files using pylint.", - "scope": "resource" - }, - "python.linting.pylintPath": { - "type": "string", - "default": "pylint", - "description": "Path to Pylint, you can use a custom version of pylint by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.linting.pylintUseMinimalCheckers": { - "type": "boolean", - "default": true, - "description": "Whether to run Pylint with minimal set of rules.", - "scope": "resource" - }, - "python.pythonPath": { - "type": "string", - "default": "python", - "description": "Path to Python, you can use a custom version of Python by modifying this setting to include the full path.", - "scope": "resource" - }, - "python.condaPath": { - "type": "string", - "default": "", - "description": "Path to the conda executable to use for activation (version 4.4+).", - "scope": "resource" - }, - "python.pipenvPath": { - "type": "string", - "default": "pipenv", - "description": "Path to the pipenv executable to use for activation.", - "scope": "resource" - }, - "python.poetryPath": { - "type": "string", - "default": "poetry", - "description": "Path to the poetry executable.", - "scope": "resource" - }, - "python.sortImports.args": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" - }, - "python.sortImports.path": { - "type": "string", - "description": "Path to isort script, default using inner version", - "default": "", - "scope": "resource" - }, - "python.terminal.activateEnvironment": { - "type": "boolean", - "default": true, - "description": "Activate Python Environment in Terminal created using the Extension.", - "scope": "resource" - }, - "python.terminal.executeInFileDir": { - "type": "boolean", - "default": false, - "description": "When executing a file in the terminal, whether to use execute in the file's directory, instead of the current open folder.", - "scope": "resource" - }, - "python.terminal.launchArgs": { - "type": "array", - "default": [], - "description": "Python launch arguments to use when executing a file in the terminal.", - "scope": "resource" - }, - "python.terminal.activateEnvInCurrentTerminal": { - "type": "boolean", - "default": false, - "description": "Activate Python Environment in the current Terminal on load of the Extension.", - "scope": "resource" - }, - "python.testing.cwd": { - "type": "string", - "default": null, - "description": "Optional working directory for tests.", - "scope": "resource" - }, - "python.testing.debugPort": { - "type": "number", - "default": 3000, - "description": "Port number used for debugging of tests.", - "scope": "resource" - }, - "python.testing.nosetestArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" + { + "category": "Python", + "command": "python.clearWorkspaceInterpreter", + "title": "%python.command.python.clearWorkspaceInterpreter.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.testing.nosetestsEnabled": { - "type": "boolean", - "default": false, - "description": "Enable testing using nosetests.", - "scope": "resource" + { + "category": "Python", + "command": "python.configureTests", + "title": "%python.command.python.configureTests.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.testing.nosetestPath": { - "type": "string", - "default": "nosetests", - "description": "Path to nosetests, you can use a custom version of nosetests by modifying this setting to include the full path.", - "scope": "resource" + { + "category": "Python", + "command": "python.createEnvironment", + "title": "%python.command.python.createEnvironment.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.testing.promptToConfigure": { - "type": "boolean", - "default": true, - "description": "Prompt to configure a test framework if potential tests directories are discovered.", - "scope": "resource" + { + "category": "Python", + "command": "python.createEnvironment-button", + "title": "%python.command.python.createEnvironment.title%", + "when": "false" }, - "python.testing.pytestArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [], - "items": { - "type": "string" - }, - "scope": "resource" + { + "category": "Python", + "command": "python.createTerminal", + "title": "%python.command.python.createTerminal.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.testing.pytestEnabled": { - "type": "boolean", - "default": false, - "description": "Enable testing using pytest.", - "scope": "resource" + { + "category": "Python", + "command": "python.execInTerminal", + "title": "%python.command.python.execInTerminal.title%", + "when": "!virtualWorkspace && shellExecutionSupported && editorLangId == python" }, - "python.testing.pytestPath": { - "type": "string", - "default": "pytest", - "description": "Path to pytest (pytest), you can use a custom version of pytest by modifying this setting to include the full path.", - "scope": "resource" + { + "category": "Python", + "command": "python.execInTerminal-icon", + "icon": "$(play)", + "title": "%python.command.python.execInTerminalIcon.title%", + "when": "false" }, - "python.testing.unittestArgs": { - "type": "array", - "description": "Arguments passed in. Each argument is a separate item in the array.", - "default": [ - "-v", - "-s", - ".", - "-p", - "*test*.py" - ], - "items": { - "type": "string" - }, - "scope": "resource" + { + "category": "Python", + "command": "python.execInDedicatedTerminal", + "icon": "$(play)", + "title": "%python.command.python.execInDedicatedTerminal.title%", + "when": "false" }, - "python.testing.unittestEnabled": { - "type": "boolean", - "default": false, - "description": "Enable testing using unittest.", - "scope": "resource" + { + "category": "Python", + "command": "python.execSelectionInDjangoShell", + "title": "%python.command.python.execSelectionInDjangoShell.title%", + "when": "!virtualWorkspace && shellExecutionSupported && editorLangId == python" }, - "python.testing.autoTestDiscoverOnSaveEnabled": { - "type": "boolean", - "default": true, - "description": "Enable auto run test discovery when saving a test file.", - "scope": "resource" + { + "category": "Python", + "command": "python.execSelectionInTerminal", + "title": "%python.command.python.execSelectionInTerminal.title%", + "when": "!virtualWorkspace && shellExecutionSupported && editorLangId == python" }, - "python.venvFolders": { - "type": "array", - "default": [], - "description": "Folders in your home directory to look into for virtual environments (supports pyenv, direnv and virtualenvwrapper by default).", - "scope": "resource", - "items": { - "type": "string" - } + { + "category": "Python", + "command": "python.copyTestId", + "title": "%python.command.python.testing.copyTestId.title%", + "when": "false" }, - "python.venvPath": { - "type": "string", - "default": "", - "description": "Path to folder with a list of Virtual Environments (e.g. ~/.pyenv, ~/Envs, ~/.virtualenvs).", - "scope": "resource" + { + "category": "Python", + "command": "python.execInREPL", + "title": "%python.command.python.execInREPL.title%", + "when": "false" }, - "python.workspaceSymbols.ctagsPath": { - "type": "string", - "default": "ctags", - "description": "Fully qualified path to the ctags executable (else leave as ctags, assuming it is in current path).", - "scope": "resource" + { + "category": "Python", + "command": "python.reportIssue", + "title": "%python.command.python.reportIssue.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.workspaceSymbols.enabled": { - "type": "boolean", - "default": false, - "description": "Set to 'true' to enable ctags to provide Workspace Symbols.", - "scope": "resource" + { + "category": "Test", + "command": "testing.reRunFailTests", + "icon": "$(run-errors)", + "title": "%python.command.testing.rerunFailedTests.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.workspaceSymbols.exclusionPatterns": { - "type": "array", - "default": [ - "**/site-packages/**" - ], - "items": { - "type": "string" - }, - "description": "Pattern used to exclude files and folders from ctags See http://ctags.sourceforge.net/ctags.html.", - "scope": "resource" + { + "category": "Python", + "command": "python.setInterpreter", + "title": "%python.command.python.setInterpreter.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.workspaceSymbols.rebuildOnFileSave": { - "type": "boolean", - "default": true, - "description": "Whether to re-build the tags file on when changes made to python files are saved.", - "scope": "resource" + { + "category": "Python", + "command": "python.startREPL", + "title": "%python.command.python.startTerminalREPL.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.workspaceSymbols.rebuildOnStart": { - "type": "boolean", - "default": true, - "description": "Whether to re-build the tags file on start (defaults to true).", - "scope": "resource" + { + "category": "Python", + "command": "python.startNativeREPL", + "title": "%python.command.python.startNativeREPL.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.workspaceSymbols.tagFilePath": { - "type": "string", - "default": "${workspaceFolder}/.vscode/tags", - "description": "Fully qualified path to tag file (exuberant ctag file), used to provide workspace symbols.", - "scope": "resource" + { + "category": "Python", + "command": "python.viewLanguageServerOutput", + "enablement": "python.hasLanguageServerOutputChannel", + "title": "%python.command.python.viewLanguageServerOutput.title%", + "when": "!virtualWorkspace && shellExecutionSupported" }, - "python.dataScience.magicCommandsAsComments": { - "type": "boolean", - "default": false, - "description": "Uncomment shell assignments (#!), line magic (#!%) and cell magic (#!%%) when parsing code cells.", - "scope": "resource" + { + "category": "Python", + "command": "python.viewOutput", + "title": "%python.command.python.viewOutput.title%", + "when": "!virtualWorkspace && shellExecutionSupported" + } + ], + "editor/content": [ + { + "group": "Python", + "command": "python.createEnvironment-button", + "when": "showCreateEnvButton && resourceLangId == pip-requirements && !virtualWorkspace && shellExecutionSupported && !inDiffEditor && !isMergeResultEditor && pythonDepsNotInstalled" }, - "python.dataScience.runMagicCommands": { - "type": "string", - "default": "", - "deprecationMessage": "This setting has been deprecated in favor of 'runStartupCommands'.", - "description": "A series of Python instructions or iPython magic commands separated by '\\n' that will be executed when the interactive window loads.", - "scope": "resource" + { + "group": "Python", + "command": "python.createEnvironment-button", + "when": "showCreateEnvButton && resourceFilename == pyproject.toml && pipInstallableToml && !virtualWorkspace && shellExecutionSupported && !inDiffEditor && !isMergeResultEditor && pythonDepsNotInstalled" + } + ], + "editor/context": [ + { + "submenu": "python.run", + "group": "Python", + "when": "editorLangId == python && !virtualWorkspace && shellExecutionSupported && isWorkspaceTrusted && !inChat && notebookType != jupyter-notebook" }, - "python.dataScience.runStartupCommands": { - "type": "string", - "default": "", - "description": "A series of Python instructions or iPython magic commands separated by '\\n' that will be executed when the interactive window loads. For instance, set this to '%load_ext autoreload\\n%autoreload 2' to automatically reload changes made to imported files without having to restart the interactive session.", - "scope": "resource" + { + "submenu": "python.runFileInteractive", + "group": "Jupyter2", + "when": "editorLangId == python && !virtualWorkspace && shellExecutionSupported && !isJupyterInstalled && isWorkspaceTrusted && !inChat" + } + ], + "python.runFileInteractive": [ + { + "command": "python.installJupyter", + "group": "Jupyter2", + "when": "resourceLangId == python && !virtualWorkspace && shellExecutionSupported" + } + ], + "python.run": [ + { + "command": "python.execInTerminal", + "group": "Python", + "when": "resourceLangId == python && !virtualWorkspace && shellExecutionSupported" }, - "python.dataScience.debugJustMyCode": { - "type": "boolean", - "default": true, - "description": "When debugging, debug just my code.", - "scope": "resource" + { + "command": "python.execSelectionInDjangoShell", + "group": "Python", + "when": "editorHasSelection && editorLangId == python && python.isDjangoProject && !virtualWorkspace && shellExecutionSupported" }, - "python.insidersChannel": { - "type": "string", - "default": "off", - "description": "Set to \"weekly\" or \"daily\" to automatically download and install the latest Insiders builds of the python extension, which include upcoming features and bug fixes.", - "enum": [ - "off", - "weekly", - "daily" - ], - "scope": "application" + { + "command": "python.execSelectionInTerminal", + "group": "Python", + "when": "!config.python.REPL.sendToNativeREPL && editorFocus && editorLangId == python && !virtualWorkspace && shellExecutionSupported" + }, + { + "command": "python.execInREPL", + "group": "Python", + "when": "editorFocus && editorLangId == python && !virtualWorkspace && shellExecutionSupported && config.python.REPL.sendToNativeREPL" } - } + ], + "editor/title/run": [ + { + "command": "python.execInTerminal-icon", + "group": "navigation@0", + "title": "%python.command.python.execInTerminalIcon.title%", + "when": "resourceLangId == python && !isInDiffEditor && !virtualWorkspace && shellExecutionSupported" + }, + { + "command": "python.execInDedicatedTerminal", + "group": "navigation@0", + "title": "%python.command.python.execInDedicatedTerminal.title%", + "when": "resourceLangId == python && !isInDiffEditor && !virtualWorkspace && shellExecutionSupported" + } + ], + "explorer/context": [ + { + "command": "python.execInTerminal", + "group": "Python", + "when": "resourceLangId == python && !virtualWorkspace && shellExecutionSupported" + } + ], + "file/newFile": [ + { + "command": "python.createNewFile", + "group": "file", + "when": "!virtualWorkspace" + } + ], + "view/title": [ + { + "command": "testing.reRunFailTests", + "when": "view == workbench.view.testing && hasFailedTests && !virtualWorkspace && shellExecutionSupported", + "group": "navigation@1" + } + ] }, - "languages": [ - { - "id": "pip-requirements", - "aliases": [ - "pip requirements", - "requirements.txt" - ], - "filenames": [ - "requirements.txt", - "constraints.txt", - "requirements.in" - ], - "filenamePatterns": [ - "*-requirements.txt", - "requirements-*.txt", - "constraints-*.txt", - "*-constraints.txt", - "*-requirements.in", - "requirements-*.in" - ], - "configuration": "./languages/pip-requirements.json" - }, - { - "id": "yaml", - "filenames": [ - ".condarc" - ] - }, - { - "id": "toml", - "filenames": [ - "poetry.lock", - "Pipfile" - ] - }, + "submenus": [ { - "id": "json", - "filenames": [ - "Pipfile.lock" - ] - }, - { - "id": "ini", - "filenames": [ - ".flake8" - ] - }, - { - "id": "jinja", - "extensions": [ - ".jinja2", - ".j2" - ], - "aliases": [ - "Jinja" - ] + "id": "python.run", + "label": "%python.editor.context.submenu.runPython%", + "icon": "$(play)" }, { - "id": "jupyter", - "aliases": [ - "Jupyter", - "Notebook" - ], - "extensions": [ - ".ipynb" - ] + "id": "python.runFileInteractive", + "label": "%python.editor.context.submenu.runPythonInteractive%" } ], - "grammars": [ + "viewsWelcome": [ { - "language": "pip-requirements", - "scopeName": "source.pip-requirements", - "path": "./syntaxes/pip-requirements.tmLanguage.json" + "view": "testing", + "contents": "Configure a test framework to see your tests here.\n[Configure Python Tests](command:python.configureTests)", + "when": "!virtualWorkspace && shellExecutionSupported" } ], - "jsonValidation": [ + "yamlValidation": [ { "fileMatch": ".condarc", "url": "./schemas/condarc.json" @@ -2810,316 +1504,310 @@ "url": "./schemas/conda-meta.json" } ], - "yamlValidation": [ + "languageModelTools": [ + { + "name": "get_python_environment_details", + "displayName": "Get Python Environment Info", + "userDescription": "%python.languageModelTools.get_python_environment_details.userDescription%", + "modelDescription": "This tool will retrieve the details of the Python Environment for the specified file or workspace. The details returned include the 1. Type of Python Environment (conda, venv, etc), 2. Version of Python, 3. List of all installed Python packages with their versions. ALWAYS call configure_python_environment before using this tool. IMPORTANT: This tool is only for Python environments (venv, virtualenv, conda, pipenv, poetry, pyenv, pixi, or any other Python environment manager). Do not use this tool for npm packages, system packages, Ruby gems, or any other non-Python dependencies.", + "toolReferenceName": "getPythonEnvironmentInfo", + "tags": [ + "python", + "python environment", + "extension_installed_by_tool", + "enable_other_tool_configure_python_environment" + ], + "icon": "$(snake)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace to get the environment information for." + } + }, + "required": [] + } + }, { - "fileMatch": ".condarc", - "url": "./schemas/condarc.json" + "name": "get_python_executable_details", + "displayName": "Get Python Executable", + "userDescription": "%python.languageModelTools.get_python_executable_details.userDescription%", + "modelDescription": "This tool will retrieve the details of the Python Environment for the specified file or workspace. ALWAYS use this tool before executing any Python command in the terminal. This tool returns the details of how to construct the fully qualified path and or command including details such as arguments required to run Python in a terminal. Note: Instead of executing `python --version` or `python -c 'import sys; print(sys.executable)'`, use this tool to get the Python executable path to replace the `python` command. E.g. instead of using `python -c 'import sys; print(sys.executable)'`, use this tool to build the command `conda run -n -c 'import sys; print(sys.executable)'`. ALWAYS call configure_python_environment before using this tool. IMPORTANT: This tool is only for Python environments (venv, virtualenv, conda, pipenv, poetry, pyenv, pixi, or any other Python environment manager). Do not use this tool for npm packages, system packages, Ruby gems, or any other non-Python dependencies.", + "toolReferenceName": "getPythonExecutableCommand", + "tags": [ + "python", + "python environment", + "extension_installed_by_tool", + "enable_other_tool_configure_python_environment" + ], + "icon": "$(terminal)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace to get the executable information for. If not provided, the current workspace will be used. Where possible pass the path to the file or workspace." + } + }, + "required": [] + } }, { - "fileMatch": "environment.yml", - "url": "./schemas/conda-environment.json" + "name": "install_python_packages", + "displayName": "Install Python Package", + "userDescription": "%python.languageModelTools.install_python_packages.userDescription%", + "modelDescription": "Installs Python packages in the given workspace. Use this tool to install Python packages in the user's chosen Python environment. ALWAYS call configure_python_environment before using this tool. IMPORTANT: This tool should only be used to install Python packages using package managers like pip or conda (works with any Python environment: venv, virtualenv, pipenv, poetry, pyenv, pixi, conda, etc.). Do not use this tool to install npm packages, system packages (apt/brew/yum), Ruby gems, or any other non-Python dependencies.", + "toolReferenceName": "installPythonPackage", + "tags": [ + "python", + "python environment", + "install python package", + "extension_installed_by_tool", + "enable_other_tool_configure_python_environment" + ], + "icon": "$(package)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "packageList": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The list of Python packages to install." + }, + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace into which the packages are installed. If not provided, the current workspace will be used. Where possible pass the path to the file or workspace." + } + }, + "required": [ + "packageList" + ] + } }, { - "fileMatch": "meta.yaml", - "url": "./schemas/conda-meta.json" - } - ], - "views": { - "test": [ - { - "id": "python_tests", - "name": "Python", - "when": "testsDiscovered" + "name": "configure_python_environment", + "displayName": "Configure Python Environment", + "modelDescription": "This tool configures a Python environment in the given workspace. ALWAYS Use this tool to set up the user's chosen environment and ALWAYS call this tool before using any other Python related tools or running any Python command in the terminal. IMPORTANT: This tool is only for Python environments (venv, virtualenv, conda, pipenv, poetry, pyenv, pixi, or any other Python environment manager). Do not use this tool for npm packages, system packages, Ruby gems, or any other non-Python dependencies.", + "userDescription": "%python.languageModelTools.configure_python_environment.userDescription%", + "toolReferenceName": "configurePythonEnvironment", + "tags": [ + "python", + "python environment", + "extension_installed_by_tool" + ], + "icon": "$(gear)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace for which a Python Environment needs to be configured." + } + }, + "required": [] } - ] + }, + { + "name": "create_virtual_environment", + "displayName": "Create a Virtual Environment", + "modelDescription": "This tool will create a Virual Environment", + "tags": [], + "canBeReferencedInPrompt": false, + "inputSchema": { + "type": "object", + "properties": { + "packageList": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The list of packages to install." + }, + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace for which a Python Environment needs to be configured." + } + }, + "required": [] + }, + "when": "false" + }, + { + "name": "selectEnvironment", + "displayName": "Select a Python Environment", + "modelDescription": "This tool will prompt the user to select an existing Python Environment", + "tags": [], + "canBeReferencedInPrompt": false, + "inputSchema": { + "type": "object", + "properties": { + "resourcePath": { + "type": "string", + "description": "The path to the Python file or workspace for which a Python Environment needs to be configured." + } + }, + "required": [] + }, + "when": "false" + } + ] + }, + "copilot": { + "tests": { + "getSetupConfirmation": "python.copilotSetupTests" } }, "scripts": { "package": "gulp clean && gulp prePublishBundle && vsce package -o ms-python-insiders.vsix", + "prePublish": "gulp clean && gulp prePublishNonBundle", "compile": "tsc -watch -p ./", - "compile-webviews-watch": "cross-env NODE_OPTIONS=--max_old_space_size=9096 webpack --config ./build/webpack/webpack.datascience-ui.config.js --watch", + "compileApi": "node ./node_modules/typescript/lib/tsc.js -b ./pythonExtensionApi/tsconfig.json", + "compiled": "deemon npm run compile", + "kill-compiled": "deemon --kill npm run compile", "checkDependencies": "gulp checkDependencies", - "postinstall": "node ./build/ci/postInstall.js", "test": "node ./out/test/standardTest.js && node ./out/test/multiRootTest.js", - "test:unittests": "mocha --opts ./build/.mocha.unittests.js.opts", - "test:unittests:cover": "nyc --no-clean --nycrc-path build/.nycrc mocha --opts ./build/.mocha.unittests.ts.opts", - "test:functional": "mocha --require source-map-support/register --opts ./build/.mocha.functional.opts", - "test:functional:cover": "npm run test:functional", - "test:cover:report": "nyc --nycrc-path build/.nycrc report --reporter=text --reporter=html --reporter=text-summary --reporter=cobertura", + "test:unittests": "mocha --config ./build/.mocha.unittests.json", + "test:unittests:cover": "nyc --no-clean --nycrc-path ./build/.nycrc mocha --config ./build/.mocha.unittests.json", + "test:functional": "mocha --require source-map-support/register --config ./build/.mocha.functional.json", + "test:functional:perf": "node --inspect-brk ./node_modules/mocha/bin/_mocha --require source-map-support/register --config ./build/.mocha.functional.perf.json", + "test:functional:memleak": "node --inspect-brk ./node_modules/mocha/bin/_mocha --require source-map-support/register --config ./build/.mocha.functional.json", + "test:functional:cover": "nyc --no-clean --nycrc-path ./build/.nycrc mocha --require source-map-support/register --config ./build/.mocha.functional.json", + "test:cover:report": "nyc --nycrc-path ./build/.nycrc report --reporter=text --reporter=html --reporter=text-summary --reporter=cobertura", "testDebugger": "node ./out/test/testBootstrap.js ./out/test/debuggerTest.js", + "testDebugger:cover": "nyc --no-clean --use-spawn-wrap --nycrc-path ./build/.nycrc --require source-map-support/register node ./out/test/debuggerTest.js", "testSingleWorkspace": "node ./out/test/testBootstrap.js ./out/test/standardTest.js", + "testSingleWorkspace:cover": "nyc --no-clean --use-spawn-wrap --nycrc-path ./build/.nycrc --require source-map-support/register node ./out/test/standardTest.js", + "preTestJediLSP": "node ./out/test/languageServers/jedi/lspSetup.js", + "testJediLSP": "node ./out/test/languageServers/jedi/lspSetup.js && cross-env CODE_TESTS_WORKSPACE=src/test VSC_PYTHON_CI_TEST_GREP='Language Server:' node ./out/test/testBootstrap.js ./out/test/standardTest.js && node ./out/test/languageServers/jedi/lspTeardown.js", "testMultiWorkspace": "node ./out/test/testBootstrap.js ./out/test/multiRootTest.js", "testPerformance": "node ./out/test/testBootstrap.js ./out/test/performanceTest.js", - "testSmoke": "node ./out/test/smokeTest.js", + "testSmoke": "cross-env INSTALL_JUPYTER_EXTENSION=true \"node ./out/test/smokeTest.js\"", + "testInsiders": "cross-env VSC_PYTHON_CI_TEST_VSC_CHANNEL=insiders INSTALL_PYLANCE_EXTENSION=true TEST_FILES_SUFFIX=insiders.test CODE_TESTS_WORKSPACE=src/testMultiRootWkspc/smokeTests \"node ./out/test/standardTest.js\"", "lint-staged": "node gulpfile.js", - "lint": "tslint src/**/*.ts -t verbose", + "lint": "eslint src build pythonExtensionApi", + "lint-fix": "eslint --fix src build pythonExtensionApi gulpfile.js", + "format-check": "prettier --check 'src/**/*.ts' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", + "format-fix": "prettier --write 'src/**/*.ts' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", + "check-python": "npm run check-python:ruff && npm run check-python:pyright", + "check-python:ruff": "cd python_files && python -m pip install -U ruff && python -m ruff check . && python -m ruff format --check", + "check-python:pyright": "cd python_files && npx --yes pyright@1.1.308 .", "clean": "gulp clean", + "addExtensionPackDependencies": "gulp addExtensionPackDependencies", "updateBuildNumber": "gulp updateBuildNumber", "verifyBundle": "gulp verifyBundle", "webpack": "webpack" }, "dependencies": { - "@jupyterlab/coreutils": "^3.1.0", - "@jupyterlab/services": "^4.2.0", - "@koa/cors": "^3.0.0", - "@loadable/component": "^5.12.0", - "@msrvida/python-program-analysis": "^0.4.1", - "ansi-regex": "^4.1.0", + "@iarna/toml": "^3.0.0", + "@vscode/extension-telemetry": "^0.8.4", "arch": "^2.1.0", - "azure-storage": "^2.10.3", - "detect-indent": "^6.0.0", - "diff-match-patch": "^1.0.0", - "fast-deep-equal": "^2.0.1", - "fs-extra": "^4.0.3", - "fuzzy": "^0.1.3", - "get-port": "^3.2.0", - "glob": "^7.1.2", - "hash.js": "^1.1.7", - "iconv-lite": "^0.4.21", - "inversify": "^4.11.1", - "jsonc-parser": "^2.0.3", - "koa": "^2.11.0", - "koa-compress": "^3.0.0", - "koa-logger": "^3.2.1", - "line-by-line": "^0.1.6", - "lodash": "^4.17.15", - "md5": "^2.2.1", - "minimatch": "^3.0.4", + "fs-extra": "^11.2.0", + "glob": "^7.2.0", + "iconv-lite": "^0.6.3", + "inversify": "^6.0.2", + "jsonc-parser": "^3.0.0", + "lodash": "^4.18.1", + "minimatch": "^5.1.8", "named-js-regexp": "^1.3.3", - "node-fetch": "^1.0.0", "node-stream-zip": "^1.6.0", - "onigasm": "^2.2.2", - "pdfkit": "^0.10.0", - "pidusage": "^1.2.0", - "portfinder": "^1.0.25", - "reflect-metadata": "^0.1.12", - "request": "^2.87.0", - "request-progress": "^3.0.0", - "rxjs": "^5.5.9", - "semver": "^5.5.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^6.5.4", + "rxjs-compat": "^6.5.4", + "semver": "^7.5.2", "stack-trace": "0.0.10", - "string-argv": "^0.3.1", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^8.2.0", - "svg-to-pdfkit": "^0.1.7", - "tmp": "^0.0.29", - "tree-kill": "^1.2.2", - "typescript-char": "^0.0.0", - "uint64be": "^1.0.1", - "unicode": "^10.0.0", - "untildify": "^3.0.2", - "vscode-debugadapter": "^1.28.0", + "sudo-prompt": "^9.2.1", + "tmp": "^0.2.5", + "uint64be": "^3.0.0", + "unicode": "^14.0.0", "vscode-debugprotocol": "^1.28.0", - "vscode-extension-telemetry": "0.1.0", - "vscode-jsonrpc": "^4.0.0", - "vscode-languageclient": "^5.2.1", - "vscode-languageserver": "^5.2.1", - "vscode-languageserver-protocol": "^3.14.1", - "vsls": "^0.3.1291", + "vscode-jsonrpc": "^9.0.0-next.5", + "vscode-languageclient": "^10.0.0-next.12", + "vscode-languageserver-protocol": "^3.17.6-next.10", + "vscode-tas-client": "^0.1.84", + "which": "^2.0.2", "winreg": "^1.2.4", - "winston": "^3.2.1", - "ws": "^6.0.0", - "xml2js": "^0.4.19" + "xml2js": "^0.5.0" }, "devDependencies": { - "@babel/cli": "^7.4.4", - "@babel/core": "^7.4.4", - "@babel/plugin-transform-runtime": "^7.4.4", - "@babel/polyfill": "^7.4.4", - "@babel/preset-env": "^7.1.0", - "@babel/preset-react": "^7.0.0", - "@babel/register": "^7.4.4", - "@blueprintjs/select": "^3.11.2", - "@enonic/fnv-plus": "^1.3.0", - "@istanbuljs/nyc-config-typescript": "^0.1.3", - "@nteract/plotly": "^1.48.3", - "@nteract/transform-dataresource": "^4.3.5", - "@nteract/transform-geojson": "^3.2.3", - "@nteract/transform-model-debug": "^3.2.3", - "@nteract/transform-plotly": "^6.0.0", - "@nteract/transform-vega": "^6.0.3", - "@nteract/transforms": "^4.4.4", - "@testing-library/react": "^9.4.0", - "@types/ansi-regex": "^4.0.0", + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@types/bent": "^7.3.0", "@types/chai": "^4.1.2", - "@types/chai-arrays": "^1.0.2", + "@types/chai-arrays": "^2.0.0", "@types/chai-as-promised": "^7.1.0", - "@types/copy-webpack-plugin": "^4.4.2", - "@types/dedent": "^0.7.0", - "@types/del": "^3.0.0", - "@types/diff-match-patch": "^1.0.32", - "@types/download": "^6.2.2", - "@types/enzyme": "^3.1.14", - "@types/enzyme-adapter-react-16": "^1.0.3", - "@types/event-stream": "^3.3.33", - "@types/fs-extra": "^5.0.1", - "@types/get-port": "^3.2.0", - "@types/glob": "^5.0.35", - "@types/html-webpack-plugin": "^3.2.0", - "@types/iconv-lite": "^0.0.1", - "@types/jquery": "^1.10.35", - "@types/jsdom": "^11.12.0", - "@types/koa": "^2.11.0", - "@types/koa-compress": "^2.0.9", - "@types/koa-logger": "^3.1.1", - "@types/koa__cors": "^2.2.3", - "@types/loadable__component": "^5.10.0", - "@types/loader-utils": "^1.1.3", + "@types/download": "^8.0.1", + "@types/fs-extra": "^11.0.4", + "@types/glob": "^7.2.0", "@types/lodash": "^4.14.104", - "@types/md5": "^2.1.32", - "@types/memoize-one": "^4.1.1", - "@types/mocha": "^5.2.7", - "@types/nock": "^10.0.3", - "@types/node": "^10.14.18", - "@types/node-fetch": "^2.3.4", - "@types/pdfkit": "^0.7.36", - "@types/promisify-node": "^0.4.0", - "@types/react": "^16.4.14", - "@types/react-dom": "^16.0.8", - "@types/react-json-tree": "^0.6.8", - "@types/react-redux": "^7.1.5", - "@types/react-virtualized": "^9.21.2", - "@types/redux-logger": "^3.0.7", - "@types/request": "^2.47.0", + "@types/mocha": "^9.1.0", + "@types/node": "^22.19.1", "@types/semver": "^5.5.0", "@types/shortid": "^0.0.29", - "@types/sinon": "^7.5.1", + "@types/sinon": "^17.0.3", "@types/stack-trace": "0.0.29", - "@types/temp": "^0.8.32", - "@types/tmp": "0.0.33", - "@types/untildify": "^3.0.0", - "@types/uuid": "^3.4.3", - "@types/vscode": "^1.42.0", - "@types/webpack-bundle-analyzer": "^2.13.0", + "@types/tmp": "^0.0.33", + "@types/vscode": "^1.95.0", + "@types/which": "^2.0.1", "@types/winreg": "^1.2.30", - "@types/ws": "^6.0.1", "@types/xml2js": "^0.4.2", - "ansi-to-html": "^0.6.7", - "awesome-typescript-loader": "^5.2.1", - "babel-loader": "^8.0.3", - "babel-plugin-inline-json-import": "^0.3.1", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-polyfill": "^6.26.0", - "bootstrap": "^4.3.1", - "bootstrap-less": "^3.3.8", - "brfs": "^2.0.2", - "canvas": "^2.6.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vscode/test-electron": "^2.3.8", + "@vscode/vsce": "^2.27.0", + "bent": "^7.3.12", "chai": "^4.1.2", "chai-arrays": "^2.0.0", "chai-as-promised": "^7.1.1", - "chai-http": "^4.3.0", - "codecov": "^3.6.1", - "colors": "^1.2.1", - "copy-webpack-plugin": "^4.6.0", - "cross-env": "^6.0.3", + "copy-webpack-plugin": "^9.1.0", + "cross-env": "^7.0.3", "cross-spawn": "^6.0.5", - "css-loader": "^1.0.1", - "dedent": "^0.7.0", - "del": "^3.0.0", - "download": "^7.0.0", - "enzyme": "^3.7.0", - "enzyme-adapter-react-16": "^1.6.0", - "eslint-config-prettier": "^6.9.0", - "eslint-plugin-prettier": "^3.1.2", - "event-stream": "3.3.4", - "expose-loader": "^0.7.5", - "extract-zip": "^1.6.7", - "fast-xml-parser": "^3.16.0", - "filemanager-webpack-plugin": "^2.0.5", - "flat": "^4.0.0", - "gulp": "^4.0.0", - "gulp-azure-storage": "^0.9.0", - "gulp-chmod": "^2.0.0", - "gulp-filter": "^5.1.0", - "gulp-gunzip": "^1.1.0", - "gulp-rename": "^1.4.0", - "gulp-sourcemaps": "^2.6.4", - "gulp-typescript": "^4.0.1", - "gulp-untar": "0.0.8", - "gulp-vinyl-zip": "^2.1.2", - "html-webpack-plugin": "^3.2.0", - "husky": "^1.1.2", - "immutable": "^4.0.0-rc.12", - "jsdom": "^15.0.0", - "less": "^3.9.0", - "less-loader": "^5.0.0", - "less-plugin-inline-urls": "^1.2.0", - "loader-utils": "^1.1.0", - "lolex": "^5.1.2", - "memoize-one": "^5.1.1", - "mocha": "^6.1.4", - "mocha-junit-reporter": "^1.17.0", + "del": "^6.0.0", + "download": "^8.0.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.0", + "expose-loader": "^3.1.0", + "flat": "^5.0.2", + "get-port": "^5.1.1", + "gulp": "^5.0.0", + "gulp-typescript": "^5.0.0", + "mocha": "^11.1.0", + "mocha-junit-reporter": "^2.0.2", "mocha-multi-reporters": "^1.1.7", - "monaco-editor": "0.18.1", - "monaco-editor-textmate": "^2.2.1", - "monaco-editor-webpack-plugin": "^1.7.0", - "monaco-textmate": "^3.0.1", - "nock": "^10.0.6", "node-has-native-dependencies": "^1.0.2", - "node-html-parser": "^1.1.13", + "node-loader": "^1.0.2", + "node-polyfill-webpack-plugin": "^1.1.4", "nyc": "^15.0.0", - "prettier": "^1.19.1", - "range-inclusive": "^1.0.2", - "raw-loader": "^0.5.1", - "react": "^16.5.2", - "react-data-grid": "^6.0.2-0", - "react-dev-utils": "^5.0.2", - "react-dom": "^16.5.2", - "react-json-tree": "^0.11.0", - "react-redux": "^7.1.1", - "react-svg-pan-zoom": "^3.1.0", - "react-svgmt": "^1.1.8", - "react-virtualized": "^9.21.1", - "redux": "^4.0.4", - "redux-logger": "^3.0.6", - "relative": "^3.0.2", + "prettier": "^2.0.2", "rewiremock": "^3.13.0", - "sass-loader": "^7.1.0", - "serialize-javascript": "^2.1.2", "shortid": "^2.2.8", - "sinon": "^8.0.1", - "slickgrid": "^2.4.17", + "sinon": "^18.0.0", "source-map-support": "^0.5.12", - "style-loader": "^0.23.1", - "styled-jsx": "^3.1.0", - "svg-inline-loader": "^0.8.0", - "svg-inline-react": "^3.1.0", - "terser-webpack-plugin": "^2.3.2", - "transform-loader": "^0.2.4", - "ts-loader": "^5.3.0", - "ts-mockito": "^2.3.1", - "ts-node": "^8.3.0", + "ts-loader": "^9.2.8", + "ts-mockito": "^2.5.0", + "ts-node": "^10.7.0", "tsconfig-paths-webpack-plugin": "^3.2.0", - "tslint": "^5.20.1", - "tslint-config-prettier": "^1.18.0", - "tslint-eslint-rules": "^5.1.0", - "tslint-microsoft-contrib": "^5.0.3", - "tslint-plugin-prettier": "^2.1.0", - "typed-react-markdown": "^0.1.0", "typemoq": "^2.1.0", - "typescript": "^3.7.2", - "typescript-formatter": "^7.1.0", - "unicode-properties": "1.1.0", - "url-loader": "^1.1.2", - "uuid": "^3.3.2", - "vinyl-fs": "^3.0.3", - "vsce": "^1.59.0", - "vscode-debugadapter-testsupport": "^1.27.0", - "vscode-test": "^1.2.3", - "webpack": "^4.33.0", - "webpack-bundle-analyzer": "^3.6.0", - "webpack-cli": "^3.1.2", + "typescript": "~5.2", + "uuid": "^8.3.2", + "webpack": "^5.105.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.9.2", "webpack-fix-default-import-plugin": "^1.0.3", - "webpack-merge": "^4.1.4", - "webpack-node-externals": "^1.7.2", - "webpack-require-from": "^1.8.0", - "why-is-node-running": "^2.0.3", - "wtfnode": "^0.8.0", - "yargs": "^12.0.2" - }, - "__metadata": { - "id": "f1f59ae4-9318-4f3c-a9b5-81b2eaa5f8a5", - "publisherDisplayName": "Microsoft", - "publisherId": "998b010b-e2af-44a5-a6cd-0b5fd3b9b6f8" + "webpack-merge": "^5.8.0", + "webpack-node-externals": "^3.0.0", + "webpack-require-from": "^1.8.6", + "worker-loader": "^3.0.8", + "yargs": "^15.3.1" } } diff --git a/package.nls.de.json b/package.nls.de.json deleted file mode 100644 index 77ec14b3ee9c..000000000000 --- a/package.nls.de.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "Sortieren der Importe", - "python.command.python.startREPL.title": "Starten des REPL", - "python.command.python.createTerminal.title": "Terminal erstellen", - "python.command.python.buildWorkspaceSymbols.title": "Arbeitsplatz-Symbole erstellen", - "python.command.python.runtests.title": "Alle Unittests ausführen", - "python.command.python.debugtests.title": "Alle Unittests debuggen", - "python.command.python.execInTerminal.title": "Python-Datei im Terminal ausführen", - "python.command.python.setInterpreter.title": "Interpreter auswählen", - "python.command.python.refactorExtractVariable.title": "Variable extrahieren", - "python.command.python.refactorExtractMethod.title": "Methode extrahieren", - "python.command.python.viewTestOutput.title": "Unittest-Ausgabe anzeigen", - "python.command.python.selectAndRunTestMethod.title": "Unittest-Methode ausführen ...", - "python.command.python.selectAndDebugTestMethod.title": "Unittest-Debug-Methode ausführen ...", - "python.command.python.selectAndRunTestFile.title": "Unittest-Datei ausführen ...", - "python.command.python.runCurrentTestFile.title": "Ausgewählte Unittest-Datei ausführen", - "python.command.python.runFailedTests.title": "Fehlerhafte Unittests ausführen", - "python.command.python.discoverTests.title": "Unittests durchsuchen", - "python.command.python.execSelectionInTerminal.title": "Selektion/Reihe in Python-Terminal ausführen", - "python.command.python.execSelectionInDjangoShell.title": "Selektion/Reihe in Django-Shell ausführen", - "python.command.python.goToPythonObject.title": "Gehe zu Python-Objekt", - "python.command.python.setLinter.title": "Linter auswählen", - "python.command.python.enableLinting.title": "Linting aktivieren", - "python.command.python.runLinting.title": "Linting ausführen", - "python.snippet.launch.standard.label": "Python: Aktuelle Datei", - "python.snippet.launch.module.label": "Python: Modul", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid-Anwendung", - "python.snippet.launch.attach.label": "Python: Anfügen" -} diff --git a/package.nls.es.json b/package.nls.es.json deleted file mode 100644 index 227e268dbc8d..000000000000 --- a/package.nls.es.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "Ordenar importaciones", - "python.command.python.startREPL.title": "Nuevo REPL", - "python.command.python.createTerminal.title": "Nueva terminal", - "python.command.python.buildWorkspaceSymbols.title": "Compilar símbolos del área de trabajo", - "python.command.python.runtests.title": "Ejecutar todas las pruebas unitarias", - "python.command.python.debugtests.title": "Depurar todas las pruebas unitarias", - "python.command.python.execInTerminal.title": "Ejecutar archivo Python en la terminal", - "python.command.python.setInterpreter.title": "Seleccionar intérprete", - "python.command.python.refactorExtractVariable.title": "Extraer variable", - "python.command.python.refactorExtractMethod.title": "Extraer método", - "python.command.python.viewTestOutput.title": "Mostrar resultados de la prueba unitaria", - "python.command.python.selectAndRunTestMethod.title": "Método de ejecución de pruebas unitarias ...", - "python.command.python.selectAndDebugTestMethod.title": "Método de depuración de pruebas unitarias ...", - "python.command.python.selectAndRunTestFile.title": "Ejecutar archivo de prueba unitaria ...", - "python.command.python.runCurrentTestFile.title": "Ejecutar archivo de prueba unitaria actual", - "python.command.python.runFailedTests.title": "Ejecutar pruebas unitarias fallidas", - "python.command.python.discoverTests.title": "Encontrar pruebas unitarias", - "python.command.python.execSelectionInTerminal.title": "Ejecutar línea/selección en la terminal", - "python.command.python.execSelectionInDjangoShell.title": "Ejecutar línea/selección en el intérprete de Django", - "python.command.python.goToPythonObject.title": "Ir al objeto de Python", - "python.command.python.setLinter.title": "Seleccionar Linter", - "python.command.python.enableLinting.title": "Habilitar Linting", - "python.command.python.runLinting.title": "Ejecutar Linting", - "python.snippet.launch.standard.label": "Python: Archivo actual", - "python.snippet.launch.module.label": "Python: Módulo", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid", - "python.snippet.launch.attach.label": "Python: Adjuntar" -} diff --git a/package.nls.fa.json b/package.nls.fa.json deleted file mode 100644 index 80be499afbdc..000000000000 --- a/package.nls.fa.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "مرتب‌سازی ایمپورت‌ها", - "python.command.python.startREPL.title": "شروع REPL", - "python.command.python.createTerminal.title": "ایجاد ترمینال", - "python.command.python.buildWorkspaceSymbols.title": "ساختن نماد‌های محیط کاری", - "python.command.python.runtests.title": "اجرای همه‌ی تست‌ها", - "python.command.python.debugtests.title": "باگ‌زدایی همه‌ی تست‌ها", - "python.command.python.execInTerminal.title": "اجرای فایل پایتون در ترمینال", - "python.command.python.setInterpreter.title": "انتخاب مفسر", - "python.command.python.refactorExtractVariable.title": "استخراج متغیر", - "python.command.python.refactorExtractMethod.title": "استخراج متد", - "python.command.python.viewTestOutput.title": "نمایش خروجی تست", - "python.command.python.selectAndRunTestMethod.title": "اجرای متد تست ...", - "python.command.python.selectAndDebugTestMethod.title": "باگ‌زدایی متد تست ...", - "python.command.python.selectAndRunTestFile.title": "اجرای فایل تست ...", - "python.command.python.runCurrentTestFile.title": "اجرای فایل تست جاری", - "python.command.python.runFailedTests.title": "اجرای تست‌های شکست خورده", - "python.command.python.execSelectionInTerminal.title": "اجرای انتخاب شده/خط در ترمینال پایتون", - "python.command.python.execSelectionInDjangoShell.title": "اجرای انتخاب شده/خط در پوسته جانگو", - "python.command.python.goToPythonObject.title": "برو به شئ پایتون", - "python.command.python.setLinter.title": "انتخاب لینتر", - "python.command.python.enableLinting.title": "فعال سازی لینتینگ", - "python.command.python.runLinting.title": "اجرای لینتینگ", - "python.snippet.launch.standard.label": "پایتون: فایل فعلی", - "python.snippet.launch.module.label": "پایتون: ماژول", - "python.snippet.launch.django.label": "پایتون: Django", - "python.snippet.launch.flask.label": "پایتون: Flask", - "python.snippet.launch.pyramid.label": "پایتون: برنامه Pyramid", - "python.snippet.launch.attach.label": "پایتون: الصاق", - "LanguageService.bannerLabelYes": "بله، نظرسنجی را همین حالا انجام بده" -} diff --git a/package.nls.fr.json b/package.nls.fr.json deleted file mode 100644 index ad28a94d6e09..000000000000 --- a/package.nls.fr.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "python.command.python.sortImports.title": "Trier les imports", - "python.command.python.startREPL.title": "Démarrer la console interactive", - "python.command.python.createTerminal.title": "Créer un terminal", - "python.command.python.buildWorkspaceSymbols.title": "Construire les symboles de l'espace de travail", - "python.command.python.runtests.title": "Exécuter tous les tests unitaires", - "python.command.python.debugtests.title": "Déboguer tous les tests unitaires", - "python.command.python.execInTerminal.title": "Exécuter le script Python dans un terminal", - "python.command.python.setInterpreter.title": "Sélectionner l'interpreteur", - "python.command.python.refactorExtractVariable.title": "Extraire la variable", - "python.command.python.refactorExtractMethod.title": "Extraire la méthode", - "python.command.python.viewTestOutput.title": "Afficher la sortie des tests unitaires", - "python.command.python.selectAndRunTestMethod.title": "Exécuter la méthode de test unitaire ...", - "python.command.python.selectAndDebugTestMethod.title": "Déboguer la méthode de test unitaire ...", - "python.command.python.selectAndRunTestFile.title": "Exécuter le fichier de test unitaire ...", - "python.command.python.runCurrentTestFile.title": "Exécuter le fichier de test unitaire courant", - "python.command.python.runFailedTests.title": "Exécuter les derniers test unitaires échoués", - "python.command.python.execSelectionInTerminal.title": "Exécuter la ligne/sélection dans un terminal Python", - "python.command.python.execSelectionInDjangoShell.title": "Exécuter la ligne/sélection dans un shell Django", - "python.command.python.goToPythonObject.title": "Se rendre à l'objet Python", - "python.command.python.setLinter.title": "Sélectionner le linter", - "python.command.python.enableLinting.title": "Activer le linting", - "python.command.python.runLinting.title": "Exécuter le linting", - "python.snippet.launch.standard.label": "Python : Fichier actuel", - "python.snippet.launch.module.label": "Python: Module", - "python.snippet.launch.django.label": "Python : Django", - "python.snippet.launch.flask.label": "Python : Flask", - "python.snippet.launch.pyramid.label": "Python : application Pyramid", - "python.snippet.launch.attach.label": "Python: Attacher" -} diff --git a/package.nls.it.json b/package.nls.it.json deleted file mode 100644 index ad041873baf5..000000000000 --- a/package.nls.it.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "Ordina gli import", - "python.command.python.startREPL.title": "Apri nuova REPL", - "python.command.python.createTerminal.title": "Apri nuovo terminale", - "python.command.python.buildWorkspaceSymbols.title": "Compila simboli dello spazio di lavoro", - "python.command.python.runtests.title": "Esegui tutti i test", - "python.command.python.debugtests.title": "Esegui debug di tutti i test", - "python.command.python.execInTerminal.title": "Esegui file Python nel terminale", - "python.command.python.setInterpreter.title": "Seleziona interprete", - "python.command.python.refactorExtractVariable.title": "Estrai variable", - "python.command.python.refactorExtractMethod.title": "Estrai metodo", - "python.command.python.viewTestOutput.title": "Mostra output dei test", - "python.command.python.selectAndRunTestMethod.title": "Esegui metodo di test ...", - "python.command.python.selectAndDebugTestMethod.title": "Esegui debug del metodo di test ...", - "python.command.python.selectAndRunTestFile.title": "Esegui file di test ...", - "python.command.python.runCurrentTestFile.title": "Esegui file di test attuale", - "python.command.python.runFailedTests.title": "Esegui test falliti", - "python.command.python.execSelectionInTerminal.title": "Esegui selezione/linea nel terminale di Python", - "python.command.python.execSelectionInDjangoShell.title": "Esegui selezione/linea nella shell Django", - "python.command.python.goToPythonObject.title": "Vai a oggetto Python", - "python.command.python.setLinter.title": "Selezione Linter", - "python.command.python.enableLinting.title": "Attiva Linting", - "python.command.python.runLinting.title": "Esegui Linting", - "python.snippet.launch.standard.label": "Python: File corrente", - "python.snippet.launch.module.label": "Python: Modulo", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Applicazione Pyramid", - "python.snippet.launch.attach.label": "Python: Allega", - "LanguageService.bannerLabelYes": "Sì, prenderò il sondaggio ora" -} diff --git a/package.nls.ja.json b/package.nls.ja.json deleted file mode 100644 index a2db0a823636..000000000000 --- a/package.nls.ja.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "python.command.python.sortImports.title": "import 文を並び替える", - "python.command.python.startREPL.title": "REPL を開始", - "python.command.python.buildWorkspaceSymbols.title": "ワークスペースのシンボルをビルド", - "python.command.python.runtests.title": "すべての単体テストを実行", - "python.command.python.debugtests.title": "すべての単体テストをデバッグ", - "python.command.python.execInTerminal.title": "ターミナルで Python ファイルを実行", - "python.command.python.setInterpreter.title": "インタープリターを選択", - "python.command.python.refactorExtractVariable.title": "変数を抽出", - "python.command.python.refactorExtractMethod.title": "メソッドを抽出", - "python.command.python.viewTestOutput.title": "単体テストの出力を表示", - "python.command.python.selectAndRunTestMethod.title": "単体テストメソッドを実行...", - "python.command.python.selectAndDebugTestMethod.title": "単体テストメソッドをデバッグ...", - "python.command.python.selectAndRunTestFile.title": "単体テストファイルを実行...", - "python.command.python.runCurrentTestFile.title": "現在の単体テストファイルを実行", - "python.command.python.runFailedTests.title": "失敗した単体テストを実行", - "python.command.python.execSelectionInTerminal.title": "Python ターミナルで選択範囲/行を実行", - "python.command.python.execSelectionInDjangoShell.title": "Django シェルで選択範囲/行を実行", - "python.command.python.goToPythonObject.title": "Python オブジェクトに移動", - "python.snippet.launch.standard.label": "Python: Current File", - "python.snippet.launch.module.label": "Python: モジュール", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid アプリケーション", - "python.snippet.launch.attach.label": "Python: アタッチ" -} diff --git a/package.nls.json b/package.nls.json index a0f3388551bf..57f2ed95b2c0 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,446 +1,177 @@ { - "python.command.python.sortImports.title": "Sort Imports", - "python.command.python.startREPL.title": "Start REPL", + "python.command.python.startTerminalREPL.title": "Start Terminal REPL", + "python.languageModelTools.get_python_environment_details.userDescription": "Get information for a Python Environment, such as Type, Version, Packages, and more.", + "python.languageModelTools.install_python_packages.userDescription": "Installs Python packages in a Python Environment.", + "python.languageModelTools.get_python_executable_details.userDescription": "Get executable info for a Python Environment", + "python.languageModelTools.configure_python_environment.userDescription": "Configure a Python Environment for a workspace", + "python.command.python.startNativeREPL.title": "Start Native Python REPL", + "python.command.python.createEnvironment.title": "Create Environment...", + "python.command.python.createNewFile.title": "New Python File", "python.command.python.createTerminal.title": "Create Terminal", - "python.command.python.buildWorkspaceSymbols.title": "Build Workspace Symbols", - "python.command.python.runtests.title": "Run All Tests", - "python.command.python.debugtests.title": "Debug All Tests", "python.command.python.execInTerminal.title": "Run Python File in Terminal", + "python.command.python.execInTerminalIcon.title": "Run Python File", + "python.command.python.execInDedicatedTerminal.title": "Run Python File in Dedicated Terminal", "python.command.python.setInterpreter.title": "Select Interpreter", - "python.command.python.switchOffInsidersChannel.title": "Switch to Default Channel", - "python.command.python.switchToDailyChannel.title": "Switch to Insiders Daily Channel", - "python.command.python.switchToWeeklyChannel.title": "Switch to Insiders Weekly Channel", - "python.command.python.refactorExtractVariable.title": "Extract Variable", - "python.command.python.refactorExtractMethod.title": "Extract Method", + "python.command.python.clearWorkspaceInterpreter.title": "Clear Workspace Interpreter Setting", "python.command.python.viewOutput.title": "Show Output", - "python.command.python.viewTestOutput.title": "Show Test Output", - "python.command.python.datascience.viewJupyterOutput.title": "Show Jupyter Output", + "python.command.python.installJupyter.title": "Install the Jupyter extension", "python.command.python.viewLanguageServerOutput.title": "Show Language Server Output", - "python.command.python.selectAndRunTestMethod.title": "Run Test Method ...", - "python.command.python.selectAndDebugTestMethod.title": "Debug Test Method ...", - "python.command.python.selectAndRunTestFile.title": "Run Test File ...", - "python.command.python.runCurrentTestFile.title": "Run Current Test File", - "python.command.python.runFailedTests.title": "Run Failed Tests", - "python.command.python.discoverTests.title": "Discover Tests", - "python.command.python.discoveringTests.title": "Discovering...", - "python.command.python.stopTests.title": "Stop", "python.command.python.configureTests.title": "Configure Tests", + "python.command.testing.rerunFailedTests.title": "Rerun Failed Tests", "python.command.python.execSelectionInTerminal.title": "Run Selection/Line in Python Terminal", + "python.command.python.execSelectionInTerminal.shortTitle": "Run Selection/Line", + "python.command.python.execInREPL.title": "Run Selection/Line in Native Python REPL", "python.command.python.execSelectionInDjangoShell.title": "Run Selection/Line in Django Shell", - "python.command.python.goToPythonObject.title": "Go to Python Object", - "python.command.python.setLinter.title": "Select Linter", - "python.command.python.enableLinting.title": "Enable Linting", - "python.command.python.runLinting.title": "Run Linting", - "python.command.python.datascience.runFileInteractive.title": "Run Current File in Python Interactive Window", - "python.command.python.datascience.debugFileInteractive.title": "Debug Current File in Python Interactive Window", - "python.command.python.datascience.runallcells.title": "Run All Cells", - "python.command.python.datascience.notebookeditor.runallcells.title": "Run All Notebook Cells", - "python.command.python.datascience.runallcellsabove.title": "Run Above", - "python.command.python.datascience.runcellandallbelow.title": "Run Below", - "python.command.python.datascience.runallcellsabove.palette.title": "Run Cells Above Current Cell", - "python.command.python.datascience.runcurrentcellandallbelow.palette.title": "Run Current Cell and Below", - "python.command.python.datascience.debugcurrentcell.palette.title": "Debug Current Cell", - "python.command.python.datascience.debugcell.title": "Debug Cell", - "python.command.python.datascience.debugstepover.title": "Step Over", - "python.command.python.datascience.debugcontinue.title": "Continue", - "python.command.python.datascience.debugstop.title": "Stop", - "python.command.python.datascience.runtoline.title": "Run To Line in Python Interactive Window", - "python.command.python.datascience.runfromline.title": "Run From Line in Python Interactive Window", - "python.command.python.datascience.runcurrentcell.title": "Run Current Cell", - "python.command.python.datascience.runcurrentcelladvance.title": "Run Current Cell And Advance", - "python.command.python.datascience.execSelectionInteractive.title": "Run Selection/Line in Python Interactive Window", - "python.command.python.datascience.runcell.title": "Run Cell", - "python.command.python.datascience.showhistorypane.title": "Show Python Interactive Window", - "python.command.python.datascience.selectjupyteruri.title": "Specify local or remote Jupyter server for connections", - "python.command.python.datascience.selectjupytercommandline.title": "Specify Jupyter command line arguments", - "python.command.python.datascience.importnotebook.title": "Import Jupyter Notebook", - "python.command.python.datascience.opennotebook.title": "Open in Notebook Editor", - "python.command.python.datascience.importnotebookfile.title": "Convert to Python Script", - "python.command.python.enableSourceMapSupport.title": "Enable Source Map Support For Extension Debugging", - "python.command.python.datascience.exportoutputasnotebook.title": "Export Python Interactive Window as Jupyter Notebook", - "python.command.python.datascience.exportfileasnotebook.title": "Export Current Python File as Jupyter Notebook", - "python.command.python.datascience.exportfileandoutputasnotebook.title": "Export Current Python File and Output as Jupyter Notebook", - "python.command.python.datascience.undocells.title": "Undo Last Python Interactive Action", - "python.command.python.datascience.redocells.title": "Redo Last Python Interactive Action", - "python.command.python.datascience.removeallcells.title": "Delete All Python Interactive Cells", - "python.command.python.datascience.notebookeditor.removeallcells.title": "Delete All Notebook Editor Cells", - "python.command.python.datascience.notebookeditor.runselectedcell.title": "Run Selected Notebook Cell", - "python.command.python.datascience.notebookeditor.addcellbelow.title": "Add Empty Cell to Notebook File", - "python.command.python.datascience.interruptkernel.title": "Interrupt IPython Kernel", - "python.command.python.datascience.restartkernel.title": "Restart IPython Kernel", - "python.command.python.datascience.expandallcells.title": "Expand All Python Interactive Cells", - "python.command.python.datascience.collapseallcells.title": "Collapse All Python Interactive Cells", - "python.command.python.datascience.addcellbelow.title": "Add Empty Cell to File", - "python.command.python.datascience.scrolltocell.title": "Scroll Cell Into View", - "python.command.python.datascience.createnewnotebook.title": "Create New Blank Jupyter Notebook", - "python.command.python.datascience.selectJupyterInterpreter.title": "Select Interpreter to start Jupyter server", - "Datascience.currentlySelectedJupyterInterpreterForPlaceholder": "current: {0}", - "python.command.python.analysis.clearCache.title": "Clear Module Analysis Cache", - "python.snippet.launch.standard.label": "Python: Current File", - "python.snippet.launch.module.label": "Python: Module", - "python.snippet.launch.module.default": "enter-your-module-name", - "python.snippet.launch.attach.label": "Python: Remote Attach", - "python.snippet.launch.attachpid.label": "Python: Attach using Process Id", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid Application", - "LanguageService.bannerMessage": "Can you please take 2 minutes to tell us how the Python Language Server is working for you?", - "LanguageService.bannerLabelYes": "Yes, take survey now", - "LanguageService.bannerLabelNo": "No, thanks", - "LanguageService.lsFailedToStart": "We encountered an issue starting the Language Server. Reverting to the alternative, Jedi. Check the Python output panel for details.", - "LanguageService.lsFailedToDownload": "We encountered an issue downloading the Language Server. Reverting to the alternative, Jedi. Check the Python output panel for details.", - "LanguageService.lsFailedToExtract": "We encountered an issue extracting the Language Server. Reverting to the alternative, Jedi. Check the Python output panel for details.", - "DataScience.unknownMimeTypeFormat": "Mime type {0} is not currently supported.", - "DataScience.historyTitle": "Python Interactive", - "DataScience.dataExplorerTitle": "Data Viewer", - "DataScience.badWebPanelFormatString": "

{0} is not a valid file name

", - "DataScience.sessionDisposed": "Cannot execute code, session has been disposed.", - "DataScience.passwordFailure": "Failed to connect to password protected server. Check that password is correct.", - "DataScience.exportDialogTitle": "Export to Jupyter Notebook", - "DataScience.exportDialogFilter": "Jupyter Notebooks", - "DataScience.exportDialogComplete": "Notebook written to {0}", - "DataScience.exportDialogFailed": "Failed to export notebook. {0}", - "DataScience.exportOpenQuestion": "Open in browser", - "DataScience.exportOpenQuestion1": "Open in editor", - "DataScience.collapseInputTooltip": "Collapse input block", - "DataScience.collapseVariableExplorerTooltip": "Hide variables active in jupyter kernel", - "DataScience.collapseVariableExplorerLabel": "Variables", - "DataScience.expandVariableExplorerTooltip": "Show variables active in jupyter kernel", - "DataScience.close": "Close", - "DataScience.variableLoadingValue": "Loading...", - "DataScience.importDialogTitle": "Import Jupyter Notebook", - "DataScience.importDialogFilter": "Jupyter Notebooks", - "DataScience.notebookCheckForImportYes": "Import", - "DataScience.reloadRequired": "Please reload the window for new settings to take effect.", - "DataScience.notebookCheckForImportNo": "Later", - "DataScience.notebookCheckForImportDontAskAgain": "Don't Ask Again", - "DataScience.notebookCheckForImportTitle": "Do you want to import the Jupyter Notebook into Python code?", - "DataScience.jupyterNotSupported": "Jupyter cannot be started. Error attempting to locate jupyter: {0}", - "DataScience.jupyterNotSupportedBecauseOfEnvironment": "Activating {0} to run Jupyter failed with {1}.", - "DataScience.jupyterNbConvertNotSupported": "Importing notebooks requires Jupyter nbconvert to be installed.", - "DataScience.jupyterLaunchNoURL": "Failed to find the URL of the launched Jupyter notebook server", - "DataScience.jupyterLaunchTimedOut": "The Jupyter notebook server failed to launch in time", - "DataScience.jupyterSelfCertFail": "The security certificate used by server {0} was not issued by a trusted certificate authority.\r\nThis may indicate an attempt to steal your information.\r\nDo you want to enable the Allow Unauthorized Remote Connection setting for this workspace to allow you to connect?", - "DataScience.jupyterSelfCertEnable": "Yes, connect anyways", - "DataScience.jupyterSelfCertClose": "No, close the connection", - "DataScience.jupyterServerCrashed": "Jupyter server crashed. Unable to connect. \r\nError code from jupyter: {0}", - "DataScience.pythonInteractiveHelpLink": "Get more help", - "DataScience.markdownHelpInstallingMissingDependencies": "See [https://aka.ms/pyaiinstall](https://aka.ms/pyaiinstall) for help on installing Jupyter and related dependencies.", - "DataScience.importingFormat": "Importing {0}", - "DataScience.startingJupyter": "Starting Jupyter server", - "DataScience.connectingToJupyter": "Connecting to Jupyter server", - "Experiments.inGroup": "User belongs to experiment group '{0}'", - "Interpreters.RefreshingInterpreters": "Refreshing Python Interpreters", - "Interpreters.LoadingInterpreters": "Loading Python Interpreters", - "Interpreters.condaInheritEnvMessage": "We noticed you're using a conda environment. If you are experiencing issues with this environment in the integrated terminal, we recommend that you let the Python extension change \"terminal.integrated.inheritEnv\" to false in your user settings.", - "Logging.CurrentWorkingDirectory": "cwd:", - "Common.doNotShowAgain": "Do not show again", - "Common.reload": "Reload", - "Common.moreInfo": "More Info", - "Common.and": "and", - "OutputChannelNames.languageServer": "Python Language Server", - "OutputChannelNames.python": "Python", - "OutputChannelNames.pythonTest": "Python Test Log", - "OutputChannelNames.jupyter": "Jupyter", - "ExtensionSurveyBanner.bannerMessage": "Can you please take 2 minutes to tell us how the Python extension is working for you?", - "ExtensionSurveyBanner.maybeLater": "Maybe later", - "ExtensionChannels.installingInsidersMessage": "Installing Insiders... ", - "ExtensionChannels.installingStableMessage": "Installing Stable... ", - "ExtensionChannels.installationCompleteMessage": "complete.", - "ExtensionChannels.downloadingInsidersMessage": "Downloading Insiders Extension... ", - "ExtensionChannels.yesWeekly": "Yes, weekly", - "ExtensionChannels.yesDaily": "Yes, daily", - "ExtensionChannels.promptMessage": "We noticed you are using Visual Studio Code Insiders. Would you like to use the Insiders build of the Python extension?", - "ExtensionChannels.reloadToUseInsidersMessage": "Please reload Visual Studio Code to use the insiders build of the Python extension.", - "ExtensionChannels.downloadCompletedOutputMessage": "Insiders build download complete.", - "ExtensionChannels.startingDownloadOutputMessage": "Starting download for Insiders build.", - "Interpreters.environmentPromptMessage": "We noticed a new virtual environment has been created. Do you want to select it for the workspace folder?", - "DataScience.restartKernelMessage": "Do you want to restart the IPython kernel? All variables will be lost.", - "DataScience.restartKernelMessageYes": "Yes", - "DataScience.restartKernelMessageNo": "No", - "DataScience.restartingKernelFailed": "Kernel restart failed. Jupyter server is hung. Please reload VS Code.", - "DataScience.interruptingKernelFailed": "Kernel interrupt failed. Jupyter server is hung. Please reload VS Code.", - "DataScienceSurveyBanner.bannerMessage": "Can you please take 2 minutes to tell us how the Python Data Science features are working for you?", - "DataScienceSurveyBanner.bannerLabelYes": "Yes, take survey now", - "DataScienceSurveyBanner.bannerLabelNo": "No, thanks", - "InteractiveShiftEnterBanner.bannerMessage": "Would you like to run code in the 'Python Interactive' window (an IPython console) for 'shift-enter'? Select 'No' to continue to run code in the Python Terminal. This can be changed later in settings.", - "InteractiveShiftEnterBanner.bannerLabelYes": "Yes", - "InteractiveShiftEnterBanner.bannerLabelNo": "No", - "DataScience.restartingKernelStatus": "Restarting IPython Kernel", - "DataScience.executingCode": "Executing Cell", - "DataScience.collapseAll": "Collapse all cell inputs", - "DataScience.expandAll": "Expand all cell inputs", - "DataScience.export": "Export as Jupyter notebook", - "DataScience.restartServer": "Restart IPython kernel", - "DataScience.undo": "Undo", - "DataScience.redo": "Redo", - "DataScience.clearAll": "Remove all cells", - "DataScience.pythonVersionHeader": "Python version:", - "DataScience.pythonRestartHeader": "Restarted kernel:", - "DataScience.pythonNewHeader": "Started new kernel:", - "DataScience.executingCodeFailure": "Executing code failed : {0}", - "DataScience.inputWatermark": "Type code here and press shift-enter to run", - "DataScience.deleteButtonTooltip": "Remove cell", - "DataScience.gotoCodeButtonTooltip": "Go to code", - "DataScience.copyBackToSourceButtonTooltip": "Paste code into file", - "DataScience.copyToClipboardButtonTooltip": "Copy source to clipboard", - "DataScience.plotOpen": "Expand image", - "Linter.enableLinter": "Enable {0}", - "Linter.enablePylint": "You have a pylintrc file in your workspace. Do you want to enable pylint?", - "Linter.replaceWithSelectedLinter": "Multiple linters are enabled in settings. Replace with '{0}'?", - "Installer.noCondaOrPipInstaller": "There is no Conda or Pip installer available in the selected environment.", - "Installer.noPipInstaller": "There is no Pip installer available in the selected environment.", - "Installer.searchForHelp": "Search for help", - "DataScience.libraryNotInstalled": "Data Science library {0} is not installed. Install?", - "DataScience.libraryRequiredToLaunchJupyterNotInstalled": "Data Science library {0} is not installed.", - "DataScience.librariesRequiredToLaunchJupyterNotInstalled": "Data Science libraries {0} are not installed.", - "DataScience.libraryRequiredToLaunchJupyterNotInstalledInterpreter": "Data Science library {1} is not installed in interpreter {0}.", - "DataScience.librariesRequiredToLaunchJupyterNotInstalledInterpreter": "Data Science libraries {1} are not installed in interpreter {0}.", - "DataScience.jupyterInstall": "Install", - "DataScience.jupyterSelectURIPrompt": "Enter the URI of the running Jupyter server", - "DataScience.jupyterSelectURIInvalidURI": "Invalid URI specified", - "DataScience.jupyterSelectPasswordPrompt": "Enter your notebook password", - "DataScience.jupyterNotebookFailure": "Jupyter notebook failed to launch. \r\n{0}", - "DataScience.jupyterNotebookConnectFailed": "Failed to connect to Jupyter notebook. \r\n{0}\r\n{1}", - "DataScience.jupyterNotebookRemoteConnectFailed": "Failed to connect to remote Jupyter notebook.\r\nCheck that the Jupyter Server URI setting has a valid running server specified.\r\n{0}\r\n{1}", - "DataScience.jupyterNotebookRemoteConnectSelfCertsFailed": "Failed to connect to remote Jupyter notebook.\r\nSpecified server is using self signed certs. Enable Allow Unauthorized Remote Connection setting to connect anyways\r\n{0}\r\n{1}", - "DataScience.notebookVersionFormat": "Jupyter Notebook Version: {0}", - "DataScience.jupyterKernelSpecNotFound": "Cannot create a Jupyter kernel spec and none are available for use", - "DataScience.jupyterKernelSpecModuleNotFound": "'Kernelspec' module not installed in the selected interpreter ({0}).\n Please re-install or update 'jupyter'.", - "DataScience.jupyterGetVariablesBadResults": "Failed to fetch variable info from the Jupyter server.", - "DataScience.liveShareConnectFailure": "Cannot connect to host Jupyter session. URI not found.", - "DataScience.liveShareCannotSpawnNotebooks": "Spawning Jupyter notebooks is not supported over a live share connection", - "DataScience.liveShareCannotImportNotebooks": "Importing notebooks is not currently supported over a live share connection", - "DataScience.liveShareHostFormat": "{0} Jupyter Server", - "DataScience.liveShareSyncFailure": "Synchronization failure during live share startup.", - "DataScience.liveShareServiceFailure": "Failure starting '{0}' service during live share connection.", - "DataScience.documentMismatch": "Cannot run cells, duplicate documents for {0} found.", - "DataScience.pythonInteractiveCreateFailed": "Failure to create a 'Python Interactive' window. Try reinstalling the Python extension.", - "diagnostics.warnSourceMaps": "Source map support is enabled in the Python Extension, this will adversely impact performance of the extension.", - "diagnostics.disableSourceMaps": "Disable Source Map Support", - "diagnostics.warnBeforeEnablingSourceMaps": "Enabling source map support in the Python Extension will adversely impact performance of the extension.", - "diagnostics.enableSourceMapsAndReloadVSC": "Enable and reload Window", - "diagnostics.lsNotSupported": "Your operating system does not meet the minimum requirements of the Python Language Server. Reverting to the alternative autocompletion provider, Jedi.", - "diagnostics.invalidPythonPathInDebuggerSettings": "You need to select a Python interpreter before you start debugging.\n\nTip: click on \"Select Python Interpreter\" in the status bar.", - "diagnostics.invalidPythonPathInDebuggerLaunch": "The Python path in your debug configuration is invalid.", - "diagnostics.invalidDebuggerTypeDiagnostic": "Your launch.json file needs to be updated to change the \"pythonExperimental\" debug configurations to use the \"python\" debugger type, otherwise Python debugging may not work. Would you like to automatically update your launch.json file now?", - "diagnostics.consoleTypeDiagnostic": "Your launch.json file needs to be updated to change the console type string from \"none\" to \"internalConsole\", otherwise Python debugging may not work. Would you like to automatically update your launch.json file now?", - "diagnostics.justMyCodeDiagnostic": "Configuration \"debugStdLib\" in launch.json is no longer supported. It's recommended to replace it with \"justMyCode\", which is the exact opposite of using \"debugStdLib\". Would you like to automatically update your launch.json file to do that?", - "diagnostics.yesUpdateLaunch": "Yes, update launch.json", - "diagnostics.bannerLabelNo": "No, I will do it later", - "diagnostics.processId": "Attaching the debugger to a local process is an experimental feature. It will be available to all users soon.", - "diagnostics.invalidTestSettings": "Your settings needs to be updated to change the setting \"python.unitTest.\" to \"python.testing.\", otherwise testing Python code using the extension may not work. Would you like to automatically update your settings now?", - "DataScience.interruptKernel": "Interrupt IPython kernel", - "DataScience.clearAllOutput": "Clear All Output", - "DataScience.exportingFormat": "Exporting {0}", - "DataScience.exportCancel": "Cancel", - "Common.canceled": "Canceled", - "Common.cancel": "Cancel", - "DataScience.importChangeDirectoryComment": "{0} Change working directory from the workspace root to the ipynb file location. Turn this addition off with the DataScience.changeDirOnImportExport setting", - "DataScience.exportChangeDirectoryComment": "# Change directory to VSCode workspace root so that relative path loads work correctly. Turn this addition off with the DataScience.changeDirOnImportExport setting", - "DataScience.interruptKernelStatus": "Interrupting IPython Kernel", - "DataScience.restartKernelAfterInterruptMessage": "Interrupting the kernel timed out. Do you want to restart the kernel instead? All variables will be lost.", - "DataScience.pythonInterruptFailedHeader": "Keyboard interrupt crashed the kernel. Kernel restarted.", - "DataScience.sysInfoURILabel": "Jupyter Server URI: ", - "DataScience.jupyterStartTimedout": "Starting Jupyter has timedout. Please check the 'Jupyter' output panel for further details.", - "DataScience.startingJupyterLogMessage": "Starting Jupyter from {0} with command line {1}", - "DataScience.jupyterCommandLineDefaultLabel": "Default (recommended)", - "DataScience.jupyterCommandLineDefaultDetail": "The Python extension will determine the appropriate command line for Jupyter", - "DataScience.jupyterCommandLineCustomLabel": "Custom", - "DataScience.jupyterCommandLineCustomDetail": "Customize the command line passed to Jupyter on startup", - "DataScience.jupyterCommandLineReloadQuestion": "Please reload the window when changing the Jupyter command line.", - "DataScience.jupyterCommandLineReloadAnswer": "Reload", - "DataScience.jupyterCommandLineQuickPickPlaceholder": "Choose an option", - "DataScience.jupyterCommandLineQuickPickTitle": "Pick command line for Jupyter", - "DataScience.jupyterCommandLinePrompt": "Enter your custom command line for Jupyter", - "Common.loadingPythonExtension": "Python extension loading...", - "debug.selectConfigurationTitle": "Select a debug configuration", - "debug.selectConfigurationPlaceholder": "Debug Configuration", - "debug.launchJsonConfigurationsCompletionLabel": "Python", - "debug.launchJsonConfigurationsCompletionDescription": "Select a Python debug configuration", - "debug.debugFileConfigurationLabel": "Python File", - "debug.debugFileConfigurationDescription": "Debug the currently active Python file", - "debug.debugModuleConfigurationLabel": "Module", - "debug.debugModuleConfigurationDescription": "Debug a Python module by invoking it with '-m'", - "debug.moduleEnterModuleTitle": "Debug Module", - "debug.moduleEnterModulePrompt": "Enter a Python module/package name", - "debug.moduleEnterModuleDefault": "enter-your-module-name", - "debug.moduleEnterModuleInvalidNameError": "Enter a valid module name", - "debug.remoteAttachConfigurationLabel": "Remote Attach", - "debug.remoteAttachConfigurationDescription": "Attach to a remote ptvsd debug server", - "debug.attachRemoteHostTitle": "Remote Debugging", - "debug.attachRemoteHostPrompt": "Enter the host name", - "debug.attachRemoteHostValidationError": "Enter a valid host name or IP address", - "debug.attachRemotePortTitle": "Remote Debugging", - "debug.attachRemotePortPrompt": "Enter the port number that the ptvsd server is listening on", - "debug.attachRemotePortValidationError": "Enter a valid port number", - "debug.attachPidConfigurationLabel": "Attach using Process ID", - "debug.attachPidConfigurationDescription": "Attach to a local process", - "debug.debugDjangoConfigurationLabel": "Django", - "debug.debugDjangoConfigurationDescription": "Launch and debug a Django web application", - "debug.djangoEnterManagePyPathTitle": "Debug Django", - "debug.djangoEnterManagePyPathPrompt": "Enter the path to manage.py ('${workspaceFolderToken}' points to the root of the current workspace folder)", - "debug.djangoEnterManagePyPathInvalidFilePathError": "Enter a valid Python file path", - "debug.debugFlaskConfigurationLabel": "Flask", - "debug.debugFlaskConfigurationDescription": "Launch and debug a Flask web application", - "debug.flaskEnterAppPathOrNamePathTitle": "Debug Flask", - "debug.flaskEnterAppPathOrNamePathPrompt": "Enter the path to the application, e.g. 'app.py' or 'app'", - "debug.flaskEnterAppPathOrNamePathInvalidNameError": "Enter a valid name", - "debug.debugPyramidConfigurationLabel": "Pyramid", - "debug.debugPyramidConfigurationDescription": "Web Application", - "debug.pyramidEnterDevelopmentIniPathTitle": "Debug Pyramid", - "debug.pyramidEnterDevelopmentIniPathPrompt": "`Enter the path to development.ini ('${workspaceFolderToken}' points to the root of the current workspace folder)`", - "debug.pyramidEnterDevelopmentIniPathInvalidFilePathError": "Enter a valid file path", - "Testing.testErrorDiagnosticMessage": "Error", - "Testing.testFailDiagnosticMessage": "Fail", - "Testing.testSkippedDiagnosticMessage": "Skipped", - "Testing.configureTests": "Configure Test Framework", - "Testing.disableTests": "Disable Tests", - "Common.openOutputPanel": "Show output", - "LanguageService.downloadFailedOutputMessage": "Language server download failed", - "LanguageService.extractionFailedOutputMessage": "Language server extraction failed", - "LanguageService.extractionCompletedOutputMessage": "Language server download complete", - "LanguageService.extractionDoneOutputMessage": "done", - "LanguageService.reloadVSCodeIfSeachPathHasChanged": "Search paths have changed for this Python interpreter. Please reload the extension to ensure that the IntelliSense works correctly", - "AttachProcess.unsupportedOS": "Operating system '{0}' not supported.", - "AttachProcess.attachTitle": "Attach to process", - "AttachProcess.selectProcessPlaceholder": "Select the process to attach to", - "AttachProcess.noProcessSelected": "No process selected", - "AttachProcess.refreshList": "Refresh process list", - "DataScience.variableExplorerNameColumn": "Name", - "DataScience.variableExplorerTypeColumn": "Type", - "DataScience.variableExplorerSizeColumn": "Count", - "DataScience.variableExplorerValueColumn": "Value", - "DataScience.showDataExplorerTooltip": "Show variable in data viewer.", - "DataScience.dataExplorerInvalidVariableFormat": "'{0}' is not an active variable.", - "DataScience.jupyterGetVariablesExecutionError": "Failure during variable extraction:\r\n{0}", - "DataScience.loadingMessage": "loading ...", - "DataScience.fetchingDataViewer": "Fetching data ...", - "DataScience.noRowsInDataViewer": "No rows match current filter", - "DataScience.jupyterServer": "Jupyter Server", - "DataScience.noKernel": "No Kernel", - "DataScience.serverNotStarted": "Not Started", - "DataScience.localJupyterServer": "local", - "DataScience.pandasTooOldForViewingFormat": "Python package 'pandas' is version {0}. Version 0.20 or greater is required for viewing data.", - "DataScience.pandasRequiredForViewing": "Python package 'pandas' is required for viewing data.", - "DataScience.valuesColumn": "values", - "DataScience.liveShareInvalid": "One or more guests in the session do not have the Python [extension](https://marketplace.visualstudio.com/itemdetails?itemName=ms-python.python) installed.\r\nYour Live Share session cannot continue and will be closed.", - "diagnostics.updateSettings": "Yes, update settings", - "Common.noIWillDoItLater": "No, I will do it later", - "Common.notNow": "Not now", - "Common.gotIt": "Got it!", - "Interpreters.selectInterpreterTip": "Tip: you can change the Python interpreter used by the Python extension by clicking on the Python version in the status bar", - "DataScience.noRowsInVariableExplorer": "No variables defined", - "DataScience.tooManyColumnsMessage": "Variables with over a 1000 columns may take a long time to display. Are you sure you wish to continue?", - "DataScience.tooManyColumnsYes": "Yes", - "DataScience.tooManyColumnsNo": "No", - "DataScience.tooManyColumnsDontAskAgain": "Don't Ask Again", - "DataScience.filterRowsButton": "Filter Rows", - "DataScience.filterRowsTooltip": "Allows filtering multiple rows. Use =, >, or < signs to filter numeric values.", - "DataScience.previewHeader": "--- Begin preview of {0} ---", - "DataScience.previewFooter": "--- End preview of {0} ---", - "DataScience.previewStatusMessage": "Generating preview of {0}", - "DataScience.plotViewerTitle": "Plots", - "DataScience.exportPlotTitle": "Save plot image", - "DataScience.pdfFilter": "PDF", - "DataScience.pngFilter": "PNG", - "DataScience.svgFilter": "SVG", - "DataScience.previousPlot": "Previous", - "DataScience.nextPlot": "Next", - "DataScience.panPlot": "Pan", - "DataScience.zoomInPlot": "Zoom in", - "DataScience.zoomOutPlot": "Zoom out", - "DataScience.exportPlot": "Export to different formats", - "DataScience.deletePlot": "Remove", - "DataScience.collapseSingle": "Collapse", - "DataScience.expandSingle": "Expand", - "DataScience.editSection": "Input new cells here.", - "DataScience.restartKernelMessageDontAskAgain": "Yes, and Don't Ask Again", - "DataScience.selectedImageListLabel": "Selected Image", - "DataScience.imageListLabel": "Image", - "DataScience.exportImageFailed": "Error exporting image: {0}", - "downloading.file": "Downloading {0}...", - "downloading.file.progress": "{0}{1} of {2} KB ({3}%)", - "DataScience.jupyterDataRateExceeded": "Cannot view variable because data rate exceeded. Please restart your server with a higher data rate limit. For example, --NotebookApp.iopub_data_rate_limit=10000000000.0", - "DataScience.addCellBelowCommandTitle": "Add cell", - "DataScience.debugCellCommandTitle": "Debug cell", - "DataScience.debugStepOverCommandTitle": "Step over", - "DataScience.debugContinueCommandTitle": "Continue", - "DataScience.debugStopCommandTitle": "Stop", - "DataScience.runCurrentCellAndAddBelow": "Run current and add cell below", - "DataScience.variableExplorerDisabledDuringDebugging": "Please see the Debug Side Bar's VARIABLES section.", - "DataScience.jupyterDebuggerNotInstalledError": "Pip module ptvsd is required for debugging cells. You will need to install it to debug cells.", - "DataScience.jupyterDebuggerPtvsdParseError": "Unable to parse ptvsd output, please log an issue with https://github.com/microsoft/vscode-python", - "DataScience.jupyterDebuggerPortNotAvailableError": "Port {0} cannot be opened for debugging. Please specify a different port in the remoteDebuggerPort setting.", - "DataScience.jupyterDebuggerPortBlockedError": "Port {0} cannot be connected to for debugging. Please let port {0} through your firewall.", - "DataScience.jupyterDebuggerPortNotAvailableSearchError": "Ports in the range {0}-{1} cannot be found for debugging. Please specify a port in the remoteDebuggerPort setting.", - "DataScience.jupyterDebuggerPortBlockedSearchError": "A port cannot be connected to for debugging. Please let ports {0}-{1} through your firewall.", - "DataScience.jupyterDebuggerInstallPtvsdNew": "Pip module ptvsd is required for debugging cells. Install ptvsd and continue to debug cell?", - "DataScience.jupyterDebuggerInstallPtvsdUpdate": "The version of ptvsd installed does not support debugging cells. Update ptvsd to newest version and continue to debug cell?", - "DataScience.jupyterDebuggerInstallPtvsdYes": "Yes", - "DataScience.jupyterDebuggerInstallPtvsdNo": "No", - "DataScience.cellStopOnErrorFormatMessage": "{0} cells were canceled due to an error in the previous cell.", - "DataScience.instructionComments": "# To add a new cell, type '{0}'\n# To add a new markdown cell, type '{0} [markdown]'\n", - "DataScience.scrollToCellTitleFormatMessage": "Go to [{0}]", - "DataScience.remoteDebuggerNotSupported": "Debugging while attached to a remote server is not currently supported.", - "DataScience.save": "Save notebook", - "DataScience.invalidNotebookFileError": "{0} is not a valid notebook file. Check the file for correct json.", - "DataScience.nativeEditorTitle": "Notebook Editor", - "DataScience.untitledNotebookFileName": "Untitled", - "DataScience.dirtyNotebookMessage1": "Do you want to save the changes you made to {0}?", - "DataScience.dirtyNotebookMessage2": "Your changes will be lost if you don't save them.", - "DataScience.dirtyNotebookYes": "Save", - "DataScience.dirtyNotebookNo": "Don't Save", - "DataScience.dirtyNotebookCancel": "Cancel", - "DataScience.dirtyNotebookDialogTitle": "Save", - "DataScience.dirtyNotebookDialogFilter": "Jupyter Notebooks", - "DataScience.exportAsPythonFileTooltip": "Convert and save to a python script", - "DataScience.exportAsPythonFileTitle": "Save as Python File", - "DataScience.runCell": "Run cell", - "DataScience.deleteCell": "Delete cell", - "DataScience.moveCellUp": "Move cell up", - "DataScience.moveCellDown": "Move cell down", - "DataScience.moveSelectedCellUp": "Move selected cell up", - "DataScience.insertBelow": "Insert cell below", - "DataScience.insertAbove": "Insert cell above", - "DataScience.addCell": "Add cell", - "DataScience.runAll": "Run all cells", - "DataScience.convertingToPythonFile": "Converting ipynb to python file", - "DataScience.untitledNotebookMessage": "Your changes will be lost if you don't save them.", - "DataScience.untitledNotebookYes": "Save", - "DataScience.untitledNotebookNo": "Cancel", - "DataScience.noInterpreter": "No python selected", - "DataScience.notebookNotFound": "python -m jupyter notebook --version is not running", - "DataScience.findJupyterCommandProgress": "Active interpreter does not support {0}. Searching for the best available interpreter.", - "DataScience.findJupyterCommandProgressCheckInterpreter": "Checking {0}.", - "DataScience.findJupyterCommandProgressSearchCurrentPath": "Searching current path.", - "DataScience.gatheredScriptDescription": "# This file contains only the code required to produce the results of the gathered cell.\n", - "DataScience.gatheredNotebookDescriptionInMarkdown": "# Gathered Notebook\nGenerated from ```{0}```\n\nThis notebook contains only the code and cells required to produce the same results as the gathered cell.\n\nPlease note that the python analysis is quite conservative, so if it is unsure whether a line of code is necessary for execution, it will err on the side of including it.", - "DataScience.savePngTitle": "Save Image", - "DataScience.jupyterSelectURIQuickPickTitle": "Pick how to connect to Jupyter", - "DataScience.jupyterSelectURIQuickPickPlaceholder": "Choose an option", - "DataScience.jupyterSelectURILocalLabel": "Default", - "DataScience.jupyterSelectURILocalDetail": "VS Code will automatically start a server for you on the localhost", - "DataScience.jupyterSelectURINewLabel": "Existing", - "DataScience.jupyterSelectURINewDetail": "Specify the URI of an existing server", - "DataScience.jupyterSelectURIMRUDetail": "Last Connection: {0}", - "DataScience.jupyterSelectURIRunningDetailFormat": "Last activity {0}. {1} existing connections.", - "DataScience.jupyterSelectURINotRunningDetail": "Cannot connect at this time. Status unknown.", - "DataScience.fallbackToUseActiveInterpeterAsKernel": "Couldn't find kernel '{0}' that the notebook was created with. Using the current interpreter.", - "DataScience.fallBackToRegisterAndUseActiveInterpeterAsKernel": "Couldn't find kernel '{0}' that the notebook was created with. Registering a new kernel using the current interpreter.", - "DataScience.fallBackToPromptToUseActiveInterpreterOrSelectAKernel": "Couldn't find kernel '{0}' that the notebook was created with.", - "DataScience.selectKernel": "Select a Kernel", - "DataScience.selectDifferentKernel": "Select a different Kernel", - "DataScience.selectDifferentJupyterInterpreter": "Select a different Interpreter", - "DataScience.selectJupyterInterpreter": "Select an Interpreter to start Jupyter", - "products.installingModule": "Installing {0}", - "DataScience.switchingKernelProgress": "Switching kernel to '{0}'", - "DataScience.sessionStartFailedWithKernel": "Failed to start a session for the Kernel '{0}'. \nView Jupyter [log](command:{1}) for further details.", - "DataScience.waitingForJupyterSessionToBeIdle": "Waiting for Jupyter Session to be idle", - "DataScience.gettingListOfKernelsForLocalConnection": "Fetching Kernels", - "DataScience.gettingListOfKernelsForRemoteConnection": "Fetching Kernels", - "DataScience.gettingListOfKernelSpecs": "Fetching Kernel specs", - "DataScience.startingJupyterNotebook": "Starting Jupyter Notebook", - "DataScience.registeringKernel": "Registering Kernel", - "DataScience.trimmedOutput": "Output was trimmed for performance reasons.\nTo see the full output set the setting \"python.dataScience.textOutputLimit\" to 0." + "python.command.python.reportIssue.title": "Report Issue...", + "python.command.python.clearCacheAndReload.title": "Clear Cache and Reload Window", + "python.command.python.analysis.restartLanguageServer.title": "Restart Language Server", + "python.command.python.launchTensorBoard.title": "Launch TensorBoard", + "python.command.python.refreshTensorBoard.title": "Refresh TensorBoard", + "python.command.python.testing.copyTestId.title": "Copy Test Id", + "python.createEnvironment.contentButton.description": "Show or hide Create Environment button in the editor for `requirements.txt` or other dependency files.", + "python.createEnvironment.trigger.description": "Detect if environment creation is required for the current project", + "python.menu.createNewFile.title": "Python File", + "python.editor.context.submenu.runPython": "Run Python", + "python.editor.context.submenu.runPythonInteractive": "Run in Interactive window", + "python.activeStateToolPath.description": "Path to the State Tool executable for ActiveState runtimes (version 0.36+).", + "python.autoComplete.extraPaths.description": "List of paths to libraries and the like that need to be imported by auto complete engine. E.g. when using Google App SDK, the paths are not in system path, hence need to be added into this list.", + "python.condaPath.description": "Path to the conda executable to use for activation (version 4.4+).", + "python.debugger.deprecatedMessage": "This configuration will be deprecated soon. Please replace `python` with `debugpy` to use the new Python Debugger extension.", + "python.defaultInterpreterPath.description": "Path to default Python to use when extension loads up for the first time, no longer used once an interpreter is selected for the workspace. See [here](https://aka.ms/AAfekmf) to understand when this is used", + "python.envFile.description": "Absolute path to a file containing environment variable definitions.", + "python.useEnvironmentsExtension.description": "Enables the Python Environments extension. Requires window reload on change.", + "python.experiments.enabled.description": "Enables A/B tests experiments in the Python extension. If enabled, you may get included in proposed enhancements and/or features.", + "python.experiments.optInto.description": "List of experiments to opt into. If empty, user is assigned the default experiment groups. See [here](https://github.com/microsoft/vscode-python/wiki/AB-Experiments) for more details.", + "python.experiments.optOutFrom.description": "List of experiments to opt out of. If empty, user is assigned the default experiment groups. See [here](https://github.com/microsoft/vscode-python/wiki/AB-Experiments) for more details.", + "python.experiments.All.description": "Combined list of all experiments.", + "python.experiments.pythonSurveyNotification.description": "Denotes the Python Survey Notification experiment.", + "python.experiments.pythonPromptNewToolsExt.description": "Denotes the Python Prompt New Tools Extension experiment.", + "python.experiments.pythonTerminalEnvVarActivation.description": "Enables use of environment variables to activate terminals instead of sending activation commands.", + "python.experiments.pythonDiscoveryUsingWorkers.description": "Enables use of worker threads to do heavy computation when discovering interpreters.", + "python.experiments.pythonTestAdapter.description": "Denotes the Python Test Adapter experiment.", + "python.experiments.pythonRecommendTensorboardExt.description": "Denotes the Tensorboard Extension recommendation experiment.", + "python.globalModuleInstallation.description": "Whether to install Python modules globally when not using an environment.", + "python.languageServer.description": "Defines type of the language server.", + "python.languageServer.defaultDescription": "Automatically select a language server: Pylance if installed and available, otherwise fallback to Jedi.", + "python.languageServer.jediDescription": "Use Jedi behind the Language Server Protocol (LSP) as a language server.", + "python.languageServer.pylanceDescription": "Use Pylance as a language server.", + "python.languageServer.noneDescription": "Disable language server capabilities.", + "python.interpreter.infoVisibility.description": "Controls when to display information of selected interpreter in the status bar.", + "python.interpreter.infoVisibility.never.description": "Never display information.", + "python.interpreter.infoVisibility.onPythonRelated.description": "Only display information if Python-related files are opened.", + "python.interpreter.infoVisibility.always.description": "Always display information.", + "python.logging.level.description": "The logging level the extension logs at, defaults to 'error'", + "python.logging.level.deprecation": "This setting is deprecated. Please use command `Developer: Set Log Level...` to set logging level.", + "python.missingPackage.severity.description": "Set severity of missing packages in requirements.txt or pyproject.toml", + "python.locator.description": "[Experimental] Select implementation of environment locators. This is an experimental setting while we test native environment location.", + "python.pipenvPath.description": "Path to the pipenv executable to use for activation.", + "python.poetryPath.description": "Path to the poetry executable.", + "python.pixiToolPath.description": "Path to the pixi executable.", + "python.EnableREPLSmartSend.description": "Toggle Smart Send for the Python REPL. Smart Send enables sending the smallest runnable block of code to the REPL on Shift+Enter and moves the cursor accordingly.", + "python.REPL.sendToNativeREPL.description": "Toggle to send code to Python REPL instead of the terminal on execution. Turning this on will change the behavior for both Smart Send and Run Selection/Line in the Context Menu.", + "python.REPL.provideVariables.description": "Toggle to provide variables for the REPL variable view for the native REPL.", + "python.tensorBoard.logDirectory.description": "Set this setting to your preferred TensorBoard log directory to skip log directory prompt when starting TensorBoard.", + "python.tensorBoard.logDirectory.markdownDeprecationMessage": "Tensorboard support has been moved to the extension [Tensorboard extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.tensorboard). Instead use the setting `tensorBoard.logDirectory`.", + "python.tensorBoard.logDirectory.deprecationMessage": "Tensorboard support has been moved to the extension Tensorboard extension. Instead use the setting `tensorBoard.logDirectory`.", + "python.terminal.shellIntegration.enabled.description": "Enable [shell integration](https://code.visualstudio.com/docs/terminal/shell-integration) for the terminals running python. Shell integration enhances the terminal experience by enabling command decorations, run recent command, improving accessibility among other things. Note: PyREPL (available in Python 3.13+) is automatically disabled when shell integration is enabled to avoid cursor indentation issues.", + "python.terminal.activateEnvInCurrentTerminal.description": "Activate Python Environment in the current Terminal on load of the Extension.", + "python.terminal.activateEnvironment.description": "Activate Python Environment in all Terminals created.", + "python.terminal.executeInFileDir.description": "When executing a file in the terminal, whether to use execute in the file's directory, instead of the current open folder.", + "python.terminal.focusAfterLaunch.description": "When launching a python terminal, whether to focus the cursor on the terminal.", + "python.terminal.launchArgs.description": "Python launch arguments to use when executing a file in the terminal.", + "python.testing.autoTestDiscoverOnSaveEnabled.description": "Enable auto run test discovery when saving a test file.", + "python.testing.autoTestDiscoverOnSavePattern.description": "Glob pattern used to determine which files are used by autoTestDiscoverOnSaveEnabled.", + "python.testing.cwd.description": "Optional working directory for tests.", + "python.testing.debugPort.description": "Port number used for debugging of tests.", + "python.testing.promptToConfigure.description": "Prompt to configure a test framework if potential tests directories are discovered.", + "python.testing.pytestArgs.description": "Arguments passed in. Each argument is a separate item in the array.", + "python.testing.pytestEnabled.description": "Enable testing using pytest.", + "python.testing.pytestPath.description": "Path to pytest. You can use a custom version of pytest by modifying this setting to include the full path.", + "python.testing.unittestArgs.description": "Arguments passed in. Each argument is a separate item in the array.", + "python.testing.unittestEnabled.description": "Enable testing using unittest.", + "python.venvFolders.description": "Folders in your home directory to look into for virtual environments (supports pyenv, direnv and virtualenvwrapper by default).", + "python.venvPath.description": "Path to folder with a list of Virtual Environments (e.g. ~/.pyenv, ~/Envs, ~/.virtualenvs).", + "walkthrough.pythonWelcome.title": "Get Started with Python Development", + "walkthrough.pythonWelcome.description": "Your first steps to set up a Python project with all the powerful tools and features that the Python extension has to offer!", + "walkthrough.step.python.createPythonFile.title": "Create a Python file", + "walkthrough.step.python.createPythonFolder.title": "Open a Python project folder", + "walkthrough.step.python.createPythonFile.description": { + "message": "[Open](command:toSide:workbench.action.files.openFile) or [create](command:toSide:workbench.action.files.newUntitledFile?%7B%22languageId%22%3A%22python%22%7D) a Python file - make sure to save it as \".py\".\n[Create Python File](command:toSide:workbench.action.files.newUntitledFile?%7B%22languageId%22%3A%22python%22%7D)", + "comment": [ + "{Locked='](command:toSide:workbench.action.files.newUntitledFile?%7B%22languageId%22%3A%22python%22%7D'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.step.python.createPythonFolder.description": { + "message": "[Open](command:workbench.action.files.openFolder) or create a project folder.\n[Open Project Folder](command:workbench.action.files.openFolder)", + "comment": [ + "{Locked='](command:workbench.action.files.openFolder'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.step.python.installPythonWin8.title": "Install Python", + "walkthrough.step.python.installPythonWin8.description": "The Python Extension requires Python to be installed. Install Python [from python.org](https://www.python.org/downloads).\n\n[Install Python](https://www.python.org/downloads)\n", + "walkthrough.step.python.installPythonMac.title": "Install Python", + "walkthrough.step.python.installPythonMac.description": { + "message": "The Python Extension requires Python to be installed. Install Python 3 through the terminal.\n[Install Python via Brew](command:python.installPythonOnMac)\n", + "comment": [ + "{Locked='](command:python.installPythonOnMac'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.step.python.installPythonLinux.title": "Install Python", + "walkthrough.step.python.installPythonLinux.description": { + "message": "The Python Extension requires Python to be installed. Install Python 3 through the terminal.\n[Install Python via terminal](command:python.installPythonOnLinux)\n", + "comment": [ + "{Locked='](command:python.installPythonOnLinux'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.step.python.selectInterpreter.title": "Select a Python Interpreter", + "walkthrough.step.python.createEnvironment.title": "Select or create a Python environment", + "walkthrough.step.python.createEnvironment.description": { + "message": "Create an environment for your Python project or use [Select Python Interpreter](command:python.setInterpreter) to select an existing one.\n[Create Environment](command:python.createEnvironment)\n**Tip**: Run the ``Python: Create Environment`` command in the [Command Palette](command:workbench.action.showCommands).", + "comment": [ + "{Locked='](command:python.createEnvironment'}", + "{Locked='](command:workbench.action.showCommands'}", + "{Locked='](command:python.setInterpreter'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.step.python.runAndDebug.title": "Run and debug your Python file", + "walkthrough.step.python.runAndDebug.description": "Open your Python file and click on the play button on the top right of the editor, or press F5 when on the file and select \"Python File\" to run with the debugger. \n \n[Learn more](https://code.visualstudio.com/docs/python/python-tutorial#_run-hello-world)", + "walkthrough.step.python.learnMoreWithDS.title": "Keep exploring!", + "walkthrough.step.python.learnMoreWithDS.description": { + "message": "🎨 Explore all the features the Python extension has to offer by looking for \"Python\" in the [Command Palette](command:workbench.action.showCommands). \n 📈 Learn more about getting started with [data science](command:workbench.action.openWalkthrough?%7B%22category%22%3A%22ms-python.python%23pythonDataScienceWelcome%22%2C%22step%22%3A%22ms-python.python%23python.createNewNotebook%22%7D) in Python. \n ✨ Take a look at our [Release Notes](https://aka.ms/AA8dxtb) to learn more about the latest features. \n \n[Follow along with the Python Tutorial](https://aka.ms/AA8dqti)", + "comment": [ + "{Locked='](command:workbench.action.showCommands'}", + "{Locked='](command:workbench.action.openWalkthrough?%7B%22category%22%3A%22ms-python.python%23pythonDataScienceWelcome%22%2C%22step%22%3A%22ms-python.python%23python.createNewNotebook%22%7D'}", + "Do not translate the 'command:*' part inside of the '(..)'. It is an internal command syntax for VS Code", + "Please make sure there is no space between the right bracket and left parenthesis: ]( this is an internal syntax for links" + ] + }, + "walkthrough.pythonDataScienceWelcome.title": "Get Started with Python for Data Science", + "walkthrough.pythonDataScienceWelcome.description": "Your first steps to getting started with a Data Science project with Python!", + "walkthrough.step.python.installJupyterExt.title": "Install Jupyter extension", + "walkthrough.step.python.installJupyterExt.description": "If you haven't already, install the [Jupyter extension](command:workbench.extensions.search?\"ms-toolsai.jupyter\") to take full advantage of notebooks experiences in VS Code!\n \n[Search Jupyter extension](command:workbench.extensions.search?\"ms-toolsai.jupyter\")", + "walkthrough.step.python.createNewNotebook.title": "Create or open a Jupyter Notebook", + "walkthrough.step.python.createNewNotebook.description": "Right click in the file explorer and create a new file with an .ipynb extension. Or, open the [Command Palette](command:workbench.action.showCommands) and run the command \n``Jupyter: Create New Blank Notebook``.\n[Create new Jupyter Notebook](command:toSide:jupyter.createnewnotebook)\n If you have an existing project, you can also [open a folder](command:workbench.action.files.openFolder) and/or clone a project from GitHub: [clone a Git repository](command:git.clone).", + "walkthrough.step.python.openInteractiveWindow.title": "Open the Python Interactive Window", + "walkthrough.step.python.openInteractiveWindow.description": "The Python Interactive Window is a Python shell where you can execute and view the results of your Python code. You can create cells on a Python file by typing ``#%%``.\n \nTo open the interactive window anytime, open the [Command Palette](command:workbench.action.showCommands) and run the command \n``Jupyter: Create Interactive Window``.\n[Open Interactive Window](command:jupyter.createnewinteractive)", + "walkthrough.step.python.dataScienceLearnMore.title": "Find out more!", + "walkthrough.step.python.dataScienceLearnMore.description": "📒 Take a look into the [Jupyter extension](command:workbench.extensions.search?\"ms-toolsai.jupyter\") features, by looking for \"Jupyter\" in the [Command Palette](command:workbench.action.showCommands). \n 🏃🏻 Find out more features in our [Tutorials](https://aka.ms/AAdjzpd). \n[Learn more](https://aka.ms/AAdar6q)", + "walkthrough.step.python.createPythonFile.altText": "Open a Python file or a folder with a Python project.", + "walkthrough.step.python.selectInterpreter.altText": "Selecting a Python interpreter from the status bar", + "walkthrough.step.python.createEnvironment.altText": "Creating a Python environment from the Command Palette", + "walkthrough.step.python.runAndDebug.altText": "How to run and debug in VS Code with F5 or the play button on the top right.", + "walkthrough.step.python.learnMoreWithDS.altText": "Image representing our documentation page and mailing list resources.", + "walkthrough.step.python.installJupyterExt.altText": "Creating a new Jupyter notebook", + "walkthrough.step.python.createNewNotebook.altText": "Creating a new Jupyter notebook", + "walkthrough.step.python.openInteractiveWindow.altText": "Opening Python interactive window", + "walkthrough.step.python.dataScienceLearnMore.altText": "Image representing our documentation page and mailing list resources." } diff --git a/package.nls.ko-kr.json b/package.nls.ko-kr.json deleted file mode 100644 index 5309a9b07b81..000000000000 --- a/package.nls.ko-kr.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "python.command.python.sortImports.title": "Import문 정렬", - "python.command.python.startREPL.title": "REPL 시작", - "python.command.python.buildWorkspaceSymbols.title": "작업 영역 기호 빌드", - "python.command.python.runtests.title": "모든 단위 테스트 실행", - "python.command.python.debugtests.title": "모든 단위 테스트 디버그", - "python.command.python.execInTerminal.title": "터미널에서 Python 파일 실행", - "python.command.python.setInterpreter.title": "인터프리터 선택", - "python.command.python.refactorExtractVariable.title": "변수 추출", - "python.command.python.refactorExtractMethod.title": "메서드 추출", - "python.command.python.viewTestOutput.title": "단위 테스트 결과 보기", - "python.command.python.selectAndRunTestMethod.title": "단위 테스트 메서드 실행 ...", - "python.command.python.selectAndDebugTestMethod.title": "단위 테스트 메서드 디버그 ...", - "python.command.python.selectAndRunTestFile.title": "단위 테스트 파일 실행 ...", - "python.command.python.runCurrentTestFile.title": "현재 단위 테스트 파일 실행", - "python.command.python.runFailedTests.title": "실패한 단위 테스트 실행", - "python.command.python.execSelectionInTerminal.title": "Python 터미널에서 선택 영역/줄 실행", - "python.command.python.execSelectionInDjangoShell.title": "Django 셸에서 선택 영역/줄 실행", - "python.command.python.goToPythonObject.title": " Python 객체로 이동", - "python.snippet.launch.standard.label": "Python: Current File", - "python.snippet.launch.module.label": "Python: 모듈", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid 응용 프로그램", - "python.snippet.launch.attach.label": "Python: 연결" -} diff --git a/package.nls.nl.json b/package.nls.nl.json deleted file mode 100644 index 9233bf2bbf58..000000000000 --- a/package.nls.nl.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "python.command.python.sortImports.title": "Import sorteren", - "python.command.python.startREPL.title": "REPL starten", - "python.command.python.createTerminal.title": "Terminal aanmaken", - "python.command.python.buildWorkspaceSymbols.title": "Werkruimte-symbolen aanmaken", - "python.command.python.runtests.title": "Alle unittests uitvoeren", - "python.command.python.debugtests.title": "Alle unittests debuggen", - "python.command.python.execInTerminal.title": "Python-bestand in terminal uitvoeren", - "python.command.python.setInterpreter.title": "Interpreter selecteren", - "python.command.python.refactorExtractVariable.title": "Variabelen selecteren", - "python.command.python.refactorExtractMethod.title": "Methode selecteren", - "python.command.python.viewTestOutput.title": "Unittest-resultaat laten zien", - "python.command.python.selectAndRunTestMethod.title": "Unittest-methode uitvoeren ...", - "python.command.python.selectAndDebugTestMethod.title": "Unittest-methode debuggen ...", - "python.command.python.selectAndRunTestFile.title": "Unittest-bestand uitvoeren ...", - "python.command.python.runCurrentTestFile.title": "Huidige unittest-bestand uitvoeren", - "python.command.python.runFailedTests.title": "Gefaalde unittests uitvoeren", - "python.command.python.discoverTests.title": "Unittests doorzoeken", - "python.command.python.execSelectionInTerminal.title": "Selectie/rij in Python-terminal uitvoeren", - "python.command.python.execSelectionInDjangoShell.title": "Selectie/rij in Django-shell uitvoeren", - "python.command.python.goToPythonObject.title": "Naar Python-object gaan", - "python.command.python.setLinter.title": "Linter selecteren", - "python.command.python.enableLinting.title": "Linting activeren", - "python.command.python.runLinting.title": "Linting uitvoeren", - "python.command.python.datascience.runallcells.title": "Alle cellen uitvoeren", - "python.command.python.datascience.runcurrentcell.title": "Huidige cel uitvoeren", - "python.command.python.datascience.runcurrentcelladvance.title": "Huidige cel uitvoeren en doorgaan", - "python.command.python.datascience.runcell.title": "Cel uitvoeren", - "python.command.python.datascience.showhistorypane.title": "Interactief Python-venster laten zien", - "python.command.python.datascience.selectjupyteruri.title": "Jupyter-server-URI specificeren", - "python.command.python.datascience.importnotebook.title": "Jupyter-notebook importeren", - "python.command.python.datascience.importnotebookonfile.title": "Jupyter-notebook importeren", - "python.command.python.enableSourceMapSupport.title": "Bronkaartondersteuning voor extensie-debugging inschakelen", - "python.command.python.datascience.exportoutputasnotebook.title": "Interactief Python-venster als Jupyter-notebook exporteren", - "python.command.python.datascience.exportfileasnotebook.title": "Huidige Python-bestand als Jupyter-notebook exporteren", - "python.command.python.datascience.exportfileandoutputasnotebook.title": "Huidige Python-bestand exporteren en outputten als Jupyter-notebook", - "python.command.python.datascience.undocells.title": "Laatste interactieve Python-actie ongedaan maken", - "python.command.python.datascience.redocells.title": "Laatste interactieve Python-actie opnieuw uitvoeren", - "python.command.python.datascience.removeallcells.title": "Alle interactieve Python-cellen verwijderen", - "python.command.python.datascience.interruptkernel.title": "IPython-kernel onderbreken", - "python.command.python.datascience.restartkernel.title": "IPython-kernel herstarten", - "python.command.python.datascience.expandallcells.title": "Alle interactieve Python-vensters openen", - "python.command.python.datascience.collapseallcells.title": "Alle interactieve Python-vensters sluiten", - "python.snippet.launch.standard.label": "Python: Huidige bestand", - "python.snippet.launch.module.label": "Python: Module", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid-applicatie", - "python.snippet.launch.attach.label": "Python: aankoppelen", - "LanguageService.bannerMessage": "Zou je alsjeblieft 2 minuten kunnen nemen om ons te vertellen hoe de Python-language server voor jou werkt?", - "LanguageService.bannerLabelYes": "Ja, neem nu deel aan het onderzoek", - "LanguageService.bannerLabelNo": "Nee, bedankt", - "LanguageService.lsFailedToStart": "We zijn een probleem tegengekomen bij het starten van de language server. Aan het terugschakelen naar het alternatief, Jedi. Bekijk het weergavepaneel voor details.", - "LanguageService.lsFailedToDownload": "We zijn een probleem tegengekomen bij het downloaden van de language server. Aan het terugschakelen naar het alternatief, Jedi. Bekijk het weergavepaneel voor details.", - "LanguageService.lsFailedToExtract": "We zijn een probleem tegengekomen bij het uitpakken van de language server. Aan het terugschakelen naar het alternatief, Jedi. Bekijk het weergavepaneel voor details.", - "DataScience.unknownMimeTypeFormat": "Mime type {0} wordt momenteel niet ondersteund.", - "DataScience.historyTitle": "Interactieve Python", - "DataScience.badWebPanelFormatString": "

{0} is geen geldige bestandsnaam

", - "DataScience.sessionDisposed": "Kan code niet uitvoeren, de sessie is gesloten.", - "DataScience.exportDialogTitle": "Exporteren naar Jupyter-notebook", - "DataScience.exportDialogFilter": "Jupyter-notebooks", - "DataScience.exportDialogComplete": "Notebook geschreven naar {0}", - "DataScience.exportDialogFailed": "Niet gelukt om te exporteren naar Jupyter-notebook. {0}", - "DataScience.exportOpenQuestion": "In browser openen", - "DataScience.collapseInputTooltip": "Invoerblok sluiten", - "DataScience.importDialogTitle": "Jupyter-notebook importeren", - "DataScience.importDialogFilter": "Jupyter-notebooks", - "DataScience.notebookCheckForImportYes": "Importeer", - "DataScience.notebookCheckForImportNo": "Later", - "DataScience.notebookCheckForImportDontAskAgain": "Niet opnieuw vragen", - "DataScience.notebookCheckForImportTitle": "Wil je het Jupyter-notebook importeren als Python-code?", - "DataScience.jupyterNbConvertNotSupported": "Notebooks importeren vereist Jupyter-nbconvert geinstalleerd.", - "DataScience.jupyterLaunchTimedOut": "Het is niet gelukt de Jupyter-notebook-server op tijd te starten", - "DataScience.jupyterLaunchNoURL": "Het is niet gelukt de URL van de gestarte Jupyter-notebook-server te vinden", - "DataScience.pythonInteractiveHelpLink": "Krijg meer hulp", - "DataScience.importingFormat": "Aan het importeren {0}", - "DataScience.startingJupyter": "Jupyter-server starten", - "DataScience.connectingToJupyter": "Met Jupyter-server verbinden", - "Interpreters.RefreshingInterpreters": "Python-Interpreters verversen", - "Interpreters.LoadingInterpreters": "Python-Interpreters laden", - "DataScience.restartKernelMessage": "Wil je de IPython-kernel herstarten? Alle variabelen zullen verloren gaan.", - "DataScience.restartKernelMessageYes": "Herstarten", - "DataScience.restartKernelMessageNo": "Annuleren", - "DataScienceSurveyBanner.bannerMessage": "Zou je alsjeblieft 2 minuten kunnen nemen om ons te vertellen hoe de Python-data-science-functionaliteiten voor jou werkt?", - "DataScienceSurveyBanner.bannerLabelYes": "Ja, neem nu deel aan het onderzoek", - "DataScienceSurveyBanner.bannerLabelNo": "Nee, bedankt", - "DataScience.restartingKernelStatus": "IPython-Kernel herstarten", - "DataScience.executingCode": "Cel aan het uitvoeren", - "DataScience.collapseAll": "Alle cel-invoeren sluiten", - "DataScience.expandAll": "Alle cel-invoeren openen", - "DataScience.export": "Als Jupyter-Notebook exporteren", - "DataScience.restartServer": "IPython-kernel herstarten", - "DataScience.undo": "Herhaal", - "DataScience.redo": "Opnieuw uitvoeren", - "DataScience.clearAll": "Alle cellen verwijderen", - "DataScience.pythonVersionHeader": "Python versie:", - "DataScience.pythonRestartHeader": "Kernel herstart:", - "Linter.InstalledButNotEnabled": "Linter {0} is geinstalleerd maar niet ingeschakeld.", - "Linter.replaceWithSelectedLinter": "Meerdere linters zijn ingeschakeld in de instellingen. Vervangen met '{0}'?", - "DataScience.jupyterNotebookFailure": "Jupyter-notebook kon niet starten. \r\n{0}", - "DataScience.jupyterNotebookConnectFailed": "Verbinden met Jupiter-notebook is niet gelukt. \r\n{0}\r\n{1}", - "DataScience.notebookVersionFormat": "Jupyter-notebook versie: {0}", - "DataScience.jupyterKernelSpecNotFound": "Kan geen Jupyter-kernel-spec aanmaken en er zijn er geen beschikbaar voor gebruik", - "diagnostics.warnSourceMaps": "Bronkaartondersteuning is ingeschakeld in de Python-extensie, dit zal een ongunstige impact hebben op de uitvoering van de extensie.", - "diagnostics.disableSourceMaps": "Bronkaartondersteuning uitschakelen", - "diagnostics.warnBeforeEnablingSourceMaps": "Bronkaartondersteuning inschakelen in de Python-extensie zal een ongunstige impact hebben op de uitvoering van de extensie.", - "diagnostics.enableSourceMapsAndReloadVSC": "Venster inschakelen en herladen", - "diagnostics.lsNotSupported": "Uw besturingssysteem voldoet niet aan de minimumeisen van de language server. Aan het terugschakelen naar het alternatief, Jedi.", - "DataScience.interruptKernel": "IPython-kernel onderbreken", - "DataScience.exportingFormat": "Aan het exporteren {0}", - "DataScience.exportCancel": "Annuleren", - "Common.canceled": "Geannuleerd", - "DataScience.importChangeDirectoryComment": "{0} De werkmap van de werkruimte root naar de ipynb-bestandslocatie veranderen. Schakel deze toevoeging uit met de instelling DataScience.changeDirOnImportExport", - "DataScience.exportChangeDirectoryComment": "# De map wijzigen naar de VSCode-werktuimte root zodat de relatieve pad-ladingen correct werken. Schakel deze toevoeging uit met de instelling DataScience.changeDirOnImportExport", - "DataScience.interruptKernelStatus": "IPython-kernel onderbreken", - "DataScience.restartKernelAfterInterruptMessage": "Het onderbreken van de kernel duurde te lang. Wil je de kernel in plaats daarvan herstarten? Alle variabelen zullen verloren gaan.", - "DataScience.pythonInterruptFailedHeader": "Toetsenbord-interrupt liet de kernel crashen. Kernel herstart.", - "DataScience.sysInfoURILabel": "Jupyter-server URI: ", - "Common.loadingPythonExtension": "Python-extensie aan het laden...", - "debug.selectConfigurationTitle": "Een debug-configuratie selecteren", - "debug.selectConfigurationPlaceholder": "Debug-configuratie", - "debug.debugFileConfigurationLabel": "Python-bestand", - "debug.debugFileConfigurationDescription": "Python-bestand debuggen", - "debug.debugModuleConfigurationLabel": "Module", - "debug.debugModuleConfigurationDescription": "Python module/package debuggen", - "debug.remoteAttachConfigurationLabel": "Extern aankoppelen", - "debug.remoteAttachConfigurationDescription": "Een externe Python-applicatie debuggen", - "debug.debugDjangoConfigurationLabel": "Django", - "debug.debugDjangoConfigurationDescription": "Web-applicatie", - "debug.debugFlaskConfigurationLabel": "Flask", - "debug.debugFlaskConfigurationDescription": "Web-applicatie", - "debug.debugPyramidConfigurationLabel": "Pyramid", - "debug.debugPyramidConfigurationDescription": "Web-applicatie", - "debug.djangoEnterManagePyPathTitle": "Django debuggen", - "debug.djangoEnterManagePyPathPrompt": "Voer een pad in naar manage.py ('${workspaceFolderToken}' verwijzen naar de root van de huidige werkruimtemap)", - "debug.djangoEnterManagePyPathInvalidFilePathError": "Voer een geldig Python-bestandspad in", - "debug.flaskEnterAppPathOrNamePathTitle": "Flask debuggen", - "debug.flaskEnterAppPathOrNamePathPrompt": "Voer een pad in naar een applicatie, bijvoorbeeld 'app.py' of 'app'", - "debug.flaskEnterAppPathOrNamePathInvalidNameError": "Voer een geldige naam in", - "debug.moduleEnterModuleTitle": "Module debuggen", - "debug.moduleEnterModulePrompt": "Voer Python module/package naam in", - "debug.moduleEnterModuleInvalidNameError": "Voer een geldige naam in", - "debug.pyramidEnterDevelopmentIniPathTitle": "Pyramid debuggen", - "debug.pyramidEnterDevelopmentIniPathPrompt": "`Voer een pad in naar development.ini ('${workspaceFolderToken}' verwijzen naar de root van de huidige werkruimtemap)`", - "debug.pyramidEnterDevelopmentIniPathInvalidFilePathError": "Voer een geldig bestandspad in", - "debug.attachRemotePortTitle": "Extern debuggen", - "debug.attachRemotePortPrompt": "Voer een port-nummer in", - "debug.attachRemotePortValidationError": "Voer een geldig port-nummer in", - "debug.attachRemoteHostTitle": "Extern debuggen", - "debug.attachRemoteHostPrompt": "Voer een hostname of IP-adres in", - "debug.attachRemoteHostValidationError": "Voer een geldige hostname of IP-adres in", - "Testing.testErrorDiagnosticMessage": "Error", - "Testing.testFailDiagnosticMessage": "Mislukt", - "Testing.testSkippedDiagnosticMessage": "Overgeslagen" -} diff --git a/package.nls.pl.json b/package.nls.pl.json deleted file mode 100644 index 029eaa59da8a..000000000000 --- a/package.nls.pl.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "python.command.python.sortImports.title": "Sortuj importy", - "python.command.python.startREPL.title": "Uruchom REPL", - "python.command.python.createTerminal.title": "Otwórz Terminal", - "python.command.python.buildWorkspaceSymbols.title": "Zbuduj symbole dla przestrzeni roboczej", - "python.command.python.runtests.title": "Uruchom wszystkie testy jednostkowe", - "python.command.python.debugtests.title": "Debuguj wszystkie testy jednostkowe", - "python.command.python.execInTerminal.title": "Uruchom plik pythonowy w terminalu", - "python.command.python.setInterpreter.title": "Wybierz wersję interpretera", - "python.command.python.refactorExtractVariable.title": "Wyodrębnij zmienną", - "python.command.python.refactorExtractMethod.title": "Wyodrębnij metodę", - "python.command.python.viewOutput.title": "Pokaż wyniki", - "python.command.python.viewTestOutput.title": "Pokaż wyniki testów jednostkowych", - "python.command.python.selectAndRunTestMethod.title": "Uruchom metodę testów jednostkowych ...", - "python.command.python.selectAndDebugTestMethod.title": "Debuguj metodę testów jednostkowych ...", - "python.command.python.selectAndRunTestFile.title": "Uruchom plik z testami jednostkowymi ...", - "python.command.python.runCurrentTestFile.title": "Uruchom bieżący plik z testami jednostkowymi", - "python.command.python.runFailedTests.title": "Uruchom testy jednostkowe, które się nie powiodły", - "python.command.python.discoverTests.title": "Wyszukaj testy jednostkowe", - "python.command.python.configureTests.title": "Konfiguruj testy jednostkowe", - "python.command.python.execSelectionInTerminal.title": "Uruchom zaznaczony obszar w interpreterze Pythona", - "python.command.python.execSelectionInDjangoShell.title": "Uruchom zaznaczony obszar w powłoce Django", - "python.command.python.goToPythonObject.title": "Idź do obiektu pythonowego", - "python.command.python.setLinter.title": "Wybierz linter", - "python.command.python.enableLinting.title": "Włącz linting", - "python.command.python.runLinting.title": "Uruchom linting", - "python.command.python.datascience.runallcells.title": "Uruchom wszystkie komórki", - "python.command.python.datascience.runcurrentcell.title": "Uruchom bieżącą komórkę", - "python.command.python.datascience.runcurrentcelladvance.title": "Uruchom bieżące komórki i pokaż", - "python.command.python.datascience.execSelectionInteractive.title": "Uruchom zaznaczony obszar w oknie IPythona", - "python.command.python.datascience.runcell.title": "Uruchom komórki", - "python.command.python.datascience.showhistorypane.title": "Pokaż okno IPythona", - "python.command.python.datascience.selectjupyteruri.title": "Podaj identyfikator URI serwera Jupyter", - "python.command.python.datascience.importnotebook.title": "Importuj notatnik Jupyter", - "python.command.python.datascience.importnotebookonfile.title": "Importuj notatnik Jupyter", - "python.command.python.enableSourceMapSupport.title": "Włącz obsługę map źródłowych do debugowania rozszerzeń", - "python.command.python.datascience.exportoutputasnotebook.title": "Eksportuj okno IPython jako notatnik Jupyter", - "python.command.python.datascience.exportfileasnotebook.title": "Eksportuj bieżący plik Pythona jako notatnik Jupytera", - "python.command.python.datascience.exportfileandoutputasnotebook.title": "Eksportuj bieżący plik Pythona i jego wyniki jako notatnik Jupytera", - "python.command.python.datascience.undocells.title": "Cofnij ostatnią akcję IPythona", - "python.command.python.datascience.redocells.title": "Ponów ostatnią akcję IPythona", - "python.command.python.datascience.removeallcells.title": "Usuń wszystkie komórki IPythona", - "python.command.python.datascience.interruptkernel.title": "Przerwij IPython Kernel", - "python.command.python.datascience.restartkernel.title": "Restartuj IPython Kernel", - "python.command.python.datascience.expandallcells.title": "Rozwiń wszystkie komórki IPythona", - "python.command.python.datascience.collapseallcells.title": "Zwiń wszystkie komórki IPythona" -} diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json deleted file mode 100644 index 1acc94053ca0..000000000000 --- a/package.nls.pt-br.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "Ordenar Importações", - "python.command.python.startREPL.title": "Iniciar REPL", - "python.command.python.createTerminal.title": "Criar Terminal", - "python.command.python.buildWorkspaceSymbols.title": "Construir Símbolos da Área de Trabalho", - "python.command.python.runtests.title": "Executar Todos os Testes Unitários", - "python.command.python.debugtests.title": "Depurar Todos os Testes Unitários", - "python.command.python.execInTerminal.title": "Executar Arquivo no Terminal", - "python.command.python.setInterpreter.title": "Selecionar Interpretador", - "python.command.python.refactorExtractVariable.title": "Extrair Variável", - "python.command.python.refactorExtractMethod.title": "Extrair Método", - "python.command.python.viewTestOutput.title": "Exibir Resultados dos Testes Unitários", - "python.command.python.selectAndRunTestMethod.title": "Executar Testes Unitários do Método ...", - "python.command.python.selectAndDebugTestMethod.title": "Depurar Testes Unitários do Método ...", - "python.command.python.selectAndRunTestFile.title": "Executar Arquivo de Testes Unitários ...", - "python.command.python.runCurrentTestFile.title": "Executar o Arquivo de Testes Unitários Atual", - "python.command.python.runFailedTests.title": "Executar Testes Unitários com Falhas", - "python.command.python.discoverTests.title": "Descobrir Testes Unitários", - "python.command.python.execSelectionInTerminal.title": "Executar Seleção/Linha no Terminal", - "python.command.python.execSelectionInDjangoShell.title": "Executar Seleção/Linha no Django Shell", - "python.command.python.goToPythonObject.title": "Ir para Objeto Python", - "python.command.python.setLinter.title": "Selecionar Linter", - "python.command.python.enableLinting.title": "Habilitar Linting", - "python.command.python.runLinting.title": "Executar Linting", - "python.snippet.launch.standard.label": "Python: Arquivo Atual", - "python.snippet.launch.module.label": "Python: Módulo", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Aplicação Pyramid", - "python.snippet.launch.attach.label": "Python: Anexar" -} diff --git a/package.nls.ru.json b/package.nls.ru.json deleted file mode 100644 index 25130dc2f1fd..000000000000 --- a/package.nls.ru.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "python.command.python.sortImports.title": "Отсортировать Imports", - "python.command.python.startREPL.title": "Открыть REPL", - "python.command.python.buildWorkspaceSymbols.title": "Собрать символы рабочего пространства", - "python.command.python.runtests.title": "Запустить все тесты", - "python.command.python.debugtests.title": "Запустить все тесты под отладчиком", - "python.command.python.execInTerminal.title": "Выполнить файл в консоли", - "python.command.python.setInterpreter.title": "Выбрать интерпретатор", - "python.command.python.refactorExtractVariable.title": "Извлечь в переменную", - "python.command.python.refactorExtractMethod.title": "Извлечь в метод", - "python.command.python.viewTestOutput.title": "Показать вывод теста", - "python.command.python.selectAndRunTestMethod.title": "Запусть тестовый метод...", - "python.command.python.selectAndDebugTestMethod.title": "Отладить тестовый метод...", - "python.command.python.selectAndRunTestFile.title": "Запустить тестовый файл...", - "python.command.python.runCurrentTestFile.title": "Запустить текущий тестовый файл", - "python.command.python.runFailedTests.title": "Запустить непрошедшие тесты", - "python.command.python.discoverTests.title": "Обнаружить тесты", - "python.command.python.execSelectionInTerminal.title": "Выполнить выбранный текст или текущую строку в консоли", - "python.command.python.execSelectionInDjangoShell.title": "Выполнить выбранный текст или текущую строку в оболочке Django", - "python.command.python.goToPythonObject.title": "Перейти к объекту Python", - "python.command.python.setLinter.title": "Выбрать анализатор кода", - "python.command.python.enableLinting.title": "Включить анализатор кода", - "python.command.python.runLinting.title": "Выполнить анализ кода", - "python.snippet.launch.standard.label": "Python: Текущий файл", - "python.snippet.launch.module.label": "Python: Модуль", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Приложение Pyramid", - "python.snippet.launch.attach.label": "Python: Подключить отладчик", - "LanguageService.bannerMessage": "Не могли бы вы уделить 2 минуты, чтобы рассказать нам насколько хорошо у вас работает Python Language Server?", - "LanguageService.bannerLabelYes": "Да, пройти опрос сейчас", - "LanguageService.bannerLabelNo": "Нет, спасибо" -} diff --git a/package.nls.tr.json b/package.nls.tr.json deleted file mode 100644 index 6164d873ed3e..000000000000 --- a/package.nls.tr.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "python.command.python.sortImports.title": "Import İfadelerini Sırala", - "python.command.python.startREPL.title": "REPL Başlat", - "python.command.python.createTerminal.title": "Terminal Oluştur", - "python.command.python.buildWorkspaceSymbols.title": "Çalışma Alanındaki Sembolleri Derle", - "python.command.python.runtests.title": "Testleri Çalıştır", - "python.command.python.debugtests.title": "Testleri Debug Et", - "python.command.python.execInTerminal.title": "Terminalde Çalıştır", - "python.command.python.setInterpreter.title": "Bir Interpreter Seçin", - "python.command.python.refactorExtractVariable.title": "Değişken Çıkar", - "python.command.python.refactorExtractMethod.title": "Metot Çıkar", - "python.command.python.viewTestOutput.title": "Test Çıktısını Görüntüle", - "python.command.python.selectAndRunTestMethod.title": "Test Metodu Çalıştır", - "python.command.python.selectAndDebugTestMethod.title": "Test Metodu Debug Et", - "python.command.python.selectAndRunTestFile.title": "Bir Test Dosyası Seç ve Çalıştır", - "python.command.python.runCurrentTestFile.title": "Aktif Test Dosyasını Çalıştır", - "python.command.python.runFailedTests.title": "Başarısız Testleri Çalıştır", - "python.command.python.discoverTests.title": "Testleri Keşfet", - "python.command.python.discoveringTests.title": "Testler Keşfediliyor...", - "python.command.python.execSelectionInTerminal.title": "Seçimi/Satırı Terminalde Çalıştır", - "python.command.python.execSelectionInDjangoShell.title": "Seçimi/Satırı Django Shell'inde Çalıştır", - "python.command.python.goToPythonObject.title": "Python Nesnesine Git", - "python.command.python.setLinter.title": "Bir Linter Seç", - "python.command.python.enableLinting.title": "Linting'i Aktifleştir", - "python.command.python.runLinting.title": "Linter Çalıştır", - "python.snippet.launch.standard.label": "Python: Geçerli Dosya", - "python.snippet.launch.module.label": "Python: Modül", - "python.snippet.launch.module.default": "modül-adını-yazın", - "python.snippet.launch.attach.label": "Python: Remote Attach", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid Uygulaması" - } diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json deleted file mode 100644 index aaf5460a3c55..000000000000 --- a/package.nls.zh-cn.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "python.command.python.sortImports.title": "排序 import 语句", - "python.command.python.startREPL.title": "启动 REPL", - "python.command.python.createTerminal.title": "创建终端", - "python.command.python.buildWorkspaceSymbols.title": "构建工作区符号", - "python.command.python.runtests.title": "运行所有单元测试", - "python.command.python.debugtests.title": "调试所有单元测试", - "python.command.python.execInTerminal.title": "在终端中运行 Python 文件", - "python.command.python.setInterpreter.title": "选择解析器", - "python.command.python.refactorExtractVariable.title": "提取变量", - "python.command.python.refactorExtractMethod.title": "提取方法", - "python.command.python.viewTestOutput.title": "显示单元测试输出", - "python.command.python.selectAndRunTestMethod.title": "运行单元测试方法...", - "python.command.python.selectAndDebugTestMethod.title": "调试单元测试方法...", - "python.command.python.selectAndRunTestFile.title": "运行单元测试文件...", - "python.command.python.runCurrentTestFile.title": "运行当前单元测试文件", - "python.command.python.runFailedTests.title": "运行失败的单元测试", - "python.command.python.discoverTests.title": "检测单元测试", - "python.command.python.execSelectionInTerminal.title": "在 Python 终端中运行选定内容/行", - "python.command.python.execSelectionInDjangoShell.title": "在 Django Shell 中运行选定内容/行", - "python.command.python.goToPythonObject.title": "转到 Python 对象", - "python.command.python.setLinter.title": "选择 Linter 插件", - "python.command.python.enableLinting.title": "启用 Linting", - "python.command.python.runLinting.title": "运行 Linting", - "python.snippet.launch.standard.label": "Python: 当前文件", - "python.snippet.launch.module.label": "Python: 模块", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid 应用", - "python.snippet.launch.attach.label": "Python: 附加" -} diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json deleted file mode 100644 index 4555d98fb5ed..000000000000 --- a/package.nls.zh-tw.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "python.command.python.sortImports.title": "排序 Import 語句", - "python.command.python.startREPL.title": "啟動 REPL", - "python.command.python.createTerminal.title": "建立終端機", - "python.command.python.buildWorkspaceSymbols.title": "建構工作區符號", - "python.command.python.runtests.title": "執行所有單元測試", - "python.command.python.debugtests.title": "偵錯所有單元測試", - "python.command.python.execInTerminal.title": "在終端機中執行 Python 檔案", - "python.command.python.setInterpreter.title": "選擇直譯器", - "python.command.python.refactorExtractVariable.title": "提取變數", - "python.command.python.refactorExtractMethod.title": "提取方法", - "python.command.python.viewTestOutput.title": "顯示單元測試輸出", - "python.command.python.selectAndRunTestMethod.title": "執行單元測試方法…", - "python.command.python.selectAndDebugTestMethod.title": "偵錯單元測試方法…", - "python.command.python.selectAndRunTestFile.title": "執行單元測試檔案…", - "python.command.python.runCurrentTestFile.title": "執行目前單元測試檔案", - "python.command.python.runFailedTests.title": "執行失敗的單元測試", - "python.command.python.execSelectionInTerminal.title": "在 Python 終端機中執行選定內容/行", - "python.command.python.execSelectionInDjangoShell.title": "在 Django Shell 中執行選定內容/行", - "python.command.python.goToPythonObject.title": "跳至 Python 物件", - "python.command.python.setLinter.title": "選擇 Linter", - "python.command.python.enableLinting.title": "啟用 Linting", - "python.command.python.runLinting.title": "執行 Linting", - "python.snippet.launch.standard.label": "Python: 目前檔案", - "python.snippet.launch.module.label": "Python: 模組", - "python.snippet.launch.django.label": "Python: Django", - "python.snippet.launch.flask.label": "Python: Flask", - "python.snippet.launch.pyramid.label": "Python: Pyramid 程式", - "python.snippet.launch.attach.label": "Python: 附加", - "python.command.python.discoverTests.title": "探索 Unit 測試項目", - "python.command.python.switchOffInsidersChannel.title": "切換至預設頻道", - "python.command.python.switchToDailyChannel.title": "切換至 Insiders 每日頻道", - "python.command.python.switchToWeeklyChannel.title": "切換至 Insiders 每週頻道", - "python.command.python.viewOutput.title": "顯示輸出", - "python.command.python.datascience.viewJupyterOutput.title": "顯示 Jupyter 輸出", - "python.command.python.viewLanguageServerOutput.title": "顯示語言伺服器輸出", - "python.command.python.discoveringTests.title": "正在探索...", - "python.command.python.stopTests.title": "停止", - "python.command.python.configureTests.title": "設定測試", - "python.command.python.enableSourceMapSupport.title": "啟用供偵錯延伸模組的原始碼映射 (Source Map) 支援", - "python.command.python.analysis.clearCache.title": "清除模組分析快取", - "python.snippet.launch.module.default": "請輸入-模組-名稱", - "python.snippet.launch.attachpid.label": "Python: 使用處理程序 ID 連結", - "LanguageService.bannerMessage": "請問您是否可以用兩分鐘的時間,告訴我們 Python 語言伺服器在您環境中的運作情況?", - "LanguageService.bannerLabelYes": "是,現在填寫調查", - "LanguageService.bannerLabelNo": "不了,謝謝", - "LanguageService.lsFailedToStart": "啟動語言伺服器時遇到問題。改回使用替代方案 \"Jedi\"。請檢查 Python 輸出面板以取得更多資訊。", - "LanguageService.lsFailedToDownload": "下載語言伺服器時遇到問題。改回使用替代方案 \"Jedi\"。請檢查 Python 輸出面板以取得更多資訊。", - "LanguageService.lsFailedToExtract": "擷取語言伺服器時遇到問題。改回使用替代方案 \"Jedi\"。請檢查 Python 輸出面板以取得更多資訊。", - "Experiments.inGroup": "使用者屬於 \"{0}\" 實驗性群組", - "Interpreters.RefreshingInterpreters": "正在重新整理 Python 解譯器", - "Interpreters.LoadingInterpreters": "正在載入 Python 解譯器", - "Interpreters.condaInheritEnvMessage": "我們發覺到您在使用 conda 環境。如果你在整合式終端器中使用這個環境時遇到問題,建議您讓 Python 延伸模組變更使用者設定中的 \"terminal.integrated.inheritEnv\" 為 false。", - "Logging.CurrentWorkingDirectory": "cwd:", - "Common.doNotShowAgain": "不再顯示", - "Common.reload": "重新載入", - "Common.moreInfo": "更多資訊", - "OutputChannelNames.languageServer": "Python 語言伺服器", - "OutputChannelNames.python": "Python", - "OutputChannelNames.pythonTest": "Python 測試記錄", - "OutputChannelNames.jupyter": "Jupyter", - "ExtensionSurveyBanner.bannerMessage": "請問您是否可以用兩分鐘的時間,告訴我們 Python 延伸模組在您環境中的運作情況?", - "ExtensionSurveyBanner.maybeLater": "等一下", - "ExtensionChannels.installingInsidersMessage": "正在安裝 Insiders... ", - "ExtensionChannels.installingStableMessage": "正在安裝穩定版... ", - "ExtensionChannels.installationCompleteMessage": "完成。", - "ExtensionChannels.downloadingInsidersMessage": "正在下載 Insiders 延伸模組... ", - "ExtensionChannels.yesWeekly": "是,每週", - "ExtensionChannels.yesDaily": "是,每天", - "ExtensionChannels.promptMessage": "我們發覺到您在使用 Visual Studio Code Insiders。請問您是否想使用 Python 延伸模組的 Insiders 組建?", - "ExtensionChannels.reloadToUseInsidersMessage": "請重新載入 Visual Studio Code 以使用 Python 延伸模組的 Insiders 組建。", - "ExtensionChannels.downloadCompletedOutputMessage": "Insiders 組建下載完成。", - "ExtensionChannels.startingDownloadOutputMessage": "開始下載 Insiders 組建。", - "Interpreters.environmentPromptMessage": "We noticed a new virtual environment has been created. Do you want to select it for the workspace folder?", - "InteractiveShiftEnterBanner.bannerMessage": "Would you like to run code in the 'Python Interactive' window (an IPython console) for 'shift-enter'? Select 'No' to continue to run code in the Python Terminal. This can be changed later in settings.", - "InteractiveShiftEnterBanner.bannerLabelYes": "是", - "InteractiveShiftEnterBanner.bannerLabelNo": "否", - "Linter.enableLinter": "啟用 {0}", - "Linter.enablePylint": "您的工作區有 pylintrc 檔案。是否啟用 pylint?", - "Linter.replaceWithSelectedLinter": "設定中啟用了多個 Linter。是否用 '{0}' 取代?", - "Installer.noCondaOrPipInstaller": "選取環境中沒有可用的 Conda 或 Pip 安裝工具。", - "Installer.noPipInstaller": "選取環境中沒有可用的 Pip 安裝工具。", - "Installer.searchForHelp": "搜尋說明", - "diagnostics.warnSourceMaps": "已在 Python 延伸模組中啟用原始碼映射 (Source Map) 支援,這會降低延伸模組效能。", - "diagnostics.disableSourceMaps": "停用原始碼映射 (Source Map) 支援", - "diagnostics.warnBeforeEnablingSourceMaps": "在 Python 延伸模組中啟用原始碼映射 (Source Map) 支援會降低延伸模組效能。", - "diagnostics.enableSourceMapsAndReloadVSC": "啟用並重新載入視窗", - "diagnostics.lsNotSupported": "您的作業系統不符合 Python 語言伺服器的最低需求。改回使用替代自動完成提供者 \"Jedi\"。", - "diagnostics.invalidPythonPathInDebuggerSettings": "開始偵錯前,您需要選取 Python 解譯器。\n\n小提示:按一下狀態列的 \"選擇 Python 解譯器\"。", - "diagnostics.invalidPythonPathInDebuggerLaunch": "偵錯設定檔的 Python 路徑無效。", - "diagnostics.invalidDebuggerTypeDiagnostic": "Your launch.json file needs to be updated to change the \"pythonExperimental\" debug configurations to use the \"python\" debugger type, otherwise Python debugging may not work. Would you like to automatically update your launch.json file now?", - "diagnostics.consoleTypeDiagnostic": "Your launch.json file needs to be updated to change the console type string from \"none\" to \"internalConsole\", otherwise Python debugging may not work. Would you like to automatically update your launch.json file now?", - "diagnostics.justMyCodeDiagnostic": "Configuration \"debugStdLib\" in launch.json is no longer supported. It's recommended to replace it with \"justMyCode\", which is the exact opposite of using \"debugStdLib\". Would you like to automatically update your launch.json file to do that?", - "diagnostics.yesUpdateLaunch": "是,更新 launch.json", - "diagnostics.bannerLabelNo": "否,我稍候再做", - "diagnostics.processId": "Attaching the debugger to a local process is an experimental feature. It will be available to all users soon.", - "diagnostics.invalidTestSettings": "Your settings needs to be updated to change the setting \"python.unitTest.\" to \"python.testing.\", otherwise testing Python code using the extension may not work. Would you like to automatically update your settings now?", - "Common.canceled": "已取消", - "Common.cancel": "取消", - "Common.loadingPythonExtension": "正在載入 Python 延伸模組...", - "debug.selectConfigurationTitle": "選擇偵錯設定檔", - "debug.selectConfigurationPlaceholder": "偵錯設定檔", - "debug.launchJsonConfigurationsCompletionLabel": "Python", - "debug.launchJsonConfigurationsCompletionDescription": "選取 Python 偵錯設定檔", - "debug.debugFileConfigurationLabel": "Python 檔案", - "debug.debugFileConfigurationDescription": "偵錯目前使用中的 Python 檔案", - "debug.debugModuleConfigurationLabel": "模組", - "debug.debugModuleConfigurationDescription": "使用 '-m' 叫用以偵錯 Python 模組", - "debug.moduleEnterModuleTitle": "偵錯模組", - "debug.moduleEnterModulePrompt": "輸入 Python 模組 / 套件名稱", - "debug.moduleEnterModuleDefault": "輸入-模組-名稱", - "debug.moduleEnterModuleInvalidNameError": "請輸入有效的模組名稱", - "debug.remoteAttachConfigurationLabel": "遠端連結", - "debug.remoteAttachConfigurationDescription": "連結到遠端 ptvsd 偵錯伺服器", - "debug.attachRemoteHostTitle": "遠端偵錯", - "debug.attachRemoteHostPrompt": "輸入主機名稱", - "debug.attachRemoteHostValidationError": "請輸入有效的主機名稱或 IP 位址", - "debug.attachRemotePortTitle": "遠端偵錯", - "debug.attachRemotePortPrompt": "輸入 ptvsd 伺服器正在監聽的連線埠號。", - "debug.attachRemotePortValidationError": "請輸入有效的連線埠號。", - "debug.attachPidConfigurationLabel": "使用處理程序 ID 連結", - "debug.attachPidConfigurationDescription": "連結至本機處理程序", - "debug.debugDjangoConfigurationLabel": "Django", - "debug.debugDjangoConfigurationDescription": "執行並偵錯 Django 網路應用程式", - "debug.djangoEnterManagePyPathTitle": "偵錯 Django", - "debug.djangoEnterManagePyPathPrompt": "請輸入 manage.py 的路徑 ('${workspaceFolderToken}' 指向目前工作區資料夾的根目錄)", - "debug.djangoEnterManagePyPathInvalidFilePathError": "請輸入有效的 Python 檔案路徑", - "debug.debugFlaskConfigurationLabel": "Flask", - "debug.debugFlaskConfigurationDescription": "執行並偵錯 Flask 網路應用程式", - "debug.flaskEnterAppPathOrNamePathTitle": "偵錯 Flask", - "debug.flaskEnterAppPathOrNamePathPrompt": "請輸入應用程式路徑。例如:'app.py' 或 'app'", - "debug.flaskEnterAppPathOrNamePathInvalidNameError": "請輸入有效名稱", - "debug.debugPyramidConfigurationLabel": "Pyramid", - "debug.debugPyramidConfigurationDescription": "網路應用程式", - "debug.pyramidEnterDevelopmentIniPathTitle": "偵錯 Pyramid", - "debug.pyramidEnterDevelopmentIniPathPrompt": "`請輸入 development.ini 的路徑 ('${workspaceFolderToken}' 指向目前工作區資料夾的根目錄)`", - "debug.pyramidEnterDevelopmentIniPathInvalidFilePathError": "請輸入有效的檔案路徑", - "Testing.testErrorDiagnosticMessage": "錯誤", - "Testing.testFailDiagnosticMessage": "失敗", - "Testing.testSkippedDiagnosticMessage": "略過", - "Testing.configureTests": "設定測試框架", - "Testing.disableTests": "停用測試", - "Common.openOutputPanel": "顯示輸出", - "LanguageService.downloadFailedOutputMessage": "下載語言伺服器失敗", - "LanguageService.extractionFailedOutputMessage": "擷取語言伺服器失敗", - "LanguageService.extractionCompletedOutputMessage": "下載語言伺服器完成", - "LanguageService.extractionDoneOutputMessage": "完成", - "LanguageService.reloadVSCodeIfSeachPathHasChanged": "已為此 Python 解譯器變更搜尋路徑。請重新載入延伸模組以確保 IntelliSense 能夠正常運作", - "AttachProcess.unsupportedOS": "不支援 '{0}' 作業系統。", - "AttachProcess.attachTitle": "連結至處理程序", - "AttachProcess.selectProcessPlaceholder": "選擇要連結的處理程序", - "AttachProcess.noProcessSelected": "沒有選取的處理程序", - "AttachProcess.refreshList": "重新整理處理程序列表", - "diagnostics.updateSettings": "是,更新設定", - "Common.noIWillDoItLater": "否,我稍候再做", - "Common.notNow": "先不要", - "Common.gotIt": "懂了!", - "Interpreters.selectInterpreterTip": "小提示:您能透過按下狀態列中的 Python 版本,變更 Python 延伸模組使用的 Python 解譯器。", - "downloading.file": "正在下載 {0}...", - "downloading.file.progress": "目前 {0}{1},總共 {2} KB ({3}%)", - "products.installingModule": "正在安裝 {0}" -} diff --git a/pvsc.code-workspace b/pvsc.code-workspace deleted file mode 100644 index ade125364ac7..000000000000 --- a/pvsc.code-workspace +++ /dev/null @@ -1,27 +0,0 @@ -{ - "folders": [ - { - "path": "." - }, - { - "path": "uitests" - }, - { - "path": "pythonFiles" - }, - { - "path": "src/ipywidgets" - } - ], - "settings": { - "typescript.tsdk": "./node_modules/typescript/lib", - "search.exclude": { - "**/node_modules/**": true, - "**/.vscode test/insider/**": true, - "**/.vscode test/stable/**": true, - "**/.vscode-test/insider/**": true, - "**/.vscode-test/stable/**": true, - "**/out/**": true - } - } -} diff --git a/pythonExtensionApi/.eslintrc b/pythonExtensionApi/.eslintrc new file mode 100644 index 000000000000..8828c49002ed --- /dev/null +++ b/pythonExtensionApi/.eslintrc @@ -0,0 +1,11 @@ +{ + "overrides": [ + { + "files": ["**/main.d.ts"], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "padding-line-between-statements": ["error", { "blankLine": "always", "prev": "export", "next": "*" }] + } + } + ] +} diff --git a/pythonExtensionApi/.npmignore b/pythonExtensionApi/.npmignore new file mode 100644 index 000000000000..283d589ea5fe --- /dev/null +++ b/pythonExtensionApi/.npmignore @@ -0,0 +1,8 @@ +example/** +dist/ +out/**/*.map +out/**/*.tsbuildInfo +src/ +.eslintrc* +.eslintignore +tsconfig*.json diff --git a/pythonExtensionApi/LICENSE.md b/pythonExtensionApi/LICENSE.md new file mode 100644 index 000000000000..767f4076ba05 --- /dev/null +++ b/pythonExtensionApi/LICENSE.md @@ -0,0 +1,21 @@ +Copyright (c) Microsoft Corporation. All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pythonExtensionApi/README.md b/pythonExtensionApi/README.md new file mode 100644 index 000000000000..5208d90cdfa5 --- /dev/null +++ b/pythonExtensionApi/README.md @@ -0,0 +1,55 @@ +# Python extension's API + +This npm module implements an API facade for the Python extension in VS Code. + +## Example + +First we need to define a `package.json` for the extension that wants to use the API: + +```jsonc +{ + "name": "...", + ... + // depend on the Python extension + "extensionDependencies": [ + "ms-python.python" + ], + // Depend on the Python extension facade npm module to get easier API access to the + // core extension. + "dependencies": { + "@vscode/python-extension": "...", + "@types/vscode": "..." + }, +} +``` + +Update `"@types/vscode"` to [a recent version](https://code.visualstudio.com/updates/) of VS Code, say `"^1.81.0"` for VS Code version `"1.81"`, in case there are any conflicts. + +The actual source code to get the active environment to run some script could look like this: + +```typescript +// Import the API +import { PythonExtension } from '@vscode/python-extension'; + +... + +// Load the Python extension API +const pythonApi: PythonExtension = await PythonExtension.api(); + +// This will return something like /usr/bin/python +const environmentPath = pythonApi.environments.getActiveEnvironmentPath(); + +// `environmentPath.path` carries the value of the setting. Note that this path may point to a folder and not the +// python binary. Depends entirely on how the env was created. +// E.g., `conda create -n myenv python` ensures the env has a python binary +// `conda create -n myenv` does not include a python binary. +// Also, the path specified may not be valid, use the following to get complete details for this environment if +// need be. + +const environment = await pythonApi.environments.resolveEnvironment(environmentPath); +if (environment) { + // run your script here. +} +``` + +Check out [the wiki](https://aka.ms/pythonEnvironmentApi) for many more examples and usage. diff --git a/pythonExtensionApi/SECURITY.md b/pythonExtensionApi/SECURITY.md new file mode 100644 index 000000000000..a050f362c152 --- /dev/null +++ b/pythonExtensionApi/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). + + diff --git a/pythonExtensionApi/package-lock.json b/pythonExtensionApi/package-lock.json new file mode 100644 index 000000000000..e462fc1c888a --- /dev/null +++ b/pythonExtensionApi/package-lock.json @@ -0,0 +1,157 @@ +{ + "name": "@vscode/python-extension", + "version": "1.0.6", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@vscode/python-extension", + "version": "1.0.6", + "license": "MIT", + "devDependencies": { + "@types/vscode": "^1.93.0", + "source-map": "^0.8.0-beta.0", + "typescript": "~5.2" + }, + "engines": { + "node": ">=22.17.0", + "vscode": "^1.93.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.94.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz", + "integrity": "sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + }, + "dependencies": { + "@types/vscode": { + "version": "1.94.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz", + "integrity": "sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } +} diff --git a/pythonExtensionApi/package.json b/pythonExtensionApi/package.json new file mode 100644 index 000000000000..11e0445aa8da --- /dev/null +++ b/pythonExtensionApi/package.json @@ -0,0 +1,43 @@ +{ + "name": "@vscode/python-extension", + "description": "An API facade for the Python extension in VS Code", + "version": "1.0.6", + "author": { + "name": "Microsoft Corporation" + }, + "keywords": [ + "Python", + "VSCode", + "API" + ], + "main": "./out/main.js", + "types": "./out/main.d.ts", + "engines": { + "node": ">=22.21.1", + "vscode": "^1.93.0" + }, + "license": "MIT", + "homepage": "https://github.com/microsoft/vscode-python/tree/main/pythonExtensionApi", + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/vscode-python" + }, + "bugs": { + "url": "https://github.com/Microsoft/vscode-python/issues" + }, + "devDependencies": { + "typescript": "~5.2", + "@types/vscode": "^1.102.0", + "source-map": "^0.8.0-beta.0" + }, + "scripts": { + "prepublishOnly": "echo \"⛔ Can only publish from a secure pipeline ⛔\" && node ../build/fail", + "prepack": "npm run all:publish", + "compile": "node ./node_modules/typescript/lib/tsc.js -b ./tsconfig.json", + "clean": "node ../node_modules/rimraf/bin.js out", + "lint": "node ../node_modules/eslint/bin/eslint.js --ext ts src", + "all": "npm run clean && npm run compile", + "formatTypings": "node ../node_modules/eslint/bin/eslint.js --fix ./out/main.d.ts", + "all:publish": "git clean -xfd . && npm install && npm run compile && npm run formatTypings" + } +} diff --git a/pythonExtensionApi/src/main.ts b/pythonExtensionApi/src/main.ts new file mode 100644 index 000000000000..2173245cbb28 --- /dev/null +++ b/pythonExtensionApi/src/main.ts @@ -0,0 +1,348 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { CancellationToken, Event, Uri, WorkspaceFolder, extensions } from 'vscode'; + +/* + * Do not introduce any breaking changes to this API. + * This is the public API for other extensions to interact with this extension. + */ +export interface PythonExtension { + /** + * Promise indicating whether all parts of the extension have completed loading or not. + */ + ready: Promise; + debug: { + /** + * Generate an array of strings for commands to pass to the Python executable to launch the debugger for remote debugging. + * Users can append another array of strings of what they want to execute along with relevant arguments to Python. + * E.g `['/Users/..../pythonVSCode/python_files/lib/python/debugpy', '--listen', 'localhost:57039', '--wait-for-client']` + * @param host + * @param port + * @param waitUntilDebuggerAttaches Defaults to `true`. + */ + getRemoteLauncherCommand(host: string, port: number, waitUntilDebuggerAttaches: boolean): Promise; + + /** + * Gets the path to the debugger package used by the extension. + */ + getDebuggerPackagePath(): Promise; + }; + + /** + * These APIs provide a way for extensions to work with by python environments available in the user's machine + * as found by the Python extension. See + * https://github.com/microsoft/vscode-python/wiki/Python-Environment-APIs for usage examples and more. + */ + readonly environments: { + /** + * Returns the environment configured by user in settings. Note that this can be an invalid environment, use + * {@link resolveEnvironment} to get full details. + * @param resource : Uri of a file or workspace folder. This is used to determine the env in a multi-root + * scenario. If `undefined`, then the API returns what ever is set for the workspace. + */ + getActiveEnvironmentPath(resource?: Resource): EnvironmentPath; + /** + * Sets the active environment path for the python extension for the resource. Configuration target will always + * be the workspace folder. + * @param environment : If string, it represents the full path to environment folder or python executable + * for the environment. Otherwise it can be {@link Environment} or {@link EnvironmentPath} itself. + * @param resource : [optional] File or workspace to scope to a particular workspace folder. + */ + updateActiveEnvironmentPath( + environment: string | EnvironmentPath | Environment, + resource?: Resource, + ): Promise; + /** + * This event is triggered when the active environment setting changes. + */ + readonly onDidChangeActiveEnvironmentPath: Event; + /** + * Carries environments known to the extension at the time of fetching the property. Note this may not + * contain all environments in the system as a refresh might be going on. + * + * Only reports environments in the current workspace. + */ + readonly known: readonly Environment[]; + /** + * This event is triggered when the known environment list changes, like when a environment + * is found, existing environment is removed, or some details changed on an environment. + */ + readonly onDidChangeEnvironments: Event; + /** + * This API will trigger environment discovery, but only if it has not already happened in this VSCode session. + * Useful for making sure env list is up-to-date when the caller needs it for the first time. + * + * To force trigger a refresh regardless of whether a refresh was already triggered, see option + * {@link RefreshOptions.forceRefresh}. + * + * Note that if there is a refresh already going on then this returns the promise for that refresh. + * @param options Additional options for refresh. + * @param token A cancellation token that indicates a refresh is no longer needed. + */ + refreshEnvironments(options?: RefreshOptions, token?: CancellationToken): Promise; + /** + * Returns details for the given environment, or `undefined` if the env is invalid. + * @param environment : If string, it represents the full path to environment folder or python executable + * for the environment. Otherwise it can be {@link Environment} or {@link EnvironmentPath} itself. + */ + resolveEnvironment( + environment: Environment | EnvironmentPath | string, + ): Promise; + /** + * Returns the environment variables used by the extension for a resource, which includes the custom + * variables configured by user in `.env` files. + * @param resource : Uri of a file or workspace folder. This is used to determine the env in a multi-root + * scenario. If `undefined`, then the API returns what ever is set for the workspace. + */ + getEnvironmentVariables(resource?: Resource): EnvironmentVariables; + /** + * This event is fired when the environment variables for a resource change. Note it's currently not + * possible to detect if environment variables in the system change, so this only fires if custom + * environment variables are updated in `.env` files. + */ + readonly onDidEnvironmentVariablesChange: Event; + }; +} + +export type RefreshOptions = { + /** + * When `true`, force trigger a refresh regardless of whether a refresh was already triggered. Note this can be expensive so + * it's best to only use it if user manually triggers a refresh. + */ + forceRefresh?: boolean; +}; + +/** + * Details about the environment. Note the environment folder, type and name never changes over time. + */ +export type Environment = EnvironmentPath & { + /** + * Carries details about python executable. + */ + readonly executable: { + /** + * Uri of the python interpreter/executable. Carries `undefined` in case an executable does not belong to + * the environment. + */ + readonly uri: Uri | undefined; + /** + * Bitness if known at this moment. + */ + readonly bitness: Bitness | undefined; + /** + * Value of `sys.prefix` in sys module if known at this moment. + */ + readonly sysPrefix: string | undefined; + }; + /** + * Carries details if it is an environment, otherwise `undefined` in case of global interpreters and others. + */ + readonly environment: + | { + /** + * Type of the environment. + */ + readonly type: EnvironmentType; + /** + * Name to the environment if any. + */ + readonly name: string | undefined; + /** + * Uri of the environment folder. + */ + readonly folderUri: Uri; + /** + * Any specific workspace folder this environment is created for. + */ + readonly workspaceFolder: WorkspaceFolder | undefined; + } + | undefined; + /** + * Carries Python version information known at this moment, carries `undefined` for envs without python. + */ + readonly version: + | (VersionInfo & { + /** + * Value of `sys.version` in sys module if known at this moment. + */ + readonly sysVersion: string | undefined; + }) + | undefined; + /** + * Tools/plugins which created the environment or where it came from. First value in array corresponds + * to the primary tool which manages the environment, which never changes over time. + * + * Array is empty if no tool is responsible for creating/managing the environment. Usually the case for + * global interpreters. + */ + readonly tools: readonly EnvironmentTools[]; +}; + +/** + * Derived form of {@link Environment} where certain properties can no longer be `undefined`. Meant to represent an + * {@link Environment} with complete information. + */ +export type ResolvedEnvironment = Environment & { + /** + * Carries complete details about python executable. + */ + readonly executable: { + /** + * Uri of the python interpreter/executable. Carries `undefined` in case an executable does not belong to + * the environment. + */ + readonly uri: Uri | undefined; + /** + * Bitness of the environment. + */ + readonly bitness: Bitness; + /** + * Value of `sys.prefix` in sys module. + */ + readonly sysPrefix: string; + }; + /** + * Carries complete Python version information, carries `undefined` for envs without python. + */ + readonly version: + | (ResolvedVersionInfo & { + /** + * Value of `sys.version` in sys module if known at this moment. + */ + readonly sysVersion: string; + }) + | undefined; +}; + +export type EnvironmentsChangeEvent = { + readonly env: Environment; + /** + * * "add": New environment is added. + * * "remove": Existing environment in the list is removed. + * * "update": New information found about existing environment. + */ + readonly type: 'add' | 'remove' | 'update'; +}; + +export type ActiveEnvironmentPathChangeEvent = EnvironmentPath & { + /** + * Resource the environment changed for. + */ + readonly resource: Resource | undefined; +}; + +/** + * Uri of a file inside a workspace or workspace folder itself. + */ +export type Resource = Uri | WorkspaceFolder; + +export type EnvironmentPath = { + /** + * The ID of the environment. + */ + readonly id: string; + /** + * Path to environment folder or path to python executable that uniquely identifies an environment. Environments + * lacking a python executable are identified by environment folder paths, whereas other envs can be identified + * using python executable path. + */ + readonly path: string; +}; + +/** + * Tool/plugin where the environment came from. It can be {@link KnownEnvironmentTools} or custom string which + * was contributed. + */ +export type EnvironmentTools = KnownEnvironmentTools | string; +/** + * Tools or plugins the Python extension currently has built-in support for. Note this list is expected to shrink + * once tools have their own separate extensions. + */ +export type KnownEnvironmentTools = + | 'Conda' + | 'Pipenv' + | 'Poetry' + | 'VirtualEnv' + | 'Venv' + | 'VirtualEnvWrapper' + | 'Pyenv' + | 'Unknown'; + +/** + * Type of the environment. It can be {@link KnownEnvironmentTypes} or custom string which was contributed. + */ +export type EnvironmentType = KnownEnvironmentTypes | string; +/** + * Environment types the Python extension is aware of. Note this list is expected to shrink once tools have their + * own separate extensions, in which case they're expected to provide the type themselves. + */ +export type KnownEnvironmentTypes = 'VirtualEnvironment' | 'Conda' | 'Unknown'; + +/** + * Carries bitness for an environment. + */ +export type Bitness = '64-bit' | '32-bit' | 'Unknown'; + +/** + * The possible Python release levels. + */ +export type PythonReleaseLevel = 'alpha' | 'beta' | 'candidate' | 'final'; + +/** + * Release information for a Python version. + */ +export type PythonVersionRelease = { + readonly level: PythonReleaseLevel; + readonly serial: number; +}; + +export type VersionInfo = { + readonly major: number | undefined; + readonly minor: number | undefined; + readonly micro: number | undefined; + readonly release: PythonVersionRelease | undefined; +}; + +export type ResolvedVersionInfo = { + readonly major: number; + readonly minor: number; + readonly micro: number; + readonly release: PythonVersionRelease; +}; + +/** + * A record containing readonly keys. + */ +export type EnvironmentVariables = { readonly [key: string]: string | undefined }; + +export type EnvironmentVariablesChangeEvent = { + /** + * Workspace folder the environment variables changed for. + */ + readonly resource: WorkspaceFolder | undefined; + /** + * Updated value of environment variables. + */ + readonly env: EnvironmentVariables; +}; + +export const PVSC_EXTENSION_ID = 'ms-python.python'; + +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace PythonExtension { + /** + * Returns the API exposed by the Python extension in VS Code. + */ + export async function api(): Promise { + const extension = extensions.getExtension(PVSC_EXTENSION_ID); + if (extension === undefined) { + throw new Error(`Python extension is not installed or is disabled`); + } + if (!extension.isActive) { + await extension.activate(); + } + const pythonApi: PythonExtension = extension.exports; + return pythonApi; + } +} diff --git a/pythonExtensionApi/tsconfig.json b/pythonExtensionApi/tsconfig.json new file mode 100644 index 000000000000..9ab7617023df --- /dev/null +++ b/pythonExtensionApi/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["types/*"] + }, + "module": "commonjs", + "target": "es2018", + "outDir": "./out", + "lib": [ + "es6", + "es2018", + "dom", + "ES2019", + "ES2020" + ], + "sourceMap": true, + "rootDir": "src", + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "resolveJsonModule": true, + "declaration": true + }, + "exclude": [ + "node_modules", + "out" + ] +} diff --git a/pythonFiles/.vscode/settings.json b/pythonFiles/.vscode/settings.json deleted file mode 100644 index acee626024ff..000000000000 --- a/pythonFiles/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files.exclude": { - "**/__pycache__/**": true, - "**/**/*.pyc": true - }, - "python.formatting.provider": "black" -} \ No newline at end of file diff --git a/pythonFiles/completion.py b/pythonFiles/completion.py deleted file mode 100644 index ec5dd900d9a5..000000000000 --- a/pythonFiles/completion.py +++ /dev/null @@ -1,695 +0,0 @@ -import os -import os.path -import io -import re -import sys -import json -import traceback -import platform - -jediPreview = False - - -class RedirectStdout(object): - def __init__(self, new_stdout=None): - """If stdout is None, redirect to /dev/null""" - self._new_stdout = new_stdout or open(os.devnull, "w") - - def __enter__(self): - sys.stdout.flush() - self.oldstdout_fno = os.dup(sys.stdout.fileno()) - os.dup2(self._new_stdout.fileno(), 1) - - def __exit__(self, exc_type, exc_value, traceback): - self._new_stdout.flush() - os.dup2(self.oldstdout_fno, 1) - os.close(self.oldstdout_fno) - - -class JediCompletion(object): - basic_types = { - "module": "import", - "instance": "variable", - "statement": "value", - "param": "variable", - } - - def __init__(self): - self.default_sys_path = sys.path - self._input = io.open(sys.stdin.fileno(), encoding="utf-8") - if (os.path.sep == "/") and (platform.uname()[2].find("Microsoft") > -1): - # WSL; does not support UNC paths - self.drive_mount = "/mnt/" - elif sys.platform == "cygwin": - # cygwin - self.drive_mount = "/cygdrive/" - else: - # Do no normalization, e.g. Windows build of Python. - # Could add additional test: ((os.path.sep == '/') and os.path.isdir('/mnt/c')) - # However, this may have more false positives trying to identify Windows/*nix hybrids - self.drive_mount = "" - - def _get_definition_type(self, definition): - # if definition.type not in ['import', 'keyword'] and is_built_in(): - # return 'builtin' - try: - if definition.type in ["statement"] and definition.name.isupper(): - return "constant" - return self.basic_types.get(definition.type, definition.type) - except Exception: - return "builtin" - - def _additional_info(self, completion): - """Provide additional information about the completion object.""" - if not hasattr(completion, "_definition") or completion._definition is None: - return "" - if completion.type == "statement": - nodes_to_display = ["InstanceElement", "String", "Node", "Lambda", "Number"] - return "".join( - c.get_code() - for c in completion._definition.children - if type(c).__name__ in nodes_to_display - ).replace("\n", "") - return "" - - @classmethod - def _get_top_level_module(cls, path): - """Recursively walk through directories looking for top level module. - - Jedi will use current filepath to look for another modules at same - path, but it will not be able to see modules **above**, so our goal - is to find the higher python module available from filepath. - """ - _path, _ = os.path.split(path) - if os.path.isfile(os.path.join(_path, "__init__.py")): - return cls._get_top_level_module(_path) - return path - - def _generate_signature(self, completion): - """Generate signature with function arguments. - """ - if completion.type in ["module"] or not hasattr(completion, "params"): - return "" - return "%s(%s)" % ( - completion.name, - ", ".join(p.description[6:] for p in completion.params if p), - ) - - def _get_call_signatures(self, script): - """Extract call signatures from jedi.api.Script object in failsafe way. - - Returns: - Tuple with original signature object, name and value. - """ - _signatures = [] - try: - call_signatures = script.call_signatures() - except KeyError: - call_signatures = [] - except: - call_signatures = [] - for signature in call_signatures: - for pos, param in enumerate(signature.params): - if not param.name: - continue - - name = self._get_param_name(param) - if param.name == "self" and pos == 0: - continue - if name.startswith("*"): - continue - - value = self._get_param_value(param) - _signatures.append((signature, name, value)) - return _signatures - - def _get_param_name(self, p): - if p.name.startswith("param "): - return p.name[6:] # drop leading 'param ' - return p.name - - def _get_param_value(self, p): - pair = p.description.split("=") - if len(pair) > 1: - return pair[1] - return None - - def _get_call_signatures_with_args(self, script): - """Extract call signatures from jedi.api.Script object in failsafe way. - - Returns: - Array with dictionary - """ - _signatures = [] - try: - call_signatures = script.call_signatures() - except KeyError: - call_signatures = [] - for signature in call_signatures: - sig = { - "name": "", - "description": "", - "docstring": "", - "paramindex": 0, - "params": [], - "bracketstart": [], - } - sig["description"] = signature.description - try: - sig["docstring"] = signature.docstring() - sig["raw_docstring"] = signature.docstring(raw=True) - except Exception: - sig["docstring"] = "" - sig["raw_docstring"] = "" - - sig["name"] = signature.name - sig["paramindex"] = signature.index - sig["bracketstart"].append(signature.index) - - _signatures.append(sig) - for pos, param in enumerate(signature.params): - if not param.name: - continue - - name = self._get_param_name(param) - if param.name == "self" and pos == 0: - continue - - value = self._get_param_value(param) - paramDocstring = "" - try: - paramDocstring = param.docstring() - except Exception: - paramDocstring = "" - - sig["params"].append( - { - "name": name, - "value": value, - "docstring": paramDocstring, - "description": param.description, - } - ) - return _signatures - - def _serialize_completions(self, script, identifier=None, prefix=""): - """Serialize response to be read from VSCode. - - Args: - script: Instance of jedi.api.Script object. - identifier: Unique completion identifier to pass back to VSCode. - prefix: String with prefix to filter function arguments. - Used only when fuzzy matcher turned off. - - Returns: - Serialized string to send to VSCode. - """ - _completions = [] - - for signature, name, value in self._get_call_signatures(script): - if not self.fuzzy_matcher and not name.lower().startswith(prefix.lower()): - continue - _completion = { - "type": "property", - "raw_type": "", - "rightLabel": self._additional_info(signature), - } - _completion["description"] = "" - _completion["raw_docstring"] = "" - - # we pass 'text' here only for fuzzy matcher - if value: - _completion["snippet"] = "%s=${1:%s}$0" % (name, value) - _completion["text"] = "%s=" % (name) - else: - _completion["snippet"] = "%s=$1$0" % name - _completion["text"] = name - _completion["displayText"] = name - _completions.append(_completion) - - try: - completions = script.completions() - except KeyError: - completions = [] - except: - completions = [] - for completion in completions: - try: - _completion = { - "text": completion.name, - "type": self._get_definition_type(completion), - "raw_type": completion.type, - "rightLabel": self._additional_info(completion), - } - except Exception: - continue - - for c in _completions: - if c["text"] == _completion["text"]: - c["type"] = _completion["type"] - c["raw_type"] = _completion["raw_type"] - - if any( - [c["text"].split("=")[0] == _completion["text"] for c in _completions] - ): - # ignore function arguments we already have - continue - _completions.append(_completion) - return json.dumps({"id": identifier, "results": _completions}) - - def _serialize_methods(self, script, identifier=None, prefix=""): - _methods = [] - try: - completions = script.completions() - except KeyError: - return [] - - for completion in completions: - if completion.name == "__autocomplete_python": - instance = completion.parent().name - break - else: - instance = "self.__class__" - - for completion in completions: - params = [] - if hasattr(completion, "params"): - params = [p.description for p in completion.params if p] - if completion.parent().type == "class": - _methods.append( - { - "parent": completion.parent().name, - "instance": instance, - "name": completion.name, - "params": params, - "moduleName": completion.module_name, - "fileName": completion.module_path, - "line": completion.line, - "column": completion.column, - } - ) - return json.dumps({"id": identifier, "results": _methods}) - - def _serialize_arguments(self, script, identifier=None): - """Serialize response to be read from VSCode. - - Args: - script: Instance of jedi.api.Script object. - identifier: Unique completion identifier to pass back to VSCode. - - Returns: - Serialized string to send to VSCode. - """ - return json.dumps( - {"id": identifier, "results": self._get_call_signatures_with_args(script)} - ) - - def _top_definition(self, definition): - for d in definition.goto_assignments(): - if d == definition: - continue - if d.type == "import": - return self._top_definition(d) - else: - return d - return definition - - def _extract_range_jedi_0_11_1(self, definition): - from parso.utils import split_lines - - # get the scope range - try: - if definition.type in ["class", "function"]: - tree_name = definition._name.tree_name - scope = tree_name.get_definition() - start_line = scope.start_pos[0] - 1 - start_column = scope.start_pos[1] - # get the lines - code = scope.get_code(include_prefix=False) - lines = split_lines(code) - # trim the lines - lines = "\n".join(lines).rstrip().split("\n") - end_line = start_line + len(lines) - 1 - end_column = len(lines[-1]) - 1 - else: - symbol = definition._name.tree_name - start_line = symbol.start_pos[0] - 1 - start_column = symbol.start_pos[1] - end_line = symbol.end_pos[0] - 1 - end_column = symbol.end_pos[1] - return { - "start_line": start_line, - "start_column": start_column, - "end_line": end_line, - "end_column": end_column, - } - except Exception as e: - return { - "start_line": definition.line - 1, - "start_column": definition.column, - "end_line": definition.line - 1, - "end_column": definition.column, - } - - def _extract_range(self, definition): - """Provides the definition range of a given definition - - For regular symbols it returns the start and end location of the - characters making up the symbol. - - For scoped containers it will return the entire definition of the - scope. - - The scope that jedi provides ends with the first character of the next - scope so it's not ideal. For vscode we need the scope to end with the - last character of actual code. That's why we extract the lines that - make up our scope and trim the trailing whitespace. - """ - return self._extract_range_jedi_0_11_1(definition) - - def _get_definitionsx(self, definitions, identifier=None, ignoreNoModulePath=False): - """Serialize response to be read from VSCode. - - Args: - definitions: List of jedi.api.classes.Definition objects. - identifier: Unique completion identifier to pass back to VSCode. - - Returns: - Serialized string to send to VSCode. - """ - _definitions = [] - for definition in definitions: - try: - if definition.type == "import": - definition = self._top_definition(definition) - definitionRange = { - "start_line": 0, - "start_column": 0, - "end_line": 0, - "end_column": 0, - } - module_path = "" - if hasattr(definition, "module_path") and definition.module_path: - module_path = definition.module_path - definitionRange = self._extract_range(definition) - else: - if not ignoreNoModulePath: - continue - try: - parent = definition.parent() - container = parent.name if parent.type != "module" else "" - except Exception: - container = "" - - try: - docstring = definition.docstring() - rawdocstring = definition.docstring(raw=True) - except Exception: - docstring = "" - rawdocstring = "" - _definition = { - "text": definition.name, - "type": self._get_definition_type(definition), - "raw_type": definition.type, - "fileName": module_path, - "container": container, - "range": definitionRange, - "description": definition.description, - "docstring": docstring, - "raw_docstring": rawdocstring, - "signature": self._generate_signature(definition), - } - _definitions.append(_definition) - except Exception as e: - pass - return _definitions - - def _serialize_definitions(self, definitions, identifier=None): - """Serialize response to be read from VSCode. - - Args: - definitions: List of jedi.api.classes.Definition objects. - identifier: Unique completion identifier to pass back to VSCode. - - Returns: - Serialized string to send to VSCode. - """ - _definitions = [] - for definition in definitions: - try: - if definition.module_path: - if definition.type == "import": - definition = self._top_definition(definition) - if not definition.module_path: - continue - try: - parent = definition.parent() - container = parent.name if parent.type != "module" else "" - except Exception: - container = "" - - try: - docstring = definition.docstring() - rawdocstring = definition.docstring(raw=True) - except Exception: - docstring = "" - rawdocstring = "" - _definition = { - "text": definition.name, - "type": self._get_definition_type(definition), - "raw_type": definition.type, - "fileName": definition.module_path, - "container": container, - "range": self._extract_range(definition), - "description": definition.description, - "docstring": docstring, - "raw_docstring": rawdocstring, - } - _definitions.append(_definition) - except Exception as e: - pass - return json.dumps({"id": identifier, "results": _definitions}) - - def _serialize_tooltip(self, definitions, identifier=None): - _definitions = [] - for definition in definitions: - signature = definition.name - description = None - if definition.type in ["class", "function"]: - signature = self._generate_signature(definition) - try: - description = definition.docstring(raw=True).strip() - except Exception: - description = "" - if not description and not hasattr(definition, "get_line_code"): - # jedi returns an empty string for compiled objects - description = definition.docstring().strip() - if definition.type == "module": - signature = definition.full_name - try: - description = definition.docstring(raw=True).strip() - except Exception: - description = "" - if not description and hasattr(definition, "get_line_code"): - # jedi returns an empty string for compiled objects - description = definition.docstring().strip() - _definition = { - "type": self._get_definition_type(definition), - "text": definition.name, - "description": description, - "docstring": description, - "signature": signature, - } - _definitions.append(_definition) - return json.dumps({"id": identifier, "results": _definitions}) - - def _serialize_usages(self, usages, identifier=None): - _usages = [] - for usage in usages: - _usages.append( - { - "name": usage.name, - "moduleName": usage.module_name, - "fileName": usage.module_path, - "line": usage.line, - "column": usage.column, - } - ) - return json.dumps({"id": identifier, "results": _usages}) - - def _deserialize(self, request): - """Deserialize request from VSCode. - - Args: - request: String with raw request from VSCode. - - Returns: - Python dictionary with request data. - """ - return json.loads(request) - - def _set_request_config(self, config): - """Sets config values for current request. - - This includes sys.path modifications which is getting restored to - default value on each request so each project should be isolated - from each other. - - Args: - config: Dictionary with config values. - """ - sys.path = self.default_sys_path - self.use_snippets = config.get("useSnippets") - self.show_doc_strings = config.get("showDescriptions", True) - self.fuzzy_matcher = config.get("fuzzyMatcher", False) - jedi.settings.case_insensitive_completion = config.get( - "caseInsensitiveCompletion", True - ) - for path in config.get("extraPaths", []): - if path and path not in sys.path: - sys.path.insert(0, path) - - def _normalize_request_path(self, request): - """Normalize any Windows paths received by a *nix build of - Python. Does not alter the reverse os.path.sep=='\\', - i.e. *nix paths received by a Windows build of Python. - """ - if "path" in request: - if not self.drive_mount: - return - newPath = request["path"].replace("\\", "/") - if newPath[0:1] == "/": - # is absolute path with no drive letter - request["path"] = newPath - elif newPath[1:2] == ":": - # is path with drive letter, only absolute can be mapped - request["path"] = self.drive_mount + newPath[0:1].lower() + newPath[2:] - else: - # is relative path - request["path"] = newPath - - def _process_request(self, request): - """Accept serialized request from VSCode and write response. - """ - request = self._deserialize(request) - - self._set_request_config(request.get("config", {})) - - self._normalize_request_path(request) - path = self._get_top_level_module(request.get("path", "")) - if len(path) > 0 and path not in sys.path: - sys.path.insert(0, path) - lookup = request.get("lookup", "completions") - - if lookup == "names": - return self._serialize_definitions( - jedi.api.names( - source=request.get("source", None), - path=request.get("path", ""), - all_scopes=True, - ), - request["id"], - ) - - script = jedi.Script( - source=request.get("source", None), - line=request["line"] + 1, - column=request["column"], - path=request.get("path", ""), - sys_path=sys.path, - ) - - if lookup == "definitions": - defs = self._get_definitionsx( - script.goto_assignments(follow_imports=True), request["id"] - ) - return json.dumps({"id": request["id"], "results": defs}) - if lookup == "tooltip": - if jediPreview: - defs = [] - try: - defs = self._get_definitionsx( - script.goto_definitions(), request["id"], True - ) - except: - pass - try: - if len(defs) == 0: - defs = self._get_definitionsx( - script.goto_assignments(), request["id"], True - ) - except: - pass - return json.dumps({"id": request["id"], "results": defs}) - else: - try: - return self._serialize_tooltip( - script.goto_definitions(), request["id"] - ) - except: - return json.dumps({"id": request["id"], "results": []}) - elif lookup == "arguments": - return self._serialize_arguments(script, request["id"]) - elif lookup == "usages": - return self._serialize_usages(script.usages(), request["id"]) - elif lookup == "methods": - return self._serialize_methods( - script, request["id"], request.get("prefix", "") - ) - else: - return self._serialize_completions( - script, request["id"], request.get("prefix", "") - ) - - def _write_response(self, response): - sys.stdout.write(response + "\n") - sys.stdout.flush() - - def watch(self): - while True: - try: - rq = self._input.readline() - if len(rq) == 0: - # Reached EOF - indication our parent process is gone. - sys.stderr.write( - "Received EOF from the standard input,exiting" + "\n" - ) - sys.stderr.flush() - return - with RedirectStdout(): - response = self._process_request(rq) - self._write_response(response) - - except Exception: - sys.stderr.write(traceback.format_exc() + "\n") - sys.stderr.flush() - - -if __name__ == "__main__": - cachePrefix = "v" - modulesToLoad = "" - if len(sys.argv) > 2 and sys.argv[1] == "custom": - jediPath = sys.argv[2] - jediPreview = True - cachePrefix = "custom_v" - if len(sys.argv) > 3: - modulesToLoad = sys.argv[3] - else: - # release - jediPath = os.path.join(os.path.dirname(__file__), "lib", "python") - if len(sys.argv) > 1: - modulesToLoad = sys.argv[1] - - sys.path.insert(0, jediPath) - import jedi - - if jediPreview: - jedi.settings.cache_directory = os.path.join( - jedi.settings.cache_directory, - cachePrefix + jedi.__version__.replace(".", ""), - ) - # remove jedi from path after we import it so it will not be completed - sys.path.pop(0) - if len(modulesToLoad) > 0: - jedi.preload_module(*modulesToLoad.split(",")) - JediCompletion().watch() diff --git a/pythonFiles/datascience/daemon/README.md b/pythonFiles/datascience/daemon/README.md deleted file mode 100644 index 45b4ce6a97c0..000000000000 --- a/pythonFiles/datascience/daemon/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Sample usage in node.js - -```javascript -const cp = require('child_process'); -const rpc = require('vscode-jsonrpc'); -const env = { - PYTHONUNBUFFERED: '1', - PYTHONPATH: '/pythonFiles:/pythonFiles/lib/python' -} -const childProcess = cp.spawn('', ['-m', 'datascience.daemon', '-v', '--log-file=log.log'], {env}); -const connection = rpc.createMessageConnection(new rpc.StreamMessageReader(childProcess.stdout),new rpc.StreamMessageWriter(childProcess.stdin)); - -connection.onClose(() => console.error('Closed')); -connection.onError(ex => console.error(ex)); -connection.onDispose(() => console.error('disposed')); -connection.onNotification((e, data) => console.log(`Notification from daemon, such as stdout/stderr, ${JSON.stringify(data)}`); -connection.onUnhandledNotification(e => console.error(e)); - -// Start -connection.listen(); - -const pingRequest = new rpc.RequestType('ping'); -connection.sendRequest(pingRequest, {data: 'one₹😄'}) - .then(response => console.log(`Pong received ${JSON.stringify(response)}`), ex => console.error(ex)); -``` diff --git a/pythonFiles/datascience/daemon/__main__.py b/pythonFiles/datascience/daemon/__main__.py deleted file mode 100644 index c1c047f233b9..000000000000 --- a/pythonFiles/datascience/daemon/__main__.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import argparse -import importlib -import json -import logging -import logging.config -import sys - - -log = logging.getLogger(__name__) - -LOG_FORMAT = "%(asctime)s UTC - %(levelname)s - %(name)s - %(message)s" -queue_handler = None - - -def add_arguments(parser): - parser.description = "Daemon" - - parser.add_argument( - "--daemon-module", - default="datascience.daemon.daemon_python", - help="Daemon Module", - ) - - log_group = parser.add_mutually_exclusive_group() - log_group.add_argument( - "--log-config", help="Path to a JSON file containing Python logging config." - ) - log_group.add_argument( - "--log-file", - help="Redirect logs to the given file instead of writing to stderr." - "Has no effect if used with --log-config.", - ) - - parser.add_argument( - "-v", - "--verbose", - action="count", - default=0, - help="Increase verbosity of log output, overrides log config file", - ) - - -class TemporaryQueueHandler(logging.Handler): - """ Logger used to temporarily store everything into a queue. - Later the messages are pushed back to the RPC client as a notification. - Once the RPC channel is up, we'll stop queuing messages and sending id directly. - """ - - def __init__(self): - logging.Handler.__init__(self) - self.queue = [] - self.server = None - - def set_server(self, server): - # Send everything that has beeen queued until now. - self.server = server - for msg in self.queue: - self.server._endpoint.notify("log", msg) - self.queue = [] - - def emit(self, record): - data = {"level": record.levelname, "msg": self.format(record)} - # If we don't have the server, then queue it and send it later. - if self.server is None: - self.queue.append(data) - else: - self.server._endpoint.notify("log", data) - - -def _configure_logger(verbose=0, log_config=None, log_file=None): - root_logger = logging.root - global queue_handler - if log_config: - with open(log_config, "r") as f: - logging.config.dictConfig(json.load(f)) - else: - formatter = logging.Formatter(LOG_FORMAT) - if log_file: - log_handler = logging.handlers.RotatingFileHandler( - log_file, - mode="a", - maxBytes=50 * 1024 * 1024, - backupCount=10, - encoding=None, - delay=0, - ) - log_handler.setFormatter(formatter) - root_logger.addHandler(log_handler) - else: - queue_handler = TemporaryQueueHandler() - root_logger.addHandler(queue_handler) - - if verbose == 0: - level = logging.WARNING - elif verbose == 1: - level = logging.INFO - elif verbose >= 2: - level = logging.DEBUG - - root_logger.setLevel(level) - - -def main(): - """ Starts the daemon. - The daemon_module allows authors of modules to provide a custom daemon implementation. - E.g. we have a base implementation for standard python functionality, - and a custom daemon implementation for DS work (related to jupyter). - """ - parser = argparse.ArgumentParser() - add_arguments(parser) - args = parser.parse_args() - _configure_logger(args.verbose, args.log_config, args.log_file) - - log.info("Starting daemon from %s.PythonDaemon", args.daemon_module) - try: - daemon_module = importlib.import_module(args.daemon_module) - daemon_cls = daemon_module.PythonDaemon - daemon_cls.start_daemon(queue_handler) - except Exception: - import traceback - - log.error(traceback.format_exc()) - raise Exception("Failed to start daemon") - - -if __name__ == "__main__": - main() diff --git a/pythonFiles/datascience/daemon/daemon_output.py b/pythonFiles/datascience/daemon/daemon_output.py deleted file mode 100644 index c8b9cae8230a..000000000000 --- a/pythonFiles/datascience/daemon/daemon_output.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -# Code borrowed from `pydevd` (https://github.com/microsoft/ptvsd/blob/608803cb99b450aedecc45167a7339b9b7b93b75/src/ptvsd/_vendored/pydevd/pydevd.py) - -import os -import sys -import logging -from threading import Lock - -log = logging.getLogger(__name__) - - -class IORedirector: - """ - This class works to wrap a stream (stdout/stderr) with an additional redirect. - """ - - def __init__(self, name, original, new_redirect, wrap_buffer=False): - """ - :param stream original: - The stream to be wrapped (usually stdout/stderr, but could be None). - - :param stream new_redirect: - - :param bool wrap_buffer: - Whether to create a buffer attribute (needed to mimick python 3 s - tdout/stderr which has a buffer to write binary data). - """ - self._name = name - self._lock = Lock() - self._writing = False - self._redirect_to = (new_redirect,) - if wrap_buffer and hasattr(original, "buffer"): - self.buffer = IORedirector( - name, original.buffer, new_redirect.buffer, False - ) - - def write(self, s): - # Note that writing to the original stream may fail for some reasons - # (such as trying to write something that's not a string or having it closed). - with self._lock: - if self._writing: - return - self._writing = True - try: - for r in self._redirect_to: - if hasattr(r, "write"): - r.write(s) - finally: - self._writing = False - - def isatty(self): - for r in self._redirect_to: - if hasattr(r, "isatty"): - return r.isatty() - return False - - def flush(self): - for r in self._redirect_to: - if hasattr(r, "flush"): - r.flush() - - def __getattr__(self, name): - log.info("getting attr for %s: %s", self._name, name) - for r in self._redirect_to: - if hasattr(r, name): - return getattr(r, name) - raise AttributeError(name) - - -class CustomWriter(object): - def __init__(self, name, wrap_stream, wrap_buffer, on_write=None): - """ - :param wrap_stream: - Either sys.stdout or sys.stderr. - - :param bool wrap_buffer: - If True the buffer attribute (which wraps writing bytes) should be - wrapped. - - :param callable(str) on_write: - Call back with the string that has been written. - """ - self._name = name - encoding = getattr(wrap_stream, "encoding", None) - if not encoding: - encoding = os.environ.get("PYTHONIOENCODING", "utf-8") - self.encoding = encoding - if wrap_buffer: - self.buffer = CustomWriter( - name, wrap_stream, wrap_buffer=False, on_write=on_write - ) - self._on_write = on_write - - def flush(self): - pass # no-op here - - def write(self, s): - if s: - # Need s in str - if isinstance(s, bytes): - s = s.decode(self.encoding, errors="replace") - log.info("write to %s: %s", self._name, s) - if self._on_write is not None: - self._on_write(s) - - -_stdin = sys.stdin.buffer -_stdout = sys.stdout.buffer - - -def get_io_buffers(): - return _stdin, _stdout - - -def redirect_output(stdout_handler, stderr_handler): - log.info("Redirect stdout/stderr") - - sys._vsc_out_buffer_ = CustomWriter("stdout", sys.stdout, True, stdout_handler) - sys.stdout_original = sys.stdout - _stdout_redirector = sys.stdout = IORedirector( - "stdout", sys.stdout, sys._vsc_out_buffer_, True - ) - - sys._vsc_err_buffer_ = CustomWriter("stderr", sys.stderr, True, stderr_handler) - sys.stderr_original = sys.stderr - _stderr_redirector = sys.stderr = IORedirector( - "stderr", sys.stderr, sys._vsc_err_buffer_, True - ) diff --git a/pythonFiles/datascience/daemon/daemon_python.py b/pythonFiles/datascience/daemon/daemon_python.py deleted file mode 100644 index d9d85c587123..000000000000 --- a/pythonFiles/datascience/daemon/daemon_python.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import logging -import io -import os -import sys -import traceback -import runpy -import importlib -from datascience.daemon.daemon_output import ( - CustomWriter, - IORedirector, - get_io_buffers, - redirect_output, -) -from contextlib import redirect_stdout, redirect_stderr, contextmanager -from pyls_jsonrpc.dispatchers import MethodDispatcher -from pyls_jsonrpc.endpoint import Endpoint -from pyls_jsonrpc.streams import JsonRpcStreamReader, JsonRpcStreamWriter - -log = logging.getLogger(__name__) - -MAX_WORKERS = 64 - - -@contextmanager -def change_exec_context(args=[], cwd=None, env=None): - # Code for setting and restoring env variables borrowed from stackoverflow - # https://stackoverflow.com/questions/2059482/python-temporarily-modify-the-current-processs-environment - if env is not None: - old_environ = dict(os.environ) - os.environ.update(env) - old_argv, sys.argv = sys.argv, [""] + args - old_cwd = os.getcwd() - try: - if cwd is not None: - os.chdir(cwd) - yield - finally: - sys.argv = old_argv - if cwd is not None: - os.chdir(old_cwd) - if env is not None: - os.environ.clear() - os.environ.update(old_environ) - - -def error_decorator(func): - """Decorator to trap rcp exceptions and send a formatted error to client.""" - - def _decorator(self, *args, **kwargs): - try: - return func(self, *args, **kwargs) - except: - log.info( - "Failed executing an rpc method. Error: %s", traceback.format_exc() - ) - return {"error": traceback.format_exc()} - - return _decorator - - -class PythonDaemon(MethodDispatcher): - """ Base Python Daemon with simple methods to check if a module exists, get version info and the like. - To add additional methods, please create a separate class based off this and pass in the arg `--daemon-module` to `datascience.daemon`. - """ - - def __init__(self, rx, tx): - self.log = logging.getLogger( - "{0}.{1}".format(self.__class__.__module__, self.__class__.__name__) - ) - self._jsonrpc_stream_reader = JsonRpcStreamReader(rx) - self._jsonrpc_stream_writer = JsonRpcStreamWriter(tx) - self._endpoint = Endpoint( - self, self._jsonrpc_stream_writer.write, max_workers=MAX_WORKERS - ) - self._shutdown = False - - def __getitem__(self, item): - """Override getitem to fallback through multiple dispatchers.""" - if self._shutdown and item != "exit": - # exit is the only allowed method during shutdown - self.log.debug("Ignoring non-exit method during shutdown: %s", item) - raise KeyError - - self.log.info("Execute rpc method %s from %s", item, sys.executable) - return super().__getitem__(item) - - def start(self): - """Entry point for the server.""" - self._shutdown = False - self._jsonrpc_stream_reader.listen(self._endpoint.consume) - - def m_ping(self, data): - """ping & pong (check if daemon is alive).""" - self.log.info("pinged with %s", data) - return {"pong": data} - - def _execute_and_capture_output(self, func): - fout = io.StringIO() - ferr = io.StringIO() - - with redirect_stdout(fout): - with redirect_stderr(ferr): - func() - - output = {} - if fout.tell(): - output["stdout"] = fout.getvalue() - if ferr.tell(): - output["stderr"] = ferr.getvalue() - return output - - def close(self): - self.log.info("Closing rpc channel") - self._shutdown = True - self._endpoint.shutdown() - self._jsonrpc_stream_reader.close() - self._jsonrpc_stream_writer.close() - - def m_exit(self, **_kwargs): - self.close() - - @error_decorator - def m_exec_file(self, file_name, args=[], cwd=None, env=None): - args = [] if args is None else args - self.log.info("Exec file %s with args %s", file_name, args) - - def exec_file(): - self.log.info("execute file %s", file_name) - runpy.run_path(file_name, globals()) - - with change_exec_context(args, cwd, env): - return self._execute_and_capture_output(exec_file) - - @error_decorator - def m_exec_code(self, code): - self.log.info("Exec code %s", code) - - def exec_code(): - eval(code, globals()) - - return self._execute_and_capture_output(exec_code) - - @error_decorator - def m_exec_file_observable(self, file_name, args=[], cwd=None, env=None): - args = [] if args is None else args - old_argv, sys.argv = sys.argv, [""] + args - self.log.info("Exec file (observale) %s with args %s", file_name, args) - - with change_exec_context(args, cwd, env): - runpy.run_path(file_name, globals()) - - @error_decorator - def m_exec_module(self, module_name, args=[], cwd=None, env=None): - args = [] if args is None else args - self.log.info("Exec module %s with args %s", module_name, args) - if args[-1] == "--version": - return self._get_module_version(module_name, args) - - def exec_module(): - - self.log.info("execute module %s", module_name) - runpy.run_module(module_name, globals(), run_name="__main__") - - with change_exec_context(args, cwd, env): - return self._execute_and_capture_output(exec_module) - - @error_decorator - def m_exec_module_observable(self, module_name, args=None, cwd=None, env=None): - args = [] if args is None else args - self.log.info("Exec module (observable) %s with args %s", module_name, args) - - with change_exec_context(args, cwd, env): - runpy.run_module(module_name, globals(), run_name="__main__") - - def _get_module_version(self, module_name, args): - """We handle `-m pip --version` as a special case. As this causes the current process to die. - These CLI commands are meant for CLI (i.e. kill process once done). - """ - args = [] if args is None else args - if module_name == "jupyter" and args[0] != "--version": - # This means we're trying to get a version of a sub command. - # E.g. python -m jupyter notebook --version. - # In such cases, use the subcommand. We can ignore jupyter. - module_name = args[0] - - try: - self.log.info("getting module_version %s", module_name) - m = importlib.import_module(module_name) - return {"stdout": m.__version__} - except Exception: - return {"error": traceback.format_exc()} - - def m_get_executable(self): - return {"path": sys.executable} - - def m_get_interpreter_information(self): - return { - "versionInfo": sys.version_info[:4], - "sysPrefix": sys.prefix, - "version": sys.version, - "is64Bit": sys.maxsize > 2 ** 32, - } - - def m_is_module_installed(self, module_name=None): - return {"exists": self._is_module_installed(module_name)} - - def _is_module_installed(self, module_name=None): - try: - importlib.import_module(module_name) - return True - except Exception: - return False - - @classmethod - def start_daemon(cls, logging_queue_handler=None): - """ Starts the daemon. """ - if not issubclass(cls, PythonDaemon): - raise ValueError("Handler class must be an instance of PythonDaemon") - log.info("Starting %s Daemon", cls.__name__) - - def on_write_stdout(output): - server._endpoint.notify("output", {"source": "stdout", "out": output}) - - def on_write_stderr(output): - server._endpoint.notify("output", {"source": "stderr", "out": output}) - - stdin, stdout = get_io_buffers() - server = cls(stdin, stdout) - redirect_output(on_write_stdout, on_write_stderr) - # Set up the queue handler that'll send log messages over to the client. - if logging_queue_handler is not None: - logging_queue_handler.set_server(server) - server.start() diff --git a/pythonFiles/datascience/dummyJupyter.py b/pythonFiles/datascience/dummyJupyter.py deleted file mode 100644 index 211af8cec79d..000000000000 --- a/pythonFiles/datascience/dummyJupyter.py +++ /dev/null @@ -1,28 +0,0 @@ -# This file can mimic juypter running. Useful for testing jupyter crash handling - -import sys -import argparse -import time - - -def main(): - print("hello from dummy jupyter") - parser = argparse.ArgumentParser() - parser.add_argument("--version", type=bool, default=False, const=True, nargs="?") - parser.add_argument("notebook", type=bool, default=False, const=True, nargs="?") - parser.add_argument("--no-browser", type=bool, default=False, const=True, nargs="?") - parser.add_argument("--notebook-dir", default="") - parser.add_argument("--config", default="") - results = parser.parse_args() - if results.version: - print("1.1.dummy") - else: - print( - "http://localhost:8888/?token=012f08663a68e279fe0a5335e0b5dfe44759ddcccf0b3a56" - ) - time.sleep(5) - raise Exception("Dummy is dead") - - -if __name__ == "__main__": - main() diff --git a/pythonFiles/datascience/getJupyterKernels.py b/pythonFiles/datascience/getJupyterKernels.py deleted file mode 100644 index c8a65cdb60fa..000000000000 --- a/pythonFiles/datascience/getJupyterKernels.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import json -import jupyter_client.kernelspec -import sys - - -specs = jupyter_client.kernelspec.KernelSpecManager().get_all_specs() -all_specs = {"kernelspecs": specs} - -sys.stdout.write(json.dumps(all_specs)) -sys.stdout.flush() diff --git a/pythonFiles/datascience/getJupyterKernelspecVersion.py b/pythonFiles/datascience/getJupyterKernelspecVersion.py deleted file mode 100644 index 1dbcd7694bfc..000000000000 --- a/pythonFiles/datascience/getJupyterKernelspecVersion.py +++ /dev/null @@ -1,7 +0,0 @@ -# Check whether kernelspec module exists. -import sys -import jupyter_client -import jupyter_client.kernelspec - -sys.stdout.write(jupyter_client.__version__) -sys.stdout.flush() diff --git a/pythonFiles/datascience/getJupyterVariableDataFrameInfo.py b/pythonFiles/datascience/getJupyterVariableDataFrameInfo.py deleted file mode 100644 index 2447132ab8bd..000000000000 --- a/pythonFiles/datascience/getJupyterVariableDataFrameInfo.py +++ /dev/null @@ -1,108 +0,0 @@ -# Query Jupyter server for the info about a dataframe -import json as _VSCODE_json -import pandas as _VSCODE_pd -import pandas.io.json as _VSCODE_pd_json - -# _VSCode_sub_supportsDataExplorer will contain our list of data explorer supported types -_VSCode_supportsDataExplorer = "['list', 'Series', 'dict', 'ndarray', 'DataFrame']" - -# In IJupyterVariables.getValue this '_VSCode_JupyterTestValue' will be replaced with the json stringified value of the target variable -# Indexes off of _VSCODE_targetVariable need to index types that are part of IJupyterVariable -_VSCODE_targetVariable = _VSCODE_json.loads("""_VSCode_JupyterTestValue""") - -# First check to see if we are a supported type, this prevents us from adding types that are not supported -# and also keeps our types in sync with what the variable explorer says that we support -if _VSCODE_targetVariable["type"] not in _VSCode_supportsDataExplorer: - del _VSCode_supportsDataExplorer - print(_VSCODE_json.dumps(_VSCODE_targetVariable)) - del _VSCODE_targetVariable -else: - del _VSCode_supportsDataExplorer - _VSCODE_evalResult = eval(_VSCODE_targetVariable["name"]) - - # Figure out shape if not already there. Use the shape to compute the row count - if hasattr(_VSCODE_evalResult, "shape"): - try: - # Get a bit more restrictive with exactly what we want to count as a shape, since anything can define it - if isinstance(_VSCODE_evalResult.shape, tuple): - _VSCODE_targetVariable["rowCount"] = _VSCODE_evalResult.shape[0] - except TypeError: - _VSCODE_targetVariable["rowCount"] = 0 - elif hasattr(_VSCODE_evalResult, "__len__"): - try: - _VSCODE_targetVariable["rowCount"] = len(_VSCODE_evalResult) - except TypeError: - _VSCODE_targetVariable["rowCount"] = 0 - - # Turn the eval result into a df - _VSCODE_df = _VSCODE_evalResult - if isinstance(_VSCODE_evalResult, list): - _VSCODE_df = _VSCODE_pd.DataFrame(_VSCODE_evalResult) - elif isinstance(_VSCODE_evalResult, _VSCODE_pd.Series): - _VSCODE_df = _VSCODE_pd.Series.to_frame(_VSCODE_evalResult) - elif isinstance(_VSCODE_evalResult, dict): - _VSCODE_evalResult = _VSCODE_pd.Series(_VSCODE_evalResult) - _VSCODE_df = _VSCODE_pd.Series.to_frame(_VSCODE_evalResult) - elif _VSCODE_targetVariable["type"] == "ndarray": - _VSCODE_df = _VSCODE_pd.DataFrame(_VSCODE_evalResult) - - # If any rows, use pandas json to convert a single row to json. Extract - # the column names and types from the json so we match what we'll fetch when - # we ask for all of the rows - if ( - hasattr(_VSCODE_targetVariable, "rowCount") - and _VSCODE_targetVariable["rowCount"] - ): - try: - _VSCODE_row = _VSCODE_df.iloc[0:1] - _VSCODE_json_row = _VSCODE_pd_json.to_json( - None, _VSCODE_row, date_format="iso" - ) - _VSCODE_columnNames = list(_VSCODE_json.loads(_VSCODE_json_row)) - del _VSCODE_row - del _VSCODE_json_row - except: - _VSCODE_columnNames = list(_VSCODE_df) - else: - _VSCODE_columnNames = list(_VSCODE_df) - - # Compute the index column. It may have been renamed - _VSCODE_indexColumn = _VSCODE_df.index.name if _VSCODE_df.index.name else "index" - _VSCODE_columnTypes = list(_VSCODE_df.dtypes) - del _VSCODE_df - - # Make sure the index column exists - if _VSCODE_indexColumn not in _VSCODE_columnNames: - _VSCODE_columnNames.insert(0, _VSCODE_indexColumn) - _VSCODE_columnTypes.insert(0, "int64") - - # Then loop and generate our output json - _VSCODE_columns = [] - for _VSCODE_n in range(0, len(_VSCODE_columnNames)): - _VSCODE_column_type = _VSCODE_columnTypes[_VSCODE_n] - _VSCODE_column_name = str(_VSCODE_columnNames[_VSCODE_n]) - _VSCODE_colobj = {} - _VSCODE_colobj["key"] = _VSCODE_column_name - _VSCODE_colobj["name"] = _VSCODE_column_name - _VSCODE_colobj["type"] = str(_VSCODE_column_type) - _VSCODE_columns.append(_VSCODE_colobj) - del _VSCODE_column_name - del _VSCODE_column_type - - del _VSCODE_columnNames - del _VSCODE_columnTypes - - # Save this in our target - _VSCODE_targetVariable["columns"] = _VSCODE_columns - _VSCODE_targetVariable["indexColumn"] = _VSCODE_indexColumn - del _VSCODE_columns - del _VSCODE_indexColumn - - # Transform this back into a string - print(_VSCODE_json.dumps(_VSCODE_targetVariable)) - del _VSCODE_targetVariable - - # Cleanup imports - del _VSCODE_json - del _VSCODE_pd - del _VSCODE_pd_json diff --git a/pythonFiles/datascience/getJupyterVariableDataFrameRows.py b/pythonFiles/datascience/getJupyterVariableDataFrameRows.py deleted file mode 100644 index 7bf647f652ae..000000000000 --- a/pythonFiles/datascience/getJupyterVariableDataFrameRows.py +++ /dev/null @@ -1,46 +0,0 @@ -# Query Jupyter server for the rows of a data frame -import json as _VSCODE_json -import pandas as _VSCODE_pd -import pandas.io.json as _VSCODE_pd_json - -# In IJupyterVariables.getValue this '_VSCode_JupyterTestValue' will be replaced with the json stringified value of the target variable -# Indexes off of _VSCODE_targetVariable need to index types that are part of IJupyterVariable -_VSCODE_targetVariable = _VSCODE_json.loads("""_VSCode_JupyterTestValue""") -_VSCODE_evalResult = eval(_VSCODE_targetVariable["name"]) - -# _VSCode_JupyterStartRow and _VSCode_JupyterEndRow should be replaced dynamically with the literals -# for our start and end rows -_VSCODE_startRow = max(_VSCode_JupyterStartRow, 0) -_VSCODE_endRow = min(_VSCode_JupyterEndRow, _VSCODE_targetVariable["rowCount"]) - -# Assume we have a dataframe. If not, turn our eval result into a dataframe -_VSCODE_df = _VSCODE_evalResult -if isinstance(_VSCODE_evalResult, list): - _VSCODE_df = _VSCODE_pd.DataFrame(_VSCODE_evalResult) -elif isinstance(_VSCODE_evalResult, _VSCODE_pd.Series): - _VSCODE_df = _VSCODE_pd.Series.to_frame(_VSCODE_evalResult) -elif isinstance(_VSCODE_evalResult, dict): - _VSCODE_evalResult = _VSCODE_pd.Series(_VSCODE_evalResult) - _VSCODE_df = _VSCODE_pd.Series.to_frame(_VSCODE_evalResult) -elif _VSCODE_targetVariable["type"] == "ndarray": - _VSCODE_df = _VSCODE_pd.DataFrame(_VSCODE_evalResult) -# If not a known type, then just let pandas handle it. -elif not (hasattr(_VSCODE_df, "iloc")): - _VSCODE_df = _VSCODE_pd.DataFrame(_VSCODE_evalResult) - -# Turn into JSON using pandas. We use pandas because it's about 3 orders of magnitude faster to turn into JSON -_VSCODE_rows = _VSCODE_df.iloc[_VSCODE_startRow:_VSCODE_endRow] -_VSCODE_result = _VSCODE_pd_json.to_json( - None, _VSCODE_rows, orient="table", date_format="iso" -) -print(_VSCODE_result) - -# Cleanup our variables -del _VSCODE_df -del _VSCODE_endRow -del _VSCODE_startRow -del _VSCODE_rows -del _VSCODE_result -del _VSCODE_json -del _VSCODE_pd -del _VSCODE_pd_json diff --git a/pythonFiles/datascience/getJupyterVariableList.py b/pythonFiles/datascience/getJupyterVariableList.py deleted file mode 100644 index d9b0778fa2d2..000000000000 --- a/pythonFiles/datascience/getJupyterVariableList.py +++ /dev/null @@ -1,38 +0,0 @@ -# Query Jupyter server for defined variables list -# Tested on 2.7 and 3.6 -from sys import getsizeof as _VSCODE_getsizeof -import json as _VSCODE_json -from IPython import get_ipython as _VSCODE_get_ipython - -# _VSCode_supportsDataExplorer will contain our list of data explorer supported types -_VSCode_supportsDataExplorer = "['list', 'Series', 'dict', 'ndarray', 'DataFrame']" - -# who_ls is a Jupyter line magic to fetch currently defined vars -_VSCode_JupyterVars = _VSCODE_get_ipython().run_line_magic("who_ls", "") - -_VSCode_output = [] -for _VSCode_var in _VSCode_JupyterVars: - try: - _VSCode_type = type(eval(_VSCode_var)) - _VSCode_output.append( - { - "name": _VSCode_var, - "type": _VSCode_type.__name__, - "size": _VSCODE_getsizeof(_VSCode_var), - "supportsDataExplorer": _VSCode_type.__name__ - in _VSCode_supportsDataExplorer, - } - ) - del _VSCode_type - del _VSCode_var - except: - pass - -print(_VSCODE_json.dumps(_VSCode_output)) - -del _VSCODE_get_ipython -del _VSCode_output -del _VSCode_supportsDataExplorer -del _VSCode_JupyterVars -del _VSCODE_json -del _VSCODE_getsizeof diff --git a/pythonFiles/datascience/getJupyterVariableValue.py b/pythonFiles/datascience/getJupyterVariableValue.py deleted file mode 100644 index 6110d8653dee..000000000000 --- a/pythonFiles/datascience/getJupyterVariableValue.py +++ /dev/null @@ -1,475 +0,0 @@ -import sys as VC_sys -import locale as VC_locale - -VC_IS_PY2 = VC_sys.version_info < (3,) - -# SafeRepr based on the pydevd implementation -# https://github.com/microsoft/ptvsd/blob/master/src/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py -class VC_SafeRepr(object): - # Py3 compat - alias unicode to str, and xrange to range - try: - unicode # noqa - except NameError: - unicode = str - try: - xrange # noqa - except NameError: - xrange = range - - # Can be used to override the encoding from locale.getpreferredencoding() - locale_preferred_encoding = None - - # Can be used to override the encoding used for sys.stdout.encoding - sys_stdout_encoding = None - - # String types are truncated to maxstring_outer when at the outer- - # most level, and truncated to maxstring_inner characters inside - # collections. - maxstring_outer = 2 ** 16 - maxstring_inner = 30 - if not VC_IS_PY2: - string_types = (str, bytes) - set_info = (set, "{", "}", False) - frozenset_info = (frozenset, "frozenset({", "})", False) - int_types = (int,) - long_iter_types = (list, tuple, bytearray, range, dict, set, frozenset) - else: - string_types = (str, unicode) - set_info = (set, "set([", "])", False) - frozenset_info = (frozenset, "frozenset([", "])", False) - int_types = (int, long) # noqa - long_iter_types = ( - list, - tuple, - bytearray, - xrange, - dict, - set, - frozenset, - buffer, - ) # noqa - - # Collection types are recursively iterated for each limit in - # maxcollection. - maxcollection = (15, 10) - - # Specifies type, prefix string, suffix string, and whether to include a - # comma if there is only one element. (Using a sequence rather than a - # mapping because we use isinstance() to determine the matching type.) - collection_types = [ - (tuple, "(", ")", True), - (list, "[", "]", False), - frozenset_info, - set_info, - ] - try: - from collections import deque - - collection_types.append((deque, "deque([", "])", False)) - except Exception: - pass - - # type, prefix string, suffix string, item prefix string, - # item key/value separator, item suffix string - dict_types = [(dict, "{", "}", "", ": ", "")] - try: - from collections import OrderedDict - - dict_types.append((OrderedDict, "OrderedDict([", "])", "(", ", ", ")")) - except Exception: - pass - - # All other types are treated identically to strings, but using - # different limits. - maxother_outer = 2 ** 16 - maxother_inner = 30 - - convert_to_hex = False - raw_value = False - - def __call__(self, obj): - try: - if VC_IS_PY2: - return "".join( - (x.encode("utf-8") if isinstance(x, unicode) else x) - for x in self._repr(obj, 0) - ) - else: - return "".join(self._repr(obj, 0)) - except Exception as e: - try: - return "An exception was raised: " + str(e) - except Exception: - return "An exception was raised" - - def _repr(self, obj, level): - """Returns an iterable of the parts in the final repr string.""" - - try: - obj_repr = type(obj).__repr__ - except Exception: - obj_repr = None - - def has_obj_repr(t): - r = t.__repr__ - try: - return obj_repr == r - except Exception: - return obj_repr is r - - for t, prefix, suffix, comma in self.collection_types: - if isinstance(obj, t) and has_obj_repr(t): - return self._repr_iter(obj, level, prefix, suffix, comma) - - for ( - t, - prefix, - suffix, - item_prefix, - item_sep, - item_suffix, - ) in self.dict_types: # noqa - if isinstance(obj, t) and has_obj_repr(t): - return self._repr_dict( - obj, level, prefix, suffix, item_prefix, item_sep, item_suffix - ) - - for t in self.string_types: - if isinstance(obj, t) and has_obj_repr(t): - return self._repr_str(obj, level) - - if self._is_long_iter(obj): - return self._repr_long_iter(obj) - - return self._repr_other(obj, level) - - # Determines whether an iterable exceeds the limits set in - # maxlimits, and is therefore unsafe to repr(). - def _is_long_iter(self, obj, level=0): - try: - # Strings have their own limits (and do not nest). Because - # they don't have __iter__ in 2.x, this check goes before - # the next one. - if isinstance(obj, self.string_types): - return len(obj) > self.maxstring_inner - - # If it's not an iterable (and not a string), it's fine. - if not hasattr(obj, "__iter__"): - return False - - # If it's not an instance of these collection types then it - # is fine. Note: this is a fix for - # https://github.com/Microsoft/ptvsd/issues/406 - if not isinstance(obj, self.long_iter_types): - return False - - # Iterable is its own iterator - this is a one-off iterable - # like generator or enumerate(). We can't really count that, - # but repr() for these should not include any elements anyway, - # so we can treat it the same as non-iterables. - if obj is iter(obj): - return False - - # xrange reprs fine regardless of length. - if isinstance(obj, xrange): - return False - - # numpy and scipy collections (ndarray etc) have - # self-truncating repr, so they're always safe. - try: - module = type(obj).__module__.partition(".")[0] - if module in ("numpy", "scipy"): - return False - except Exception: - pass - - # Iterables that nest too deep are considered long. - if level >= len(self.maxcollection): - return True - - # It is too long if the length exceeds the limit, or any - # of its elements are long iterables. - if hasattr(obj, "__len__"): - try: - size = len(obj) - except Exception: - size = None - if size is not None and size > self.maxcollection[level]: - return True - return any( - (self._is_long_iter(item, level + 1) for item in obj) - ) # noqa - return any( - i > self.maxcollection[level] or self._is_long_iter(item, level + 1) - for i, item in enumerate(obj) - ) # noqa - - except Exception: - # If anything breaks, assume the worst case. - return True - - def _repr_iter(self, obj, level, prefix, suffix, comma_after_single_element=False): - yield prefix - - if level >= len(self.maxcollection): - yield "..." - else: - count = self.maxcollection[level] - yield_comma = False - for item in obj: - if yield_comma: - yield ", " - yield_comma = True - - count -= 1 - if count <= 0: - yield "..." - break - - for p in self._repr(item, 100 if item is obj else level + 1): - yield p - else: - if comma_after_single_element: - if count == self.maxcollection[level] - 1: - yield "," - yield suffix - - def _repr_long_iter(self, obj): - try: - length = hex(len(obj)) if self.convert_to_hex else len(obj) - obj_repr = "<%s, len() = %s>" % (type(obj).__name__, length) - except Exception: - try: - obj_repr = "<" + type(obj).__name__ + ">" - except Exception: - obj_repr = "" - yield obj_repr - - def _repr_dict( - self, obj, level, prefix, suffix, item_prefix, item_sep, item_suffix - ): - if not obj: - yield prefix + suffix - return - if level >= len(self.maxcollection): - yield prefix + "..." + suffix - return - - yield prefix - - count = self.maxcollection[level] - yield_comma = False - - try: - sorted_keys = sorted(obj) - except Exception: - sorted_keys = list(obj) - - for key in sorted_keys: - if yield_comma: - yield ", " - yield_comma = True - - count -= 1 - if count <= 0: - yield "..." - break - - yield item_prefix - for p in self._repr(key, level + 1): - yield p - - yield item_sep - - try: - item = obj[key] - except Exception: - yield "" - else: - for p in self._repr(item, 100 if item is obj else level + 1): - yield p - yield item_suffix - - yield suffix - - def _repr_str(self, obj, level): - return self._repr_obj(obj, level, self.maxstring_inner, self.maxstring_outer) - - def _repr_other(self, obj, level): - return self._repr_obj(obj, level, self.maxother_inner, self.maxother_outer) - - def _repr_obj(self, obj, level, limit_inner, limit_outer): - try: - if self.raw_value: - # For raw value retrieval, ignore all limits. - if isinstance(obj, bytes): - yield obj.decode("latin-1") - return - - try: - mv = memoryview(obj) - except Exception: - yield self._convert_to_unicode_or_bytes_repr(repr(obj)) - return - else: - # Map bytes to Unicode codepoints with same values. - yield mv.tobytes().decode("latin-1") - return - elif self.convert_to_hex and isinstance(obj, self.int_types): - obj_repr = hex(obj) - else: - obj_repr = repr(obj) - except Exception: - try: - obj_repr = object.__repr__(obj) - except Exception: - try: - obj_repr = ( - "" - ) # noqa - except Exception: - obj_repr = "" - - limit = limit_inner if level > 0 else limit_outer - - if limit >= len(obj_repr): - yield self._convert_to_unicode_or_bytes_repr(obj_repr) - return - - # Slightly imprecise calculations - we may end up with a string that is - # up to 3 characters longer than limit. If you need precise formatting, - # you are using the wrong class. - left_count, right_count = ( - max(1, int(2 * limit / 3)), - max(1, int(limit / 3)), - ) # noqa - - if VC_IS_PY2 and isinstance(obj_repr, bytes): - # If we can convert to unicode before slicing, that's better (but don't do - # it if it's not possible as we may be dealing with actual binary data). - - obj_repr = self._bytes_as_unicode_if_possible(obj_repr) - if isinstance(obj_repr, unicode): - # Deal with high-surrogate leftovers on Python 2. - try: - if left_count > 0 and unichr(0xD800) <= obj_repr[ - left_count - 1 - ] <= unichr(0xDBFF): - left_count -= 1 - except ValueError: - # On Jython unichr(0xD800) will throw an error: - # ValueError: unichr() arg is a lone surrogate in range (0xD800, 0xDFFF) (Jython UTF-16 encoding) - # Just ignore it in this case. - pass - - start = obj_repr[:left_count] - - # Note: yielding unicode is fine (it'll be properly converted to utf-8 if needed). - yield start - yield "..." - - # Deal with high-surrogate leftovers on Python 2. - try: - if right_count > 0 and unichr(0xD800) <= obj_repr[ - -right_count - 1 - ] <= unichr(0xDBFF): - right_count -= 1 - except ValueError: - # On Jython unichr(0xD800) will throw an error: - # ValueError: unichr() arg is a lone surrogate in range (0xD800, 0xDFFF) (Jython UTF-16 encoding) - # Just ignore it in this case. - pass - - yield obj_repr[-right_count:] - return - else: - # We can't decode it (binary string). Use repr() of bytes. - obj_repr = repr(obj_repr) - - yield obj_repr[:left_count] - yield "..." - yield obj_repr[-right_count:] - - def _convert_to_unicode_or_bytes_repr(self, obj_repr): - if VC_IS_PY2 and isinstance(obj_repr, bytes): - obj_repr = self._bytes_as_unicode_if_possible(obj_repr) - if isinstance(obj_repr, bytes): - # If we haven't been able to decode it this means it's some binary data - # we can't make sense of, so, we need its repr() -- otherwise json - # encoding may break later on. - obj_repr = repr(obj_repr) - return obj_repr - - def _bytes_as_unicode_if_possible(self, obj_repr): - # We try to decode with 3 possible encoding (sys.stdout.encoding, - # locale.getpreferredencoding() and 'utf-8). If no encoding can decode - # the input, we return the original bytes. - try_encodings = [] - encoding = self.sys_stdout_encoding or getattr(VC_sys.stdout, "encoding", "") - if encoding: - try_encodings.append(encoding.lower()) - - preferred_encoding = ( - self.locale_preferred_encoding or VC_locale.getpreferredencoding() - ) - if preferred_encoding: - preferred_encoding = preferred_encoding.lower() - if preferred_encoding not in try_encodings: - try_encodings.append(preferred_encoding) - - if "utf-8" not in try_encodings: - try_encodings.append("utf-8") - - for encoding in try_encodings: - try: - return obj_repr.decode(encoding) - except UnicodeDecodeError: - pass - - return obj_repr # Return the original version (in bytes) - - -# Query Jupyter server for the value of a variable -import json as _VSCODE_json - -_VSCODE_max_len = 200 -# In IJupyterVariables.getValue this '_VSCode_JupyterTestValue' will be replaced with the json stringified value of the target variable -# Indexes off of _VSCODE_targetVariable need to index types that are part of IJupyterVariable -_VSCODE_targetVariable = _VSCODE_json.loads("""_VSCode_JupyterTestValue""") - -_VSCODE_evalResult = eval(_VSCODE_targetVariable["name"]) - -# Find shape and count if available -if hasattr(_VSCODE_evalResult, "shape"): - try: - # Get a bit more restrictive with exactly what we want to count as a shape, since anything can define it - if isinstance(_VSCODE_evalResult.shape, tuple): - _VSCODE_shapeStr = str(_VSCODE_evalResult.shape) - if ( - len(_VSCODE_shapeStr) >= 3 - and _VSCODE_shapeStr[0] == "(" - and _VSCODE_shapeStr[-1] == ")" - and "," in _VSCODE_shapeStr - ): - _VSCODE_targetVariable["shape"] = _VSCODE_shapeStr - del _VSCODE_shapeStr - except TypeError: - pass - -if hasattr(_VSCODE_evalResult, "__len__"): - try: - _VSCODE_targetVariable["count"] = len(_VSCODE_evalResult) - except TypeError: - pass - -# Use SafeRepr to get our short string value -VC_sr = VC_SafeRepr() -_VSCODE_targetVariable["value"] = VC_sr(_VSCODE_evalResult) - -print(_VSCODE_json.dumps(_VSCODE_targetVariable)) - -del VC_locale -del VC_IS_PY2 -del VC_sys -del VC_SafeRepr -del VC_sr diff --git a/pythonFiles/datascience/getServerInfo.py b/pythonFiles/datascience/getServerInfo.py deleted file mode 100644 index 8b92600f7847..000000000000 --- a/pythonFiles/datascience/getServerInfo.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -try: - from notebook.notebookapp import list_running_servers - import json - - server_list = list_running_servers() - - server_info_list = [] - - for si in server_list: - server_info_object = {} - server_info_object["base_url"] = si["base_url"] - server_info_object["notebook_dir"] = si["notebook_dir"] - server_info_object["hostname"] = si["hostname"] - server_info_object["password"] = si["password"] - server_info_object["pid"] = si["pid"] - server_info_object["port"] = si["port"] - server_info_object["secure"] = si["secure"] - server_info_object["token"] = si["token"] - server_info_object["url"] = si["url"] - server_info_list.append(server_info_object) - - print(json.dumps(server_info_list)) -except Exception: - import subprocess - import sys - - result = subprocess.run( - ["jupyter", "notebook", "list", "--jsonlist"], capture_output=True - ) - encoding = os.getenv("PYTHONIOENCODING", "utf-8") - print(result.stdout.decode(encoding)) diff --git a/pythonFiles/datascience/jupyter_daemon.py b/pythonFiles/datascience/jupyter_daemon.py deleted file mode 100644 index be51abab85b8..000000000000 --- a/pythonFiles/datascience/jupyter_daemon.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import json -import logging -import os -import subprocess -import sys -from datascience.daemon.daemon_python import ( - error_decorator, - PythonDaemon as BasePythonDaemon, - change_exec_context, -) - - -class PythonDaemon(BasePythonDaemon): - def __init__(self, rx, tx): - super().__init__(rx, tx) - self.log.info("DataScience Daemon init") - - def __getitem__(self, item): - """Override getitem to ensure we use these methods.""" - self.log.info("Execute rpc method %s in DS Daemon", item) - return super().__getitem__(item) - - @error_decorator - def m_exec_module(self, module_name, args=[], cwd=None, env=None): - self.log.info("Exec in DS Daemon %s with args %s", module_name, args) - args = [] if args is None else args - - if module_name == "jupyter": - if args[0] == "kernelspec" and self._is_module_installed( - "jupyter_client.kernelspec" - ): - if args == ["kernelspec", "list", "--json"]: - return self._execute_and_capture_output( - self._print_kernel_list_json - ) - elif args == ["kernelspec", "list"]: - return self._execute_and_capture_output(self._print_kernel_list) - elif args == ["kernelspec", "--version"]: - return self._execute_and_capture_output( - self._print_kernelspec_version - ) - if ( - args[0] == "nbconvert" - and self._is_module_installed("nbconvert") - and args[-1] != "--version" - ): - return self._execute_and_capture_output(lambda: self._convert(args)) - if args[0] == "notebook" and args[1] == "--version": - try: - from notebook import notebookapp as app - - return {"stdout": ".".join(list(str(v) for v in app.version_info))} - except Exception: - pass - # kernelspec, nbconvert are subcommands of jupyter. - # python -m jupyter kernelspec, python -m jupyter nbconvert, - # In such cases, even if the modules kernelspec or nbconvert are not installed in the current - # environment, jupyter will find them in current path. - # So if we cannot find the corresponding subcommands, lets revert to subprocess. - self.log.info( - "Exec in DS Daemon with as subprocess, %s with args %s", - module_name, - args, - ) - return self._exec_with_subprocess(module_name, args, cwd, env) - else: - self.log.info("check base class stuff") - return super().m_exec_module(module_name, args, cwd, env) - - def _exec_with_subprocess(self, module_name, args=[], cwd=None, env=None): - # # result = subprocess.run([sys.executable, "-m"] + args, stdout=sys.stdout, stderr=sys.stderr) - # return self._execute_and_capture_output(lambda: subprocess.run([sys.executable, "-m", module_name] + args, stdout=sys.stdout, stderr=sys.stderr)) - result = subprocess.run( - [sys.executable, "-m", module_name] + args, capture_output=True - ) - encoding = os.getenv("PYTHONIOENCODING", "utf-8") - stdout = result.stdout.decode(encoding) - stderr = result.stderr.decode(encoding) - self.log.info( - "subprocess output for, %s with args %s, \nstdout is %s, \nstderr is %s", - module_name, - args, - stdout, - stderr, - ) - return {"stdout": stdout, "stderr": stderr} - - @error_decorator - def m_exec_module_observable(self, module_name, args=None, cwd=None, env=None): - self.log.info( - "Exec in DS Daemon (observable) %s with args %s", module_name, args - ) - args = [] if args is None else args - - # Assumption is that `python -m jupyter notebook` or `python -m notebook` with observable output - # will only ever be used to start a notebook and nothing else. - # E.g. `python -m jupyter notebook --version` wouldn't require the use of exec_module_observable, - # In such cases, we can get the output immediately. - if (module_name == "jupyter" and args[0] == "notebook") or ( - module_name == "notebook" - ): - self._start_notebook(args, cwd, env) - else: - return super().m_exec_module_observable(module_name, args, cwd, env) - - def _print_kernelspec_version(self): - import jupyter_client - - # Check whether kernelspec module exists. - import jupyter_client.kernelspec - - sys.stdout.write(jupyter_client.__version__) - sys.stdout.flush() - - def _print_kernel_list(self): - self.log.info("listing kernels") - # Get kernel specs. - import jupyter_client.kernelspec - - specs = jupyter_client.kernelspec.find_kernel_specs() - sys.stdout.write( - os.linesep.join(list("{0} {1}".format(k, v) for k, v in specs.items())) - ) - sys.stdout.flush() - - def _print_kernel_list_json(self): - self.log.info("listing kernels as json") - # Get kernel specs. - import jupyter_client.kernelspec - - specs = jupyter_client.kernelspec.KernelSpecManager().get_all_specs() - all_specs = {"kernelspecs": specs} - sys.stdout.write(json.dumps(all_specs)) - sys.stdout.flush() - - def _convert(self, args): - self.log.info("nbconvert") - from nbconvert import nbconvertapp as app - - sys.argv = [""] + args - app.main() - - def _start_notebook(self, args, cwd, env): - from notebook import notebookapp as app - - # Args must not have ['notebook'] in the begining. Drop the `notebook` subcommand when using `jupyter` - args = args[1:] if args[0] == "notebook" else args - self.log.info("Starting notebook with args %s", args) - - # When launching notebook always ensure the first argument is `notebook`. - with change_exec_context(args, cwd, env): - app.launch_new_instance() diff --git a/pythonFiles/datascience/jupyter_nbInstalled.py b/pythonFiles/datascience/jupyter_nbInstalled.py deleted file mode 100644 index a56562c61be8..000000000000 --- a/pythonFiles/datascience/jupyter_nbInstalled.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -try: - from notebook import notebookapp as app - - print("Available") -except Exception: - print("No") diff --git a/pythonFiles/install_ptvsd.py b/pythonFiles/install_ptvsd.py deleted file mode 100644 index 52c8b66212c0..000000000000 --- a/pythonFiles/install_ptvsd.py +++ /dev/null @@ -1,65 +0,0 @@ -import io -import json -import os -import urllib.request as url_lib -import zipfile -from packaging.version import parse as version_parser - - -EXTENSION_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -DEBUGGER_DEST = os.path.join( - EXTENSION_ROOT, "pythonFiles", "lib", "python", "new_ptvsd", "wheels" -) -DEBUGGER_PACKAGE = "ptvsd" -DEBUGGER_PYTHON_VERSIONS = ("cp37",) - - -def _contains(s, parts=()): - return any(p for p in parts if p in s) - - -def _get_package_data(): - json_uri = "https://pypi.org/pypi/{0}/json".format(DEBUGGER_PACKAGE) - # Response format: https://warehouse.readthedocs.io/api-reference/json/#project - # Release metadata format: https://github.com/pypa/interoperability-peps/blob/master/pep-0426-core-metadata.rst - with url_lib.urlopen(json_uri) as response: - return json.loads(response.read()) - - -def _get_debugger_wheel_urls(data, version): - return list( - r["url"] - for r in data["releases"][version] - if _contains(r["url"], DEBUGGER_PYTHON_VERSIONS) - ) - - -def _download_and_extract(root, url, version): - root = os.getcwd() if root is None or root == "." else root - prefix = os.path.join("ptvsd-{0}.data".format(version), "purelib") - with url_lib.urlopen(url) as response: - # Extract only the contents of the purelib subfolder (parent folder of ptvsd), - # since ptvsd files rely on the presence of a 'ptvsd' folder. - with zipfile.ZipFile(io.BytesIO(response.read()), "r") as wheel: - for zip_info in wheel.infolist(): - # Ignore dist info since we are merging multiple wheels - if ".dist-info" in zip_info.filename: - continue - # Normalize path for Windows, the wheel folder structure - # uses forward slashes. - normalized = os.path.normpath(zip_info.filename) - # Flatten the folder structure. - zip_info.filename = normalized.split(prefix)[-1] - wheel.extract(zip_info, root) - - -def main(root): - data = _get_package_data() - latest_version = max(data["releases"].keys(), key=version_parser) - - for url in _get_debugger_wheel_urls(data, latest_version): - _download_and_extract(root, url, latest_version) - - -if __name__ == "__main__": - main(DEBUGGER_DEST) diff --git a/pythonFiles/interpreterInfo.py b/pythonFiles/interpreterInfo.py deleted file mode 100644 index 9719a534345c..000000000000 --- a/pythonFiles/interpreterInfo.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import json -import sys - -obj = {} -obj["versionInfo"] = sys.version_info[:4] -obj["sysPrefix"] = sys.prefix -obj["version"] = sys.version -obj["is64Bit"] = sys.maxsize > 2 ** 32 - -print(json.dumps(obj)) diff --git a/pythonFiles/normalizeForInterpreter.py b/pythonFiles/normalizeForInterpreter.py deleted file mode 100644 index 34b31d56b398..000000000000 --- a/pythonFiles/normalizeForInterpreter.py +++ /dev/null @@ -1,154 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import ast -import io -import operator -import os -import sys -import textwrap -import token -import tokenize - - -class Visitor(ast.NodeVisitor): - def __init__(self, lines): - self._lines = lines - self.line_numbers_with_nodes = set() - self.line_numbers_with_statements = [] - - def generic_visit(self, node): - if ( - hasattr(node, "col_offset") - and hasattr(node, "lineno") - and node.col_offset == 0 - ): - self.line_numbers_with_nodes.add(node.lineno) - if isinstance(node, ast.stmt): - self.line_numbers_with_statements.append(node.lineno) - - ast.NodeVisitor.generic_visit(self, node) - - -def _tokenize(source): - """Tokenize Python source code.""" - # Using an undocumented API as the documented one in Python 2.7 does not work as needed - # cross-version. - if sys.version_info < (3,) and isinstance(source, str): - source = source.decode() - return tokenize.generate_tokens(io.StringIO(source).readline) - - -def _indent_size(line): - for index, char in enumerate(line): - if not char.isspace(): - return index - - -def _get_global_statement_blocks(source, lines): - """Return a list of all global statement blocks. - - The list comprises of 3-item tuples that contain the starting line number, - ending line number and whether the statement is a single line. - - """ - tree = ast.parse(source) - visitor = Visitor(lines) - visitor.visit(tree) - - statement_ranges = [] - for index, line_number in enumerate(visitor.line_numbers_with_statements): - remaining_line_numbers = visitor.line_numbers_with_statements[index + 1 :] - end_line_number = ( - len(lines) - if len(remaining_line_numbers) == 0 - else min(remaining_line_numbers) - 1 - ) - current_statement_is_oneline = line_number == end_line_number - - if len(statement_ranges) == 0: - statement_ranges.append( - (line_number, end_line_number, current_statement_is_oneline) - ) - continue - - previous_statement = statement_ranges[-1] - previous_statement_is_oneline = previous_statement[2] - if previous_statement_is_oneline and current_statement_is_oneline: - statement_ranges[-1] = previous_statement[0], end_line_number, True - else: - statement_ranges.append( - (line_number, end_line_number, current_statement_is_oneline) - ) - - return statement_ranges - - -def normalize_lines(source): - """Normalize blank lines for sending to the terminal. - - Blank lines within a statement block are removed to prevent the REPL - from thinking the block is finished. Newlines are added to separate - top-level statements so that the REPL does not think there is a syntax - error. - - """ - # Ensure to dedent the code (#2837) - lines = textwrap.dedent(source).splitlines(False) - # If we have two blank lines, then add two blank lines. - # Do not trim the spaces, if we have blank lines with spaces, its possible - # we have indented code. - if (len(lines) > 1 and len("".join(lines[-2:])) == 0) or source.endswith( - ("\n\n", "\r\n\r\n") - ): - trailing_newline = "\n" * 2 - # Find out if we have any trailing blank lines - elif len(lines[-1].strip()) == 0 or source.endswith(("\n", "\r\n")): - trailing_newline = "\n" - else: - trailing_newline = "" - - # Step 1: Remove empty lines. - tokens = _tokenize(source) - newlines_indexes_to_remove = ( - spos[0] - for (toknum, tokval, spos, epos, line) in tokens - if len(line.strip()) == 0 - and token.tok_name[toknum] == "NL" - and spos[0] == epos[0] - ) - - for line_number in reversed(list(newlines_indexes_to_remove)): - del lines[line_number - 1] - - # Step 2: Add blank lines between each global statement block. - # A consecutive single lines blocks of code will be treated as a single statement, - # just to ensure we do not unnecessarily add too many blank lines. - source = "\n".join(lines) - tokens = _tokenize(source) - dedent_indexes = ( - spos[0] - for (toknum, tokval, spos, epos, line) in tokens - if toknum == token.DEDENT and _indent_size(line) == 0 - ) - - global_statement_ranges = _get_global_statement_blocks(source, lines) - start_positions = map(operator.itemgetter(0), reversed(global_statement_ranges)) - for line_number in filter(lambda x: x > 1, start_positions): - lines.insert(line_number - 1, "") - - sys.stdout.write("\n".join(lines) + trailing_newline) - sys.stdout.flush() - - -if __name__ == "__main__": - contents = sys.argv[1] - try: - default_encoding = sys.getdefaultencoding() - encoded_contents = contents.encode(default_encoding, "surrogateescape") - contents = encoded_contents.decode(default_encoding, "replace") - except (UnicodeError, LookupError): - pass - if isinstance(contents, bytes): - contents = contents.decode("utf8") - normalize_lines(contents) diff --git a/pythonFiles/printEnvVariablesToFile.py b/pythonFiles/printEnvVariablesToFile.py deleted file mode 100644 index be966bcac28c..000000000000 --- a/pythonFiles/printEnvVariablesToFile.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import json -import sys - - -# Last argument is the target file into which we'll write the env variables as json. -json_file = sys.argv[-1] - -with open(json_file, "w") as outfile: - json.dump(dict(os.environ), outfile) diff --git a/pythonFiles/ptvsd_launcher.py b/pythonFiles/ptvsd_launcher.py deleted file mode 100644 index f5da46d936d8..000000000000 --- a/pythonFiles/ptvsd_launcher.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import os.path -import sys -import traceback - -useCustomPtvsd = sys.argv[1] == "--custom" -ptvsdArgs = sys.argv[:] -ptvsdArgs.pop(1) - -# Load the debugger package -try: - ptvsd_lib_path = os.path.join( - os.path.dirname(__file__), "lib", "python", "old_ptvsd" - ) - if useCustomPtvsd: - sys.path.append(ptvsd_lib_path) - else: - sys.path.insert(0, ptvsd_lib_path) - try: - import ptvsd - from ptvsd.__main__ import main - - ptvsd_loaded = True - except ImportError: - ptvsd_loaded = False - raise -except: - traceback.print_exc() - print( - """ -Internal error detected. Please copy the above traceback and report at -https://github.com/Microsoft/vscode-python/issues/new - -Press Enter to close. . .""" - ) - try: - raw_input() - except NameError: - input() - sys.exit(1) -finally: - if ptvsd_lib_path: - sys.path.remove(ptvsd_lib_path) - -main(ptvsdArgs) diff --git a/pythonFiles/pyproject.toml b/pythonFiles/pyproject.toml deleted file mode 100644 index 52c7c96d11e7..000000000000 --- a/pythonFiles/pyproject.toml +++ /dev/null @@ -1,11 +0,0 @@ -[tool.black] -exclude = ''' - -( - /( - .data - | .vscode - | lib - )/ -) -''' diff --git a/pythonFiles/refactor.py b/pythonFiles/refactor.py deleted file mode 100644 index b62802ce2c53..000000000000 --- a/pythonFiles/refactor.py +++ /dev/null @@ -1,397 +0,0 @@ -# Arguments are: -# 1. Working directory. -# 2. Rope folder - -import difflib -import io -import json -import os -import sys -import traceback - -try: - import rope - from rope.base import libutils - from rope.refactor.rename import Rename - from rope.refactor.extract import ExtractMethod, ExtractVariable - import rope.base.project - import rope.base.taskhandle -except: - jsonMessage = { - "error": True, - "message": "Rope not installed", - "traceback": "", - "type": "ModuleNotFoundError", - } - sys.stderr.write(json.dumps(jsonMessage)) - sys.stderr.flush() - -WORKSPACE_ROOT = sys.argv[1] -ROPE_PROJECT_FOLDER = ".vscode/.ropeproject" - - -class RefactorProgress: - """ - Refactor progress information - """ - - def __init__(self, name="Task Name", message=None, percent=0): - self.name = name - self.message = message - self.percent = percent - - -class ChangeType: - """ - Change Type Enum - """ - - EDIT = 0 - NEW = 1 - DELETE = 2 - - -class Change: - """ - """ - - EDIT = 0 - NEW = 1 - DELETE = 2 - - def __init__(self, filePath, fileMode=ChangeType.EDIT, diff=""): - self.filePath = filePath - self.diff = diff - self.fileMode = fileMode - - -def get_diff(changeset): - """This is a copy of the code form the ChangeSet.get_description method found in Rope.""" - new = changeset.new_contents - old = changeset.old_contents - if old is None: - if changeset.resource.exists(): - old = changeset.resource.read() - else: - old = "" - - # Ensure code has a trailing empty lines, before generating a diff. - # https://github.com/Microsoft/vscode-python/issues/695. - old_lines = old.splitlines(True) - if not old_lines[-1].endswith("\n"): - old_lines[-1] = old_lines[-1] + os.linesep - new = new + os.linesep - - result = difflib.unified_diff( - old_lines, - new.splitlines(True), - "a/" + changeset.resource.path, - "b/" + changeset.resource.path, - ) - return "".join(list(result)) - - -class BaseRefactoring(object): - """ - Base class for refactorings - """ - - def __init__(self, project, resource, name="Refactor", progressCallback=None): - self._progressCallback = progressCallback - self._handle = rope.base.taskhandle.TaskHandle(name) - self._handle.add_observer(self._update_progress) - self.project = project - self.resource = resource - self.changes = [] - - def _update_progress(self): - jobset = self._handle.current_jobset() - if jobset and not self._progressCallback is None: - progress = RefactorProgress() - # getting current job set name - if jobset.get_name() is not None: - progress.name = jobset.get_name() - # getting active job name - if jobset.get_active_job_name() is not None: - progress.message = jobset.get_active_job_name() - # adding done percent - percent = jobset.get_percent_done() - if percent is not None: - progress.percent = percent - if not self._progressCallback is None: - self._progressCallback(progress) - - def stop(self): - self._handle.stop() - - def refactor(self): - try: - self.onRefactor() - except rope.base.exceptions.InterruptedTaskError: - # we can ignore this exception, as user has cancelled refactoring - pass - - def onRefactor(self): - """ - To be implemented by each base class - """ - pass - - -class RenameRefactor(BaseRefactoring): - def __init__( - self, - project, - resource, - name="Rename", - progressCallback=None, - startOffset=None, - newName="new_Name", - ): - BaseRefactoring.__init__(self, project, resource, name, progressCallback) - self._newName = newName - self.startOffset = startOffset - - def onRefactor(self): - renamed = Rename(self.project, self.resource, self.startOffset) - changes = renamed.get_changes(self._newName, task_handle=self._handle) - for item in changes.changes: - if isinstance(item, rope.base.change.ChangeContents): - self.changes.append( - Change(item.resource.real_path, ChangeType.EDIT, get_diff(item)) - ) - else: - raise Exception("Unknown Change") - - -class ExtractVariableRefactor(BaseRefactoring): - def __init__( - self, - project, - resource, - name="Extract Variable", - progressCallback=None, - startOffset=None, - endOffset=None, - newName="new_Name", - similar=False, - global_=False, - ): - BaseRefactoring.__init__(self, project, resource, name, progressCallback) - self._newName = newName - self._startOffset = startOffset - self._endOffset = endOffset - self._similar = similar - self._global = global_ - - def onRefactor(self): - renamed = ExtractVariable( - self.project, self.resource, self._startOffset, self._endOffset - ) - changes = renamed.get_changes(self._newName, self._similar, self._global) - for item in changes.changes: - if isinstance(item, rope.base.change.ChangeContents): - self.changes.append( - Change(item.resource.real_path, ChangeType.EDIT, get_diff(item)) - ) - else: - raise Exception("Unknown Change") - - -class ExtractMethodRefactor(ExtractVariableRefactor): - def __init__( - self, - project, - resource, - name="Extract Method", - progressCallback=None, - startOffset=None, - endOffset=None, - newName="new_Name", - similar=False, - global_=False, - ): - ExtractVariableRefactor.__init__( - self, - project, - resource, - name, - progressCallback, - startOffset=startOffset, - endOffset=endOffset, - newName=newName, - similar=similar, - global_=global_, - ) - - def onRefactor(self): - renamed = ExtractMethod( - self.project, self.resource, self._startOffset, self._endOffset - ) - changes = renamed.get_changes(self._newName, self._similar, self._global) - for item in changes.changes: - if isinstance(item, rope.base.change.ChangeContents): - self.changes.append( - Change(item.resource.real_path, ChangeType.EDIT, get_diff(item)) - ) - else: - raise Exception("Unknown Change") - - -class RopeRefactoring(object): - def __init__(self): - self.default_sys_path = sys.path - self._input = io.open(sys.stdin.fileno(), encoding="utf-8") - - def _rename(self, filePath, start, newName, indent_size): - """ - Renames a variable - """ - project = rope.base.project.Project( - WORKSPACE_ROOT, - ropefolder=ROPE_PROJECT_FOLDER, - save_history=False, - indent_size=indent_size, - ) - resourceToRefactor = libutils.path_to_resource(project, filePath) - refactor = RenameRefactor( - project, resourceToRefactor, startOffset=start, newName=newName - ) - refactor.refactor() - changes = refactor.changes - project.close() - valueToReturn = [] - for change in changes: - valueToReturn.append({"diff": change.diff}) - return valueToReturn - - def _extractVariable(self, filePath, start, end, newName, indent_size): - """ - Extracts a variable - """ - project = rope.base.project.Project( - WORKSPACE_ROOT, - ropefolder=ROPE_PROJECT_FOLDER, - save_history=False, - indent_size=indent_size, - ) - resourceToRefactor = libutils.path_to_resource(project, filePath) - refactor = ExtractVariableRefactor( - project, - resourceToRefactor, - startOffset=start, - endOffset=end, - newName=newName, - similar=True, - ) - refactor.refactor() - changes = refactor.changes - project.close() - valueToReturn = [] - for change in changes: - valueToReturn.append({"diff": change.diff}) - return valueToReturn - - def _extractMethod(self, filePath, start, end, newName, indent_size): - """ - Extracts a method - """ - project = rope.base.project.Project( - WORKSPACE_ROOT, - ropefolder=ROPE_PROJECT_FOLDER, - save_history=False, - indent_size=indent_size, - ) - resourceToRefactor = libutils.path_to_resource(project, filePath) - refactor = ExtractMethodRefactor( - project, - resourceToRefactor, - startOffset=start, - endOffset=end, - newName=newName, - similar=True, - ) - refactor.refactor() - changes = refactor.changes - project.close() - valueToReturn = [] - for change in changes: - valueToReturn.append({"diff": change.diff}) - return valueToReturn - - def _serialize(self, identifier, results): - """ - Serializes the refactor results - """ - return json.dumps({"id": identifier, "results": results}) - - def _deserialize(self, request): - """Deserialize request from VSCode. - - Args: - request: String with raw request from VSCode. - - Returns: - Python dictionary with request data. - """ - return json.loads(request) - - def _process_request(self, request): - """Accept serialized request from VSCode and write response. - """ - request = self._deserialize(request) - lookup = request.get("lookup", "") - - if lookup == "": - pass - elif lookup == "rename": - changes = self._rename( - request["file"], - int(request["start"]), - request["name"], - int(request["indent_size"]), - ) - return self._write_response(self._serialize(request["id"], changes)) - elif lookup == "extract_variable": - changes = self._extractVariable( - request["file"], - int(request["start"]), - int(request["end"]), - request["name"], - int(request["indent_size"]), - ) - return self._write_response(self._serialize(request["id"], changes)) - elif lookup == "extract_method": - changes = self._extractMethod( - request["file"], - int(request["start"]), - int(request["end"]), - request["name"], - int(request["indent_size"]), - ) - return self._write_response(self._serialize(request["id"], changes)) - - def _write_response(self, response): - sys.stdout.write(response + "\n") - sys.stdout.flush() - - def watch(self): - self._write_response("STARTED") - while True: - try: - self._process_request(self._input.readline()) - except: - exc_type, exc_value, exc_tb = sys.exc_info() - tb_info = traceback.extract_tb(exc_tb) - jsonMessage = { - "error": True, - "message": str(exc_value), - "traceback": str(tb_info), - "type": str(exc_type), - } - sys.stderr.write(json.dumps(jsonMessage)) - sys.stderr.flush() - - -if __name__ == "__main__": - RopeRefactoring().watch() diff --git a/pythonFiles/sortImports.py b/pythonFiles/sortImports.py deleted file mode 100644 index 666827118d37..000000000000 --- a/pythonFiles/sortImports.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import os.path -import sys - -isort_path = os.path.join(os.path.dirname(__file__), "lib", "python") -sys.path.insert(0, isort_path) - -import isort.main - -isort.main.main() diff --git a/pythonFiles/symbolProvider.py b/pythonFiles/symbolProvider.py deleted file mode 100644 index 033ce4b99900..000000000000 --- a/pythonFiles/symbolProvider.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import ast -import json -import sys - - -class Visitor(ast.NodeVisitor): - def __init__(self): - self.symbols = {"classes": [], "methods": [], "functions": []} - - def visit_Module(self, node): - self.visitChildren(node) - - def visitChildren(self, node, namespace=""): - for child in node.body: - if isinstance(child, ast.FunctionDef): - self.visitDef(child, namespace) - if isinstance(child, ast.ClassDef): - self.visitClassDef(child, namespace) - try: - if isinstance(child, ast.AsyncFunctionDef): - self.visitDef(child, namespace) - except Exception: - pass - - def visitDef(self, node, namespace=""): - end_position = self.getEndPosition(node) - symbol = "functions" if namespace == "" else "methods" - self.symbols[symbol].append(self.getDataObject(node, namespace)) - - def visitClassDef(self, node, namespace=""): - end_position = self.getEndPosition(node) - self.symbols["classes"].append(self.getDataObject(node, namespace)) - - if len(namespace) > 0: - namespace = "{0}::{1}".format(namespace, node.name) - else: - namespace = node.name - self.visitChildren(node, namespace) - - def getDataObject(self, node, namespace=""): - end_position = self.getEndPosition(node) - return { - "namespace": namespace, - "name": node.name, - "range": { - "start": {"line": node.lineno - 1, "character": node.col_offset}, - "end": {"line": end_position[0], "character": end_position[1]}, - }, - } - - def getEndPosition(self, node): - if not hasattr(node, "body") or len(node.body) == 0: - return (node.lineno - 1, node.col_offset) - return self.getEndPosition(node.body[-1]) - - -def provide_symbols(source): - """Provides a list of all symbols in provided code. - - The list comprises of 3-item tuples that contain the starting line number, - ending line number and whether the statement is a single line. - - """ - tree = ast.parse(source) - visitor = Visitor() - visitor.visit(tree) - sys.stdout.write(json.dumps(visitor.symbols)) - sys.stdout.flush() - - -if __name__ == "__main__": - if len(sys.argv) == 3: - contents = sys.argv[2] - else: - with open(sys.argv[1], "r") as source: - contents = source.read() - - try: - default_encoding = sys.getdefaultencoding() - encoded_contents = contents.encode(default_encoding, "surrogateescape") - contents = encoded_contents.decode(default_encoding, "replace") - except (UnicodeError, LookupError): - pass - if isinstance(contents, bytes): - contents = contents.decode("utf8") - provide_symbols(contents) diff --git a/pythonFiles/testing_tools/adapter/__main__.py b/pythonFiles/testing_tools/adapter/__main__.py deleted file mode 100644 index 2f17c6e50a61..000000000000 --- a/pythonFiles/testing_tools/adapter/__main__.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import - -import argparse -import sys - -from . import pytest, report -from .errors import UnsupportedToolError, UnsupportedCommandError - - -TOOLS = { - "pytest": { - "_add_subparser": pytest.add_cli_subparser, - "discover": pytest.discover, - }, -} -REPORTERS = { - "discover": report.report_discovered, -} - - -def parse_args( - # the args to parse - argv=sys.argv[1:], - # the program name - prog=sys.argv[0], -): - """ - Return the subcommand & tool to run, along with its args. - - This defines the standard CLI for the different testing frameworks. - """ - parser = argparse.ArgumentParser( - description="Run Python testing operations.", - prog=prog, - # ... - ) - cmdsubs = parser.add_subparsers(dest="cmd") - - # Add "run" and "debug" subcommands when ready. - for cmdname in ["discover"]: - sub = cmdsubs.add_parser(cmdname) - subsubs = sub.add_subparsers(dest="tool") - for toolname in sorted(TOOLS): - try: - add_subparser = TOOLS[toolname]["_add_subparser"] - except KeyError: - continue - subsub = add_subparser(cmdname, toolname, subsubs) - if cmdname == "discover": - subsub.add_argument("--simple", action="store_true") - subsub.add_argument( - "--no-hide-stdio", dest="hidestdio", action="store_false" - ) - subsub.add_argument("--pretty", action="store_true") - - # Parse the args! - if "--" in argv: - seppos = argv.index("--") - toolargs = argv[seppos + 1 :] - argv = argv[:seppos] - else: - toolargs = [] - args = parser.parse_args(argv) - ns = vars(args) - - cmd = ns.pop("cmd") - if not cmd: - parser.error("missing command") - - tool = ns.pop("tool") - if not tool: - parser.error("missing tool") - - return tool, cmd, ns, toolargs - - -def main( - toolname, - cmdname, - subargs, - toolargs, - # internal args (for testing): - _tools=TOOLS, - _reporters=REPORTERS, -): - try: - tool = _tools[toolname] - except KeyError: - raise UnsupportedToolError(toolname) - - try: - run = tool[cmdname] - report_result = _reporters[cmdname] - except KeyError: - raise UnsupportedCommandError(cmdname) - - parents, result = run(toolargs, **subargs) - report_result(result, parents, **subargs) - - -if __name__ == "__main__": - tool, cmd, subargs, toolargs = parse_args() - main(tool, cmd, subargs, toolargs) diff --git a/pythonFiles/testing_tools/adapter/discovery.py b/pythonFiles/testing_tools/adapter/discovery.py deleted file mode 100644 index 798aea1e93f1..000000000000 --- a/pythonFiles/testing_tools/adapter/discovery.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import, print_function - -import re - -from .util import fix_fileid, DIRNAME, NORMCASE -from .info import ParentInfo - - -FILE_ID_RE = re.compile( - r""" - ^ - (?: - ( .* [.] (?: py | txt ) \b ) # .txt for doctest files - ( [^.] .* )? - ) - $ - """, - re.VERBOSE, -) - - -def fix_nodeid( - nodeid, - kind, - rootdir=None, - # *, - _fix_fileid=fix_fileid, -): - if not nodeid: - raise ValueError("missing nodeid") - if nodeid == ".": - return nodeid - - fileid = nodeid - remainder = "" - if kind not in ("folder", "file"): - m = FILE_ID_RE.match(nodeid) - if m: - fileid, remainder = m.groups() - elif len(nodeid) > 1: - fileid = nodeid[:2] - remainder = nodeid[2:] - fileid = _fix_fileid(fileid, rootdir) - return fileid + (remainder or "") - - -class DiscoveredTests(object): - """A container for the discovered tests and their parents.""" - - def __init__(self): - self.reset() - - def __len__(self): - return len(self._tests) - - def __getitem__(self, index): - return self._tests[index] - - @property - def parents(self): - return sorted( - self._parents.values(), - # Sort by (name, id). - key=lambda p: (NORMCASE(p.root or p.name), p.id), - ) - - def reset(self): - """Clear out any previously discovered tests.""" - self._parents = {} - self._tests = [] - - def add_test(self, test, parents): - """Add the given test and its parents.""" - parentid = self._ensure_parent(test.path, parents) - # Updating the parent ID and the test ID aren't necessary if the - # provided test and parents (from the test collector) are - # properly generated. However, we play it safe here. - test = test._replace( - # Clean up the ID. - id=fix_nodeid(test.id, "test", test.path.root), - parentid=parentid, - ) - self._tests.append(test) - - def _ensure_parent( - self, - path, - parents, - # *, - _dirname=DIRNAME, - ): - rootdir = path.root - relpath = path.relfile - - _parents = iter(parents) - nodeid, name, kind = next(_parents) - # As in add_test(), the node ID *should* already be correct. - nodeid = fix_nodeid(nodeid, kind, rootdir) - _parentid = nodeid - for parentid, parentname, parentkind in _parents: - # As in add_test(), the parent ID *should* already be correct. - parentid = fix_nodeid(parentid, kind, rootdir) - if kind in ("folder", "file"): - info = ParentInfo(nodeid, kind, name, rootdir, relpath, parentid) - relpath = _dirname(relpath) - else: - info = ParentInfo(nodeid, kind, name, rootdir, None, parentid) - self._parents[(rootdir, nodeid)] = info - nodeid, name, kind = parentid, parentname, parentkind - assert nodeid == "." - info = ParentInfo(nodeid, kind, name=rootdir) - self._parents[(rootdir, nodeid)] = info - - return _parentid diff --git a/pythonFiles/testing_tools/adapter/errors.py b/pythonFiles/testing_tools/adapter/errors.py deleted file mode 100644 index 3e6ae5189cb8..000000000000 --- a/pythonFiles/testing_tools/adapter/errors.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -class UnsupportedToolError(ValueError): - def __init__(self, tool): - msg = "unsupported tool {!r}".format(tool) - super(UnsupportedToolError, self).__init__(msg) - self.tool = tool - - -class UnsupportedCommandError(ValueError): - def __init__(self, cmd): - msg = "unsupported cmd {!r}".format(cmd) - super(UnsupportedCommandError, self).__init__(msg) - self.cmd = cmd diff --git a/pythonFiles/testing_tools/adapter/info.py b/pythonFiles/testing_tools/adapter/info.py deleted file mode 100644 index f4ab602d8f18..000000000000 --- a/pythonFiles/testing_tools/adapter/info.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from collections import namedtuple - - -class TestPath(namedtuple("TestPath", "root relfile func sub")): - """Where to find a single test.""" - - def __new__(cls, root, relfile, func, sub=None): - self = super(TestPath, cls).__new__( - cls, - str(root) if root else None, - str(relfile) if relfile else None, - str(func) if func else None, - [str(s) for s in sub] if sub else None, - ) - return self - - def __init__(self, *args, **kwargs): - if self.root is None: - raise TypeError("missing id") - if self.relfile is None: - raise TypeError("missing kind") - # self.func may be None (e.g. for doctests). - # self.sub may be None. - - -class ParentInfo(namedtuple("ParentInfo", "id kind name root relpath parentid")): - - KINDS = ("folder", "file", "suite", "function", "subtest") - - def __new__(cls, id, kind, name, root=None, relpath=None, parentid=None): - self = super(ParentInfo, cls).__new__( - cls, - id=str(id) if id else None, - kind=str(kind) if kind else None, - name=str(name) if name else None, - root=str(root) if root else None, - relpath=str(relpath) if relpath else None, - parentid=str(parentid) if parentid else None, - ) - return self - - def __init__(self, *args, **kwargs): - if self.id is None: - raise TypeError("missing id") - if self.kind is None: - raise TypeError("missing kind") - if self.kind not in self.KINDS: - raise ValueError("unsupported kind {!r}".format(self.kind)) - if self.name is None: - raise TypeError("missing name") - if self.root is None: - if self.parentid is not None or self.kind != "folder": - raise TypeError("missing root") - if self.relpath is not None: - raise TypeError("unexpected relpath {}".format(self.relpath)) - elif self.parentid is None: - raise TypeError("missing parentid") - elif self.relpath is None and self.kind in ("folder", "file"): - raise TypeError("missing relpath") - - -class TestInfo(namedtuple("TestInfo", "id name path source markers parentid kind")): - """Info for a single test.""" - - MARKERS = ("skip", "skip-if", "expected-failure") - KINDS = ("function", "doctest") - - def __new__(cls, id, name, path, source, markers, parentid, kind="function"): - self = super(TestInfo, cls).__new__( - cls, - str(id) if id else None, - str(name) if name else None, - path or None, - str(source) if source else None, - [str(marker) for marker in markers or ()], - str(parentid) if parentid else None, - str(kind) if kind else None, - ) - return self - - def __init__(self, *args, **kwargs): - if self.id is None: - raise TypeError("missing id") - if self.name is None: - raise TypeError("missing name") - if self.path is None: - raise TypeError("missing path") - if self.source is None: - raise TypeError("missing source") - else: - srcfile, _, lineno = self.source.rpartition(":") - if not srcfile or not lineno or int(lineno) < 0: - raise ValueError("bad source {!r}".format(self.source)) - if self.markers: - badmarkers = [m for m in self.markers if m not in self.MARKERS] - if badmarkers: - raise ValueError("unsupported markers {!r}".format(badmarkers)) - if self.parentid is None: - raise TypeError("missing parentid") - if self.kind is None: - raise TypeError("missing kind") - elif self.kind not in self.KINDS: - raise ValueError("unsupported kind {!r}".format(self.kind)) - - @property - def root(self): - return self.path.root - - @property - def srcfile(self): - return self.source.rpartition(":")[0] - - @property - def lineno(self): - return int(self.source.rpartition(":")[-1]) diff --git a/pythonFiles/testing_tools/adapter/pytest/__init__.py b/pythonFiles/testing_tools/adapter/pytest/__init__.py deleted file mode 100644 index e894f7bcdb8e..000000000000 --- a/pythonFiles/testing_tools/adapter/pytest/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import - -from ._cli import add_subparser as add_cli_subparser -from ._discovery import discover diff --git a/pythonFiles/testing_tools/adapter/pytest/_cli.py b/pythonFiles/testing_tools/adapter/pytest/_cli.py deleted file mode 100644 index 3d3eec09a199..000000000000 --- a/pythonFiles/testing_tools/adapter/pytest/_cli.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import - -from ..errors import UnsupportedCommandError - - -def add_subparser(cmd, name, parent): - """Add a new subparser to the given parent and add args to it.""" - parser = parent.add_parser(name) - if cmd == "discover": - # For now we don't have any tool-specific CLI options to add. - pass - else: - raise UnsupportedCommandError(cmd) - return parser diff --git a/pythonFiles/testing_tools/adapter/pytest/_discovery.py b/pythonFiles/testing_tools/adapter/pytest/_discovery.py deleted file mode 100644 index 51c94527302d..000000000000 --- a/pythonFiles/testing_tools/adapter/pytest/_discovery.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import, print_function - -import sys - -import pytest - -from .. import util, discovery -from ._pytest_item import parse_item - - -def discover( - pytestargs=None, - hidestdio=False, - # *, - _pytest_main=pytest.main, - _plugin=None, - **_ignored -): - """Return the results of test discovery.""" - if _plugin is None: - _plugin = TestCollector() - - pytestargs = _adjust_pytest_args(pytestargs) - # We use this helper rather than "-pno:terminal" due to possible - # platform-dependent issues. - with (util.hide_stdio() if hidestdio else util.noop_cm()) as stdio: - ec = _pytest_main(pytestargs, [_plugin]) - # See: https://docs.pytest.org/en/latest/usage.html#possible-exit-codes - if ec == 5: - # No tests were discovered. - pass - elif ec != 0: - print( - "equivalent command: {} -m pytest {}".format( - sys.executable, util.shlex_unsplit(pytestargs) - ) - ) - if hidestdio: - print(stdio.getvalue(), file=sys.stderr) - sys.stdout.flush() - raise Exception("pytest discovery failed (exit code {})".format(ec)) - if not _plugin._started: - print( - "equivalent command: {} -m pytest {}".format( - sys.executable, util.shlex_unsplit(pytestargs) - ) - ) - if hidestdio: - print(stdio.getvalue(), file=sys.stderr) - sys.stdout.flush() - raise Exception("pytest discovery did not start") - return ( - _plugin._tests.parents, - list(_plugin._tests), - ) - - -def _adjust_pytest_args(pytestargs): - """Return a corrected copy of the given pytest CLI args.""" - pytestargs = list(pytestargs) if pytestargs else [] - # Duplicate entries should be okay. - pytestargs.insert(0, "--collect-only") - # TODO: pull in code from: - # src/client/testing/pytest/services/discoveryService.ts - # src/client/testing/pytest/services/argsService.ts - return pytestargs - - -class TestCollector(object): - """This is a pytest plugin that collects the discovered tests.""" - - @classmethod - def parse_item(cls, item): - return parse_item(item) - - def __init__(self, tests=None): - if tests is None: - tests = discovery.DiscoveredTests() - self._tests = tests - self._started = False - - # Relevant plugin hooks: - # https://docs.pytest.org/en/latest/reference.html#collection-hooks - - def pytest_collection_modifyitems(self, session, config, items): - self._started = True - self._tests.reset() - for item in items: - test, parents = self.parse_item(item) - if test is not None: - self._tests.add_test(test, parents) - - # This hook is not specified in the docs, so we also provide - # the "modifyitems" hook just in case. - def pytest_collection_finish(self, session): - self._started = True - try: - items = session.items - except AttributeError: - # TODO: Is there an alternative? - return - self._tests.reset() - for item in items: - test, parents = self.parse_item(item) - if test is not None: - self._tests.add_test(test, parents) diff --git a/pythonFiles/testing_tools/adapter/pytest/_pytest_item.py b/pythonFiles/testing_tools/adapter/pytest/_pytest_item.py deleted file mode 100644 index 87e439e30c7e..000000000000 --- a/pythonFiles/testing_tools/adapter/pytest/_pytest_item.py +++ /dev/null @@ -1,604 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -""" -During "collection", pytest finds all the tests it supports. These are -called "items". The process is top-down, mostly tracing down through -the file system. Aside from its own machinery, pytest supports hooks -that find tests. Effectively, pytest starts with a set of "collectors"; -objects that can provide a list of tests and sub-collectors. All -collectors in the resulting tree are visited and the tests aggregated. -For the most part, each test's (and collector's) parent is identified -as the collector that collected it. - -Collectors and items are collectively identified as "nodes". The pytest -API relies on collector and item objects providing specific methods and -attributes. In addition to corresponding base classes, pytest provides -a number of concrete implementations. - -The following are the known pytest node types: - - Node - Collector - FSCollector - Session (the top-level collector) - File - Module - Package - DoctestTextfile - DoctestModule - PyCollector - (Module) - (...) - Class - UnitTestCase - Instance - Item - Function - TestCaseFunction - DoctestItem - -Here are the unique attrs for those classes: - - Node - name - nodeid (readonly) - config - session - (parent) - the parent node - (fspath) - the file from which the node was collected - ---- - own_marksers - explicit markers (e.g. with @pytest.mark()) - keywords - extra_keyword_matches - - Item - location - where the actual test source code is: (relfspath, lno, fullname) - user_properties - - PyCollector - module - class - instance - obj - - Function - module - class - instance - obj - function - (callspec) - (fixturenames) - funcargs - originalname - w/o decorations, e.g. [...] for parameterized - - DoctestItem - dtest - obj - -When parsing an item, we make use of the following attributes: - -* name -* nodeid -* __class__ - + __name__ -* fspath -* location -* function - + __name__ - + __code__ - + __closure__ -* own_markers -""" - -from __future__ import absolute_import, print_function - -import sys - -import pytest -import _pytest.doctest -import _pytest.unittest - -from ..info import TestInfo, TestPath -from ..util import fix_fileid, PATH_SEP, NORMCASE - - -def should_never_reach_here(item, **extra): - """Indicates a code path we should never reach.""" - print("The Python extension has run into an unexpected situation") - print("while processing a pytest node during test discovery. Please") - print("Please open an issue at:") - print(" https://github.com/microsoft/vscode-python/issues") - print("and paste the following output there.") - print() - for field, info in _summarize_item(item): - print("{}: {}".format(field, info)) - if extra: - print() - print("extra info:") - for name, info in extra.items(): - print("{:10}".format(name + ":"), end="") - if isinstance(info, str): - print(info) - else: - try: - print(*info) - except TypeError: - print(info) - print() - print("traceback:") - import traceback - - traceback.print_stack() - - msg = "Unexpected pytest node (see printed output)." - exc = NotImplementedError(msg) - exc.item = item - return exc - - -def parse_item( - item, - # *, - _get_item_kind=(lambda *a: _get_item_kind(*a)), - _parse_node_id=(lambda *a: _parse_node_id(*a)), - _split_fspath=(lambda *a: _split_fspath(*a)), - _get_location=(lambda *a: _get_location(*a)), -): - """Return (TestInfo, [suite ID]) for the given item. - - The suite IDs, if any, are in parent order with the item's direct - parent at the beginning. The parent of the last suite ID (or of - the test if there are no suites) is the file ID, which corresponds - to TestInfo.path. - - """ - # _debug_item(item, showsummary=True) - kind, _ = _get_item_kind(item) - # Skip plugin generated tests - if kind is None: - return None, None - (nodeid, parents, fileid, testfunc, parameterized) = _parse_node_id( - item.nodeid, kind - ) - # Note: testfunc does not necessarily match item.function.__name__. - # This can result from importing a test function from another module. - - # Figure out the file. - testroot, relfile = _split_fspath(str(item.fspath), fileid, item) - location, fullname = _get_location(item, testroot, relfile) - if kind == "function": - if testfunc and fullname != testfunc + parameterized: - raise should_never_reach_here( - item, - fullname=fullname, - testfunc=testfunc, - parameterized=parameterized, - # ... - ) - elif kind == "doctest": - if testfunc and fullname != testfunc and fullname != "[doctest] " + testfunc: - raise should_never_reach_here( - item, - fullname=fullname, - testfunc=testfunc, - # ... - ) - testfunc = None - - # Sort out the parent. - if parents: - parentid, _, _ = parents[0] - else: - parentid = None - - # Sort out markers. - # See: https://docs.pytest.org/en/latest/reference.html#marks - markers = set() - for marker in getattr(item, "own_markers", []): - if marker.name == "parameterize": - # We've already covered these. - continue - elif marker.name == "skip": - markers.add("skip") - elif marker.name == "skipif": - markers.add("skip-if") - elif marker.name == "xfail": - markers.add("expected-failure") - # We can add support for other markers as we need them? - - test = TestInfo( - id=nodeid, - name=item.name, - path=TestPath( - root=testroot, - relfile=relfile, - func=testfunc, - sub=[parameterized] if parameterized else None, - ), - source=location, - markers=sorted(markers) if markers else None, - parentid=parentid, - ) - if parents and parents[-1] == (".", None, "folder"): # This should always be true? - parents[-1] = (".", testroot, "folder") - return test, parents - - -def _split_fspath( - fspath, - fileid, - item, - # *, - _normcase=NORMCASE, -): - """Return (testroot, relfile) for the given fspath. - - "relfile" will match "fileid". - """ - # "fileid" comes from nodeid and is always relative to the testroot - # (with a "./" prefix). There are no guarantees about casing, so we - # normcase just be to sure. - relsuffix = fileid[1:] # Drop (only) the "." prefix. - if not _normcase(fspath).endswith(_normcase(relsuffix)): - raise should_never_reach_here( - item, - fspath=fspath, - fileid=fileid, - # ... - ) - testroot = fspath[: -len(fileid) + 1] # Ignore the "./" prefix. - relfile = "." + fspath[-len(fileid) + 1 :] # Keep the pathsep. - return testroot, relfile - - -def _get_location( - item, - testroot, - relfile, - # *, - _matches_relfile=(lambda *a: _matches_relfile(*a)), - _is_legacy_wrapper=(lambda *a: _is_legacy_wrapper(*a)), - _unwrap_decorator=(lambda *a: _unwrap_decorator(*a)), - _pathsep=PATH_SEP, -): - """Return (loc str, fullname) for the given item.""" - # When it comes to normcase, we favor relfile (from item.fspath) - # over item.location in this function. - - srcfile, lineno, fullname = item.location - if _matches_relfile(srcfile, testroot, relfile): - srcfile = relfile - else: - # pytest supports discovery of tests imported from other - # modules. This is reflected by a different filename - # in item.location. - - if _is_legacy_wrapper(srcfile): - srcfile = relfile - unwrapped = _unwrap_decorator(item.function) - if unwrapped is None: - # It was an invalid legacy wrapper so we just say - # "somewhere in relfile". - lineno = None - else: - _srcfile, lineno = unwrapped - if not _matches_relfile(_srcfile, testroot, relfile): - # For legacy wrappers we really expect the wrapped - # function to be in relfile. So here we ignore any - # other file and just say "somewhere in relfile". - lineno = None - elif _matches_relfile(srcfile, testroot, relfile): - srcfile = relfile - # Otherwise we just return the info from item.location as-is. - - if not srcfile.startswith("." + _pathsep): - srcfile = "." + _pathsep + srcfile - - if lineno is None: - lineno = -1 # i.e. "unknown" - - # from pytest, line numbers are 0-based - location = "{}:{}".format(srcfile, int(lineno) + 1) - return location, fullname - - -def _matches_relfile( - srcfile, - testroot, - relfile, - # *, - _normcase=NORMCASE, - _pathsep=PATH_SEP, -): - """Return True if "srcfile" matches the given relfile.""" - testroot = _normcase(testroot) - srcfile = _normcase(srcfile) - relfile = _normcase(relfile) - if srcfile == relfile: - return True - elif srcfile == relfile[len(_pathsep) + 1 :]: - return True - elif srcfile == testroot + relfile[1:]: - return True - else: - return False - - -def _is_legacy_wrapper( - srcfile, - # *, - _pathsep=PATH_SEP, - _pyversion=sys.version_info, -): - """Return True if the test might be wrapped. - - In Python 2 unittest's decorators (e.g. unittest.skip) do not wrap - properly, so we must manually unwrap them. - """ - if _pyversion > (3,): - return False - if (_pathsep + "unittest" + _pathsep + "case.py") not in srcfile: - return False - return True - - -def _unwrap_decorator(func): - """Return (filename, lineno) for the func the given func wraps. - - If the wrapped func cannot be identified then return None. Likewise - for the wrapped filename. "lineno" is None if it cannot be found - but the filename could. - """ - try: - func = func.__closure__[0].cell_contents - except (IndexError, AttributeError): - return None - else: - if not callable(func): - return None - try: - filename = func.__code__.co_filename - except AttributeError: - return None - else: - try: - lineno = func.__code__.co_firstlineno - 1 - except AttributeError: - return (filename, None) - else: - return filename, lineno - - -def _parse_node_id( - testid, - kind, - # *, - _iter_nodes=(lambda *a: _iter_nodes(*a)), -): - """Return the components of the given node ID, in heirarchical order.""" - nodes = iter(_iter_nodes(testid, kind)) - - testid, name, kind = next(nodes) - parents = [] - parameterized = None - if kind == "doctest": - parents = list(nodes) - fileid, _, _ = parents[0] - return testid, parents, fileid, name, parameterized - elif kind is None: - fullname = None - else: - if kind == "subtest": - node = next(nodes) - parents.append(node) - funcid, funcname, _ = node - parameterized = testid[len(funcid) :] - elif kind == "function": - funcname = name - else: - raise should_never_reach_here( - testid, - kind=kind, - # ... - ) - fullname = funcname - - for node in nodes: - parents.append(node) - parentid, name, kind = node - if kind == "file": - fileid = parentid - break - elif fullname is None: - # We don't guess how to interpret the node ID for these tests. - continue - elif kind == "suite": - fullname = name + "." + fullname - else: - raise should_never_reach_here( - testid, - node=node, - # ... - ) - else: - fileid = None - parents.extend(nodes) # Add the rest in as-is. - - return ( - testid, - parents, - fileid, - fullname, - parameterized or "", - ) - - -def _iter_nodes( - testid, - kind, - # *, - _normalize_test_id=(lambda *a: _normalize_test_id(*a)), - _normcase=NORMCASE, - _pathsep=PATH_SEP, -): - """Yield (nodeid, name, kind) for the given node ID and its parents.""" - nodeid, testid = _normalize_test_id(testid, kind) - if len(nodeid) > len(testid): - testid = "." + _pathsep + testid - - if kind == "function" and nodeid.endswith("]"): - funcid, sep, parameterized = nodeid.partition("[") - if not sep: - raise should_never_reach_here( - nodeid, - # ... - ) - yield (nodeid, sep + parameterized, "subtest") - nodeid = funcid - - parentid, _, name = nodeid.rpartition("::") - if not parentid: - if kind is None: - # This assumes that plugins can generate nodes that do not - # have a parent. All the builtin nodes have one. - yield (nodeid, name, kind) - return - # We expect at least a filename and a name. - raise should_never_reach_here( - nodeid, - # ... - ) - yield (nodeid, name, kind) - - # Extract the suites. - while "::" in parentid: - suiteid = parentid - parentid, _, name = parentid.rpartition("::") - yield (suiteid, name, "suite") - - # Extract the file and folders. - fileid = parentid - raw = testid[: len(fileid)] - _parentid, _, filename = _normcase(fileid).rpartition(_pathsep) - parentid = fileid[: len(_parentid)] - raw, name = raw[: len(_parentid)], raw[-len(filename) :] - yield (fileid, name, "file") - # We're guaranteed at least one (the test root). - while _pathsep in _normcase(parentid): - folderid = parentid - _parentid, _, foldername = _normcase(folderid).rpartition(_pathsep) - parentid = folderid[: len(_parentid)] - raw, name = raw[: len(parentid)], raw[-len(foldername) :] - yield (folderid, name, "folder") - # We set the actual test root later at the bottom of parse_item(). - testroot = None - yield (parentid, testroot, "folder") - - -def _normalize_test_id( - testid, - kind, - # *, - _fix_fileid=fix_fileid, - _pathsep=PATH_SEP, -): - """Return the canonical form for the given node ID.""" - while "::()::" in testid: - testid = testid.replace("::()::", "::") - if kind is None: - return testid, testid - orig = testid - - # We need to keep the testid as-is, or else pytest won't recognize - # it when we try to use it later (e.g. to run a test). The only - # exception is that we add a "./" prefix for relative paths. - # Note that pytest always uses "/" as the path separator in IDs. - fileid, sep, remainder = testid.partition("::") - fileid = _fix_fileid(fileid) - if not fileid.startswith("./"): # Absolute "paths" not expected. - raise should_never_reach_here( - testid, - fileid=fileid, - # ... - ) - testid = fileid + sep + remainder - - return testid, orig - - -def _get_item_kind(item): - """Return (kind, isunittest) for the given item.""" - if isinstance(item, _pytest.doctest.DoctestItem): - return "doctest", False - elif isinstance(item, _pytest.unittest.TestCaseFunction): - return "function", True - elif isinstance(item, pytest.Function): - # We *could* be more specific, e.g. "method", "subtest". - return "function", False - else: - return None, False - - -############################# -# useful for debugging - -_FIELDS = [ - "nodeid", - "kind", - "class", - "name", - "fspath", - "location", - "function", - "markers", - "user_properties", - "attrnames", -] - - -def _summarize_item(item): - if not hasattr(item, "nodeid"): - yield "nodeid", item - return - - for field in _FIELDS: - try: - if field == "kind": - yield field, _get_item_kind(item) - elif field == "class": - yield field, item.__class__.__name__ - elif field == "markers": - yield field, item.own_markers - # yield field, list(item.iter_markers()) - elif field == "attrnames": - yield field, dir(item) - else: - yield field, getattr(item, field, "") - except Exception as exc: - yield field, "".format(exc) - - -def _debug_item(item, showsummary=False): - item._debugging = True - try: - summary = dict(_summarize_item(item)) - finally: - item._debugging = False - - if showsummary: - print(item.nodeid) - for key in ( - "kind", - "class", - "name", - "fspath", - "location", - "func", - "markers", - "props", - ): - print(" {:12} {}".format(key, summary[key])) - print() - - return summary diff --git a/pythonFiles/testing_tools/adapter/report.py b/pythonFiles/testing_tools/adapter/report.py deleted file mode 100644 index bacdef7b9a00..000000000000 --- a/pythonFiles/testing_tools/adapter/report.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import print_function - -import json - - -def report_discovered( - tests, - parents, - # *, - pretty=False, - simple=False, - _send=print, - **_ignored -): - """Serialize the discovered tests and write to stdout.""" - if simple: - data = [ - { - "id": test.id, - "name": test.name, - "testroot": test.path.root, - "relfile": test.path.relfile, - "lineno": test.lineno, - "testfunc": test.path.func, - "subtest": test.path.sub or None, - "markers": test.markers or [], - } - for test in tests - ] - else: - byroot = {} - for parent in parents: - rootdir = parent.name if parent.root is None else parent.root - try: - root = byroot[rootdir] - except KeyError: - root = byroot[rootdir] = { - "id": rootdir, - "parents": [], - "tests": [], - } - if not parent.root: - root["id"] = parent.id - continue - root["parents"].append( - { - # "id" must match what the testing framework recognizes. - "id": parent.id, - "kind": parent.kind, - "name": parent.name, - "parentid": parent.parentid, - } - ) - if parent.relpath is not None: - root["parents"][-1]["relpath"] = parent.relpath - for test in tests: - # We are guaranteed that the parent was added. - root = byroot[test.path.root] - testdata = { - # "id" must match what the testing framework recognizes. - "id": test.id, - "name": test.name, - # TODO: Add a "kind" field - # (e.g. "unittest", "function", "doctest") - "source": test.source, - "markers": test.markers or [], - "parentid": test.parentid, - } - root["tests"].append(testdata) - data = [ - { - "rootid": byroot[root]["id"], - "root": root, - "parents": byroot[root]["parents"], - "tests": byroot[root]["tests"], - } - for root in sorted(byroot) - ] - - kwargs = {} - if pretty: - # human-formatted - kwargs = dict( - sort_keys=True, - indent=4, - separators=(",", ": "), - # ... - ) - serialized = json.dumps(data, **kwargs) - - _send(serialized) diff --git a/pythonFiles/testing_tools/adapter/util.py b/pythonFiles/testing_tools/adapter/util.py deleted file mode 100644 index 1e650522f64c..000000000000 --- a/pythonFiles/testing_tools/adapter/util.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import contextlib - -try: - from io import StringIO -except ImportError: - from StringIO import StringIO # 2.7 -import os.path -import sys - - -@contextlib.contextmanager -def noop_cm(): - yield - - -def group_attr_names(attrnames): - grouped = { - "dunder": [], - "private": [], - "constants": [], - "classes": [], - "vars": [], - "other": [], - } - for name in attrnames: - if name.startswith("__") and name.endswith("__"): - group = "dunder" - elif name.startswith("_"): - group = "private" - elif name.isupper(): - group = "constants" - elif name.islower(): - group = "vars" - elif name == name.capitalize(): - group = "classes" - else: - group = "other" - grouped[group].append(name) - return grouped - - -if sys.version_info < (3,): - _str_to_lower = lambda val: val.decode().lower() -else: - _str_to_lower = str.lower - - -############################# -# file paths - -_os_path = os.path -# Uncomment to test Windows behavior on non-windows OS: -# import ntpath as _os_path -PATH_SEP = _os_path.sep -NORMCASE = _os_path.normcase -DIRNAME = _os_path.dirname -BASENAME = _os_path.basename -IS_ABS_PATH = _os_path.isabs -PATH_JOIN = _os_path.join - - -def fix_path( - path, - # *, - _pathsep=PATH_SEP, -): - """Return a platform-appropriate path for the given path.""" - if not path: - return "." - return path.replace("/", _pathsep) - - -def fix_relpath( - path, - # *, - _fix_path=fix_path, - _path_isabs=IS_ABS_PATH, - _pathsep=PATH_SEP, -): - """Return a ./-prefixed, platform-appropriate path for the given path.""" - path = _fix_path(path) - if path in (".", ".."): - return path - if not _path_isabs(path): - if not path.startswith("." + _pathsep): - path = "." + _pathsep + path - return path - - -def _resolve_relpath( - path, - rootdir=None, - # *, - _path_isabs=IS_ABS_PATH, - _normcase=NORMCASE, - _pathsep=PATH_SEP, -): - # "path" is expected to use "/" for its path separator, regardless - # of the provided "_pathsep". - - if path.startswith("./"): - return path[2:] - if not _path_isabs(path): - return path - - # Deal with root-dir-as-fileid. - _, sep, relpath = path.partition("/") - if sep and not relpath.replace("/", ""): - return "" - - if rootdir is None: - return None - rootdir = _normcase(rootdir) - if not rootdir.endswith(_pathsep): - rootdir += _pathsep - - if not _normcase(path).startswith(rootdir): - return None - return path[len(rootdir) :] - - -def fix_fileid( - fileid, - rootdir=None, - # *, - normalize=False, - strictpathsep=None, - _pathsep=PATH_SEP, - **kwargs -): - """Return a pathsep-separated file ID ("./"-prefixed) for the given value. - - The file ID may be absolute. If so and "rootdir" is - provided then make the file ID relative. If absolute but "rootdir" - is not provided then leave it absolute. - """ - if not fileid or fileid == ".": - return fileid - - # We default to "/" (forward slash) as the final path sep, since - # that gives us a consistent, cross-platform result. (Windows does - # actually support "/" as a path separator.) Most notably, node IDs - # from pytest use "/" as the path separator by default. - _fileid = fileid.replace(_pathsep, "/") - - relpath = _resolve_relpath( - _fileid, - rootdir, - _pathsep=_pathsep, - # ... - **kwargs - ) - if relpath: # Note that we treat "" here as an absolute path. - _fileid = "./" + relpath - - if normalize: - if strictpathsep: - raise ValueError("cannot normalize *and* keep strict path separator") - _fileid = _str_to_lower(_fileid) - elif strictpathsep: - # We do not use _normcase since we want to preserve capitalization. - _fileid = _fileid.replace("/", _pathsep) - return _fileid - - -############################# -# stdio - - -@contextlib.contextmanager -def hide_stdio(): - """Swallow stdout and stderr.""" - ignored = StdioStream() - sys.stdout = ignored - sys.stderr = ignored - try: - yield ignored - finally: - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - - -if sys.version_info < (3,): - - class StdioStream(StringIO): - def write(self, msg): - StringIO.write(self, msg.decode()) - - -else: - StdioStream = StringIO - - -############################# -# shell - - -def shlex_unsplit(argv): - """Return the shell-safe string for the given arguments. - - This effectively the equivalent of reversing shlex.split(). - """ - argv = [_quote_arg(a) for a in argv] - return " ".join(argv) - - -try: - from shlex import quote as _quote_arg -except ImportError: - - def _quote_arg(arg): - parts = None - for i, c in enumerate(arg): - if c.isspace(): - pass - elif c == '"': - pass - elif c == "'": - c = "'\"'\"'" - else: - continue - if parts is None: - parts = list(arg) - parts[i] = c - if parts is not None: - arg = "'" + "".join(parts) + "'" - return arg diff --git a/pythonFiles/testing_tools/run_adapter.py b/pythonFiles/testing_tools/run_adapter.py deleted file mode 100644 index 1eeef194f8f5..000000000000 --- a/pythonFiles/testing_tools/run_adapter.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -# Replace the "." entry. -import os.path -import sys - -sys.path.insert( - 1, - os.path.dirname( # pythonFiles - os.path.dirname( # pythonFiles/testing_tools - os.path.abspath(__file__) # this file - ) - ), -) - -from testing_tools.adapter.__main__ import parse_args, main - - -if __name__ == "__main__": - tool, cmd, subargs, toolargs = parse_args() - main(tool, cmd, subargs, toolargs) diff --git a/pythonFiles/testlauncher.py b/pythonFiles/testlauncher.py deleted file mode 100644 index 6858931730ef..000000000000 --- a/pythonFiles/testlauncher.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import sys - - -def parse_argv(): - """Parses arguments for use with the test launcher. - Arguments are: - 1. Working directory. - 2. Test runner, `pytest` or `nose` - 3. Rest of the arguments are passed into the test runner. - """ - - return (sys.argv[1], sys.argv[2], sys.argv[3:]) - - -def exclude_current_file_from_debugger(): - # Load the debugger package - try: - import ptvsd - except: - traceback.print_exc() - print( - """ -Internal error detected. Please copy the above traceback and report at -https://github.com/Microsoft/vscode-python/issues/new - -Press Enter to close. . .""" - ) - try: - raw_input() - except NameError: - input() - sys.exit(1) - - -def run(cwd, testRunner, args): - """Runs the test - cwd -- the current directory to be set - testRunner -- test runner to be used `pytest` or `nose` - args -- arguments passed into the test runner - """ - - sys.path[0] = os.getcwd() - os.chdir(cwd) - - try: - if testRunner == "pytest": - import pytest - - pytest.main(args) - else: - import nose - - nose.run(argv=args) - sys.exit(0) - finally: - pass - - -if __name__ == "__main__": - exclude_current_file_from_debugger() - cwd, testRunner, args = parse_argv() - run(cwd, testRunner, args) diff --git a/pythonFiles/tests/__init__.py b/pythonFiles/tests/__init__.py deleted file mode 100644 index e2e6976acd68..000000000000 --- a/pythonFiles/tests/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -import os.path - -TEST_ROOT = os.path.dirname(__file__) -SRC_ROOT = os.path.dirname(TEST_ROOT) -PROJECT_ROOT = os.path.dirname(SRC_ROOT) -IPYTHON_ROOT = os.path.join(SRC_ROOT, "ipython") -TESTING_TOOLS_ROOT = os.path.join(SRC_ROOT, "testing_tools") -DEBUG_ADAPTER_ROOT = os.path.join(SRC_ROOT, "debug_adapter") - -PYTHONFILES = os.path.join(SRC_ROOT, "lib", "python") diff --git a/pythonFiles/tests/__main__.py b/pythonFiles/tests/__main__.py deleted file mode 100644 index 14086978c9af..000000000000 --- a/pythonFiles/tests/__main__.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import argparse -import sys - -import pytest - -from . import DEBUG_ADAPTER_ROOT, IPYTHON_ROOT, SRC_ROOT, TEST_ROOT, TESTING_TOOLS_ROOT - - -def parse_args(): - parser = argparse.ArgumentParser() - # To mark a test as functional: (decorator) @pytest.mark.functional - parser.add_argument( - "--functional", dest="markers", action="append_const", const="functional" - ) - parser.add_argument( - "--no-functional", dest="markers", action="append_const", const="not functional" - ) - args, remainder = parser.parse_known_args() - - ns = vars(args) - - return ns, remainder - - -def main(pytestargs, markers=None): - sys.path.insert(1, IPYTHON_ROOT) - sys.path.insert(1, TESTING_TOOLS_ROOT) - sys.path.insert(1, DEBUG_ADAPTER_ROOT) - - pytestargs = ["--rootdir", SRC_ROOT, TEST_ROOT] + pytestargs - for marker in reversed(markers or ()): - pytestargs.insert(0, marker) - pytestargs.insert(0, "-m") - - ec = pytest.main(pytestargs) - return ec - - -if __name__ == "__main__": - mainkwargs, pytestargs = parse_args() - ec = main(pytestargs, **mainkwargs) - sys.exit(ec) diff --git a/pythonFiles/tests/debug_adapter/test_install_ptvsd.py b/pythonFiles/tests/debug_adapter/test_install_ptvsd.py deleted file mode 100644 index ad23d26349f2..000000000000 --- a/pythonFiles/tests/debug_adapter/test_install_ptvsd.py +++ /dev/null @@ -1,36 +0,0 @@ -import os -import pytest -import subprocess -import sys - - -def _check_binaries(dir_path): - expected_endswith = ( - "win_amd64.pyd", - "win32.pyd", - "darwin.so", - "i386-linux-gnu.so", - "x86_64-linux-gnu.so", - ) - - binaries = list(p for p in os.listdir(dir_path) if p.endswith(expected_endswith)) - - assert len(binaries) == len(expected_endswith) - - -@pytest.mark.skipif( - sys.version_info[:2] != (3, 7), reason="PTVSD wheels shipped for Python 3.7 only", -) -def test_install_ptvsd(tmpdir): - import install_ptvsd - - install_ptvsd.main(str(tmpdir)) - dir_path = os.path.join( - str(tmpdir), "ptvsd", "_vendored", "pydevd", "_pydevd_bundle" - ) - _check_binaries(dir_path) - - dir_path = os.path.join( - str(tmpdir), "ptvsd", "_vendored", "pydevd", "_pydevd_frame_eval" - ) - _check_binaries(dir_path) diff --git a/pythonFiles/tests/ipython/random.csv b/pythonFiles/tests/ipython/random.csv deleted file mode 100644 index dde35fda3850..000000000000 --- a/pythonFiles/tests/ipython/random.csv +++ /dev/null @@ -1,6001 +0,0 @@ -".Lh~N","~`y","]W|{92","|uHbIo","o}","+h2" -"-O;Xfw ","","KX^K)FHe:","3+4ncqL8=O","py]ZA;","_y>" -"}z#IiI'+c,","^) ""","(SLt4","JJ:2VnAQ/J","ZO>%nl>`EZ","" -"","ji#cufxu2",":7JAHYDdRx","klq?$","tItAtlu-","TxspzZ" -"x9>iX'C+F","","G`[I","p^Y=S)",">NLE@UX|=a","a=XsO" -"`Y""Wc2^tQ","HlZ","N9/@","J","A","Cv" -"","L f'%K","~UDs","mh/A:X","Yz9d:T{2Q|","ee" -"`3A* >","Nu6cv","%F13Kb6p","","8+{hhd","J#","W3_yiE","y)d8?","" -";,.;rnu\K","nfS)Fy=l","",",r~$","jOU[uQYt'","R" -"3$cA$","l4","t!nf","53snc8g","m&,:","OQg\ " -"m>D","74|LkY5eV","/LR","h","","B]" -"60z{e92;","^P","5s-:m","G2YGn*DpK","I","" -"4s2(","n?j1,f~~?d","?","3{j,tax>8r","","Ms_\Z" -",i9sLk3z","D';Tv","R","m1keY","|`DumH","k.2-Mu9P" -"!","Y$","O","r","xj _*%*","#" -"HU","Z_jT0?","!2X>5","@9tD~BA)va","^ Gn=|q4H","eX" -"-","H,m=WD","fE;","YCTw<","""sS/{ow","","D@=iE'j4" -"Tqi1","hTF?RF""g=","","9{","m]?81+hk","1ZHfSk" -"J""oMEj","""*MZ`q; ","{","C","R|}Ws|j)d","s" -"6 k\:$@gl","bo8)dK#Sj","3Z3#","","J*:F>",".$" -"4Fx0(~dQ#U","F('2","YO~phil","/NmyUrJ~E","","" -"Or,B""b@HO.","uV2tX%yAE8","fn HXw","","7R^b","Pq%" -"W8BTO3","Vz{xaSpxd(","7YTQU}D]q[","b]B|5x","?i(kD","" -"","P~O","?m&SG1o{","(",").{1PSm[E","{" -"a","?","k&8)","","FP31","!""P^$!" -"90g=","{XN","FFH;b","r^XHX>@R&1","","4!sz=W#K" -"","##LY$m13","-(","`b","#K","Dd" -"|jA","34 Q","dU-;:OOU\U","nKO","*I","}+IJv" -".>j&","d-Gz","nOe6W""q$Zc","MYyF~","","FzO&u" -"!@>3&","YCyw0y","","","I(,","!fhPR+!=8N","*^tw&-Rt","V","","Sc3S" -"u;","#no","U","|B1`","[^o;Lyp5","" -".Vb[JH9x-s","9?<""y","","","8@1K7Jh","-ySc" -"R9S@g;fJ","ae4b","Q01]VuYAIu","J]W(PXVu`","xUw_LZ!8CB","" -",",":6","CLUFQ[9!","'K9\l^","_(OjmvR?","lT1GR;k" -"""+u$2VaoTD","","","@\|#G","","8I","Nx@R&g&sw","*r-Ltk","","" -"KB/ uy0","YJ6.].gQ-s","Q","RE[3RGSE4H","Q6a_)5p?","","|~O>&Xua","#cD&u","n~nM`]" -"V","-47Q8,k","53S""EIi%`","lDlQVv","A""}c1c='x:",";{4?6\" -"z'","YP5e4(U","l^mTI6qb",")sDm^JM)qV","","lw/yD34~","|uM5","","O6z>P}",":w!CBD" -"GUoP=,Kqc",")0|O","[A99FJC","uM:Fg","O{&","aQ;G_{m" -"D?1m8|8","Ule","CkEK+","Sfi8wyM","c1I~t","2/&bE=QJ:""" -"7XpO#@","I0L(t[`59","E&grAL3,","7","","" -"&tLwX)e","<#R#","&fp","}z@s","Gn","1ln[S!GP" -"k>Kb&YeB","5Qw=$-oq","&^","J15BT'z>~","sBq6&TRf","3FOj0T" -".6r$K4","\6f,.E'","k<","","4l(d 5","J[>x$1D2" -"""fto","lR`(+","?","TJ","","" -"8Nk","H","","]X","m.d%BI#q","; ,Pq?`;,%" -"5^}7sQ`","7>:L","I","3L\-","wA7Nh@rww","9VXVw%)~" -".HS","","","{7?+C","zo17eF|v"," R" -"vH#+T","?_Dk.Y","Gvdh+)-PhU","A]gB^<^e","R%X)","Gna*.n" -"?d","S","J:vQmT_[`^","W_X","`""S<.S}'","IC " -")AFHI(1't","K>]R","Bx","iWTE2fc","1<","m=B;x4n$" -"Zyu","q5C% i""b","$N)""mCi/o","ULa nXr{nv","u9HQx5,_1Z","XbKX" -"OP[s ^wl)6","y",".}2t=:","E,z@aBPR","qC=P3","`p}A63u,3%" -"X[d","Q0tsJ#*","gMR-.6&6:@","H"">M""CfcR","0}BSkSW@/e","R`Wi&`Djr" -"e&gUxU*A","0"," :","","Q>B","E" -"s%>WO5$o3g","D","s{%",")V&x)`@;","5=","1Sw" -"","Ym@","_","M`(*_B>P- " -"K","","2O#D?","%RTu>7Otx","zbN|","I""/" -"-)",".JzD'","bc[y^d#Y,","Tm0ud\","1H@;","n|q< L3i9U" -"&cc-XYJ",">51","0BKHX[","",""":0JR/g","\'\`5l\O" -"","o""L#w?4qY",";X7Qt","ivrB]@","R","% %-6A23" -"E-I[","0TPXa/8);o","T4hBVto0F","Lr[|_:Si","%(/x""","tT" -"","vWq`y[!","fZ{b-)R(","Y^","","bJr$}.<$>r" -"F","","t+r]s,=T#","b]1?U","5Ldjnsq4:N","u,7}qpR" -"","zftO.","3-y","","Y]BLTq3?","-x%#b" -"<[s2YJ&}_","bn","$>Rt7tHW",">!*4Ao","","}}" -"c]-jDpO","!LsvN,/+6","W+w&=l","""@fd`ho","wk+i#'Q","q/:k}" -"IMaj/y","L","g*d_:\:","YT\0","O<[/q@_""#a","UDQzt#5" -"ZFE","xb","oe*1.uQ/.","Xi1fJ8*\I","DXVd!(6>","5sBi}E5" -"8)","Pz","\\ L|","G|e&9","2gd#5)x Z{","gU\Jq]RrA" -"d0A$fck]","`" -"8","Y9ds?,""","^u","GUha]","]MR%qJ",":gq""`lO","8B;N:c?" -"EE"," b:(W9N","|;P""&9","v@qz","}B40.e%Utn","M,ynqkYg" -"e!/]Rz]$","cDQ!NE7","8@=6","d","4#/O","" -"zn","nA^@g!Z","8nt$sxb","t","","m#x{0;V11" -"","{tT5","9QnNs@A","\0URMK","]","j<""gt" -"&0/UGKz'G""","K:j)_","QS>g!7","$`9uc,CJZ,","`8+w,","`" -";'V-7","$p<`=","j^I","r2 ","","jy{" -"","m(hNrbi","h","Z9$V83J","+5]b","I" -":","<|>b[X1jX","c","T","","}r^hq4g" -"(vwf","wQvCnhksM","`","8K,3S'lHv","4o","A!q% P""LX" -"","rf8'y7;","X!Ur","s","?iDO",">h(." -"ui""R&JBr","&'7.u","2Y,l-5","?HB","DL""$","sAh||/l=" -"lXaB7[","1hY","j!%6 ow","Tf","i^r [F","OV9%h5nY}" -"Bp}nh7Ic+M","YH{L","y","o!9","K!<|","@D5" -"OjI/r'r*S4","WI=pe$lRG","'*MB","l","AQapJF4bTE","oBx>" -"WkoM","~H8GI,1p3V","Wu=B7{0j,","","xg)","IZ8l'1+I" -"Q3lB!","Q'N","}xi!#DkY&%","FNv","5a|FsN ","T!98" -"6","h#5{)<+A","#i7|fSA""W_","\u3].o" -"wI*","Rqk|kYv","]d |#lE",")FWt}%O9C","os","i@)=y9" -"","&u[Jq7","MsE24i/b%" -"b","{)\e?09""D","D*?Ybms*","vk6NN?7fJ","~q2Pc|","/vW:v }{J5" -"|@'o"," XH4 haX"," Y^0e>}","A",".]WK""",")bLp%mt(" -"_x&yU!GiV","WTc'5nj","*3NkkGk$'","f?,/V~","Z8g mW4","hW" -"wwE@@","","7Di?""Dt(lB","BU~Gg-","pd:" -";NonN$t5","","4G~X3zC3 ","IHHBOJ.","P}",">r*>W5" -"?x2""L4","sv|)/mN","+""$=1:8","p@~6#C>mM","I0&1Aaq7M@","n" -"NWnM;J","LXjXFA f","iUa;""","|k","662X.1;t"," " -"SBL6tq~B","Is|v9","KjJ[",")mgQ.;iw]","ERR?z","WcWgb#$q6e" -"7~a'`","C?6`","Rr>q&YV6I/","?b6w)G0","'jpc$","c zI9eD " -"_^_4{O&gbY","T^5__","w-[Py`(Qxf","*",":'EKBh#S","ljM" -"","c#sJ","W^2","@2`","\\OuBL""^mo","2wm6WA|x" -"8pkGz","V,/WQq*J7Y","&]2?7Q","EF.T9\@","[k","9YI)(eh:;7" -"$wk~","VkK:0Kz","u0!R~2","xY7#","9#","`j}6&" -"9","~S.E)b" -"Fw4l2A V","o`""Py","{Izy$K","OYsbb8","3]ZDq","8hPS1Pz" -"~"," fQwMd').]","PR&T.;<.\U","""gUK74[","EAn<","JQlWX5","1QI","%AQlZmNPE","2|A?","W^XqWP" -"a#,W(`B@5C","",")","Dz","y \O%","&5'U|J.8",";)SH","q(7","EH&+jZ 1!","HTh" -"bzr]","^;V8$b>B","1:aY5Yyw/","yr+&","noUrd","pkg" -"S(Cp&`e]","",">-c|%.m","","C7Y'u","X" -"ny","dNYQ","FWYe;y!","i?4","1,bY?=","`EjF-M" -"8;;V%","%wY","x~^veI","t" -"kYYbvo8<","C\|",",4g","Ax{sqF-Cv","}^COxg 9","o""" -"UPjp%M","!#:r.8&""Xw","W!/h2","^%^f~","t","oP" -"T{6","","Om=~""9s","u/o","cZ@.F|B09'","LI%e%65gY\" -"5 I","r","'F&o""e","qn{s $lV","*}tz1","" -"M","E74,J","=z3U,)","W[.!,","e:Tr&5<.h""","y$Iwo" -".H""","Qq42V79RQ","^Fn-6A0c{","iZ{yG}nV^1","Kw:)[","0-YkX}/0" -"XZc","","o%Z","","q{,",")J*z=wr" -"cvOCJ&O","x%cJc@","O2bJ2fo","m","","ob]_Tj@*v" -"_!sCApL>_","","qWa6A#$""ww","3'","m4I","L;8( {ye" -" ",")~z0g","YlIA{:Ey","","","k" -"ax#""rfEO","","X(/Pj}","CC?[0","sJI","","fir_*o","8 ShApVE_g","4k6m" -"&>b","c=9","!","I","","$/dYTpip/$" -"'","FGj*S|Z","{N8","eonWJSsY","","U" -"EL|*\!V$1`","Og""","","","lo!:^",">H1&sgt8Z" -"r~:","u","'/Bn?[Qf","nltE-YYzDB","I'ODVU{xr","" -"[I(]cD","<,/","x","","2x/fH!8%","O4a~X" -"})","QoMIAa","%G@","46;pHf*","}3rU @V","+`eU&/gG" -"HD\5","!f","j6OfLC","jX/UU)k" -"","","2@","4bZ+L{","Z|H","""p7u" -"PD'!gTiPcA","","<","0N4x`","n%\E7ol","$duR1IFA2I" -"","d_B","|","aa7;ac","","UviR" -"O@ei*, ","u'Tr","NJo","B*E^/Xo?Y1","BFk""){%:","TS?>s=?= h" -"Lt","f","PYgD c","a4/",">2?+A~+S","IS""" -"xG')3","q","","0k>U)ZI","uHg)U""X+","}uU1?*" -"M!0;Kgz_G","+","1:g}+","b,TC;%rTQ","Z+S,","" -"i=lps","[","$^cP","n2",":0,Wkb","9[URQ8>&" -"@3","UXHc|C","~DLL\QV||[","uQ.8 Q)+q","""","A" -"x2ZrZ7kTQV","","!R<","G%\fT=","E","-qG0{" -"'&)T%oz","{kBu,","OF6vL}FsX","OT'5=[nqH","VdOw+[WU","]SZBjN" -"","rdpPo","Yh4[SDH",".^t","fJttaStU","@%5!;^h\" -"/uT_)[","""{","[up:^Qgi","6GF","5j%$6xE[g","&l" -"&>-Lf7]U","z>","$qPD^>O8","&IzR","e","}" -"}8X%","yDw;c#""b!","Y/}~G","6Oh[ZJIwQ4","km+ _8D~","dTCu58x","sSXv","pBuA>|X;_","eM!):?EMc",".KU>","Vtd`wZQ}" -"y$?{2Ti","}GZcl-","\kQ4","mk_l7O;#.X","KDd[Qd","Gg0pL*" -"sg\dV'=5z","!S""nEgUx~","","QcOn","6","#" -"N#fa","a1|+SwUd5","rC(nF`N0Z>","nnPaaE"," ","yEwZ6DM" -"V","^YU~b","","*bJ3,N","V={@V{","_>#Z0*" -"I-~QAavV\","K6;#0k","o","8(" -"gwut0","","WU^","4","/!][iG,z","""W7+uh" -"j+?WYE2","w]&o4Fr","bBV^SU}Hv","9'C","!Q_7<","" -"J*ok_L.*Gk","$Xl","","_ut","g h7,w-","<1" -"Y>)?WdJ","=","""n","Xn2m[x","Q]mFLF","Sh/Ns" -",/^a5S;","Vxs%'","QivnALbO","","+b8","Sk" -"2","2KNAr""91[<","VJbQ","sZOSuh(5&","","E1+D" -"W""","[V:67mEA","~]c","J5<+pN#!K","%,b})","Y;.>:'SI}e" -"R>flcq%","4e]fB^","^>s}0","8*hE"," a%","lVsOax0'-" -"!l{<+3a?3B","sH","y","~` \hy@+","_'eQ2/o=FS","E" -",","*Y","c%Uz+']<","M28o"," 2o[WuQ0DP","(oWt3($" -"3E","_S""CKJV","x&#@hpdvR","aQ+$(","S","#r%" -"","}!Q#fiHh","I","","RV<[9pS-c2","Ot,1X" -"!u","yn]v5>","'","","Wkf#",")spuPy" -"`","&NgU{7}","zA]&&{kE9o","h,&|5","jWNzw","`[2p""lG2""R" -"9JEw>3","ccc~#;"," ","80UvW9;/","","zebGg>#." -"2{","?wLn]","OXM","8+","LST%bsEJ","," -"V'","OzdoP^ /s=","%*","goIg|b","u","KKQ:va/E-K" -"\xSS0y|2","&","n~S>A",";in)T|","B""V~,z,i\","._w" -"A","""","[e_o","CJhj;~-","3_e2",".%*61w3>\A" -"","f6bOj/M]-","nlZFc7g.",": ""s q~","is/?d)T","c9+sD3bT" -"C0a'R|D","|+","gNvw","","CCZ?F1","N\;C," -"iQTa+b[X8s","""H""X.|#B+Q","AP26-cwO","G","","""EM^D*%%^" -"!ICp*Lw","7[WHV""XH{","[@","U","'1P","RN6lj","F:;'l","*hs%1","" -"",",~&gR.","3fIG","rHMo","&","#" -"JnsY","@?I)p","%37+bN","yS)]_3YAX","\31p!_","n}M(" -"|5W4","@9j-","PB^HQ","{-cCfQ]s","S","m[x64" -"[x","C[zL>vh","h-Ix;N","1-e9 %Nh|","mwdP=M,","X2:d>'0@Ku" -"Mc={-!j","ovo>;Tr","@vC2xP]3","""'Ev","a[x68|<)}<","DX\y)" -"b5U","MDI","aQ,}$v~@7#" -"=""","[[f#7=Nv","mQ","f~\Z^",")""$-)qwJg","I+^]u" -"Q>`tw7+^"," X","[A_qc0FRd""","h_","Swb6$","vRY" -"Pr4","nma)mc9Oq","- TdOChW+i","WQk$A$:N","_IhGX_RS","cO","Ho3@l6","6?","X=_R,8C","GHr",">Yk9{wPy" -"g.XDqYM","J')g@","Nm87","l=?> f","HWQ``Hd",";Oh1""*z" -"tldt ","opHA{-W+)","*PVq*Nnxnk","8",";W7,peh'","-w3kZHa","","+/0|>*.","YCD#$","DowrP" -"m","c4","xd","E6(:>","","_|" -";&d%BsH|i6",",SSk","oZ4" -"24f,,4","bQf/","r\;","zlvdPU","","Vkkp1eZ" -"w@v4m ","","D&","C34$","ZAgUJEP","wfSP*DFUB" -"|\.B[M,|=","y","uV#$""","jS4i","w-Y","~V" -""" LS","{","","al;p","&,ocis]","qj" -"1h,: Pm~^J","tN5zO*QW","<9lU_","uEbd?Ms&$","%bA3O$a","" -"","3P4B","Vh*7lq2","hQuYV;7","0Q","~""3~3yvt,z" -"Aq","{8%N","I*,ssZ(:>u",":68[{yN","","""uu]3" -"I#]O","Gh)NfB##q6",":p","rENjq","o","iBwt(" -"Uw}}wTD","6",",e@rNam","WO","x2tPl","cR9h" -"_o8go","S/","BWo_","z","","t<51fb-j{" -"Xnp#=","(GIR","","*WjHzw","|" -"`ikUg","",",Y","CX+\","U9\HE)1Gz","Wzs0" -"Kt","VO34)\\!*","t~zJ9uYT-X","9`9iN^"," Pr","!F_+Mhf" -"ij+W","jG","","","a@eHP","~D2:" -"","f[fd?","4V","]{cy<>44]R","tagc@me=","Yer" -"=","_ ;Tc","ji36s//v7;y","!Uy.RT$z","","PP~.C,vubY","k3%am","2Gs" -"E7#&8hMZ","-o","^G&","2NCWWjXL_E","","OFIQ.r" -"k@^b","q","wb)etgW2","bE",":F|>=q","K$" -"jg6#j","i","c","^|)2YPk","+<","-4A!5a" -"^:P3{^S5","Z~Q","^.cKSYy","","t*34V2>","t-""Rn]""V:" -"","M?=gzH[v]","[6uvyAC41","d~D","%xe_X\t","I" -"zQkYWrs","(#F |*x-","Sd","h79{!","NQ1LSo)6","=v`fl" -"bp5tK",")YaaJs8","w:rSY4SNecLp" -"vCJ,a","wg;S8js7vt","","0d<@-_O)","{MKV^N","^2" -"d.D`","'""","x.[&","*dcV","{z","6y+0a" -"K{:u","-{u3aN""","Eqr8%O:!X ","5>!p","ZX>0W.~lx","/p/rU" -"taZxgwfN8]","","]P:9M","M30-ptS~]","m4.7\V#'?","dvB?" -"3rq%*Yw","%f4v:4Iu","","5oJgGtPUIb","JI","=D!R*~H" -"gkVe;yG","R\oQ^67)3","2W0|b+ c","/W@0[;]mm`","2<}8I@z","uq]A0=v" -"YI}","}XVL!C",";i","wL#cIdG%","eod 6*",""";[qK" -"r-I6%#","kMM","b<<#4f57Gh","LQ$EPga","kkVPwlN0","Y>%wr D5?(","R[3e,","-j$<","]6aw" -"foY#cWjL","h6{BO4$","c+oVNk","x9UO0","{RIdlhJ","o|E" -"h=ZW!:8Kl","oqW","","R,(5H.piCE","0T","*fAdr" -"e","bQ","","[u;.","/9r","P ^H*X" -"n=ZO@A,S)",":3OyJ];G2","sS","{SZ9?nF","""-0#","p{n" -"8N'p","oe`;S%&MH",";}p","v]@eS,+B",". Sv+p$","BQ1m1HqV-" -"19]4(J","$:+"," 4Pby*H","Gi26IA2<7","AwIo1~z","$_x" -"{,'","g+{!s}g","meNrc+n~",")","WIu19/","FUi!" -"t,k\",")4aJEL<","e3","18","=","aiBKyxK" -"11C/eT-N2","v$","O0Z","u*E9$&#dR","J#{}","p FFaC&$OJ" -"-~J","L:K6 ","?","1","<","vi6G]s?D" -"0-","$[:","H","D&A","JcPwaG,","V" -"9,f","aC3","","mq}","4","{U|@/l2T#{" -"&N""jfZ`","1q","sjM","PrM20;(7.","oA3xzI\","O!H" -"$QX~VR","H/uKon","y-:V","Y\L;'&;q","DfLF5/FDPc","3>MA.8]a" -"Z>E9a.5~","$F?","T~rp{iU","","XWh)V3","H}" -"2","MK8?$x""w|.","","V$F6J.!SO","","8yt" -"_NNof4","QCw-Qh+",".J4xa","jVGk=(+9","G=|q","]1vi>$k+d " -"C9GS_","1>R/V0y.","","!","4pS","E>O6moM~ S" -"OX7-=<(","Zyow$o:,F","Y2Zl'Z","+9Q","xC x9]RbF","jp/RqMEwy+" -"!4BKn>}t","EN","MK","mKD","zTZq'3j " -"b","{v@","QDSA","{--/MV1","F~<#`{9^Q\","bY" -"DBuM4""jm2","e{ho8:","l8S","7","7I~-&S","D#M(n+u""" -"{n~%(z8m","T{o=Q","5","8!>(k1w#","!VaD]",">b~_(^" -"JB^(gmt","kq^,","A#yVx","i.o3ia)kRm","ze'rP","[k" -")#","-P' t~","c/6&","U}","","a{tY","ZoU*EKdP","/X)qa","O[;\RyO{" -"Y","*r4PX<}","PGrVzC+Q","'W;LxII:xo","s&?a2xX","(" -">,E.D|OK","DuqRfMYR/","|=c[rOgPI*","PHCU","E[hAIr#!PZ","" -"|[dE1`>u^","-cCdxXD+>X","","0U(Np","","hfDi}:tI?z" -"!''G","I","X9","a","`4d,?]","B%)("" Q" -"F\l]\","I8)$]<^~","-?v!K7#p","","!cq:k1","/`=" -"","DzvVS","8 @D^BR9Dr","%z","^'GG|oeza","@-" -"gT^9f ","","","Q}q- }%G>\","Eo1<_&+","tf" -"`{2","bbVEi","GcMv`P$]a","bU","v}|B$vu=TTe-H","Za","Vc+M)kP","","Gog!3c)qY","t5gq|Y2" -"'+W5","vs","c9P","/hn)o(B","0/" -"\+EoGy/w",":7QF$]|QF","euVo|G","HNtoa5U{S","g",".-UFU2" -"",":OX+","9B","N-R;C*J}H","/","]" -"/z","/QI.l@","","n","=","Y)tF""sb$" -"%ZL)LVy?","Xkp*,",";K","w","bha""","eMqxFJK" -")mE)Ldb","","{&H?UX#%ZF","T.3zEzOIX","""A2""Q |y","on" -"gt,^[9>As","Vt*","')T%","M","d@I`7n*13","&dBxYQ-" -"*"" uH","^",">u_I;)o","]_f3d.","t#bY7M](","\{Ge" -"["," ?""o~aBm","r2*TV^2","{mP^$:B","","3""" -"*S)","hUS0<*9","x6F8!Yh","f","lr%""dcG;","P`e?\kp`#" -"GqL[_G","X>[G:_i","S5SIm2","HZ","v;gZ=@","lp""V+')i)E" -"'\%","","M@c2","1|_;IfHt!t","Na[b lUC","cV" -"","","N <","n","lDbQ","fOT}A&sROX" -"j#=9J","kGB9l","Krq2omq9","RH+[b","{ MFOQuYOY","1?NGx\~)" -"vsl","[r","z2ZYUr)R5","jLO","=9v9","IJ'S" -"6[J4","=.2dB!","(~qz|F","8S22","3.^bP_2vzx","p" -"x`58Q2","XlP","ATYEQ",":eF_8Ml$RL","","5-?UMGT<\w" -",CB]|vx","rWOb{k>&p-","Bp0M$-kap","yhl5<5f:","E]a","]=/HY]@" -"tn~","`=_829iI{m","V","CI2,(","","y*W-=" -"YQjb{","m","|?U&k598","","OZ5~","uf]|2TREJv" -"\"," >\$^EY(8_","Rjm*""t@","}C","5%1Gah","O" -"(q>Vc5a","=/","Ye3drpl","f? = >>",",,7l""%v","e!%ln^.<'" -"=mnib0@a","sr~n<8i(aD","ky19#u/ApN","u","?gV,i2","'#-,[:" -"B","h(GdA","H&","d1y*j&k","'xT-2c","7JlgbHY" -"9p1k",">","%% iXeV1)","p'z$we`=Pp","Fq","I>Y1" -"ZsJZ","Gji","\","*#0 h~(^-q","=MLU,A8s","dm.m3" -"0.e\O","|nW","6'?L&<","EJa","JU1","s_#Qhx" -"","Eg9","!mOw=-!+ol","*1y,8\=","58 z[","IGE^Q>l?fI" -"Rv(p",".vd~96=I>s","3u%+E","#B[0@","c","bGq" -"SScmE","l Kh","l79JXC3=VZ","k2","$o""~","p" -"uh","ex@7k2p#m","bl","v","c"," $)T[V" -"f:ryalK","j","""|ARTeqi","","K.)4" -"N8","3u~","TD","q_I5L2J3RJ","ye","h8[" -"Ko""$","uu')*69X","3*Bh/P}","\[G%U'6","6%?","5UPL,1RLK`" -"KesVA?FW""","{lIto~*N","_=?g3","qes","8},","NT)Hre" -"S4Pd","}BZ#!&","}g'G*IAs","]=tw}",";1yXn9","90" -"4X+/""{+Q","|gxc6","4B];'[Yj8;"," \5","d]","" -"X\rKIB{V","]b3N","q","5vTkM}T7","lHM2Ax`~[","dhq" -"jjz%c;qcn","%hr\`~2 ","","]nLj","ndwjy{o","e_h" -"Y[$n?3"," ","!","","$KJLM",".zA" -"CX'8`Y,","k>w&T","E!C?Ut:Y ","Zre&","","" -"XgDa","soo-9u:0q","K",":`(Vh9RTCU","OcN[FV","`","@{T!""" -"^\s8:FN'","3f965+","B$nZ8`$;$","N-<","-?e","-Z;cPI" -"3lG1=W]NK","O!E0I","$t>r$/Jwo","E","","Bbp1" -"","J[4","J.W^CyoH",")cD","L","eV&[/" -"9@HrYJ`3Fz",">4"," /o(oz%'Y","lnT+","Vehm>,E*","" -"^qTZ_","%E@5So","~>","_sg)T_IRY","ppXj4","%4'" -"fG","b@D~u","P","0c","T!~%w&anOY","q9?uTURqZ" -"~%v`aU","P",")k","*""","4QXuI;\>","," -"SElfh$",",g5x73","r64`Y","""&Hn[,dk0<","R-c*wcq","""8^O5GKL" -"",".","2/;","=uQO8Q0E)~","?-T0-K'a0_","*rjf%5 n8D" -"kQAL2EM*yH","ABf^~84v7","","*/","&:]'.l","+(@","Nz*QRNB%","T" -"_y$##@","","1N!7#j","D7)DVq","sQr X7r[","L" -"\R*,^A(","yFa=6%z","0#[aK","Grw!S$lY}h","peLP","NO" -"*!w>F","o8EU@","I|rc>2",",U% ]A","0","JS/z " -"p 58","@Py@~HGC%","42B^=^="," &3sM","x#3J}S:k",".}67" -"","m`,v","G@4","s","|t.}""h|.","b$R" -"5%","N0U4","","9F;r1:""H%","","w7^&" -"l\{m'0","{","""""~/","`j34B|","y*CLY4E4","*ny" -"BHw}Fk","V4T9V","","94B","b9'yX""","@q\<_Q" -"b67Vf","1b$8","Z$Ul","pvp0O4x>","3FvrBg?j2i","=M" -"+ItwpkKY,","^ady6^nv","","-wsfp?","LvOcvq","Zw" -"`te",",B=","mK7_A][`w&","!8@;`#!n+","@3o46!S\","" -"Wc)E=FQt3","`lkmDlK","~GO]!%E2Ne","[icn0_w1","sYsucGc","0" -"","0","S2mFv1y","sm""Z :",""," 5$" -"","ktca'+_","esj","","52l=I]5","e,]I8Bn" -"P%=2T[d","/+","63$Ze","^1pKUdv`#","=r!","t>kjX=.|" -"~a|/T","O$S","dW^$pZ","/NJOxu3","m%","S""giH{<4/F" -"sV9w|60?$","'-k@mf^","QJ<","QjO']-D~","EasA","0{8l`h&#" -"3-/ch9Wx,$.","yN<.t&!.","d%IVo2Vzf>","lH'y#fTEa","8d^XPhWmNG" -"l8eVte","{gYR2hLz)","[WxTo","E","NO_8)d=I","b+@ZqL&asM","Et\" -"KW d","|M!MP+&Oas","\z0`","U","g.k","HSMo" -"E],@","7=Kx$""","pA3","CcM","l=a!="," kvcxW" -"`g","Ym6/V+&3z","I3""`1l*Uj","LrxBm:3i","","Rw;*X4CH" -"N","Ag","""F7i_z|&","","Dl1 {N*05i","?N" -"Ox0hNYyJ^;","","2U|-","<|kg=[SCxr","7q?Wj","u>J" -"wrkVHq{","UCs","D","V^[oTJ","C4*K3","yz{Q" -"M}`0+?1","1F-@r?","s","]","ZvOZYk" -"Hc%lPt+i",":#j","7-v20","I@\/{)^","QX",";Fw 8G>~" -"d-k_FKj,3V",";M8Gi""`F(I","m","Co","|.I{w","Ph>NyA" -"9@@?;","t:$x:^`","r?i","e","vK@a&G(","FG3\7oh" -"yxwt\5,o,r","&3s","M?c~oD","'jFO}OY","~t)V~.","(+w1j" -"=pRx|!E","wE>*zq;0Pk","","YAm&%VT&)","j|.i","" -"+Pi","*g","]7>%k;","=.*Ywgzs|","4<\B`$=4","vKY]" -"H'qizT3 u1","|l2#vYI{F","0","C.W@ ;8","=!&&;<","p,2{" -"FMxz{KT~","30}LX[.C@E","\5Q","","pAM=","r+r;eJ" -",","'N!*""","@","miy#0pL]<","mf{","#z0`s]" -"g r&","{",")l@9","P7,j%","0Jt","v" -"&^('>1q9x""","cSE=x4=5","N|MptOz*Z","","\;x/8m:","#T" -"0VJ[","","NE[jM ^X!","""^(Odv AY","","0" -"%7MW hq-","Nfl","?","m:7Mv~}G|","&.x&1","}*+qI'%" -"TLS ","8pCh0is","a","Vdg\ m","cP+n,X1k","/TD/lD7=(~" -",r 3a)o","mOV==","/6","~]eD","","=u""c" -"#-'mX","t/{Bl8","69_z)g\|X","","Ss;Avh}m#6","Zyl+?g" -"3","2:t}71?6j+",":[Q'`K","","))V","c" -"bxL/((`N'","A2","btd)xs" -"`Yo~7*KPX+","x5b!R@#","Z)*pc","VrckVlGQdy","","(g%'C1","n+.l0B6" -"W)#l? 2TgT","7`","~a;L6","I","q`v/|lbQR","$" -"A""Gx{s","dc:vtO;","lx`4,a","V-q w'%","M","|q]" -"*8","K8/|;"," ik<`N1M3,","/","","FJc3JZ m" -";!","M5+%]","+Kt(542;","!V|","pu","]Izuu}" -"+2W/#]R`","",")B^$","","2MK$<""=qX","^dS|" -"z*","","}R~eL)","-]sC?%"">Z","#R82z)vsh","mCRO`$a" -"s2","B&*Y%uUOOE","T|c!","6","*iP@.QXy+F`T(5E","aE=o=f;","<","dd ","NJ{ &axo",";P\cD" -"UEd`F^m","&-gNnM","$28lUuo","","Wl","]#" -"d8M","+",">","7","ijMrGEC6O","p" -"f@_","[","x","b>\f_|8G^","N;,nK","lK,f|Fz^,`" -"frpz","","jI|qqIi","E9N%x","WT","bC(sD" -"t","MJ1> x3","z@IF*y!zP","(T!gW,o","m1rNM","d""A;" -"3Qk.' ","$r_:","O=G!(","","!cFa|h.Q0o","'~u(\eY#" -"r!vO[4","\","0_&w`]mIb{","m","","r " -"V","DDU#eF_f% ","A&]a|2C/","*Sj3@$A0,",">1\41PE","Z(P3aR@" -"","u=Vc3ls","twjqlZX*","J_,H@2","?bgPa","aIj" -"Zgw""MIQQxG","P","?{pK^n]","Nr1 D#xJ","D","iVnJt" -":E&n","_""K4.","%x]","","T@Y\roh~N","LIL9i'8?" -"","~u","nA3 $V>0","!4 {","WLO)I","}$c=1$" -"f}Uc7g3LuX","+2-P","""x'^.","?","y!U!2-Kp8x","~F" -";1r""A>y9","","","=","P","" -"tjT","'","Gvl-"," q/!@N'0'",":XM","e:","jb?BuRT:" -"NR.%",")]5Lti(2~@","U=tm","WrArhRl""","y~","Eo]P" -"_ADu Z*F@","$r>X","mOJUz","g2","g6[@qWo5","C$" -"o(x]p","%f\","aQTSj","","Yh,u,X","5" -"JHSiP","WS@\","",";Y,{QZ`w","+![6/)*","",".X6 ","zx3p","l+6$g","YB7#~+4" -"W(XOUt","","ABY}~","JD-8o`g-XJ","l>ji d","2:Fb&Zl|" -"2h((k","P4]W,)","@zn$ux","P=","+f","#_" -"3`|e#/Rcv","Y",";8c{","zGY5ox",".?M~s11r","'r19)SNG" -"w|x$1#","l","{wT","*jYl-y|,O","$ @Lql",")um" -"Z[Q#",".jV^yJ","ZyyQm","Nr<+","(:1qzgtB(","f" -"f","UWn""Zf","n","7i[","gY=;Jx","" -"","MPH@{e,c*","Wi?~hQzOfX",",~Q/w['","t?x{<#N","CRcD" -"x+%Dvo:E{","8 qo","&+&ZDk$b%x",";\0> &^KZb","y/TR'1t+V","" -"q]\0|","iU>","",":#?A","L0;8&,[yhK","y[C7" -"(.",".et","a","\P@2Y-3{","","""wU\8a@" -"c[=5^}4","&I*P*","aLq5\&","N+/2V","xjE} o""","" -"M[U","gd","-4l_Q12wq","ZZT]L0","","d.kE)8B)" -"4uGc8E%m)E","gh-+X","}i","gZ9@?","Wwni","Xbq~XQ" -";:","O}ojl2i","1","^a~$","X^","$hA" -"GEJ","+`;>:<","VGU","@r#c-aRYm.","J>>","" -"fzi","",";hQZ_+b","F6(=` TY","H","M'AI$0D&" -"+","5!CJ0'!@","4GM}q%#fE[","","^J#mf7&igf","4T" -"f&={4VuYh#","&K%z","BRvl","<~UCW7h7L","-F:ve>eGd",">E" -"HIO","/~1cy9OMg","G/({s","}3%","","/|>]w%j 6" -"""#L6)","+]",":""^","","]B:ZZ","A[" -"uTPB$d$","j(R^","p1(*L?","Hu","","sU(HeC" -"TCD~","h^,q2|^x","!{u",".>^B&" -"b@A","./CXutA","UtN/'|","eg","k{OZ4G$6","`M""v" -"02#SV+,","kL^DY7`r","}g5L!c88`" -"m5myog1s3",";x","x","R!n8H""","6{S+_","Hc" -"h5f}n4~(`U","V","uCIpSU6 0","Zw7WX~uzbr"," Q*c","" -"iqH+rA=5j@","e-","+p:S:"";","Mj","s)L[INYY","U" -"M","<_=_pq","(","""~ge}/<","N","iu",":","Ai7 oxh","Gu" -">#K","4^Of:&-","l n","","""b_","tDp@B6" -")\&e^@yFb","c","- X*o","Iujl,;X","y ea`4","]FP" -"8;;tGHb","5GI(]8%","0B:pg,a3^D","E","~G~I{E" -"&|*YT^u&","UI__:|l(3q","z","euO","vf}'.J\MH","E0" -"^","&d?G{&",":\r","kD","EQE$","E4To~<" -"L","Kc"," ~","0s","mx|qUV","JuTeFhO" -"}N'\|u"," $fu gYq","5C7[","H+i","@3$ K:","tGW" -"#^","!){IZfj[","/$+;P]0l~","5Ga(,V",")a,","j?@Ih86qCz" -",ev%/3Xm:R","","y~Ev]]>","G","`7\S","" -"DbsFI.L/Rq","\&T,H^","n0+9hT,Qo","$,~Iac;i%",", ","rV`?gb4>" -"[)ZC","","a/_X$N","Z3xrK^3",";?<","8RX`jTF" -")'pp1nTL","\81kZO","qX8","#I%","qe|y:^=m1","w-ka#c7" -"]4TlU8kM","lR<(","C","0]O1E7*","","iay" -"G""v3v!1d","o,","\1we7dU","9kc#Mt_""","v&""q{ R t","t}ZAG" -"t","h/l}","_","Imwy%CG>RW","4SbC",",vE" -"t","@3>ml","T>}C ","pL","C]i(%S6e","8W1@e7","26A4vD@|b=","7l#\\X'gjm","ZB","/THj!^C","Kfye*" -"<=e","}*","t}kQ&Q0dg","|0b","0g*Ub!PT","G" -"n)FmG"," $)eUFe:","8$VD1'4X#M","d]yX&)","Rc0VIn","bTK;'R0q^O" -"-E#e\XH","`%4Uv\J9ix","8F|x!t-Ic","K+=!91k","9>","/N" -"RW","?'F@Cqwn%+","+.W","m~zxbMh+}E",">xL'PEk$","o8(Jn3#7hB","4y!@1Bp","D9m;","6-" -")=,","l =,#*#5OB","BNx","hr_:hKS","PS","C(AZ#o+," -"#HGXVPSQ","SQ","`","@LAh1X:","}q~(fo","P3RIUzI" -"fl6A[R","mj(","EJ/3Zpb-j","d","","rTr@^m" -"Cp\c*Vwsx","'","|h[;","G","\\U","Ex\X3Mx6u-" -"st c","","U!Qz6Ebn~","5pR4UjCjVl","i","/j^4N" -"@:","","",",w8)pEm>b;",";","gH*J!c" -"","XBs'!4","0&:kw","X,FD*","0PBc_9","a_" -"d>y&","THAl","","8e{",",3DK" -"Z7>&JO","XFr38","`","Oy1k#^",">iT3$!.","yMSO26>zA" -"kD;q.T","(ft$]",".t~'ecyAu","hd+","|)@,x""$8","X/b}1Z{" -"=@>j ","UnNh0I7(%-","p5F~m","-Na","WP@^","P(#Lp q" -"","(""nXpt:3e}","qF\","ypb;","X$","._r_1Q[G" -"K>Biv","~J~!m:CW%","y`ntR"," rY?_E_c","'u?,qp","x" -"7o(AA",">(;v:","z-z5","n }A","[79)/6.: k","" -"2!4CIt","2W@C","3-8[B","bQ~Ug28","/$Esspv","4?Daz#aje6" -"%[jTK","YeX,wa","9A~|v","D","!xR~X","h: ?smk/G_" -"/","OI>P~Cu@$","v:IQ\ZnkN*","J?Sq^6Y(","}hQ%","(N#" -"^f3M]~zqn:","jU*@%3",";z8`HsL*|","-qq","T2","`p5""" -"x*l-","0F9MDy!]o","JOynuf","9%","~!","5|" -"Dj@zV.","E}- |OB","2p^Z","B{fi:?","eL%>Pi]J'","9C""kwa#" -"LX}","PrLfFS","/}>a0E","("," AzT`6]W"," %e8.>4i" -"&Q.W3","""%5ohk.","'O","|eMU6y5h","?","T" -"A'"," P","'","(9-","","" -">?""_@uqs","<5IOk""7L@",",a@y","NbodJ","359fu`NN",".]g'\9" -"K","3OdL2","h""q_j","Qw","n5&=Er`D","OCU<^G:e","V?83jV","je|?","<",">=I*C.^Xj","Cmev" -"T","j4,}xxcV","cB","q?H","Q.HtJ","YX" -"`'.t8","N\","/Dh","j",":E*@Xj","Qs" -"b;fP""MoAZ|","u[hJ3T&gV","HU","4vT`[z","P2$*","cn%S~" -"?r2u~yr0","#55t","=[CUa#q","sG8kHNl""d}","","SJ9" -"TIUv*","vZh.EU\-","A","U","m","S@@" -"",";n","03Jp","h)","Zz:w72dcO","W2tdn" -"c[&","P%!","OYe#d","TpT)","U.+^`K","M4n~3vq S" -"h}POP'","]E","J4?3^","DGg7DE.'J","5{3fzx)%e ","lct;y9jLf" -"J3fCPT","CU~:jg>TUq","J","r1K&","%yx"";S$Pv","N6vZ1DN(" -"j9.F5","","\kiTSFFk","=Rx&g8","0s~Xi","/0peGo" -"{4(X1","<:{","\=F-!M2[","PHTy$Ot!:'","[DQ","L!f[$]]R" -"","]","gJ~imx(c","T.","'^&=9Z","_+Q#7(g:" -"M4'{","\N^","^","E6_(Ap*","q]{'n]","Ql\HKo" -",E+>j","","F{y*","","{6[XQ","h9" -"?/55z>e'x^","/","","SO`*jK","","*ORgj@QyG" -"!cY","uO8xt7 3T","ld6~9:J","RlQ4c","x","5l=m\R" -"63vLt","DFyH","=mm(pc|q","(","vX",";+W3S>;E" -"""C4-SSl F","=LL/+(","K/Eci","","","" -"WtI7","D;ou.un","R>D?#bym","=.AUe""GD","v'\&dfNfbK","!(""V)|)}" -"y;=n","es[T*o2","~kARTB","@)F""X",".!74L2Kf*G","4" -"xwtD","(.&$","$Z5BJP=rXD","ZTw,""9do","g","V" -"R&g5iIJg","Z","vGP","wG{Do","1Z","KRN$,b" -"+2z","9dX/j,\G","@=","y$T7O<{W","""%`jV|YI0","] ETvdAF" -"a>Qk","m@VB","^","","","U" -"H","""GE&","$Q","O|2-","","@C_l""ct`rB" -"BG3","ie","","{3h6'Q#","u" -"rf","","}QlF.w&","ni&a\","XY>vp","5J%51T9" -"|l","^U","A&ra,.`~","rQ","J6;rt",",{lo?bMh" -"WrYT?","q,K(gK0.","?","","WcEt","qL","`e|Elwp","GnlWNJm","`7\q%5[=A",",""}" -"^vV#","y;.\G&&\@","(URI@6a)jQ","m]~M?{is","rYeF|","]N4" -"B](![19;W*","w%J0@;",">OO~aO!mf","xPmNoX^[","jg8'JU","sYq*" -"itA[","@0lg|dK","LP*y*","}+HNr","?]nzT}","" -"tA?m'$\","rs5I5gp","6i*q","]",") %\L""Ce&$","F>i" -"*~Gi#","?sO","rj4=k[Ke","0G;yy","Ru","*9TU:$$.O" -"]","iS","-W","%#~#yBr","s","&U8r" -"","xRBII/","s$#","kSO","k8yhB?j^","!V&SSwp3" -"K>Qu","o|'PO?*q>b",")(","OcKra)^zy2","j/","yQ}/^08" -"03q4o#@","b0+K*yVO","RBD&zp","d*CN}Q","^ldUmLC%(U","@Sq|;O}iV" -"Klr","+sJlb|It","f","vnJ","",""" D[" -"ysRWT$B","e.)","@&4>1*""FLl","g8","$[d>va9","UbeM" -"","IzL3Ad$","^mGX5TK","rL,cp5:h ","Eh7)","""rDf'L" -"Q(+#c","Oct*:","","a,",";O"" bnX2","RE#" -"v|I5'yz]I{","bf3sNoy","^+N'*+""""[","Bq4@ XS""in",";j-t@Eekg","" -"9","","","J""","QCiU$s","5B/n" -"LpU.F$P`&","ej[p""","W?,0T?.c","}.L$a","#gUoHK;;","&=eHz+" -"Kt(|A","+","SY$ ","P7OfW)R","7|","whiJ?L=" -"w","+\N>_p2","BR^5rgWlJj","y9m+","K O#TO8","U" -"lEvw;WR!q@","[UCCz>,^;e","j!i&;4wcr","*V""8>u/n1","!]cK","dX=39:U6Ys" -"Fyf,o","1y%.`D32q","t|O\&","wb )|","yH{?]R","" -"]-9d","Jj+Rpp+ C;","1v,C{vlO&f","+SAr}""","@+]JtHx7R","4D'" -"~dKoFvL$","iECeIUXM!","q",">Pi+","l9nIl","8$x)(<1t" -"f_,CGQ3Xj","!","5c>N","n@3/","-Rvm3","RyLv" -")","g+{C8ep","=y","t8,//`oTw"," lS.'Z"," " -"G69JD&*",",e=","4dW:q\c?","FBPq","I","1p"";xgMO" -"p;5","","|@]","/0c4",";y2:",":_'AFa=" -"(","","","mJZW~#+VJ","z","P" -"dn}Xw7,:R","r dT","4x" -"R6Q.6r",">j[",",euQm)K2:","(","<","I'#" -"","k-{7,JW,{^","1","V%2#oE","Vh","ehN" -"kH}pCM","FAtz.d%%","m","VR","PU[;xxP6g","j6uUPb*I>" -"DfsKeW","e","eG`","#H","r""O","" -"9","Hzul4","#%Ypyq#p!","@aJ<^?r2N|","c51 ","5u'hyQ%DK?" -"%(WA*EMtVq","3-V",">eA}3lY`;","#A+ FaSrI","v#d","uy?=%?`?_K" -"J""","<}lA~","mW2NMb)lR","2Pa_?'","p[RitFhgG=","MH4m" -"?lnjj|","T1$","","FK","K\'[g","TN" -"g","","","","l=K,2J","o)\j" -"{U","E>w","7 'n$","^o e8&y","^Tx952","" -"w>S;","6kEOp8AOf","`h%Q2C","T6_7","h'%W","M~wi:fy" -"c'",":plRS3G=S","H:]Fm*`","NkOlv.","a8Io)","(~mi" -"r@M!aZ&-tWFh","uo>*L2`9f" -"A","","rI3-`YN","","Gh `>","an!S" -"oj>w\G|47n","c92C/nk","#","Wl2(yA","Y'","/ZS(32\" -"1QcaxxO","h#","L+-5PIN","iFyXP .&=","WN","E^Tl" -"!p~$[yne3Iu","",">tz!p&[*" -"mV4z","4+|A_QZ['",">,HPML","$}j([""V$X;","S3El","$" -"H?","/jz.{^<-","dm","O","gt]","hHrr?" -"tq""5je(\","IAuoD","g",",O>JKBp","SN","nS?" -"0i6B","x8^Mvu6yv","].","vjE_HR","1YG;zP~[","bR" -"i2","h#8zA","","(~W{CAn~[G","8E_|W4c0P'","" -"3$upm","""vAmbyb","msU9 3eI","hg@","2YHfF^Og$","m" -"[i","'UDP0Qw3","NHh!@M.b","rQ5","aWf)~6","bIjX""nh","`e" -"oj<#YqrR5","!Li}D:","deQtMk@?rI#","A.p","7k_h5M1V+" -"","","uVa)@Pa","3GB","-@dPF","%" -"eaI","<_f5","k6Q,!#&","{tH9e&*&bJ","TPV5OCM","8zS)'5" -"6F&dXI`Br7","7JM+7","mB77Uc_7","@74#","`P","M(\#>uZ" -"q17$i","","L^e]","75$","Q","l=m)KS" -"`{1","Z'! r","!R","WY~|l7",".wzMw","%YI=BpO-" -"r81S>","c={*","^0}","kT,r00+ggb@B_S","9_T\4IgTkB","SVj0Z" -">_Q-qN!{","kb}{FwP!I","?[B2\q","E;>IlZDY~","(SoaD","EX" -"!","FR}","H2jx","BQBnG632a","SO;k:""","~5VQu-O" -"E:#","BQ","Q","kI","D_","" -"mw0N?=tPv","]L","W6X@s_*Qg" -"`vX3Nwlq.f","[Y","pm$[;p","?8s.","1kkM^%!34","#5%bI;K!" -"!%M)fm/`z=",")x;NUFk","K2",")","",":3" -"Ndb","NbP","!k*==","8/18eI$","2b9KW}N0:","mhH%8P8" -"s70","","*x=4aA","wv9)+","_|M","9y`&" -"IJyF+;","ek","N","gs+",",","+E].an" -"\.::f.ha\m","* VMjbU ","nGQR?y,.6M","aEq/.?/_~","$qz,","nad""@gc3" -"(-","{nx4?QG","us","*!e`l;&(h.","0","<" -"_mlE.o2",")gX<|oNMpq","pl","",">%`%C7p5T","N^U^='4q" -"^p(R","K+9]i,","p0]EYeR$xl","QoP","db1'-T","48s/ioJ_>" -"S","2=t)T>zBd","","n|%(*~f7","","" -"ux'e","M;[oF5/$^R","'QU","THZ<","VrW[{fEX4V","l,dyipfMz" -"Bd.a","(z-W",";V","""s"," N","Q)B`5@5" -"R$oxUv1v,b","6","V$}W","%Hj""+2HYv|","cySY2U^HKB","x`>=0Z7" -"%","g0~3ZePY","D^q","y}E>U{(","<7a[zAraB","ha" -"^","W9","a","}0,A@","sV","$J" -"H+U!@!7ZM","y6c]I/Z|","eONy}" -"a0r`PJf,","","/0E,","SqW4ygj`","v)|0J-`F 2","" -"M^XO`5G","PErd3","'Q$\","?D","gzG","{1I0N)+.vM" -"A","~.'g","BgT.^fY_#","vow]:PZI9W",".c%T5","KMd~f2e]cT" -"/@-nD@","[/|+Q5tdjG","L","gh+`?g;`Xd","i< I34","[FA-9L&H" -"}7","[HND:;'5","}PumJIN:[-","=**","%o/O","75tbHL1,'""" -"K^!","A5DZQ","a/RLgy-)","_","j eUlA]*p:","" -"LD=hEhN1~W","d}6&S","g&8QM \","V#b=Kf6","J?","8b" -"t.",",3ZS.(l8m","ma-","O2E>V{acu^","YM@3+!K","KV{" -"@]2g?m" -"X ","Oe}36+",":ICO8:""kUe","]pgDU|Jyl." -"}R5%?lQBC","9Bu","[RU%O","V&l;&Ve","B-'","lR" -"%-9e","=.JKh","h/","33","~.*1aLx","b6=M" -"T5h?]s","e\2","*3rS@>o((","+\","/EgP6lI?T","]mM5E]v" -"'nmK)5Hls","MqP","!H{T","= 0","","{>7" -""," ","","","pw1","" -"I311m","IC8jc=","?KMP|","-77n","szOUXL/","kd0" -"8xL|_m\b","_{46""N)-N","=L*""+^~zm","k>A0","3=.Wz,","$>p~" -"u+S","N!D'E)","dkNm{","Q!","z:_q=90","b!" -"'+P\#f9{!k","\","8$8L{_iJQ","LU","z","6z-E!$""" -"m{Rs1E59zR","]#IZc1\","""8tAZOs_","[(","","0eWk^5" -"","0ZV","&a.{m]i,}\","'ppVg","gzn='~cj"," UZ x4T" -"nt pZiE,","uw. |'","0&86o*=QA","WZVisJ6b",":_z(^","YfJv&," -"(Gh)A{l""K","Tyqcqa`,up","0oAqe_","W(fBB" -"","WW%r2{i{X0","","\TN","T &*4:Lp","2H" -"Mgt}l:s[t","&cY%","&F{U","","`_&,o","u75~n","@CEPSu+" -"","-+YVyf1s","-","w:]31S.`","f6",")R" -"F","j1{","%WEq7lkVAx","DE\v5)W","`l",".Uu`_mfb" -"=","","!FbodK","3f$raWo","@xHx+%^","b^yh" -"Dx ayqT","-""`L=R-.SI","R\X{0","FD","4{i","]?MT%v" -">XKzRlz","|,6""=","YO>","^tIDT?d","tN'","];0uW2%" -"%.t ^m@D","F",".t;","","","@" -"=?g0I|Lcp~","Zne{R<","KUP4G~At","x})","""j","6Kn-#TQl" -"B=tY1[f","","HS?Gv2Nub","6^","B'kj","HvEL" -"I8`IH0Ld","E","O=I';",",ja(O""#","8","m4m" -"evO","","@IeR","|*.","l{N","CqA,n}gI&b" -"~MV1A6","@1WXON,|","vmx0 qY","&DD","~L","qK=lQS?v" -"Oqc'J","ZcYAFWVy","{Absei","lx1!nc","w""Y1Qa","O}%qn" -"H(c""pHi:","R><&","","~Ek:","*I[c","!twJ\7ME" -"*T","BMEf?'ZS>H","~A!","BL",">PV|\","" -"GQr)","" -"rVe","(-zfq),","FrU","p]|7)66[","@n*^e4","gex" -"4>a#9","d01H;s,Wh","T8<=e ","8BQo&o","}j>/<","3 i3; 4O~" -":vh{_Q(/L","@vKp4","uN2r)","P0,^]3K'3","x S","n^KQ" -"J4=ySK"," uOPOqA],","Z","=V.}yr#M.","48","f+-4S)G>" -"S;6C/mu","Sg@4g","WybQK","E4+9vR .W%","MZ","" -"e>Xr","GqV","a]-Ksd=;;g","{c')0N!","MCi","n|??" -"VB","y)#2Crk\Ip"," iKqtw",">QWer","}{r5EiC","RYitXl([" -"Q","xq1m","g",":d-","0s5q+#","pkfL6jP" -" ","K$","MI6_b5`","y-KT","`q","vL'=6""r8]z" -"","IN","vK>Y","]Tp3u","rg)v`u#","D MOYY-" -"d@|4/~Qr","t;'pf","V%rz!<","","[n","?=" -"w}O>Ks","c_","WS","gOB&>NhV","p[T6W3A+[-","Y6$m.e00a" -"+4SH=YX3""","i1","'}UM=J%\y9","Ssp%","5ct,?kY","I7O,C^#'q" -"4tl 8<","gi.","","isBc","yG~OR","a:" -"[i1q","!","ly@HXK","30@%vS""fB ","@GA","49'yrjXXpQ" -"!H2KM_vP","G(+","Ta","x%A,;",")P#|?","eQT~" -"""FO.eHhc\g","]x","Jk1vPAwd","","}"",VC","3YY-;" -"Q#:!mN.g7","~-u^Z","","T`;L","7(d","W`#y`" -">","F<","[/6uqy ","MK4*","Z+","U" -"/Y!duX","N[/","Id'k","w","%]0| Y(","W62ma`Sm)+" -"","xh4Y5:b+4d","1g/",",bBH&T","","x6=a6HhO~" -"","qMa","s@pn""'H,","@i<","@U%C","Z. VO]" -",Sb3Gl","t","44","x","~","Zw/P8P" -"N[7","K>nF54""F","|&/@hY","B[2","Zi)","kPy*(\tIEX" -"eH$lI","B","E}Nv,31V" -"u","c^3aLxEs","`2f","$&C0WtH9","9=fzolN*^z" -"zto9m*{","q/UC","$0d,1Z]*^","1x","b@6C","Eg6ld|k.w'" -"fbs$""dTdOr","%OcmCsma","Z","3_@da|z","O=","*x[-T8!'""" -"P ","VI9l8NDsX","!)Mx","m7$O+r^CXA","=3',#i]%","}" -"jZQ26","@}J(","!H_rpoe;",",Yh[","@1O@bc!&3~","Q5|g&+" -"MmaN ;on7,","Vo9","XO","SDyl(P6""D[","zN<,q;UGlt","1vu>QF&Bb#" -"&41sP","1L","N","]d","W.SVV[O&$","O6" -"'bdA","",":'d$DGmA","}","","]8Q9f" -"*/87(Q$N","]?","X","|?^#h"";[,","9^o:X@!<'","O7" -"v@rRy","]","\rhx,pKh9C"," f$UE","BT[1d`)a3","UZ" -"&\~7",".",")No8!{&zA","R>","fBt5rs8<","mX152/" -"&","ZEP""","GV0=on","/wu78_S?Zd","@>NT","pO4-$oRY." -" 9I<#5kPq","g,Ss\~Qg","NU","tHr[./:~","ZDRR1@-","P~~%U,iGb" -"'!","}","kJRwZKuLx2","","'%N=6v^9p"," lf""}u" -"e1[t7Y\B1","PM/2 8+a","%OWHm","foM3$:","Kc)",">Cuc_" -":PUV1nv?W5","*","~l@s_","n?shlB",";=N*P?4h*3","p3jLf39<47" -"9x","hHMPhPA","XW9{b","7w3","","44""N#h" -"59Mkps^F","{*aYUU","","","R!OIZmS7J/","7E3f&g=T" -"89E5}=@","","dDT","UUa","","UOa;`Pa+Xo" -"A{G%`","CYN7g>`^s","IjYb","tY8","","$^\TWH1" -"$9Q%T2G","","{B","()x=2","NY&5H{R@D","8cS""1/`P" -"I9GG=owO","Km^j*x ","<*V.a9","]>;_d]'rP?","&6","" -"(","4lAY[xLS","b9^62@" -"KSq*>`^","tamZjqfI""","4X!&qyR","IAw/)) ","f<","FbEL""" -"xK#${E|&;","v&7h","fr","","e1OJ;5OlD$","c+" -"A}i","FXqz","""|;!E$""/%)","(B","0Iw q+","F =+Oo" -"HWDg|","rj,+v@[","BLQh","\kiJQ1QF","Mw","L" -";\P-}G`6","%&zU~KfM^","d7Q$","o\Rux","4rBx(","2_+hr" -"TqnA3{T/Ch","V","hm","A`'a",":","D/QRkBg" -",t{E","KM"," _","H|fHS0B9","v^)?mI[@","5" -"\6|w/b}'B<","syl,","fz-*FZ#","i}Q4S","","[a" -"KwoiUan","&Csp>0%#Ma","+8A&9Hmg","(C0kVRd%","*2R""","5I3|r]" -"jd$pN",">0wc4","t.","","K","U#7" -"E~fj^N]0:","|[ClslGP","Ek`yZ;^v.n","4|TeYq}'j","QV|~<","bHU|!W" -"D.","@""J2CQ{v","/5l8Z","Rd?$+@","w","0y8|" -"","""-(9m5","""Ib~5AkC^D","-FG~","","M;O*bW" -"@PqS+*h","9{H","CAuT@LL""","1/z!","dg""xFuMP" -"N","[;3M<3/6j","x)s","7$)=^MT",",q","*D0F" -"Y","","X[""+{","X3","N/","~" -"q0xB","^_)f..p=~NV7","m6^c","n`oz5\|er","k["")","x]|Q!","ZB0t x" -"","Ie;$W7Ltq","b?+R m'F","R_@","a(aK@)v4","d^" -":a9LLz5o","Tu2 KmR","jeOLC|" -"Ab.n","A[M","O_B","J{p;","oKo>{","+N}2h}lf8" -"@g'z\","p1[rd","","lp=`""H","&Bey","yD&" -"d-","$6","1,l","m`Z`%Vy","G:JVW""","" -"d+""7Rb=4Wk","",":wc7W|HJWZ","n","o!Ll#k|0","k1" -"\E]|","|7M6Pph1jD","~q","/rhg","S`T^VjZ","]p{i2M""@!q" -"0|s","!.J{G","Q]VQ=QS","!3Ow",")>4","EiRMl" -"W\sSAu","P","hd%L~uL9r3","WBeO@W__","ET","p*7)?" -"dDAp1G7a","~Hf{wk","\>mMvO^M","uJ3","2 Rjl<>","JR" -"K7","R_"," ","d/d:b%k@!'","l","i%ymq|NJq" -"@>(Kd8ee","k6guOgk3","""]","Y ","YC\;=W","*upJ9sf}y3" -"I#q",""";+0X","","e","2J","3#M7`" -"+:e[mW""uD","C#Tw\G","ON2&1","VLK~.?z""","[4""Z","1" -"","~.,38","4sz#)QVo" -"4!,""y}).PV","y|o","2","Uzw[}","_b$oC=!","7Bcv-T" -"SZv/gj","y1Dt (","H}H}","","/D@]","sa*" -"*$,1T","(tUe1&","""{;1EG?","bUB[{9" -"8x""GrfC[:","7KBMvnn]<","$","+]35m","-_","ou" -"(*UT9}Lf","v;","/qBh=","8/pRg2P~%","\]1","Z" -"*Hni\@Q>;(","QD""?BA.","^h>","]t","E;Wkr=3=-h","" -"/i7dns[<","zA0M5#@e",".$","","A3Q+a","{Qt""n" -"a^","A5`G#>!]^8","","9","@Nc22${L","L*R" -"Q","ds?U/","c,","","/","" -"C6qs","MEW:;","","","+,L5,^63""^","Urb^;c" -"on","7!Kw","tee8rRNrJv","^;1:>2","a5"," HJOU" -"#8x_","20.tu","=db}Z_","@jbZ+AZ8","VE@b`uiT=&","J" -"9uz","E&Hqd2glvv","t4[*M","*Ot` [","dXmZtgE","""A{=" -"wIf[XC""8/","sG(U.l)cC","[tg","y","Lb8","yo}wO" -"X3>=RC""@5","(e?WL","_7^]2","#)dfqT""fu","{k[U`$3Jiw","s""gOd66qr" -";w9l9","""DA","gl3","jQ0{'\>","","OF" -"JcnXG\","_u'XbxK4(O","LzQ*","tGoHd%","G","@WO;S#TG=","ss6'6|.p","" -"=$","&I!","^D}PTpl","M;_H","x-PN","OtkNQ" -"\plR Lj8","dGW_","","","lv4a","XW2k" -"_^@=;L]-","k&","%_'V",",Nf.QD","jbaG$"," $)YbQf" -"m^h{B","8#Cy","U","mFb$$fc","1","dz(#3" -"(`5","JZ","e#""","]WN","","L_" -"=KJ1+","VH']{O u","Ttk*,toi","T{c","uO!@`","wJyKwtj" -"""we]c","KpQa","/kc2`G%`lE","Fi","p>1#!/T0*`","""G[" -"[FwV8vyqg","","w;b7!k","4FHmLwB""b","X=","we/",">U","-Bk/t","DuhJ8@ut?" -"ME","|k]d.6 ","bt},%-a_b","YtF6jDg_",",Ztt","[+Pwoc+6U" -" lcL","","0pJp7Q","N>0N)&Xe)g","5.zbIM>[" -"t""&42o","","U","q]RJ(}Z(Qt","'Ahx'","Q" -")","%F(U ","yT^vpM","|@=ah8T5?" -"1`Hy6nb,O","8","e[^}a^","c;mKT<","M-S+]","v/J\1_!" -"rL>ABq|_","+$y}j",":;5-=7","","rrJ'""'xR&F","@<8a" -"5oI.I?*^","Kx(X2UZL^k","nka/xTW~"," Zl8E^","","Q" -"*m4B","%K>3","|a~$0","h,&p","bC-kO6D","Lh=BNr" -"ef] I2K {","Q,V7","[&D||","XbBsPO","9B~A\y;kU","" -"u`R*aS","|eQ3aP0!&","RE(J}","","9ki|rM>d`^","hZA" -"*qXOdYcT","kNIZ]y(>","vkpcWicf'","2j9","d?A","2a81Q-k?~" -"q?","LGP","1P',","Uq_wAke\^",">gpP`o4Y2b","DHvoM6c" -"g.1A","={h]sHeb","g@wRl$","","!!B>T,Q","W2-LEI{" -"","""4VC#@G|r;","A","*rx","wz,ri","f7f" -"n6i","hT.P(gF","g)Z;.\x","?1","E8cg ","}/U" -"y@4O=VkPj","uuw{VS","AqGw(8nA<@","'T+dEO>Yt","foTr%[AicI","+vYcWQv5" -"ce$","","Ve.QW","9E@^","R$P","M{G{QJgv" -"u?$.lVL$M","~pLkO","od","","QXQw'W/Ny~","kJz^@" -"sr'Ny#_M","i/""JVmx\+","&v","2","rIc""p1E4","t1" -"~C-qD+)$=6","#r","*k^u[fuh,9","w2XE","$;""[","n-" -"s","|","","3n","{J7aU~3","Z" -"wOO","","m* Rva+","P","9Ui%S","^I/>c" -"LM","D","TBJWtB10","g*(2","Xs$*ju""H","}Z}Lh]" -"Gt,BulVC","SlY","","c~hjy4$""","DkGCX'/3.{","'' P/s" -"*H;","H%","^>q","hu[oWA$$","pO]#P<","RYe" -"yw A","Q?O8GD9,Z|","U","q;[2","I$mVse","xcT~" -"HMB","qu\L","","%B)g0","Yy5FQOQ>2","B9MY" -"whsJ\","%qi","UV?|f}*","F`hs~zqA","3dCR+Xm~|%","c.QU?J0" -"gvF%|.","3io","v(","Du","2o&KLe","C.V(#POu" -":gb!61a","","=o{BRQ""g","H","*W#d#%<]","oY9" -"p","D#tj|+~/Am","Bu)6suu""K#","","#JRg/sP:-","p+t" -"3m s/1oj+","#V ,aH,~L","j4tk[","","jPXV]8OB?","Z?i:" -"40[","KTvzMw-*g","^zDl9s;","a","","Cq" -"Fnh>|-u'","'","""z$]VqI$a{","_S;nX","ELltURP","<`}","""3d|Qev8C8","cC7k" -"K1F(jZ&)","","[UB7","8|","","IC|T" -";t}Kg5k",".^@F~.c","]Kr}-Zx","wco","c*","F" -"yyr]o6YcAC","dq","f","Eqdywx;","^","&F3q>Z?1/" -"YkaUl*",";","zlH%q","Q}-H7D|q""","t9=E","ud" -"1Po\)x6O","NilQ","O3*Txm/R","F/xp","35","=AgvpHH1","mK$d","\w/","q1" -" -:ofXf5 Z","j/X)","4>]x","JM#uP'UL","""<@cK28\r","*Qb P&QR" -"d","6-Y]Xi0","R9k'b""_","qq","L'R.NCB@a","b0n" -"i)\R9","K4^1","fW~","<{I8]xx>","~TG0p5Dn","y" -"B","!u","XxIC5","M`B]MomG4O","G\jxVH}|","?B,@fn." -"u*Z#&*Qc","<_i++PJPP%","","J-""yeaAz","RV",":zzoTjuSu" -"!)>JqUjQg","1<","j","/Ib5@whC%Z","/","f&a>Zq$xn" -"-oR+V$t2","ZwWXwAPy","\9NU","^E$s7","]obEe)T@+s","T(Hwo(" -"","5R+@",""" ;OsonX6","d9r?/?$E","$3/vxLt*v","@)." -":FV0","E]91l","<3k2Cm","[8n\k","I7TxGjT;[","iNr`KAN" -"$}2Amc#m(W","8[*;","F}:","z","~#k1K4^","6 ","SQLO",");" -"-Qj","a3p","PL~s0","AuEr6","`UcjuA","D","@@/;dD","lqoRUu","ub(]Fqbb""B",";9o-#+)_F" -"w_s_u9E ","88","f,9hAS","""$d6Fv","J""T","ma>Zb/M/6H" -"","f15_?L","*""1'}xa","Rh","L","" -"%2 *","j","~6","n5s|","+>W","","&P","nB1++lumCP" -"^AC=U","aO6~","XlSj_emnf","98[D~","","WQ*^h" -"Ct","djGwZ>","43","mh","O@]v>5""=0","o&l>e;zqef" -"9I+&HzW","UWF",")%eQp*iB","TagAMX{R","EZb","aVEDi(tR{b" -"@|24g{|__b","YqC+","JGy\)","Fcml","","R:q?9,-}" -"""$V'","/B:&9V","1aol7IV","","Z>+o\+","rJph~L e" -"=k0:8Au",":[:!GOXbu_","/u7+Q",">A9Y","i/.W","ex)MfbcL" -"m~r+","2>v","['(MV0","nT","ov8X_^","$vK" -"}nDF?%U$Mu","/Rh","""w","$$FXZ,","A;eI9hF`","mMT]lR" -"","9~v/q",">j","g.g<","P'B [K]V","'@w;Qap" -"u','f:?i","d1-#","cw""""ll~?","ZEdV","""3&","QwFZDt" -"oUGrr5AF","f","p<6]=<)/Y","f2iP","II/>6","mD\'x}E" -"Y1@XExlgX","ux","U79c{,;S\d",""" +!QH(","x+@[S""w<9","6Qu],=" -";C#","\CN[*","h7KuW]CZ","W","+l1Q","|,5;P(w" -"e","D*>{ Gz","q","K0'J","9Mh/N\X5&","$h62qDhC}" -"a\B-MUT7""","&","M]EO!a","QaI@'fs","Ex(e;Hdh","~j8\gD;r" -"Lxh&eC","","/h-!mx","","^3Pau" -"}]7?B","W_","J8>`*r_[.","@","(-N]F`.?:v","" -"Q%","wZ+Untty","|\~\","{z$8I","E'BNN3+4_","w""nV+j%" -"%bTi","aYeKT`","V","","/qriV[","pm72)n#v$N" -"hs(","0",">mUuk","u","C<","$J)!X'PMV" -"1HNGSv07S","})Y\3j\0","QXEKX""%","}6","]1i_ Jmk","fOAUJpG" -"Ngblkh'D","urQ""Pg","","md:X\-A$\","o}A4",":WIG&4" -"FuI6Vf!lgU","EKMu","CHfv",":{N","etRcEw","j" -"[;","Kwy7\;","KSC","0P{/\au","L5","VCwJ#;{S&","{\B7T:S4Q"," ,&.$G[x","$aU5:evb","d""39_Zo&p" -":_,||]b*","","f}]L","%I~","9-^Ggt","TBT}k3]]T" -"^U)""}","n.UUG5X","K9Kmda4)","{U;","jE4`euHi0:","?,myi04?" -"G~@l",")G#JDr5~","I}","#","aE2#up""~","gXM+wstSe" -"H% ","v'Y}","]6","4AgZi`64","0%e^B93>kQ","CO6" -"8K}","2vaPg-P(=",")7.L.>Q","7\9^","fAbU"," 7H\t=W" -"w(6s","7(&Mzxc7k","-kK3`P9-@","9)o","u-lRe`A%","%SfPv" -"NFS","R`6)`","","U1eR","qK#HJ","1G'Q.3]" -"n$","v:DI]","R(ZO!Sd","~)","","m" -"mMJ'|tLiv","S~WBIjy","-!DEg[\R","","0zB>","(X94" -">D^v2","XHhf#","M2""yDE","IakH`!$pw","x~3PK!q","CI4l*," -"e08rc+l(8","wD!9]h!8B","hc= ucF!","~9","}4+6","9a" -"","fr","4?b","R>s>8f\Ov","J","](`zt/,Qx[" -"r_]7{HA\","] #M>","#Z7~;oJ7 ","dQ'r>,)?A3","-pPD}MN_qD","" -"o)&jo","\","O0","[","2&","z" -"VRU_Mlm","*7WP<9","","O,/","s}z[GPm!","=J rfgZ","?G|aX18':","~i'C@" -"O_B~?F5","xTM7","9|f","Kl#""*wns","l]ixW&",">l" -"8uxz,#O","}","w$%O","ds""","Z8|k,","" -"x)","f_9l>2:i","Bx5%","Q[0rm7","r","MMlG??$92" -"X10q","H4t>D","jf/=","l","(L+FY>;","V<\kp9_W","z+","uW$Se7'A" -"DD4+","","e6|M|j","I","Y\j3*","n/V" -"m","P","5}[t","o$3XaB","(1p","Q" -"(l4","+5}If76","]:as","<{jR}[=","","Q;b&" -"&@0RkC2F","KpP#;7}0$","Qi%HZ%VG","d","U","/VC)&1z" -"c1<$OIm%*_","iN'UN!","{)oQmic!","p+^V.$","/rYs{<","Zjf!J]s" -">EI$^+","c@","sj[^","q\Z^v5:","x6","]3Fv+B%G\","!iexxRDer)" -"iz;C","*%]W;-","m9gf.","~EqHR7JI","63L+/7I`h","yq7"".n`>U" -"r4x@vF>x","","OXV3","sF`|wfBnK","","&T" -"e(X,(iYjD7","dGEtB","","s[=!^Ke0fs","ssK[)J?YnS","P!UL" -"","|62l|%?","6C","","","E5""5^xE8.y" -"r*l]6","=","'~omw^2H","y|W<","FJ~+9|",";>+`n^O" -"I","""SAq","( (w oOjfs","lua96Jg~u","L%K","^c" -"Q#f0GDJh_Q","fI,`>1:hbc","yDozSJ/c_","q:Gae{v;:","W)[7""?""Aj-","bJ@+N-AEG." -" &0Bz[a{ <","Tlm09","{ow,)>KiFu",".|z/","orZwLWz","sb]@" -"%#4dn""W6v","",")\ ie6Gq){","&","=oAo","0@Wu1lW=4U" -",}D:9","i>ty;^E","","&L%Otmb","~)Yb","~" -"mKi2","102d}Xj.i","/Z.hw!W","TU{)`","2'ptLd""","*:U ""Z@)`" -"","O?X/H>","*","","05JMV","]es)" -".#d]cs","G]i:-0s","","|","d`h3","?R;" -"{","",";,8Z","UMr3","GU>$C<#=","($" -"6?4^","W=","","YxMcaFi","","QU}RNU:" -"!Xit-N-E","3]I90","(pl&s","Rh","","$1 /|" -"WF0","YybY","o! p;Va0","zUIA","YdGvc|","\pzZF" -""," #","Ds7A","zfW","D","S]]>yZ" -"^zaep.&","[fVOXP","2t8","94#PGqW|r","%d-","'+'L|9T" -"G'+5dSY7","~Bn[ka=V_","[{"":{5","Sd:O=","","PVa" -"ok3J&","<2)R B","3nHmW2Wh","!4v","Xku","&8;%0" -"cLH:","","* m&T/jG`(","CH*","z.Cn3aR","gZ" -"FoUQev","'~!jP>/:=","KeJsGi4`","!@%mY+gI9R","M<^","b4Itg.DHd""" -"v&v``-AQ",">Tv","DfgIrN","+m,>x","nJ%/Q","2+r{-mz`k" -"Gq_,mf","}W|","[WyseU","il","9KG$Nh","n^p" -"FqNa-`P~]","4.z""2M","&UPS","1%`s*5I!","I","D" -"ZO+S|","lP?Oo","G1l","hHJW^)&5F5","!}%-D","zCXD|" -";@^^+;","","Rt!>+'`+v","pXaEZ+8z","Y",";`P0q^J1%" -"o8RLS3iDP","j=w","_,@y<-","Ce{7/88O<","V.#3V","N5\Pt" -")Q/3d(/IV ","j`G:J/","L!,.UynAL","%s ","?Tva%Z","a p" -"y%mogcs!t","&e|qk","WGE7q","","","{\s{k`" -"",")(","?8#e=Y","Usi-","d","o6tiyX" -"tOVe/f'Hh`","W""3?^5IZ","nGKdv4O]","2RW","h@Mk=qU+","R x3" -"pAaqAjus","i|:","x5Kj","}b9","PI","})V.4$" -"h)nUHN","N2c KreCQ","b{","p]T|^soV",">f(^~b*","aX{^8iYc" -"6He>J\zfYN",",-e","]9","1M;;J","7# }ll5a","#","czPm+","Ojt7","dg6d_Gz`K","AQB?y","P%/7M{(_" -"|{nW-c8T-","Lqb9B","^,<","V)&{_3Kp","WCv>rt","DUi!/Psch" -"'","","q%qyhzh'})","4o&","{z0CR","n=#Hjm\H_" -"","'fe","s-B.%$5?l!","&{h;QDK0",">Rj","p.1sET!" -"","n!u8RJ","WG&67~j","x","F","TNaMzW.V" -">","","NobK'eg,y","K|^)gpVP$","prNi3","E$J4o?m2" -"2xfMAc,<)","","6+%u","hoNrez","beSaoe","QJv(r#:O Z" -"3k@}+'i","]pm'|",".cBD","S",".9Ja.)j\un","pl9" -"'w=lq>5Y","O""","o:lgu=","!xO(",")(3*T","" -")","HAKr:]5L","","`wm","q","Bm0" -"fCI\V!Tg(t","yJGBu\mi]","}J 2*cEYd","=>TR","b_Es""","q" -"%cb","","iUqtTIy/","}","[2TGE","(Q" -"c","-H^f%i ","'3\}H#^0","eVHOQ/R^","`0","h" -"#_:i*","YW;","","y@+0klU","D1A@6","W&F^`(O)B" -"p","!t",".G","","-G9&/XyU&","5R0+-T" -"!h","Bl","E","G]wxk","AqC~K","y7eiO" -"XW7@","=+AF?O0/f","","XST","u^4_3","v!N7.=xS" -"&{a$xJYPN","S@Y[O{Rls","+v?09|`,pE","UcPW/=NkJ","GR#HB","o" -"","E3r","$K","P]",";glO","80R>" -"Z-R>","E0>Rdk","","""C8Ipn","Y/jY%(EoO","kTEr4cQir","t","egA3:~4f%","" -"^Uq","","",",gOJ%","ceKP|B" -"K4*#","","EI","yW|q;jg","(}uj","AL7iR8%~" -"6vqU`",")"," 6","2ke/`lW]|e","","Ri:>_NxZ" -"",",5ft","6S","8+$f","cm-FUpy","TN" -"RNU8^2","&ce{.K(1*!","KAe-XRL#Ru","y)$#]JjL","S``.`]","P-)XW","3$5(3<","AwbsP0;&Kx" -"O,mcSHZ@","6@*#","0)","""q:[\`<","QVn:","" -"I","evL","s2o","""ZmT:3O-~+","!|TZ","zP*J3D0hO" -"W9{)%L","y61a","","""n4^L`","3|","kBoX" -";g:{'8q",".","ksK~mJ&","J","tuG","32e][qO%1" -"^M2<","z|s;Da5B5","!Ya?l5/8+_","D4vjM:(""^a","d4t","7" -")_9o","NYe","lZp%Q8tYD",")CxxziJss","p~","oc","L`%H::9J" -"W","(@uS","<~RK=","4yg","qN{VNx=","8,g|hH&" -">DvSB1#hz","y","P","}","#m","4LBUACX" -"#ab","vH4+Kp","(efQH","1X[y*>N|#"," B_n+/*","whb" -"{S[e'`Q.E","l-BUV","~P6&\","kwx@f1'f-X","|li_"," F&^~PH""TY" -"3\SO$TY","a{","\aE6{",";KH","Yj:""G","1H>v/" -"o'T}=N3","","/8","[k.RX","g~","" -"","MF",">p]+B","(","5","zxov" -"VO","fu=&kgYh","CJJQP/3(8",")J ])`9%","f","","s,41i}td" -"","je>}6N9","s:lhwbm","I_w(","M;oC","vx-" -"J]","=N4q","@u0""b","","@^GzUnx","g0YH" -" ~k;hC","R[1}^GMs|","XvW3}F>KR","5>WY(9aBj","DRusg","RYR" -"{k#96oEr","s8Hu=O","","a7","o","""e<" -"","v","gw|#,&N;","nD.v:#A","rM/?3K.O=~","C6rgq" -"A"," Hsm","W!ozP76F&O","T","ZkNlCMF`","gsxD>dk" -"U 4-p","Qtt EWyf","k7'+^c$65","Nj{}j","Xe`I2","QqR}[t" -"","]BIeww)+F4","%$","#o{*","HEY&|w","/{;rp:)fD","","B","o" -"s&Yb|A==","","-&b","{f","oR1","~fymA6\C|<" -"svrbqg&B1","1c","lo","U8/1V!`v" -"J8v","4rWV9","76U9q{KV8P","vv) ae1:.",":QqOMsZ","^#4.;sg" -"","6","AFfoQNEO+","0{?WJ%","`0R/>]","" -"-","h",">","bYKG+T",";vmn0u1us","ls$x-`)" -"aBW1t","m`%l21ta","`.He.""Wk#'","","`p","x3%a4+?|" -"Mr?i8:U__t","aGA-!B&w","L[|Ui ","kKiJ`W!"," Furo","`g(WgAdq" -"01`dNfI","3`}C","}-):!3x",".#MchD","d`","}" -"Jh|,&4Ff","T~.""RDlk","R","*","","9ON^xZEi:A" -"RQno3","[N"," `}5Ek7","(>","Y552I",";AB" -"0=`","&H'4#2}A$","`| L","gF","Y{'E@:H3~M","OCndT't-" -"oe6f&",")7<-lzrZl","8{tT+v","ijM","FZ","n/" -"hyVrW"," ;(tj-q2","6#k!|B)X*","?H==`tp#7","WR0_y>={[","M" -"~N",";>i","l:#","w",")41#l","" -"UB-J^78Ra","""","","]CpRDGNi","t@$]vl%P{","zB6 #e"">U&" -"K:;@?","*","y]r.R<","\< -dU","],a2","F?pwg" -"&p","FSO;|WZ:","@","F1z","Tp{w","5~d~[c4i>g","1/z%p\qK}S","`.G6SG" -",L=RFMN0l","","k/g}x{%Q","u{","y""Jnd$","" -"]^iUl1(","GX~?:q|","","DKto","qyJo","E0BDjFqD-" -"qx","%F_`GWJ2d","FMf4|Bm5","","",": " -"VK>\f=~!","ps4","$UDLr%","","TRgk","i)n\s" -" \b;","7<=J/O~|`q","{","Nz^Ol.",",?","lYzM!A!1" -"A^Bg[7g)","s","aHJ","8JavxhkXHV","$1","%3G" -"4'5]","","(Q5{lpiB*M","C[~b|#t:d","#oa","G,`g?)uR8" -"","%o#&","5YL>'hw2","$-8:K'","6't,&sN[qh",";&lg?" -"%P'nh;&","@hB]=Xe","",",BKq*7","3kpkB","9^wKD[" -"hFj ']>{","""QW","HQ","Z>OM?41\S(","~qaLFh","rim+jN+" -"7{y[D","f]IYmPn#","V$g","1-6S9Pi^t","+","] 5Jrngv:P" -"'c45O{%","@","%#`@4;"," V5[1","0-d2","","","* " -"{","Y W#BO K:F","u","r","Cc oQ!","" -"*&\pHM","","z3qG3:e\X","4","l- ","$=e%|pmXm0" -"Z9*""]g",":","uLto","T0;N q,]U","puT)N4","L^7)" -"Fn}3f.LuPR","OoS6tU}6","AA& XSb","pVbgn;{ub","D","LPYGNNezf" -"uX|X[.","Dl,SdFOy","$9<})M","q","","[Ssf.Rbg" -"L>I","$X.","#$rA$7 #","utSV'RS","#G'daiU~4","xkg " -"dc<%(;I","ObU","""u\cB:\","","pzB+BKW","!@0x" -"","6)uY{","#'7GYK\","^RiXO/|?i+","CS,_#","wY,r(if1,(" -"hm-{","dp","'""E[=LYTk",",X%>K*",",","#TnK7^Bz" -"lFtbeR","%`)XZA]bQ2","HY",";^hM1S;oXC","","""e" -"DQ4CP","7""r(o.h","rf8r1","9oOobh","S/*.jpWQ>4","0` hF|""W:b" -"Y%q6",":x"," ]j5","\pQMmt;u","rTMG[pK","@!|o" -"t>I""7vmd0l","H{3Y8;X+m","","3u,,R#w"," Jme","" -"o","6LZff^3","psjx","2M>?rr",";%2^'BH #"," &e]" -"L=q<","GF;];'U@","","H","@(^!lnU7"," o=z)OOu" -":zHk9:.","cEHow,","KU@T#tZ`}","yz[)3","0","Th>'Nz{>6" -"9","+RS","(/t0601|Yr","","c/aI","C4)'9[s1ym" -"YN3]:B|P","7lVL&%","Cv|+-0sCm",",m>uClMAI","s F=","aQoeb9Sn>^" -"oI\G","]{t",",i\%ol.","3&","JtHBG1:wXO","qd" -"\2-by","","RJQroIL]$","dv.""- <^=","wNd=k:W","1" -"Ii","gkd","VF7uL","b*YK@","f","9;f6|w[0\" -"rqb-","D%","M9^fGFFx","pCsG6-vU%W","U+?gL","S,#4Y\Ba" -" ,&48]A<%*","ZSa -bdk","4AAk4kI","Q&E\","$x\].$",":*=BB%a)" -"Mrg59g|xP","/o8$,.;h_","{|ce|6-7I0","@<@x+byN","KCs-`*J","u_BwRG" -"w/","Qg","hf`",",dvS)","Z[PzR>@>*B","8e1JYN" -"!-]","(5<1uTFg","13*Ly*","V`toYS","7H)@l&!",""")","_B6p","*ndbzfk`,p" -"B#2H+ql","P~TQ^" -"yX ","w","= z","7L0k","","IpP" -"","H|","0",";%/|'g.,e","","o'o]@" -"Vws","tW5eMg P","bN)~cT^-oN","X","""5u,","9HO^<" -"Z.e_QycO","","j8","XV}hHbN&p|","=7}Z","w""!.H" -"2F'i7(]_/","X","zEme:* ?#:","kS&T`","e~9}YX#","4MtIdWXn" -"f:>1N2,4""","bQ!@","y%","qzw* E@=X","L","uK,9" -"G*f\?X\","J\+S=I00u","j","Jl#C","","" -"byTt)","pb!5KU","JWP&XoDbu","f1?Lw","u&Or","a9.MM+nkB" -"v{n","","7VivPC)r","En,","x","ts3nLc'd" -"ML6)","%H>.Yvk7s#","8","na","Kb@%","90B" -",MD","CWKn-SSJ|","F'V\","4=1","g/Lv(e=:b","S4C/,$zn$a" -"[[/*m(r","Qff`","","EQlprgP~;!","","cK(<>5~^bg" -"bdll=T","E%+Ro/\#""p","zU#q?Uh-jN","7r","@S@k/t","`#JX (:GR" -"/","MD;u%4","51i2K~jBD","UVCu`P","J|UDt(5" -"YnX*V_h|~","ql637%&M","=b,S1h","XVhx","LWN/rY","" -"eK+i0z?&3","j+}F","&EWGD_","D~e","FDj(.S\h]b","p3/" -"'K/8/","-pcH""z5#:M","M","c","zQ79","i59V" -"","|}","Rl""e","3+","rqA~S","GGDP {7" -"k5mL\=","!0Y>oy","+L+g#","B","g","" -"k","vJj","v8F|]8WwQ","%W","0W3","a+.3PAanf" -"muC~Tz}5l","","*FQ |/DZD","",":Z2t&N","F|S" -"CMK","aMLU*?^6:","l","_-z[kX","#eJ2""/oEb","i&J" -"PXa<%4s.x",",Lj,ms",";_QAG","\M","+xZ0D1W","" -"Iu","@_$0I","!~I","0475?Pr","","xfX(5fP" -"M","KW","9v","e","G^I0","%Bjba/PTl" -"","Zdj{GY^|3J","EQW2nF`","ioXX7F4(","Fj|)JyCN","5d" -"X<","SX;.v9","8","\=v}Z{i","s","y}m]j-D;L" -"7","C=.9c-V","/_b","rsI%","\9$","OUd'uz|-" -"[vMQV4kkg2","G14a,A@","X`k0;","",":u","x)=N" -"Y","OnMFVMzn\","wr","RT|tXR2","wQ37}","@" -"","n7","^{hYk 2","eOtY\c.1~","`Q>G'G_{_",";XG84" -"%D","dk_#r","dGvR,jI.","Op9+4","=r&2",";c}M(R<" -"M]Y","]","","c","-r"," " -",^]k"," M}","'J9O","p&977\26","h.Sa~7~","" -"VL'yY","Wqb","`","j6\w","YP","Xv`?3" -"v3+V0Ai#a","a-#","X","kHU\&*3F","q/*X8I$_""Q","" -"EH=1D&v3E","/MF","mc","kj\Se(k9k","_cS\*y@e","e !G~Z!Iry" -"fcFbijd9n","e{He`Xh","}aA","g=R$","Kl?-LGQjT","x6T/_`m","g4}OBOqkyg","f}ul$/G" -"","U","4:3","^6zo6?AS","e#A0:]rDP","$` w$S*zE8","pWxS9E(<$","iPO?5}u[" -"T","}yb","","p","?W(V!lmf6B","CF5I" -"h(!])-","k","o2*XV8","3=T`'3M3KL","|U%j&E:\&","" -"KcP>zQ2","m#74#6","m<4]RL","R&@","GukI4z\",")RQ" -";","{6iH",".gs6m:-N","+#i^hU","&t^7j#qS","|uY2QEew","m`$Nbzj`","p" -"e6>.""l","@n0k","^\z)z\g","B{+","","XvYO""" -"9","x?f(","Qq-sF","-0'U","1jVn* X","cFjR" -"rx.];o9ay","","<","""jUbs","C/1LG","MU" -"","|70zmRqt","Fu-C4=Q]","}}","%?E@L0 +,","vgD70ZoCMA" -"%pP~$}mb[B","aDNA_,(SYF","[smlZ;6s","-]hJ+","=z^m=0)gs]","m,(l&N""" -"9hiz","_HXn;}","2R7rS{/am8","A:f5Ah%","u833^tC<","y~ShTK(" -"kx.;?sUL$#","pc","F[r","tj7wK","","" -"_r%n",",[j#|","?8","ek""V{gIoq","P f","|l]:\-l%7" -"","Y""l8rV","wrn]30xDm","VuU","z",".{@CB-h;}" -"\W{j","zTj^qif""k(","}hB","k{.iLU[5Gc9","" -"'=E=+""","~2{j^3}}S","Hsmu`","s#t1","&R","" -"","#T4","XSM_1","","E4","!" -"<`,&","ULnQ/NZW(x","VsSgfCRD","U6L5","a\","&wEO4{_z" -" Jy<(1Pi","V5","';<"," @k+v9N+iw","Yo)e?oE","w%J~Zh" -"^cXyo",";n","","jDl>$7G0'","","u" -"l`D6","5x|+Ab{F7","d","U6K&","NNvkG|","IQe" -"gK )|",")BI4Bt5S/t","","*NGlRJhYW","'}f&","Xi~$Gqls^$" -"a]Y^71","r07hx","@","t5p30","]84p","b" -"","OQ$","HD","TR#qR?u","","`6&_Pz" -"}","b'Cz9w)c","0V","dg'3[Z]rM","G",";2;a" -")Q;","G&'rfX","7 3)E","/3]a|C%","c`}T""eB5e{","[6wA\ " -"!Ts-,k 1",".h*",";xa\AOB","","K/NX}a4S","^" -"0f\zlhVE0","d.#+h7K8r*" -"mdM:)#","V'\z\e3","ruH#0","R|","D{dmoH","?~5z" -",LBC|e","p","Spym-:{L","$eL","5 ","b7s?H0" -"2se""cYG_","={jA-""#)^","6","A$%d","qGEyiD","" -".N","""%-gc","!","Vdn{iRwo$x","[x;PX<)","3" -"E]","1IuA","s\z""#","""~AVs4p","T)A","! C/KT" -"*UX)","wR[%g\","W%JC""f={zW",":u,","4r","<(b`%","" -"~}3Cg","K;RD-" -"jB/?\?(","j%","]rH3*Xfc","[ktC@}","_oWt","" -"NjgH{""1","P f","Qs]/","|do=","qTaAF}0","3Hj(/'*" -"%1X}TH5(","{#KDZ","#?LpF","z\""\u!","ZpuzX*","PT}" -"zJ\","a","'","]","o","/ 0]v~" -"]W","fbB3k,1UE","~(""[w",",k6dS","561{z;E","!{*$vr]" -")C+1H""{","12R-PWsPW+","'","","U","^a&q>d}" -"`ee|l@",";P""&q@K_",")","d-","t`BG}W","qN" -"U","8N?-r`alX","4{b3j^BU","!0AKx'BWH`","feHF-%L","y$|pIK" -"y]@sV","{%AC%Pw9zl","fsm","HbN"," :U}","'P#L0+/bMM" -"]%","","T 6Ut","C!nm/? q(","s!E,>","" -"SLHvW",";8,j","7Yr6U","`EPEw","","z&9" -"%T&mrIT","pt",";A?1cr","5J}(,","&&","J+KG","uf/>BAD\" -"\wc~w[1DI<","R&fF","-.&jh","L","""","J;W" -"" -"Y=UwC%g0","!","ek$6","gOC!qh5:by","m|h","" -"&`0","Ga4AdHN","s-UQ}=c~W(","Qu=#}^","","g" -"9","","","3","*7n#sS","|'" -")c","/DHD$*","G","G-JXVX","yk7+pNhXKi","_zlM) G" -"rL5TJ","|<8$@""[h3#","F8MN4""","j,a0R&yX","[","`:)[qr9" -"X/#k","$=","|% mk#'","V[aF}","=-^" -"","_Pdpz","X[kn8p:","","(jI$B9o","=N]e" -"z$-^Bw","S#7JJ/K9","Uu:y@0aCZH","p;A)M?|~S\","o","?}`jx" -"}q","qF34HrEKOp",";{Y[;","a2M4-E","TKz$qX<@","D/." -"","l","","Kvg"," :","" -"vT","~{<}\zY","%kFh","","]w)","ehPVgF" -"q7U","Nbmx","id""&I8r..","Prv>&R8ch[","s9}!+h0","xX_vpyM" -"xD{G.9X","e9uP;69*","oniE\rs","BuVHm9!Z,f","w[d17[c","\uOusY" -"'SL)kgw@""R","q>","UG`ORA(","","","om Ez" -"%]1y","0/p!.l%","","(mQvxH""0uY","w~thjCIB",")_N>hEh7" -"|E2Xy","u","qYq","I;","<","5sw@nvo%\y" -"nY","RXUPmsxPs","","[]vkY 9p","A/A5\smVx4","" -"TV-jOx","_}","%nKV:c","v+9881","hUo!\x[o","l"";43!AD`" -"h-{MM:kkO","K?*n","92E9t?","a._^!","M q","" -"YoXUv","k+U0 #\/v","{:'8","l","K+A&:Qf","Uou}2BOAZ6" -"d)='u8",")","|",",?E[R-*}u","U","G4,IQ" -"_","m0(F""tT%","f`+","^q]`4n","0y`"," R" -"t==URE","{02:OE@Y}$","lxC`1","5maX","","Ptkh""eFfmn" -"","LN","","H-H(PPSv","l","7J^|vbV-""" -"Dn'^^f3hv","f7o'3","(RzY+#4","%!b""Lh\F-i","'u#'c*","x^Y%tj`" -"e,DQ;K",",!","Q m(","Q""h","6!5","x=0j1Z{" -"*X{&Nlsu","W.^M","+","-","","I}9%q,9net" -"","r)M8K","6[sYyY)vo","d/J(6","t8,@","/`kP(^!Xv" -"ohFtgV","n7v","","","Qg$}9" -"""^#;6","Uy`","X$","e","| bDM_G'}","@c|(" -"B,kz","pI]f/]CXL","uOCUDw","[:5F","v{?","W',]DwWL" -"c`%Uy~ ","U-","dYF%A/X","","g}qn","sLI@$(xU_" -"%Md*L",")W","'Q\)1>o `","BR^m0ddNTE","fk1;G>","`" -"","t?~HTB","&R%QQ1M j","%4H:z","4:UNI-&M8","" -"97","","#6/vD{;-_a$9Ed","I*b2" -"RFJ5","+-k:cb)4&T","5B<","njZ","xzpy""*%/","HA" -"","oMMtv","","VW{","9Kp8","" -"""w,;T\","Y","O%*c%J","","0""-;:{","S" -"k18","","J('r","","k}?Nr","-2M]>" -"W0?|N)|","x/\jF68&Hl","0t","B6K`ebq","=w","" -"s?{>(e","SK+Q'rgO?","`?f@TJ7',9","AD","Xy4-`[J","*OF18" -"fj+1'5","]T<>?YQ","q4V%","A_;,inKs","R;4-q^8ztX","Zv]" -"G@U","D","(dEH\g","m&","eGGS","" -"","#","",",T","]:!8N;","Q;&" -"l","","A.KrWVZi","3m %8S","vlbS","c3E;]" -"D`VPB","b={@p;","","qbyJ;{dK",".`/*C;|","<" -" P@yGH2","","hjmo~kHmo'","D$tqEM3e","","" -"237P ","",")~&1","!(","Tr","y@" -"/""^ME","","Jm9","An","m5","q|=E'" -"","aeOtD","^M*Ty#li","}.{wzRqI(c","p","iK7:" -"m","U2%Bz","1=mETG`x","<31oys^b","O`JXr",")" -"pM9c!7)","g","EES","^)'$=kz%Jj","=Mqr^","+Jf./[[" -"wA7","","~:","x7hpJXRh","MeFJ3-?/" -"T%_AR0","Z2{$?E>","Mf[Ag0ALr","Em[","D@4PY*RjaK","",":.6ZF1K" -"yo|Xqt'","]1P","6}Oi~]O","Y/=2}3$]8","","PG" -"S2#8[^T ","v","Vh","Y%Z?t","Y[gF\xsN","^=4;ke" -"]A/","","l-!_","Ko&","4OczA~cq","}2Xit" -"G&=mBM}","+Dnd10F[","[;8ln!OtqA","CcbEEU?","lsD6","I/tA" -"?","#!6<","","V\w","V","BSs}DSXA" -"_*~[","7F","$R",";$at;w","eqsR;.","" -"Cu\u","-i/g","p","DBLn",",-yhG1Z","$~@o/gR`" -"Z6U4VThU","","Y+c3","%>y","%?|n@&V""","" -"Y<8FAq(+","P","~$",":~K:f5","mu'G:<|p!i","yb&6(j" -"'gxV","nx%J`ZGh","TPK","Ppz;52","W)F3ojnUFz","(8^V" -"M","`SZ","9)3q_D.x$c","3nERar*s+q","","JxSe_" -"T","/jYQ@ZYGT","","Bjo;e5","@HPd#a~D^","G7Q.I" -">qD""2WdM","GA@3","yf+l","\+","Sf|<(2Us","ON$mn&"," 8wT^|,|6","`","u","","8~g" -"NS\","v#Ug+a","%q@UE}V,","mPgZ_V)6YG","TL2q","B*`y" -"e?WdS}d","yPItc(j",")4_X@u&","","f.D5_Zo t-","O,-E" -"{$2/n+","C|",",h",")}q","3=Fr","[.W" -"R9-Y9Pj4","w[ af2","0-H""Qi","9aM4#","jxieH",";/Q" -"riO","=$Ll0jJX:","M.)}|","=","@HLX","zh&J98" -"ppvrE","!RKB.2!z6<","g","on^(1:a","wl! ;c\","Ap^!cCR" -"uX!v:7",";_RIJh6$m","","JRfJ+M\,M'","WTVK","D|" -"sDJ#),","46","t5","dT|X})","i<0zl)","G" -"Isl~1]]FuK","H+ =c(","","",",b,Ay","]hv3eQ;OmU" -"S0C'$1:Y","^c2;","3h$nR|FW@E","T;wtypv",",DhU>","n~l" -"z7","kd\@","","H:0h-t=/","V{/wxTq","%~]13k","X>Zn" -"q. ","N|c>N?hm",">P_(pA.k,@","V","/5","t)mu" -"';~@D1","Vf","Vdg@]L5","","VcTj7K0=gK","zNj{]!d" -"U{Z&ze","S7Q|u5=D@","|9PkGMuNJ","","$","f1" -"lhU!","DX","3A@G~JmFyb","jg","Uv$m","i*8mSCY","Q3jX","<1Q.x!29%e" -"T}44:L)","bR",";(za|X>p","]lz><;o*Oo","2X(OM""","'?W#" -"!Ww",">DQqjyk","!QZ:}E","|)","-Cy8[[-a","AQ(7Jf""(" -"MOb","5l#V","p]3","4Ptqi","T","L" -"/dF ","[*;\47","","<_","tRo" -"kCbR#",":mRk9Y","\^",">?5!:}^Ul","/mEW;/D","oZI.OP{" -"R","}0nO+R",",?X*35","Dw24~&:QXL","5p'wNN","%/>D?\<6!8" -"^qx5?","Fj9#;Z","P","kgqTg@","Y/001LYg~T","237?D_kX*," -")4vqo@z!{3","Rg$","]==NB-'""h","z","~ |xXuwj{","z`1:#]pe" -"","","60$WnV","8T","+","" -"du","A#B8s",";K^;L","n3","LdQCmB","WY(,>EEd","Ob65:3,,O." -"","5" -"2ikxn>$KP",">vS\_dC","9","","_","kc+B':pbMd" -"Y!Hs{8]_-","wE4k","HHvHq","k",",Mdk","" -"0X!8dE","Xn+h*(>","uXtp","iv0TQ/d^","qDI,","`.Vle&Jde" -"5e;QCrWa|","{*","C3","",")","" -"S","3lecX2{!","","c","JU.j#?P\p","9x$ep |e+" -"l4fiS","","",",>^W","siE+#&","" -"Tenrh","?W","sE""J^yG","%{""\GE5","Lwr G/&\","7GZSL38bz" -"foF","~czq","?{,($,s5P","9+8","_\-b","*{bAr^eS" -"b^KtzXA]A","""0.l","5","r#i" -"bN""%*BZ@3","Wz","d3R" -"WE/,5WB4;x","Ld","+Hxy","<9""+","I/e","y=Ya0_$!^" -"Q","SZ,tWif*","","@JqM) ","#CwhIF","HudXtqg," -"","5p|jGX","/Gox+","\?K=PCXa2<","`qOp8\",",,0la/L" -"m?$(Uig","$gqu&n","zOagC{1X","|JA","","" -"c]z",">lL+ig","nF","","N^jYF",")?b}" -"x/Y","K[84zct`l","qC/p>JDl","w_fzR9{BX*","\#RG-j!","Kj" -"]bb:}","j","z}|: mh=i|",".s#N","3|B","cn(2`c(~" -"K?5R5Mw|<","_BO","IN$U x","#n]QP[{","*;M8FHmY7","?e4Nr/]" -"t*x","","Eu1x*$","k","g0},","""ywzOyLS]{","hDLUeAQ^","JdW=1BYC","Ds","tG" -"OWpbf","nM0$\X+(o","rGmj","uT[Y7dX","UP","*.:!P@Q" -"qh.","Jp","=,$TeF]@;D",";","nAxoY0","" -"yc~{ S++","#dhb7","J","284v","zI$=","TA`7" -"5m","-G","","q3w~$^C3","","RkY" -"[ '/hlo!","_","&Tr>O","{#X","O/6RYIP","r'p/b" -">P","?^MJR:XJ+","cWY?","OfOf!i]P:","ahVxyjB;","R" -"G7",",}%~u?Mev","s/wA","+w=#f","^L?VM]K/|","P" -"N","QyT{<'4t|p","","I|j<0'","&R#",":x?Es>H7Gg" -"@lNJ=6%","MBF,dX{K""[","Sw","b.Qn","mIPJ6@DN[k","=xBFyjQ.)" -">mlOo","99b1Sz7@C3","C8.~p","$RTV","/;+OT)zK6_","U+y&%H" -"McKt","C;X$s",",cN`","*5","oQR/EEm*Z@","CsLGK" -"zo(",")wa3O!O?+J","cpGoOi*9G^","9pF,#,Hz","gfh","^B" -"x","eJ","8>E.Rj","","k_","bg{","}YWF\\}","zx""f?&","qjsm5","","W)`[" -"","W","ZX[","A""Oo","Ch",">G" -"z$'{:S","Z$M-Ps$&F","` XG?,YBsv","I/Lx}TU(H?","MntpDE6gq","/_MiJ<`" -"+E,j.GD1","" -"a1!a","ae3n","JQ","M&","Da&&" -"j3pU73",")5x^GV}4H0","Ei:yo&","8``","5jScl^","1,q^9PP@g" -"#eeJtp[v_","6`icv.5pW","","!sMzd$%","G]Rod3<","$v\N%&xu@." -"o.?,K","H*T","5YkVF",">7^Y{","{)","Pro|iLF","4# ]c+fv","Q","s","}Zz5" -"Md{jbT_U5S","7L\P8W","DqXq'M`{ K","h6g","x;9N, ,L","G" -"","kXP:&rZ","Hwo","S'>5)q","F)+E[x","" -"g{`3W%bN;}","#uzo(ZAk","+\","9NL)","*q*Wz" -"e","1m","|Z 5\Uy",";#fY;Z","e=0%$","Xo><","","","+\#%icG" -"hHxS","lo","n,]","e_d:=v","","4~F-7.?<]3O","u+l*arKY3s","7W}i6","7vg\","8@Ww-","}6hLIoe?" -"","","%!=u%q;rq_","f_3","2v","" -"L","pi=%","5kA","c71","=""e$","d&w[gp&,&}" -"j","dR}F 6bi","3","","V8vAC\e_A","L""q(" -"/VZs""u'","N","rl'BIY1","J>zBk?\0+","","a$,6>2T5" -"8","XzW.b""M&","B{ |2w4?CO","IY%s'wH","&el-c","*dDoz]J" -"","/_iI[PQW4",">>{*ib^","n$","NT(osa","1","{]sJ_KV","6 j","" -"k;","th!TO","hNuK~ch\5l","YBWlQfK","e>iAO(HvCs",">" -"","VDps`ft2","s2Qn&dvMd","5w$TRBJ",":Jy-?g?I","O$BuZo^" -"}",",","#)l*P9h&","YJbl//d","q%{Pt9i:/","2law>(SU>" -"","~~Kt+nVe}V",")\",":","c$nRB|r","%}qf" -";x6","szLyj5a","","","Di,,gL#OF'","Lrb"," ?;","9d9.|6_pXO","s" -"S%","1/XcSaMX","I P0","#+9eQzCiCr","","jz9JT7)]Q" -"9b","G|&9Z5e(d+","d","C]d{~@su(","","T&_" -"RzDn,lBMB","XUzS?cHL","&j&M4","l|+C>" -"R",":1~hq","jg]o3","@","&&:*NP&{","-=B:(#","s,6>S]#","DlXI3Dq*U" -"$f""G","DMJWP","YI3ca'c-","~?,nj3R*","8=G'q""Y/u","kB" -"Aw|BH7vy.","","d5#):","zUNcA","=","xjE3@EQq@@" -"","n=j ","F}on@h","d#","+","hNK[=9E" -"U%5g-","","24","9","j%hhQC""d,","9l$yY3Nd}" -"l!XZ[yarA","jr8#Sl]","]Cu","g)]xx","lV4r^0Z^+","" -"","Ad)Zk3a","V`6R99","","","/|","^{" -"*'|z*HBd""","X3D$","&fUFS6","ztR9e_sRRu","%P42.","" -"[)hH2","[EZf<","WA4k@Yx<","","k7","V81M" -"Q","tXq","r","h~dB6","J78cdP |","?~o[x" -"Gt5er","\iCp+&aT|","1","=Qf>","0'HvX",";4YKF$!tA" -"YwMd`","?wx[5",": (WPPT6","",".w!R/0Au;f","" -"D\fl","P@-WeBl","yY","P\g*U0D","qyqWUEnqF%","%" -"s[L","","tkp,eaY^o+","]9*{","","aj","Y2MK","3LJ#L""L+$" -"rShLDbL)#m",")b","""%dH1$/&h","Hgc","`z:^#W","Q" -"y^d=Vq}\","o","%XIIDox4G","N#85#YtP","+K7","" -"m&\C)'wNXT","UO'\eQf","","ueW`","2QxV<33y ","*'k|*(9" -"","a","1zxr","D\+PL," -"n=cv$opPG&","","uU`!pHl","s5*`5","=M}","yvG\uy" -"Vpv9Ul>","G]7*ZK","",".?hm","A","@!" -"J^Wci.d""/","XHS","&","w+GO","^]S,Bj]","'39`" -"","[N","","qd~+Tr","Od~","J~R$S" -">BI]iFU","|","k!w^[P~I","","jj/1K@","7yTz_igXd#" -"><8DK;S","w#","\","avI~D","o]@%","Zo{P" -" G7&H8]=","x""trJt"";","_/ A2","hh)JU+d_-","","bru(" -"M/","hip.$","KjL4+!.c","SeB?Co?GP","","~^Y[K" -"yI@" -"e=4%","z.y","","O17 D^","m_j'\8","Hbu","" -"IA!PiGK","oO6PS>o","""le Z""FC" -"xS_","","U]M",")6WigXr?j","e#?E,Y0","Y,@:^/=r" -"%x;9","r`c`{NcXKu","}S[-1}VI?","~B.tqq)","YKNjCl2rup","" -"[ H","9SLb","{34IkB","Bj","KiP+&$C","P$!)uOB'w" -"","d!","uXz[}","8$=O",";D[@e","JqtW!y)" -"CNS""[!","H=*kR>zy>h","DIWhg",":%@?d*fhfZ","}rW51((","RlI&" -"N%DU","(8BaTyO","gy@o","","W(9","3=9:.V" -"9","!p5W9","X*_?","r","""r,x.pG","ouA!a)t'[" -"Wo^uq3","}_M","W*`45(A1",".Y,oi{T4'","d!G&","|R[-E" -".un.&[p","y","py2tVO_n","I","0b%/0u|a3%","" -"E2G*5u9t","I*Q*ae$q","m","","hQraj5$""","Rb}1`8P" -"`uM85JM","1L$``$","rbN" -"1_.f","AF;6nq3|","|6","yc","LOf7@} ","s:uf>\a:6R" -"/9v%]X}Vh","D","v0vcQ","-o","}MW""{j" -"","","R)WY?>&0\]","}Ask/",".83","Y}L={a/yL>" -"hTeeAb3i7",";","GXtGQ","mnlID","","-5w" -"CS`U","6.~RO!^jp~","z?(Q#5y8v9","i","q8","cFQ$(x-""" -"EC","OscQ1%%","I$=X","4~n0z","h~3","_{@F90" -"a_","J~@@hk","Wc&!^","U=<07L1","#y09@c","_G@$-Mcu" -"K",".HA6","1","(NQI","4mCZ5%)J","[)y" -"","l{dc","oq/","~ZC<;c","\Zj+eE","i!G" -"<(F?","\d2!t 5?","hg""","3}6oV6","8POkuS~\N%","sT" -"&B","G>':PrG3^:","","3'","9i_Z*A","r" -"`;zk<`","shu","Fn4!","([7~5*`Eh|DNs=0","m76;,","Keb!","rG1r","A$BA" -"-","-T","/It:W8O","V","n4~M}","fj+]" -"T44X#+`s>","-y|:m","p V4/v","B[c",":}U*i$1","LoD/cY3F|" -"gaqt",",|NSar4`","&","","yLECc\-","A&0x'&E" -"A{/2e, \?R","C?JX","_QI","TydVEl","$M2Gj%XTIH","k""" -"xT<@*hKs","X.+","/9YEP&q`{","X"":rRb","M","nbD" -"","{|8c#s&G{/","_2Y^v|$D","|z1ngG0q","|=9B/4]RL"," zE69" -"`","","[!@","/|t%;","^g?d","cBR)p@qELI" -"lkuV>","?Xi`~p4r@+","9,","(KmUq3p>","c~jagEu","$qC","}SJ|kW2","E&57LD_VK%","p@<","5Z_f","" -"""","[+Z#>tNb","m;+(lTK6AI","W2e","=E\","""H" -"",",hN9\","","IT$sM0","cwqF","HNXvEc@c" -"U","0h,E","","bl]S,","-9","_5S" -"4Pdl]=rUr","-Ze","@P9sC","*pgRYh","'","!$RkwHb-" -"#*YSiM1#k","c","jv?Q#?>","\_QC","Hrq","v2B|" -"pNW?(uH ","wS\6",",gx$t~M}","/v-$L","ShI`_:]w" -"","4[ \>IgZ=","$d*4dZ""","O<;vP","",">Ore\%\]" -"nu02(","$e*",">K7qZk","\v]e5""(W","**0,T","#7;AG7+5""<","8U']j3 Z","kI4e:","sTFDz^FC","ly>vQ" -"","eNj","n'oQUEw{Q","KIpcS q","ARedi","uh2b" -"Y>sGR","t5'+jf0AJ","JJ:!r2V]e","a)Y|.I$UP\","3S","S*" -"RFO}]Q%","]=fo_","pQ`E+) '","}+|9.LrL/","'h","D'{:" -"u","y!ZATW2m0&","?>%:WKjO~D","_","3","","dR",";e_zZ3(Wxw","" -"MH[]x#(P","W""]Y","*_pWGvjE| ",">1Dm?G,BBN","Z_~V)","W:Y|Y%(k" -"u.5Pq","\r#""A%B","o?X<","IuF","F","WN" -"8$L6Z","HSktb""5@n","f",""">hAPCAI2","","7APO9`" -";Ms8pO","*m+CDBS]","p","","rs\O|rD-","n9?blg?ru>" -"IO,","i9v|sah","-PkL","jyxo8i","aXfPa&"">k4","_l>j)N" -"m8>","eS2",":'Nxvm","F`$|y,uh","#lEQK0%","NDd5" -"o~,Wh1;iMB","JV%9x.@iI",""")VV@7*y","Ao`Kwe5c","/F@","{n!s,()<:a" -">e","{$B.",",Am&ttsU","@a|","8/" -")Q%","S+L;@@4","jr","mO%Cj$9""","6eSm5","@ytq" -"3Ei77[RC=","?","&R""d","j\en>","_M~3p]","[" -"t%({","3>idJ:9|NZ","","4$D<8{hb/","2h{","c$&@JhSY~n" -"DAS8|","Y7K1Px+C","`ak9","Wn&Pv^`r","Aaj~","q16{ir" -"kK*=rW7h" -"lY","`KUR","+4scACgs}O","C","8aBpHDR_","CtsJTZh~" -"x/[ouRM:*","(RA8d+","m(pE]V","b","(PiD_G","'K " -")mQK",";sV(","}N","9*Q$GcT2","SEY,6#y<0+","y!n2" -"|#"," k;' &","1BI>aDR","|q?&{(~$","exH","bq'",">ul""V","@`]mS{YL1H","9tOuZ" -"4N","","G,.","","S'k3(/q","A" -"37&Qa_W_","Nb&" -"/g)tnp_","R","E",".t`Q1t_j'-","Lp78","{)NXoK\[" -"Y","%v3","Z{DGm_Bg","Whih%F<","e^1E[Sf]","~A5Y(X;" -"1l""H/1*A4","2K)(ThDd,","24c","@M_n0W","","=m[O" -"","[SZBy,s","","u'0xNjw","/y:{+5iJ[","M {@OVzA" -"|@gr","^tL&","h4/k+","","E~y","!Jw{h" -"aX;y","Beu43#","rd2|1","i-g'vz1QX%","8|(b|","1:y:" -"tc'&HM(l|D","Lbg","@jB","DU*F0y","X)I.",">5yeR" -"ZBH%T1","""E8t[","bYj[v@","2","gVQ","*CU" -"xcO8,","/","Y[uI6N","9Im","x;&nx0FN8~","M;P" -"|\W",",7Bbo:,D",",'8>zD1","HUv4&>0iI","|q#PA*q3","x]t'{e" -"\","}yL3\(FC_","","SBh` s","VYd&Hw?","X/p:UB" -"\@-","`xd","nyY`D==","","wu","texOMu#V" -"X @K$d3",".0M|0","*\Y~S","E?';1e:","_l?)`",")4hts:5N" -"~\","4qTHu(x-","mmtcM","","5w:mu*oxc","ne;&Ym, " -"Hm""","",",LtXU}%j","7N'qB","A>H","?EaNJ=" -"","32=}pv%Q[s","K?'#o.!5>g","QQ","1m","}s{>DdC." -"",":Wv}3.>k","{}s?X]","p?f't)","s","}" -"QOi","ro# W8n7","|TTh|XNf$Q","/tQ}_!","z^,CF3O5","2X""lf-LWt" -"QE{","C~}JEq*L","","B","8()",",y~R" -"b!?o2:}t","!]gG>","e9.u","3D","A@f8<","" -"taTlE","pz2F/@h","'`]q'","4qYuS","s>M%K:)","'P-" -"V3oj","\[~HoLbl","e6v","9OKN,","'>,l+noQ","?z-&" -"","r5`5~j^d|",";~_!}Ev|Jt","AEP2f","4","j+\v7ANGt" -"5","nX^bBv|","}rzei`L\9m","","8k","qWCG(a2(W","" -"s`KG[",">/TVHz(&Kr","I2^}","R5s","w>C)j84+t","R(O-V b""TU" -"ZV:cFQj","]Y`CxQ ","ei","Tq>,]*%%","O_]6h<)m>","UqDH/bWG" -"-6","L|S<}%=5'","nTq1n>9","8lm","~J@wf&-JL9","&h" -"%Pn|G$=vw","x^oS",";w.^vUG#G>","i","F9","R|Z2NCw" -"R=Z*24#A9.","9$EI\}k]W","V_","","","6a|Y6P9<8" -"9A|]bLC-0i","!oO/!HE~{","","nO","H9P0LCP","q^W3 Q(L~{" -"FJE(","F","ww ","kgb./(X8;=","","YfDF%zWn2" -"p9i#Q","","]*mH}/&C","<","]fO}&7@w4","m(" -"dll*r%n'","RvvqQ_C","yH!z#A7Uo","3P>/,9s ek","'h(8pZ""","lK" -"s%FCq","&cNT","l[","Fk4{z","","Ap8D#" -"","<3IAZ""T}!X","C9d#","ckaS","'<042|APki","UVe$Z+We" -"","%","y/0N:Lr1","?|h&jX","d","]:O" -"(yce","u","'va]","w}5-#{o=","-","" -"%+,","1[","RaW~q92bO","T4","c73-IG~","kAz'a4" -"FHkeUm]","}Y","k""q]vm[","F i","U_evW4[9","<(_~f2E/7" -"^vv","JW Dp%K","B_u{cd.N","g*o~7?","""k6`rYtB","/D%5%~" -"4>","@","","56N","Xo+r`","k0=l" -"R{W&uA","H2","1ZY>L8.<;","LUFGto{","Kg{}=Y","''v!U.j" -"$-let\9n,","V6P","noR>07q2Z","hBpQJ","cD5?Im ","y1`" -"EF\n4td`]","Ly]y1mq","","O","\=WS;","Th""W4" -"2tsjOcJ9L","CXPQ","","F8)YFY",";C","d" -"z9P>1Q9|7","2","}8 l","d[0*cs","","PO<" -"[wV","QYL08T:;l","2$jCA^","(|*0","W%","pY.83=[Eh>" -","",Ps","k)%yr&]43","ZF4","m}\","a","x" -"Ks#'fTc","iK&\","wH2b","",".iu","sN8 b@" -"8F4","`|H?","","~A3""UR`","h?n)~)e","[ZNu" -"v","& vMrdG","`h!","$","W2)W","Xp!lN{" -"iJv","Ab","'+UdYJkQg","F>!","Gq:D","""vSsPS5" -"K","W@lwZ9u","XT>/Mqcek","y","RE","+'_=" -"5hA","X","v*iFb~g","lotbMi0u","","XG<-y.@kbX" -"E+_Mx","$o","o<","v6>`&J","!X7aE","[[mM5hrp" -"__9J'CSS7g","98E;c""","RV5","","","u" -"c0=","&k","k","/6","%~Cg+e5}","W)@|$0" -"Ds0wt;","8S_PZW(","y:;","^i(yU","U!Z-;nCZK","+%km" -"f';w","ubD\o","D[F#","gZ",";k'fx",":n>Xz" -"Q",">hD","bi6LbP@","`\@","/pqRB",")&w6/X,1Z" -"l5f?","vQX@62M|","Pv","][""l[!,U/","'g@s:ai]>D","+/}g#C4n+b" -"","oJ>2fo","wF>.[","WoN1,B","~|[$(L&<","# ]0" -",TJ""^Ej>","8Zr","bY?:J{""R","G~?","BsQ8","b" -"mY[?a","xKG&7""","0hg","O_xb","{nz[JBL- L","" -":","9{R};yB","K_","rpWT-""","8Iz?}" -"3p*FqmL;9","W?)D""H4H(","0$#Ln2)Xb'","(B","*s","*PF}rt[_V" -":wSD","q(4-{","x(&Dk*[^","g>v","YG","f!}e(" -":X_","nE-","EcI""O~a8c",",.=#-C:GQ","","n@o{" -"<#YrY","T","f","","9","mn?EIy" -"Wb1l""9;.*0","""f(","@K39""hkVR","mYW","qt","r" -"9","r$""","U+ Sui%",">z1Y)+k","*""Bvy"," O" -"`!","cPlLL","n?=%p","}bk>Wylnc","0D?L","%z-v$8q" -"T}y=8%qR)L","","nx","","","?h_8&NzF" -"_F}P,","0L","4jRkg&>","`@n","/616","sj7" -"mrXI",",5,\Uy}rY","rZL=","@k1&y6@5","","""@xh""F@" -"m_","]/Fgna9yV$","R)!","k'>Uc\","vW8[Z-","y?" -"NfXHZ+%[",")^$42V+?","kRZ}YY88&|SX","m]""8h","a" -"Z4s,","dA","W7:i;Yge","Prc","N.","" -"O","/o!2uT7#K","m5s~0","D{hZ(",".GG dGfo\m","T8n" -"bM","BVjk@?[J8","","q","=GU","2" -"c","8x'!","","D]~@UL*v","Zh","{-a" -"cE1 ME s","Qc[q ?1#J-","BCP","","X4[7",">^S" -"?","|}4BEnO52c","`nM]B7Y U","C[IvE""","yae2H?Z_&g",".+gjkGE]" -"popKD(}/fo","/4","TU.","&,L=DpA","*(","G7" -"c<4>","r~2(0[dgZr","A g(bG;","JQ\8~.E=&","&:'y{Pf@]","%:y" -"dB mDZ:","_{",",U|!@!c","","3HMwjEF","XE:4[IS" -"hlL","eQ[(^Qf","[ ","N","YTm\","" -"oVv-EAqS`=","=SVJwv2|","^F__;","P3Hc0S{G@","#=CP5","F]b0'u4" -"&$+o+T)","^#/5Y=","c2ruV 1^G","EAb4{Yi",">""uU+","T\8;lR\<" -"3FnR","{","" -";R:}$""e1","#","WY/A\m","q&[a=","lTJ6X$,y","c+oa,N$uX" -"","W=bSGc.sf","0n&w#J9;0","$@/-]e","MQ; ","7(B!" -"ta:Xyh1","noRfo","","L2te`A","U{enx~Y'`","Ou/(^""zO" -"%%|#no","kruMC;","R""4Km}qm2e","0N}3","g[@a(f^""?","a&v#QFjhu" -"EEGgch6YvZ","<=b*3S","","|f","\Qv","jDuf\gU,O" -"RwJC(","(U","8\==?P**","D&|?","Y","O""wP=+oDb" -"?S[Q/l(","wG4&v/s","2D'o{b^^be","aG9w%" -": [^A*Gd","T`k([`*SK9","""cTo5","aI[" -"RvA","H|J@J~qy","","{!m]+zs^GZ","fnO",",o>|(-=" -"pfci","k)./_i","@","z#a%$yw$","","H" -"+H:-}X","=zzwxQx0W%","t0B0[8","!ay""AQ~J*","A'","" -"u[ M61@~Tf","I*}aThg'#)","^n%@","","lB?)","PqPsHyi6" -"Px3lg","tR-B{.=alE","R&sG+SX","",":",":bFJ2Kn" -"K<\h2.6q","5\&==pj","!&%QuWUg%7","qxof?;O",">:=","~zx8BX5&}" -"s->~;Kr","jC~3E@7qfQ","","#=2Vlv,aiI","+FL","" -"","xy\~","","y>Hr4|ski","]$GA>L ",":v\e^dA_" -"","#uG;","XOI(","","!","oe%" -"C1R","w6ZJ.2","/&","iE})_MLSH#","g","AF""^ih>$S-" -"o)K3W:|`}","nT\/8gC^","{_","FSyv~SK","","a|" -";>","","AX%>k","{iq_f_^7\","fr;,$","(0+`-zP.{I" -"`$T3!cO,b","WPk@`Cm@GO","","d","=jx&_hXc[c",";" -"A?","e","0\H_QF","YG","7aiT#","x+PwO<" -"i","5d/X>3)#","1+'(bwSq","}o^V9kuS","fI4\(^Z","ON7C" -"uT&v|2","5","/","","y","r{=I.\" -"N[+v","`","","o=Rz|=\","1cWjDkh","Uljzk!" -"o8_`","nrJk}eqGfS","4fR""},!s?]","S{bGL*;0","","7*$" -"8JB7xr#Hy","06","_{F","tD43B75",".bLTb}i","o?T" -"ixXV+","`","","%$EV=S)-","+<2Rtr","tYq>Ptf" -"c\}3Ru07","n","+P.NZtRn","yn","D@Q|*39L","7P,XcH" -"mPOzk|<29","PdS/l:I","","([X;7@I]$","%QYy:%&Ih","|S" -"utBlI4O#M","c$NTF~-_{","V","4uW","(W@i","rN" -"JU(P.X","4!O>)","RQ+@ AT","jg8qpq|.TD","/u","=XBAnYIg" -"dz","p4*>{YG^","~","D<@_[","Si)?Y",".cL1we_(dD" -"9{(E"," 4","tQ['g8pu","t3_","yO'J|",":6=[k0*)}v" -"9?n{","jY_n:","7","2",".uWtU\","+/" -"jq:j"," sE","oJfe80i<","w4",">0KB","" -"O:",")}#f","Hrm" -"",":.","40!|00","/d#","lHH","k:#}(3" -"VF*b","NuFf("," $","#-Y#ipE","K/T2;YhA","-X9HasVKP" -"/","M08T!","qu]Hf&`","qjpc","d)sug","81ztm03!}" -");`$0o" -"chDz2's@p)","cZcf<","5jeuXv","+hrU,T=","fM&!r4","CMCYBL!m8" -"d]","h+9","o*[]0I","PR:@","_;f`hq_","r ON" -"Ol0d8Gf\(","64c&0IJ]or.W" -"[$+F<","D","fFv$5_n","^m6Z2","t^Gr-:Q7G2","Rt\V|" -"L:R-*","@ts|t|wnA","","`n","","]}w~Y2C#E" -"Q$","691i:","!!>j=#iv","K!]`|9H","dVB0uJ=WL","dXI" -"Xj `y>1=6","72","oJ=@If]N","-D5","LX","" -"aLQsfsMy)g","Lt7E\N5}","SVfn'C<9(d","","{\","h%bOzTB/q" -"Nf8lpr3; ","Z)/W^mihJ","_NamL@2m",">C",":s-Y","?" -")'N2=ZA~(*","86eAXvOnm","L-","6P^ex",";dg:rlWU","^ bn?x%" -"!^","&6zh( >$fK","R","","MV6Mh+'uQ","c >J-TZ." -"P","N","Dbew\d4","An>Z","","TbpiXl" -"e1Ht#}d'&","w[B[","4f","ogT","C","lC^" -"%y|NR:u","}s.bCb=i","iK7#","ok_jxu","+WGctl9","u1Z}" -"=S`U(DaG","M$","M1","e7m@MrM{","$tQ&C(p*","" -"atDF0m","%kYk'6fU<@","SD04Y'#+","g@P$ XA"," 9])Cl2@}e","T." -"V(XjAGfP+I","\GO4""T5,~h","","uo/","tdqu:=f`","?_(N" -"n","lg ",".[7","5:M8I6M.t","Ze#oSj\","ySs2$1VC" -"_R}z>",":","06zjeuTDBk","6VZ96A$","JYVnFi lOn","{/""+P8v5Un" -"{TbI,4'.\P","r!","|wf3?mR","5y5jo4QP","[I~1W2ZKc","SwIeq8" -"t5)Z>G22R,","S$3/?s){&","vMn","lJw+","17\$Iy","a1ZUK]gJ" -"cuh+","J/j\~A","k48~2mf"," >bd]rp~M","Hc"," cO" -"J","poQu+}SHi^","3IID","%4DX","xxoG:m`(","k" -"0`!+","Ux(n","'tAZ*","/&""oOY~","6OJc","nr[ M" -",][3X}O$","YUE\l:1R*:","J2@j","B>","$_k*&rnLo<","" -"iK/RK3ty","(d_o$UB","MN?[:/","nQl9","ox"".u&B0","CZ%Atz" -"",".SMK","8*IRHk/"," -RbUX3[n",",T3;wLh>~","{28FE|" -"?43h","","UK",">XR*(T","SFk\u-a`","p" -"-_","\%v>6Hy$CH","O2B)","Qa5","MT","^7" -"tw:,5E""X","#HmD#}xD","](&6@oI6=","an#@@jR","Y(9","""*0g" -"u?","qDAezvF","p_","zlp","In'ih5A%","cQdNj`D}`" -"V","7","OG","","Lghzp=)bYM",";-z" -"Y}ClD=ME","@AgHhx&kQ","+u","","x)","rD=@PJ+7\" -"sqg","or1l+E ","F>","","XB1ELt!}-","|uW[H" -"","","#oYfF&","y^R ","R4ai48|ee","M{5!Zei" -"zAv$.&X\s","vC;i","AV","n`'","$ht@TVJL(","P.KvkL" -"Lqa","'pjT8W`xP;","%F?7W""","nTW<%Uc","_","uv\@" -"","XA=Fh'1*Z","|/*8","yP8ibO","g@H>K","#" -"*R","`y]5MS3","","*MEFpvqF","1qecJ","F@" -";XU","(?KL$/#","w]LBt" -"*VUHX""1BZ",":,n-RHc4","#kSUF %`P","j4Rf>\`=!","z%^!x","9""H" -"iX8cgE)4G0","d$wp","Ll{JEV}z","*0K]gVSl","S&J","n,-Bg.sF'K","Y","a3^,_(" -"y7&","ine!a+ISD","tfC","]{z~+","WCGt!","" -"SO?y,E\Im","C~qxsE@9","m@/\uv","","WKa","^l,jUMe" -"XR1J9",")&D7uS'","+~`vt",".EH't ","SFup,QV","6rDpJ50+1" -"d09","`Bh{|e|]","","\iEe","T","k4,9^" -"HsTDq","X)L30jRRs","Ww\/$t;""!`","A""8*dn.x%","96+s`q ","'g3nb\l" -"WDW&>'r3;","7z52eH&>F","VSj","s=z=y,iI",")?!M","|wos,_<" -"Z6 c?,_JK","f.!O2TVA","k1IfG","lp","F])=3_V;","-""c" -"pzT>F}","/ee>","[o4l@u","Qox","@","}kjx" -"YK","gE(G""ZWK`","","5""+>,z","&Ocj*","[2HqzK,ojc" -"e4x5YN`@","PWk","vj","$8 ]b?~r/","\ l+7#%","" -"E8U7iAOa","b>N","^","9","""=","=Q#'" -"erD8N;d","","fSq","^GCp","S^D$I#rc6","fm-'r" -"j1","","Vtk?0p4&N","A[QpS5c","C+6mQ","G" -"9H","yUj5","-nd","/I@yQX?qg5","~SR","17;" -"t","B""","a","Zv:f#HPtYx","n","Cdv" -"}6""Slm$B","Yb?f?A","cU)&p","95XWTl*J","6m%i 5?.D","" -"NrJj","0|dA4%","Ht","+>eq","q4PP$","J)k" -"5)#40U}",")O?(","","_bp","gKsIP*l-",">a&U{" -"&)_mx5","p)*i""","'o#FV*y","","[Oy/:2a('","EXjV%=f?8" -"Gvtj","H&m_#67W","5","RH""F#qh3","","RPL" -"","w]'iz?$","7","bv3J","6/B7}7pJAd","SR5os;v)ll" -"A1@""'#)#'","","]Cc","gc+[","iv;t[Z","yQKx" -"`.)","1IV""L19S","Q`(Ssi=]M`","4EcI","1X7nc`Mt","{z'T" -"","b`","8w\UQ","mMX","&EbqkMQ","S","+A6`5" -"|6Dpk","nG/","h]gQ,Ub",".'","?U]HH1vy","%F<" -"A","#r","#+>>(r&w]","","","%g" -"VRtPS~e","}PYc&*^","Y5[SkAW","$?.I9\","lQ3y938VY","K}" -"zrjLc","Z|a#00TBxa","veLdNa 5","","U>M","" -"","t","U","tY!?y J?,","sUJ*Vi[06","Ey;" -"}w",")","B]%Kf",":kF","#'=l","P!","h6'K:","I?K" -"","W:M:7","TdaYc","$*Y","C0l","CU?BrtInc" -"/","d!rMw83I ","da|Urx7","Y~QSxE;","vKE'kfx","A=|:#i)eu/" -"S+HK","tgd7e9D^v{","","R","(dXJ]","WN-""" -"laWe/Rf1)I","e#}B-;,pD","/*A",">f|HY;Qa" -"Owm&fl?X","#B","-X(m#0O","","k?I","<*}+pSOo" -"%F?X","","SPx{$J","Gq7B5\e:","o%V4()F{-'","9|x)V|" -"PzR)}Ej^O","2","""vF4","M0.dz","l5b90uB","*ZryuJ" -"","T5Zt jS@O","5,","E7{KOm$5K","X(h-i%'}","[nk0+pSU'" -"^","Wh,Xn""(AD","cu~$sMt4]t",",Dh@/y","","" -"Nz+a}","}bar?5Q;sJ","T=C[/","J7""lx","","" -"KDJ75","8","yuJ","K,","^;EO~I\",",WZG]/oB8H" -"E;/P)0x{","D*i_F","6`j494Gg4c","jnL=PY9Q","#","7}4G;UIU7=" -"$U","E-F8xTE4","rGH:6Z./","5s>Lh9G","\8|dcK","E" -"vHb+Bt~!","wL<;","/e!J","_fUkr\ aWN","""XQgPj](}","tv" -"L(fKTM","3u$-v/ch&","HR+wc","QgLq$gVh","jI M7L","# &" -"r=M]n)!","A6HZ","fC","Jt7","kq#H$"";B","(Qo" -"e!s","AT\4R","^/gGe","Nc7Q_","7[_M","{ca5uPcSku" -"NS","","?vdq\6A","B","N4:","4Ji" -"""C6mWF9l","@a;kOW","y#c","MQbmn","]Sl/6qN^","" -"!z","z_is","i$aa=r" -"f~O#`95@8`","q","G-","5,R[N/'4xo","8^,a","fe|>B\" -"'}+pY_c","-F]>~-'",":-Y~S","","J.H>&Fi","Rq|V*" -">}","T~meCpyJ^","","Q","R.Qa[.z","k." -"+Nn+IK=S","e","o+{Uo","mp>","No'mgJ4-","" -"J","od]stFv-]","V`YEG>","","#i'",">m","","@@+""","+89" -"0MG#>0","j","S9x","<>","x0ZjM","xa3 " -"","sm^t\A","^0!/|\,cJ","","->","Ky\|" -"^\_Ewh","\e%TC","U|I/@'_l","o@s","AiJ{,",";ro$g&" -"^#`""Xd",",B#","Vsw8%h","""`1{f9bSc","t/y7!a@i","i""5>" -"+s","3JC","AGl*]XG","h","~Q8!FV9@","" -"miuBJ1R-.k","+""-~","OIQ$+Q=(","amu","","u-?" -"lq1}i","%KxCj","K)",":0a$Dr[","@VPNmm24/","" -",R5b.q!|-","5w","#:0(u60S*","Ye]=gb","1HzOtk","w~Hs" -"+#6V","vi#+x.t","z#J>","","g37`~R","/6a+Q" -"Xh(M","wbf`@T:/c",">: /,_","Rlt@","","!c}f>+T" -":C[","#""*x%\f:f","xa7/" -"","f{SEkSGh","(]","8O{","@wX'YTJt","V<\w~Aq" -"?P#{\=(K=","rAr%G","T","9]","","!:""ls=TMxw" -"JdD7w E%fE","fXgmQG""c","n[Xc+YIKD","^`6wj[~H","0","5S^" -"u[|4","Xw2[cskyX","","nWJrL7Zt","""E\(5l]Ph?","" -"Z^8","R",".CdMNd=F;","~x):x","""""DT|c6BpH","" -",W$Z)$qn",")","@FK","G,`?atq","FT{L","}a/%X" -"v,S","{","$uL{$[Ih,B","*G;PES>","NnX;Re","" -"X?}SY:6Xm","BN",".","","qco","!oS" -"7Cn:I","%Ub$","F4MFLH9)K$","","c@,O57KiV","mq\" -"Z)","w8J#gSg ","=l3$,@",";{Urg6","",":u" -"","Mr1Z","'~0","]kH)","]fD","#oZb" -"CJD3",":AI_vex5o",">y4","9,-WtDA&<{","+1\+~/sTc","" -"m4Q","^u`r>","!3]m]","","07TbdX6!H",";t: UFd" -"X","hrm","4J""VK8O:$","({","\(n<=9","T5Z>xd%9I" -"V1d'Jl+#Dn","(AXo]Pa{%s","",":K","_mLV","5U8b/Ozqw" -"d","VV`jA","n_>Zp6V'A","NI8","T;Dl#","Gtw?~" -")a;","@A6J[4`o24","","t!^^N","`c+Rr","p\d2G~L" -"eEG/&!","[OpE4)viNQ","yAw$""f0u","burv6O}","nzVS","ML" -"4S3b#3'j",";01","h.mSm","ZX~uV","MX(2pb&x","_mH4{A" -".eod} *1XH","","*gQ",";@w","8%Mj","wo4@@" -"Ch:AX","b^Y\{","H","Nq%!%A/sim","5#","ZDSE" -"P","CLe","UC5Z`G","","1tf","O8$fq^Y{j" -"&vHc","","jOR|_e[","mti\L>","Y","Iq#gbp0.%" -";E","]0fX","WPi`6wiVgb","='MgYi_I0?","5+/","O)`A>h)&","(""g&ER|1l5" -"*K]YeO","","M1","V","w>x","^.$N" -"?Q]","-","k6<'@N?","","prp%AN","%nU$!" -"-x6D!LgV4","","Iofa78Or","#5g4_lXn$I","PNMU|qU0","Z*os" -"'CLFy*""to","X+<","^kgjm1:.\","E?2_/t","V!?#","nZ*7" -"Zsi!PBf2u","ddU","j@^roIK","~wVcb\Y*","LV","o%`[nK" -"6I1","QF8TxP","v^Bl;o3","b","fWH3[","yw]5Nxe" -",*orfSKWLZ","","jX#k","h","ikwcv ","=4rhFs_xH" -"","tL>j>GJcC","T","uKX^_","a[sdV`Pz","Sm" -"V!S=W-c-4","t`b\ A9","","i9!-","96K\:""+o}{","+:" -"NAJ~","Az6t{m!CJ_","","d>G?X&sTZ","V",".hi&|""qa`" -"a.8#'","(","\'K]A38;O","J*|:_","|D","c" -"G$","","1","Ef","BoZa","[""J""" -"/0,H6]GY","","\F$-vz#K2r","0X@8A1fd","mj}'}a`ctN","u7BcM9:" -"nW|sA?qXC","h(?","!$\Eejf","H!P","9","|7nWBm`[T" -"r^FiB+mP=Z","!",":~J4T","b_uF4tV,(","vTl{=Us","_ -" -"","bth*fd9%","h1r\Ep;8s","TfIOs9yH",",","1xDIv~#G" -"!>Ln","|HlkL","4O~'`M0","","6nNcJxiJ","0" -"o9Q.!!?-","","\^","S","J_xJL%","" -"","^;%&<>8CmP","RdQ\Jj_!%f","]JP","tr{H7","" -"{8j/#N*73","","o|rUz","SDPE98A","sF","FMr" -"V7/Xf!a","3e","E3)|p}\y/","","pr","e;{\S1`=#" -"VsvFpD""u","=#>gL hgKc","5<>,\","H",")vV!m%u ir","#z_" -"oe32&Q^_F","}*","m[>t^2rNO","p;Wu9+sbh2","LIm l99L","O0|jH5" -";","7g","","L","2D~GAd","|6(H7>E%5" -"","9L","xSaL%H)::~","&m,",">Wf_@AllF","" -"p9=MfoJ","zQi#W?","OS(13\j=FB","","ha}u4H","" -"p","ja","l^^qH5k!gL","X~xYC","$?5N2a","gU" -""," y%f","2","%D57;+","#`*>","L>UzOrOn" -"A","((9vRc","PkUtfGU{4","W=","q`f#]vJgm>"," IIsn=" -"L`8""Q}-27%","S:pY+W@M","++:T_C:","A5AVY.!!;","=5""L","" -"]?","3f($cTk","t*4LP5","N","G).Z.=;N(","g" -"b3y)","'[0/","L&_,s>",")","%MO~&Bww","58t\r|X`=H" -"mjk*%&","qWB&j","&v0(JM,","!>*+","d^u&zEIgD","VN" -"*ee_.""","""","\qVrxV%","8>\[|N","$oJ7st","""/J1""k" -",","y7~ohX'F","""p","7|4qALx","^u\i","" -"ivBP]""uM","`8 7^yX","J`_","|?>VGDpGg","s7iMkU""k","RYN@zu~F","Ej, w;j$" -"`5c","","cRu>","{@%.A-""","{&8&J'","6P\cQaO" -"Hb@94rah1h","8~","Th[`7p$Z9G","YznAYYo:","(>>Ve<5","LFd\BlS_jK" -"FD^","","$n#","","/`qc","=<" -"pX1","6-_W","IzOA!H%","v?d*q$Nn","Nv}YrAyiaN","DK+=;w~P" -"/AW","""I{_","6N{7_+","PLsFAs1;","8","tmQ*SdJjEM" -"3AoPWCRh","{cwS","F>Z}y4^%A","?s)V43>&(","{dR,l^ah=","","b:w-" -"1@EhM,(\E","\" -"gN/~84","c3R_GmQ1","svrtdog""","2!}RI^1^lq","JH>J","" -"oJ0RJnr","{Cbo[w>K","EfuJ9\m~:","O_<=qD{'","p<4QQ","}" -"fkg","e\1,L","@|A8IY","Z"")9*","","T56:" -"",",e-\m""g&c","0Zo","FjM","rTPMA","^V-~E(s" -"spko;@X[F?","[s;Q","Xz","%U&[|","e?","Pcb(6;" -"TVF)I","|b:","V6","-","k0aWHpT","J>" -"4?K>ze","sU","Y8x] !",">qh","4W7QZfR9%4","rO?" -"Se6A/1","pwA3Yh","i","1`","W,f|FKz","3={[" -"2","P!SqX6","zm+;@Z","7RB","O%VT","^" -"Gp9XU","?","","","YKZ1@","V56lE`vo" -".""8$","-!","r6g$TZ0mP","KZ_a""^","B[]","#PR?9N#" -"Yqftd$~3> ","JHn","bB=","7","K|vhVdQ","n.7P9" -"s:;}/CAz:G","x/ixsR","6uwMr :Q","@#sK[;<#","Q#;ax1","" -"","","Uozc","s","","bf#Jya%" -"""kz4|ve","}!Lhy","j.jn2","ia","%r'D","c.$H\Sq\" -" Wb]","W7)","/=Lth`&","j;]fTs\N","kL;hCqH","Y1`!yg_LX\" -"f=",";zTu\,^","cyfRp:""","}X;P","$vK=3G08]R","" -"7","H!Z4.Nf","7$6T\B9","=>Dys",";/!X|j","%,S" -"e=u","N~dL$*OcW[","TGJ(FcC ","gt{Q(","pB^oq","","o:=v","C8C!P')&;" -"%s1=xGc}",").","'{cd;9j\","C*%,*&q%",".D","1I5hR;2" -"7/S=z!C","23","38""[KMT2","bwQAR.&","4ZF""]""D","/WnN7\!""a" -"iF``i","""AAOMk","""73","C&?mME|","","5)Y3_gx=" -"","1r~","S y","J6Pn","#kml","N^ZNj(t7" -";+7j-ob","9","y","NUyDn.r)","6B#9U","" -""" l",">P","]Cu""ZOccC","K>+","tc6/Gw(1","-fE1IJ" -"R","dY`74<:V1l","pj","PyD96M,","Au[","[DTO%c=" -"-_jo6[GJVA","dO","mJ&","$T G&","W","" -"0""mgGkS","X,[WN","Wx","-_L+F=R","3^","?*" -"Bp Usg""","|x","p?#^G5G","k","HUl""Gysx","7|E73" -"m$L","uG6_ eF_c","yp9cAvmNC>","j85=9P","=5,@u8",")" -"%:#7e^dBS","**a?X;","7","q","%n(gG-xh","jb" -")k'[*","BjFP+}@O:>","Q+W/\a","_}X6^nE","PG1B?","A6bYaZ" -"%","'5C]n","{","NJX$T*K4P|","YF`YB>","bz" -"h>>h?","IGDJfnfI{Q",")1|""c",":pVm","","f/" -"#`,k~F","|=n'","wEjZ7/0o","hh","1{=|ZvYES","OH2w" -"","./2^y""8r","mI_7SbX","srn:Wcl","","S" -":^bP","x@r)Hz4p","F)|N",",","IeIAn4B;","U=x!?u" -"Hi","PHM$VT" -"2Z`)","","=n,h5)","kPmF[KI""","*(#cx/ig","xR t" -"SJD&A?#?N","t","*","","^HMb/P.","M@t""d$Jt:c" -"`Yi","Y;RS%","","Ua WnnBCs$","","" -"","{t`$Y?","","XUa,dgi","*gV$","(!tG@N6" -"","lr{>Vb","~X","y@I","F59|v","5TUHH|'}i4" -"*I?k",".FF","r","WxZX%t}%","xMJ","7|H'QA" -"9Q","MLE","An","k7","q\dc-Od","""U0O_85","0oH2|T;","" -"P 3","rW&i","e","U",",3/'~D:_D","zaG;Pd2'+q" -"R","6","4\Q","(N","LB/MrcQ;a","=92" -"1\{Mfk{=E","","#/[yR","B$'""=","[k>","p L,dVkp" -"/J","9Ze;,S","43I","%U","BEG:i1","!E>v&-'ii:" -"VjF$e","Y79.j7-.n3","ro=k","!Ksx","Ko}N","jr3N?" -"8""xNF","YT0kE'}f","Y0Qc!T!5","d.ti",".LVo","(R" -"@?FHxP% D~","9{]Cw?'fVM","m;lI2ZG","2,I{D~C'&","wf""qPS~UV","O1f`]u;Z>" -"t?2c_AkD7","{tZ","K'}iy|p]y","Xk4O4}u","Xlu5N","r~Ad3\||}s" -"i","klzafkg:s","SGiS1p",",uPgGo",")W{0x","^m8" -"-F""}&u&::t","H@rJ:8VI","G=o.;2TIRy","z;<","gSt+7 bR","~F.+[" -"*);TRx","JAJ;An<","g","01H",""," 1J" -"~G^q{/Y","l_+7|G(;3",")&1#","f\","QZc,xok `","*R" -";>?ceN","z","ZJMjydz","v,zoi CBk","","@Y*Mf$" -":fGlmr","#(R-" -"T8zDm","k]",".",")5H*#us","3{","Xp`" -"l|p","","z4cst%""8E>","l! 8*,","=c%","" -"vS,eM:","","CUz]","","o","['" -"'%#","'@?m@aL",".sK","","7FC\D_p.0J","nT" -"r","<4&F","""xDnr@}","v.=8%6","dza@r:8yOU","n1ho`Umg" -"","z","xVL`o\QC2h","i~","gV>6tHl6@""","TpQznu5" -"/",";M","Uf]aO)","x(}UO4","","ec" -"2","VnCAM*J-(","uBSU""z\",">hr17&rW","aIObt","" -"|","`R","hBdRwI","=","0y-nAT8","'" -"y","`C1u Fu","U""","*","CHKw&","k" -"ad","u!","k%Kf","l]Ay!ga","","=3)TRTy" -"*{n4VO","""UD%R","{0fFFj","sI5Kj","6mj9}P","Uz=%=PpJ5H" -"R<=e","%taOp5h]Yu","ikx1(ixX","=J!","OtEl;\kgfe","#&v&v:\" -"b>OIF{ ","oT.","[Tm","}C]cL","o:k ","","s=IA^?[T","ZZ/613!rY","L'P`S[_I" -"#","I9","'aC" -"YwZ1~","u|","'$Z-QJ","Hi9ep)o/","t*x","'" -"7$.g#Kh=","80Vo*y[","cuE_sCfIh3","|,I'uK","^Ip^yU","d^jH-Nx7\" -"L&Q^M","yt6o]Ev","f*!]x","@b\6rQj%)","C=d","8GkJTqjBDq" -"P&","`~w_]","i?i","J-;ZeB~?G:","$~u{","sM" -"m","+2to","HE/""!","3","KMvNl&jAQ","Y\" -"EN","Nr}PW7t?+","@K8W","e","lf!WB","mNO" -"#'KQO","nf5'5NQOe","'}\3i#=*X=","<P","w>","k0qmxr" -"","l|g3_S""","cq)g&F","~B+/:'$/","r4?y{$","X" -"!B*hQv+","]L%\h=^ja]","ed'D0#","P*pN\dcC","R@","L[_adlPve/","Dbl9e+t" -"","]`d(0a","G8,","f-<","" -"^.PAa[Jp",")z-","$;","*`","8WnrFEP9","%X,Cs4" -"#%t","d<","M55K,.i","MQ/yp6v","V;9p","`U""I<]9" -"aT_{TI2L1","TL","Lw7A]","B\9cq\","6","]o{o" -"|IG-""","aPBM&u","LBt-jh(#7","oX","6^le'yJ",">!u0" -"oU2$p","nw)HbO","twDSt@.)H","_Sfv","","" -"P,t#+^","=\f~","-[","5RnMDZ","Z","&_GTSd#b" -">jb a","j-m%.)W","}>?ibm$Ej","DU(x=W","","'" -"n","@v$&TYmK","m%","Y{","LkG"," ","|x@#","UbI","G" -"`""","&","fdcRXEN._`","s>O^6/i+","OXg","" -"%A","}G0.i","yk}g~?>!g","UrIhIn,%","do{#$R L","fBC" -"2{Y-","Hl@eJ(}1y","XR!a","J=]_6"," P-d9ev","1?g" -"1R",",8*c","yD>_`Jx","%X9","fbuk=@f","gU.&{%" -":)""WmHE[)E",".uxm07Br&g","_;Kv8","Fuygx_j~`/","jl","E_zs=" -"lwD[3ue","aiGuqd+U""O","{^f|P~&3l7","_","M=H)%-pg","2{8D" -"}FKC;F>","^aBSL*n}","@S[Jwj1c","""VZe58b<","Hk20'I","" -"8J7Mp\5^[","=""q","ibI","Y""Opp0","Q@D|Lj","'.1L$([mMU" -"ad>%ZL","'MX!mvqH(I","!{4>@_","Q'd^","DF?L#*","+" -"","qC3~bhdm","1$w","oI" -"F`",";82`wbuNT","h","ioK\m","r","7@""L$s-." -"GjKg|ra{","\}y^NS|H2V","5R2%[^Y","JkK}k","}}","C#N" -"8#sK","B&Z:gP&F","]","zh#?d","=","`^GUM" -"FlZ","l","_~<","w","Rb'Ad","hX-" -"FkzRi","","T+`eWqcVV*",";[-y","S=&HK\'","-R)sxn`c5" -"Dh$Xh'E!","RJZmu[A|~B","u","s""}4Eg0gZj","]#L,0uR","" -"lbNx|","_Op=%6{s","sC'j_&lpY ","uDHyz","5CXx|C5*","H*0nKRfL" -"",",[>a-pvV<\","k9N--v)<\","]K0}o","4cKze;`N $","(" -"r(>Kj|j[j","-:_","D","([O","*rN","P" -"","o/L&Nkkn","'lt(&","","=FKWv>""T","Wwz" -"0TTj","","V1n6+8ju","5!eo","ll1`*A?","" -"~h\s_]","wt","AgDG","sMsY/TH","jsS",".dq-fJF-." -"X20I{PQy|(","","/l^~Lp34","O`]I","@uUg","\GqBJ" -"","H`>","Hmoa7[z","F8o?`",":","&Mf1>Q" -"z","|2! PXt_","[BJF" -"z3=n>\EO","OZb","J","$.2;_\bQ>y","x^","0`=^B" -"Sd"".dF9B","F]-n#^","","I?q","L","""8L\S+M^" -"BSzoV0)(z""","s","=9,B9","#q","m9","|Zm37ek8" -"/W","",",u'1m>`/P&","",":&ye?\Dt","ZT!u%\hNtn" -"{cx<^U","HDbQ'cO:l",";Lox~w1=Oh","D.qpb4","","9NY@n5" -"~nJ",".yL^O","7","""3` a~q_","_7" -"[","d","Z)Dm","HaW2R@v","}Mr",">}" -"","}I td7R","MVe=@9]*R","?","","3gNpp-" -"au7","$BMx&<","'&YZsIrF'","q]h","A[<","cE_J7" -"$y",".7M,B","u/","","=#'jtlT"," &Sb" -"m","&M?31<.dn","_","^",",@q#>","njFq7VV" -"","1","U=$FJz!","~0L\d","4{L55IaX=","j&JJ9(/:W" -"","pVBa&~3","\:9f3>e; ","B","F>","m5M_.XPAva" -")|unsjx%C2","}O$5D" -"n&{kK#$r","1)","","1""6Q2.","","Z-}'R" -"s","nUN@0pj;8","-B0g%FRB","Ku","s)_Y3@4\X?","eQC~" -"It2V* M","k]~,Bu1mc","HliCCg","4a9+$wt%oW","XOz`0eo!/h","HrME" -"3c6wL:","b@O+4k d}","(","{%0d^I;K0","VlCgF1x","U>7NUa" -"UT`t*>","}f5m@""","W:","YYEb*!KFns","-~,<,","pFwko 8[t" -"H/89c'","","Jn[V","Ae&3`("," 6[!","v" -"F5:%YAMMAW","0","KjMRKB","Z","",",e;" -"~K%o^dDpB0","\Q","_FD","b8WQm/=","","MZl3\LW,=" -":D*;","|IgY`",":*D[NGr=A","X~]oe14","","=~,0NX+6" -"5K=#|,uX","9LNs","[FG","cp\&D0&fk*","+&",">#M]T" -"='oA/","","xq!Q;8","qzNL","`duzWU","j" -";;~/.","U:'v||","","","l1a.2","0LW2P" -"Y","n`@!","J>H!2F","rI3>kN|Ac(","33L","z-R:-iQ80" -"y$k\","6wNF'D","6aW[:j<"":","OQ(e","U7[!L","ES>0]~r" -"p!=","0~X2^}&","{OGGdTA)~p","6 gY-","<*b4!cuh9","2" -"%z^e`M/.r?%I","K","^>$","3x$X","!Kz:0O." -"uK40ZtQyY"," t-lzS","","eF","d,`Z^1.$","Ln" -"","I-a&%.W,","wAo","nuS[|p"">#[","","[x#Bz" -"t[FV}8i","","V~7Me","9c+H`ALto","`H*$=Bgo","" -"}wOU\;>9qF","F#N|;","VN775""G","kH5","&-sO1/N ","^" -"T09","mLW8MMJb-)","NF$i^dy*","","^"",dv""|{/&",")JtR,(" -"5ab`[","),@{]kRm","HfaEwLe[","p","[U*M@J5","x" -"X13=T'&","!p:vnLZ+","Q)6p)ga","eD4IJE($ L","Z6o","" -"PX","_v>`Lg","","xB0^|]","YJ_-|","7koAWFYFO" -"t1@Bm","}mZ*Q}S>)Z","","6(r5","oOFDYO7WZ","nG%b\^aOR" -"'vCU""Y","|FRSC%5p",")c&,","tR2","MbJ_J9~fVf","R" -"(]ZMr}","4O<-EVWg(","","@r","","_Jv-!;$]+" -"","TMmwpgqiVt","{&ao%<","","q#ho6X9b","" -"b","","R|5W1q&","4\WP0{","5<&aQi{R","]+gM&m$o" -"IO","bh4'5O)SXr","""eL","^j8?|OO","zuM""",":Fsb" -"lg","{","x=" -"G=|","","s-b$#I",">\+","'9T\W->Q","Ef@" -"*d%;","=X[v[H>@","!","xa","/\","z" -"","C'Wq$]s","7bNW|5","~8wK","G""IS]HuAKf","bR&0" -"","v4j","u)MP)mUS","M","2%+[ ","1~" -"e","n(""$N-YDo","@~T","}q;*Y","EDJ$","P\N" -"!87kz_!,","rCJ3i","Y","9","gEl","}" -"bA/'","*p%yx","MbR^<","rCz%q*fi","~HH*","40AmOg" -"MOf4thzm5","E&'","TdTyX9","y","K9iC{bnV(","n}#=Ws" -"hO",">IZ3q}ziS","Ld+hkl)B'Z","psm)rYB@TC","OgqG`N","" -"lw9s","A,`~","'A?>fz","","]}?y%As","lJDuGI/" -"EdM""t","RZT}bLx{2","^&ek`[L","^]Drbd","wD}","t!\zOD?J%" -"","""%"," Hpo'@nY;P","1$/","nuHW","I9" -"",":\","B}9lv>Nb","{Gmx(L","/ug-a3Y","w*h Dl].A7" -"^l(w","EoO8^","xosm>5","<,kU0b","","?1`j" -"q&}/sKL0","tI9","+_`=","p","i\C^w]r\;" -")gmS)S"",D","KClkeXt","*S5pM6q","U}L`lkK6d>","m*Y(]O","t|&r)0T|" -"_l","KlpL","X","z6ca}f%@","_-2tQru",") " -"1V,L","%RQ&.tF)ku","`pG_qCul=i","GS_zVA","Zms~)/w","k","%","svQgA)","#","P998]Q>","5+#2az)" -"uV24q","Oz<.w_" -"v' q({d;","+njk}","nn|aa","4B","bHSZ%5m@Q6","V)Qs.Ucb" -"I[","U","r{=z""_PD","*Be7-2^68","}Dv_n<3ouV","" -"y","","K","","M5) |C4M",">1*YIeg4" -"{!h^{;","kFUNy","U.i#Hc","e/","","a<~" -" aB!","f&B%6&",",Lz]nPWGe","*;B9Wi[","","4" -"DKNdP@","3eqY","j","k&1","Toz}","""YO" -"$)'",",U","","M41)6>Q","[v^6_UP","P1y;#<" -"j]ItKmw4","uY*[2.","c,,","t;","PH.Dn?1w","yI(" -"#F}58/Qb","(`_%bj","7d,yx","73g n9b","tIwI~","57" -"`FZD);fk","km","a$cagNV8*~","u#>`","L28cl?","K}E85Y" -"k<~'Z9(nL","","N;5@","4Yx+_@u_zj","5N[","hx&'" -"vYr/45)","-{s(","vjh","^%A3!$mp","V+","GxT6>><" -"/w","z","3:8rKE\I","5!","","ZL~8F+ZE[" -"e!?jMw#.aw","|=e;*I~G~","}KA","6pa","","dK164]/w" -"5f","+|H+W","|@hr","A6%|R/","","HL&q)-" -"$(N8-Y","x:.!9VP(","qUp2@","5g_-W)rW-","","wb[w'qr$a" -"Cbuc","1GH6.7kR","bJ0\*","Ah6XW(o","J}S[8A","EJf0TLCW" -"7(m+/Z","v"," yvy}V3","LWU]",":","" -"rmS}]N","=~p-+]93~f","s","YAT","b","HiX&I" -"","A:d","jZ$","Vex","","iKUth@&" -"","rlSrlQ","","bz0q","frx""8","En" -"J",".@W@","~XP","s","WeKNE^rr","" -"XREU+4`joB","g[P~9[K0","E2`RqB=K","""][_W""~jq$","Rh;D","wO!!e(" -"F]v/",";+4(ovGD","eTB*rFq{","$&J`z%>","OVf`g3<","XGgeuV^j4" -"Ch(W","U{W{","NJWI}kC","<","-pKXGl","6LCYo" -"sz].tI","=;-yVdk5","","UNdl""[u","R*|hnn(|","_""&N>3G","Ajhy_^" -"\Spt","Y@a`U^","\5Me","oVqIa?dMB","H5]}","" -"Vci","%'\","$Ok[9VBm","tM]6OR)FH4",">g|J[bA_&","c" -"","s","_'{j)","%i1p~@f3n_" -"Rtl&xxi'&","2","dv8h`"," goL ","g>s3v","B]S4&\})" -"d;}","Ve3{v","#gp&D.2xn ","CQ","^d:+_btUp^","&)3D1T|rLr" -"-}~!%","|>oZ=O<0h","*%<>j52","","","H4(qHjctO" -")I","D[`XbyE[1h","$ZzJP","Uo","F,wfG0?e8","`.i|SdFdO" -"E/","./""UG+OR","pELt(S<,","ES5y[","h0966","\" -"I?","BQP;7~L","&",">`!#:Nz","","B }zNS" -"2-W/","5(y0[[kyO","","vKan^ge-d","97iHn@IS3{","BL=" -"*q,6","y(G,","yp^NFwy=Bfx]@" -"","frl:","|3","|d","^Lm}K","lUEw8>f$?F" -"","Kc","sI","4I8","tb6",":D" -"0\=7rQa","s","o64b>5o_T1","@xqS>","D|GyACR",")eXD**j$yB""%S","|~/",",@","","gLq@]R" -"4>W","$Wm","","b","rrl","/" -"!zp","T^C?","WH$@","S","3,pD7O3$","NWz$ka[3""5" -"`7,:U","""RS","0|&`2.#rX;","n+","Ku{8`j","uS&_" -"M,#-","","+V;ef{#}bN",":/=Z,a6uI","l_de#$","1YdPz,xkeW" -",M","$""\ 6A:T","","m,|","x","xVJ" -"3:haJG4[v","F","jH_gKcB","z[:V4[g#Y","W","n(" -"a#K","","","-mgzOKJwv2","4- #5<`yKr","Ol[UndAVZa" -"~","[/+AmvQdEA","f<#","R[/n","b&~,6]o+7:","|E,A[7ex" -"["," xV","jy&`U@a`h'","F=5T@fzb`4","v_W>c7wpl","T7%r'|S2]a" -"~{k","ZgX0mS","aV",">/Te]<'xsI"," -oeH","*C.WxeO9" -"l+n2CWN5S","F89[Yc"," ","","","^|d" -"PI WJ*","i","5c_Iq|","t","p2%xeR"";","_C5 ^." -")arZly","B[m","e,os","P`~NLO&","U{ 9H(>","po-^$" -"0VZ&=q@)","s@p:","\","","I}}(1!qb","b74r2Q1p" -"\\4@H>*S","RBDR","]/?","",".tUDA6-]!-","o(""AXMcBZ" -"lt","O""Ty&`A","-:","UjXg Q","q3VAM!G","`" -"D3_|\ShUhS","Ak5/1Fti2","t#5ns","i","ijg]2k"," @x>^zh+%" -"Bt3,Em'&8.","=p","I3\y-%d","m!l2>\","*%""""`_9h","&8" -"|dzx0","","kxY o","","w}a1vo","WP9ke1" -"i0{'h0MW:M","Y","H","6tE[;!,@","","`:,U" -"","O!A8","[Y,","lvl","=_&a7yd=","@" -"?[;V|(aeP","D(J","g\J#","x.~3v""CV","Du:$","NJ" -"s/&hsm","\S))$","","0hiCsodx2","%2c[K^^","H%d""~t[>~" -"DuW_&x-h","hjf","zXCvV","1m!C#","?I","K" -"J:}","u>","l|t%FS","u }J9k[eu5","7#zXM~B;In","{|" -"\>'D26OR","wv{w$2- ","vw-E","Y","""P","f[X" -"dykP","K5vi","C)}","KoV@}y(","jFk'","{#LhXAk/" -"(Pu%j","#","sQ\)^d8","w","aE&","+1K" -"Q@{[S","IBGW>hVcD+","(^-8l","A'u>|09E?",";#4=","e,4/" -"XJ^0%Ud2(p",":L>~","{-:b'B","5*'0IQ2(+","7l","0" -"EsRjSf,-4C",":*XhL@f_:","","7","AjK-d","O" -"vT]S","!*<5Qp","S/.sk`?*","+!" -"Y)?i8{a","uG@Q%$M","W`\=WVL'vH","qa""1\A.Orl","|@Cg?/Vk","W+ KG6[!^" -"d=[QB","Q",";9Hq?$9e(F","5#Z`A@zpCS","_3tO,&","]qd" -"j3U","Nu8","&}za97","H]AA","}x1q","'!" -"@d","","","Vf","O^GD_","q" -"p3","tELnilg#","tk","UeBQCQuMa","oV`a4(","V_RI(>P4Y" -"nEw_Tt","","6Kf","ZC>OE5","DV&rdHVK0,","?do" -"n>#i.Hv","8=","U4E)DJ:","&:*huDRSz]","4Z7[\H-94","xaPCz{H" -"g'w>","vF9Gg?m","oO","""(BV,z*","@a!cc/9\}","[9" -"k{=","DYrnMC","eu%I+_*","/DW_Y\y[yx","t","Cla;}TJK;",";IY4" -"~) &","","Cb+g>!0X","f8Fo2{","w_#","" -"","",">","wWV?>zBh^.","vp","f2",":Km}af$","?{_Y&" -"YBNV","JA!to4|k","^","3-Yk6#4","L)","oi=]" -"J7mlZo\_N","M","&[&^p5/0m",";6U-3S","rR\c]]v","F}C>:L" -".DDrM","6f7!","m{Mx{G","~K","BEhB9","ps" -"}4P,8","","fj4G","0$p{E","/YjE*","nQPn" -"^lY","H)T@","",")XH'","@q%j^(;nC","J_GEG>w'","-pDDH6SQq","g,","N0V4","","" -"I5)","hb","-wc_c~i#\C","wFGA","2rvz","((fntfviO-","(","]l" -"AQ;M%>4","G2-RVh","mwp4p","(3tGM1`\","iSHO?&3","Is" -"rQ","q&n7u4)<<","""%j)^|aJ","~h'(3N","","_=" -"dE7,}.","","qbVH","""RYl8V)]","kbX},","'buNq2" -"n0O+P8eg","aL(W@)w1""H","SF_UkkU'T","OK-QAJ'","Ngz/[","xH+" -"!E :/S@v","Joi~G'Bd;" -"","A8NEc9'","1\(","1GvT@{%","^!#3h""0ra",">Ot6}" -"%$@sxb!n0","mA;B$T'R","RXx" -"W;*?c!L","`2\_z/&","P","A.9t4","W]o.","_r&K" -" -TnzMUJ0.","wKi1","","khI(o","rJGy","oi6k`J" -"sW1d3","|zzD",",7","Qx\","2","" -"d",":QhAS^","ELT$WX","5X|;9t|S8","f_Gw.dGJ","P&@t0e" -"dPFzD-PlTTS2","CL?|U;HSgl" -"]EJ_R1H{eP","-C]|l>q","P","3mR|(","00N{-{4V","I," -"nN ","R&:","czgSf","8","~([","yD}z?T" -"/='",">{^}" -"{.b1 /{Ta","?z5V*l&EFa","L07|;`a,p[","qXG-j.+i","{IC!^EZ","" -"xdMO",">",",5=","L",")y3> l","[#E:xdS" -"4kWy(","q,}\","_1i2!=","v^1*;@u{""","V","vjG/rZ}M" -"1:ogQAJ","","%(","m","0WL&?V","$~" -"^$\","a","fls'o","_",""," %Gxy-TQ" -"r#&H","q","j{9I0i(\D","1gfjbCLR.5","/Wx","#""hc1XM" -"~:&Nv1)K1","a}Rq","3SJ$Q.C62t","Dd{RyK7Q","LVK?*8%(BX","opH","EiM/N@&K.N","G!`[j`","","_tB[Q\","^cCECFz" -"j[]hAoY:g","e06Ox","/][{AV9\k","WAz{",".","Xoa" -"906","cY\VzA","R_D@","Wy","!<8tMxLv$r","UL" -"","z_y","",":}","N|gi","Y\Yb$T" -"rSK).^[K","~(8Y^W%d","pk$O{t","m#|;","","/imFpGE","%Evj" -",PU","TI" -"\Y*CkdMO","u,ZT<$",">h""","V4T{ik((W","b|""TE[",":QN4b5" -"=TE|[IE","g","o@","'#Iwh@|","*iI$","6ZG6es" -"w","",":X'tPQ$U-k","Y&>vD","3","M^33" -"6?@32:u","kzfVjL(x3","E0","de.|Z@gXM","5H","Bs&" -"A$Mx>ml^n","@F7%;","7]cs0/\yk","1,","'|E4Aa:IE","so4kQ|pAT" -"\v>;T'I}+""","","m","n","7!X=o*,[s","b.^X" -"7?}8","","]PrI.","E","HfD`l","+GfQ" -"]0Nq","R[cI >S","JlCzjV",".","}>.Q[pu48%","X'PkPf" -"k>)s$M(b"," &UOTtZ)>","OWS","]","&e8","fMqlS" -".>*6|","1_" -"FNzKCZ","Q6|jGO`","h2\d'BvR","CeW","","2>YZhc#P" -"2","DQ""=7w","]L5&","","~","^Z4|}1Al2." -"T+}Anz","vYY|Y@fw","~5x8","P","2l-","3$.S$SE" -"","~y/","glOL(%XJ56kk8","""wQm6x.D;:o","c^O","HdHyB!@74A","=Xxb;K""","o]eg ,c};" -"z*","jd(Y2~" -"J","|=o.))kn","^+?l8-H","Yve*vf88.","ss.+C~&~U","#wrXq'~p" -"V4} hj6#@x","B*oW","@j","=/WqePy,-","6\T)","5*Ta'" -"gRvpk|7","VOuT","Z","","}/KUa@5","M74<.kAe" -"e:B`o %M~","aNIe{)`|\","deZd","U(An","X8Rcy","V0w%xY}V8" -"^yZ49{:","4K","PeXY/<)$","j[F+pB9","^","&'%xo" -"c/8b","n&@_xw>","I/TN","],r:","@t:ze?~","A!qYD-;" -"QU","!}eU7h","5Y","=7","","" -"O$oG","bBZ","","uN *Hk","3","X)" -"","YC/\APy`","1Cu6?!bNj,","O=2 R !,_#","yvQNQ","hpv2G" -"Iw<","tt?V6b","5?d>","&)b0q%h~7",",r}kR}y","" -"]@\m","p","==IYuOq","<2fMt'hNoc","mu!Idz@","c)0^KEAcd#" -"","q}@35VuN","Ud""]1y=m0e","r7-iV",")gWB=}","" -"e=GzB","R3Hr*o","'.)0/","","nVZ","tU'6{{/" -"1+*kkNF2","TfA","60Q'T~X+[","W)?Tl"," Vr""'/s;^9","9#" -")9qv9H","","hZ XU':S#","x","Zy","nvB+" -"\","xFZ+3X","L-?","aFXd_R[v","fuL@NE;","$p" -"w/`|^e","w)","","N W","fE2q:~k","" -"HD7qI]R:","&coY""","(71","",";F","U" -"``w","E","Zyc],","[gG@,9niw","d8eB>5,t]","3k*gC\Q&09" -"<.2","","""^aQI[",".","Z","+L%=""" -">p","hvAdZ$@2z","9EzRQ",".m _*S=l{","x","" -"cOJ;l*v","f","G_Y.oUz","j","","V" -"~SLIP/6=D)","%d&6/P","d""P","@d","","sOK26@w<" -"*_9Wrj/FGJ",">MBsQ~",">-?Sqt'yQ5","-Z","r8W@\B~C","","Y6tN'VMjw","l&nB" -"scult","","%^T@)","3-<","u:x","cltd" -"","KTFNw","+A","2w","Z&*' e(2e","?" -"+ <%K\","9d0g^,'+","S'-xdB","R0sGmEy11",">","?Y98agC" -"j#|{} ",")","&","HAh""!zA","-cWn#a","Dq" -"","rt>b","R",">~6di",")o{dJ3","zNS" -"mn.%U""xwI","=0&1nde[e","l-g$)oy","8Bu`Bm","KrA!Qtx","eB$3" -")o5","@UC9yU","EqtWT","2Ta!{","v@Pdj+[S&R","5}c)\dzy" -"Etza9|","7ASvQy*;","5Tkm","'}mnxT" -"kY[uj!","",";n>Wxi'}","|9SA","5Q","6emu/~" -">h%i""X","t1b","bz yE","}vkn","@p","""Jht" -"","fGt:A","B","*","\]E\yEe3","k" -"'|?oF:4<-X","gLKCefb""+[","","\lk l","","p" -"g!3u""7","t)RVmT","Iu","?sQ]","`,sYZvf=","g&cCz" -">""{P}W%0","*%h""","'#KZdi7}","-","%","" -"7$fn}5","vHyS,L*-X",";","v[","0cWihVf}/L","g5E;A*j3" -"3uk","8""tb*:","_9KK!","Df^{+hB(","5Z,","G7o5=(H" -":","-e","IJ""UVGy8>",",'a","gBsja]ur:","ciZ" -"@%/d2","GHJQ8","!QQjaYXM:","3[GqC","""QUP/_+j[","d" -"N<""mV+wF","","aviq","cp.7",",","N,|" -"","ZzN*X","4OYi&ci%6A","lX1XP","X/JVo[,","v|H`" -"e2(HK","","6M","D","VN:f;|$u|P","kD+)8rF-Yp" -"$X_]0;,","Q|v","=nYd","BSiPgqC","","8x" -"FuJ[_","Cz","#IdY","u`C.or=9*","=@-2'","e" -"?","GdS?h|\Cjt","$/uH","g0","","F" -"G","@_N[`?29","`l?@@yV\","bn_N","L4","i" -"rcqK(","!Cak\x~Y","}","Yv!CK@","=@c(b=","J;" -"b","*gXQ~","","M=","L{^","YKK,7$L" -"g","X{6@&mP","I?#O,m,","mn!O","i2X_,a,j","_02tx?.v" -" a($K0=wsH","|a.lr ","I,`S[","8""C","&","$YZ~,it)31" -"72""RWvO\\","","&]AQ+s_lMX","6u","j6}$+$U)","" -"s7E>gPd@",";","Nvm%IV9ZT1","3h2eD2yv","Fn5","|UmuEQWXs" -"T/]$,>Te","kOzl3/U8]M","Qwfc\3=!,<","X&.","G","Jv+mpb" -"7","j:C1!).","(]~Mlt,g","#2JA:~w","{","5Toqu||t" -"*.@wA&z}18","`Sp2w=A","f{%9|%*!?","qq$Eh:","BkSFS5L","6" -"i.<7#vE&",">Z}n#w~","yO","QR6)0=S","T","T\D6","" -"+","RX6V,*%f1}","v~lcqf5,}j","k+B7+CRF","","_ci" -"D","I3mFk#","'","V;6f","/D",":s(:" -"cKi/Bi-P","U","1p","4sc/*Lu>s<","@!zM2","ZQM-3" -"KFq+*40b&^","hc&D%j","y^?('~/815","","v%BmJ_","s","P2Jg12LT-{" -"*,","1:=C+b>",">~","G>>f'*N|g"," 0P&4","ghtQ1" -"Y","Qu*vMl!r","@)G_$9eY",">C.a. })K'","93jw%MX","1j&kjXN((" -"d:","q","$nuLrp","Ex(%|-'(E","9bPt","lsg" -"R[Lq$QbQ","","p~","=&B","bf[r","fcPUZ" -"&/!AP'of2[","","gK%S`qxEi","a""HQ#tREJm","V9?",")" -"}jpsIFQFV","6,hLe","9QZK","$(Q}","swAH[!","nEgdsX9Uo" -"DI","33","fKG}8","","^c1","9-" -"N?m8!GSJ9","Y?@@17=F","4","Xwdk-ch","!;{","3BI" -"9lfj","tj#%@Y]t","<","#L","mPk ","2EvG" -"Zsg6}5","3\","W$[$D~|h2","03C*3Y]um","/"," eg.*" -"8wN_e\~Ee",";{ad","Fe'~6ZKS_,","y)C`lnmZ\",",fF?","oW\X-" -"j","o@Y","@","LP>%>=PS","!'b-{_Im7B","{o#3d5x0" -"6H!a0,{ I5","J[|Wj""","*7%\As","l:{}$@","L^!jub>U","1]nw]" -"70(Tco","\pHZ^q6w","","FXwjG","BB{`I","|" -"56%Ia0sCe","6mXvd;","I(hP`p]","/2$","|v@`X","AwZ" -"2jyg&","l;pE5r","\#;v","","","]_4," -"c%v3a&","Svyd","I&\?","o,/Dj1v3","BOjBe]"," Yfi6" -"hb*","*jC3bV","9>>JhZ""zz","# M \","w""^\r","9~.pW 7|e" -"d","I5e]H+",",Mt/6eW","r0o1v","( "," m_\""A" -",,^;%{d",">>","oN","flXdqu'2","n>UK","^1MlQ{vm" -"#a=;De","FOpy)G8R+","|*|W6H-","@?mTf{8?","e2g[E`","4qje|","z","2OwQ)","dp" -"61&<%Ig)",")","1","tu#","","AH&TN" -"y&","c)LM??\","e.]N","yv`opl",":",".wT" -"Fc^2x7","8pA","rudMziKX","rlMu@X{{","~6.vH&~-",";*2~U\P" -"[hQED6","eC?kD?;,~p","Z'c","d[",";.","0(L/" -"'l.u{","Q~S","kuXmX","yi10T]E","M p","jMTMC\uV" -"/","NiN","I.)7*","Er ","","" -"","VhWg\","tl","t6{H+v)cQ4","a","6" -"""W `e<3-=","yOgYfMU","J;8","rL16\vp3a","&gwR(","/V&" -"e\","B=o]=","!CxGh8@","V","uY","^l",";FPO;C!","Y" -"","_Z@S+(f=","O_j|tRLA&}",">&zf","J!St~q","+hdhl^" -"(\CK9","M{<:vy)Ku","n$W5""O]",")a60OGrN","{}FJzjxl","LF|\" -":c","G'","S","D-Rb[_zG","MH~SL|)t","""#[O" -"Yv(","1oFv%eYQ","`#p?q""QuU","cwAXB","aZHY","wyg" -"b}j\+","}oiBQ?]","\","","","HEexFaI7" -"zyP0+pa","Fc"".ZR.ZJ$","3Ahbe`q","Bsg>}W'","8EmimWCt6b","Ei]j+" -"g~){ z","","#'S'","{+S","\FRO:M","E" -"5(""","","SJibvzbm!^","`FO","HS3","B" -"sPI 4*","Y9BInacCg","1!","{z","!'P","(P$oiJ" -"+,","r","*","&P q6","q@4B7!Qvk4","t>`]TaEeF" -"GL?E ]a","INJ>#$","Q_d>WN`a,A","VKIHGE\""^e","N-Vo53h?","AJH<" -"|\ RkL","3H","",".KwI","WD","8LR)4V#ed[" -"/a","R3","8rwy","G(x|;~","b^","[" -":k}>`!R0h",">oj3UxK@7A","9'usR.Tgt","jUMUJW.l","UMEa@","i~:" -"N?!^","3dYd4","_?px""{)",")ovLc`{","gQP$g,h?Kz","7Ekg#|%f" -"8","=#J^-","q)SN","D_*S""U","\=nID:","z" -"3}N(`","*=k","9;\oILK]6r","/+7^-",";B=$","@!lXYjlZF" -"r=Ml5","?.8zt","","eOG.=\","","V113" -"g)IfEngk/lf2","{" -"-[f^","8a","f[Hs:'f$[o","@Z_vg|/","o?j","f~f" -"zv","","q^^1X",">3Wa;" -"m$ \x","a2","9t","G","Z?","f60{W.3" -"+""k/=","2","s]Vp[,PAK1","_>xP","td51 'w","@Rs""fMt\" -"","","x@zdtwY#T]","Ngz{>Gu\","sIX?","Qrc?[}F" -"]z4a+","QTH","J0t\I]m","9","Q!R","_2>cVmG1" -"Pe4}A","t::r+U80k","%n|Gp_^qb","pE$Ks6l!~&","tE","Lt7-Wi" -"DV%W{4_f","%`gF!&x]p_","N}\ 0B }>","dMm)ZkwFq","S)","@a4kn-+" -"'#a","W:}G","zsa:>6u^x~","","]D","Ll`v" -">~jFgP|=c","bVK","eu-F23@",")]!^4","&?TJJl","4a*qB`S" -"c_","v3qX","IEx;E","I,po.>","hG{7}'","Pp&l!`"," nJdM","_:-","%1e'1xr""","W~^","eZ]NcSX\","b25?" -"}^C=ANXiDP","[Kh,&#W8","S'EB7zQH2 ","(_R6","{zI4BO","" -"","X","viLPqKpUq@","","%EMD=kZsl6","y%L8Fks4pT" -"+s","/.","","VAF~l","mgie9Mf;;,",")hH" -"D[]y","{|","Pkw[4I8{8","K53;yZ","/","inMJ,n&#R`" -"yQ9""","`m,8QU""N%v","&c}$x}c","o$;z\S","{>fka","@v06}6~" -"","]kBBjz&X$",",F j{Mnw","9i1*8","ebiSz{/z","|?0o""1W" -"uyP8","<'.i[m","QT:k0","","q$hlrSC","" -"+H@1dlA",">qkRH9rZw","@","h1f","hx+T","QVw=Q?bLDW" -";'Gf<","p?","sbd.""","q>]!T4i:","FGcX!-b","JdVe~6^" -"b+^d0","t6ND","5/T'L7","#&","/CIT","d4M" -"O","D8;iE]N","t51ZNd;l","f+~k;d>@Lo","|qf@sFq-f/","0,!63oA" -"eFwd;a","DBRf","BQcFIUm","MoJU'","O*Mn","rcd gq" -"QV/v=+_4N","o7rj?<","LFK/ !j1","*2<0h","4\P0q" -":rG_2""BjJp","4Skm;Lu","6jzpq","","H","[wK(v?Ncd{" -"!","","ElMY}i","aznu&1","0t#P|I","p4Fj" -"R&-","bU>xS(1`K7","Cm\[dJBHc","^hBulws #p","lI","+p&o74x3" -"/","oX9[Ap$","@","B>tob","b]7mzF+|","6." -"","Y6-<`e","EVd%.W,v'a","F ","CnNAUInAG","o(znE" -"","hiS=(#V","c""[(mdOR}","qY",":Y","n%$OS(huUG" -">2V" -"@iv","V2rq[","P^P","Q=TSzT|.","+ztzwmvN","B4JL4" -"Zh,","Ga(j=#RT","BzC)%f\>","AtSH@","s""&\78bHdJ","z=[" -"{H""ij1","lR\H17|p(D","IwEKh|QvD","vUsY","","Y" -":V_J>1^","!{AW","UEFA_","J1","0","D0" -":no","4WMuG","D4xbJR9","+~.sQ","nR@?","6&Al3b" -"S+u","","LY!66lV.","]&d","`hJZ`2" -"lG","J>>[rKNpR2S""","-'R(","1tQ <&<","z+ZzxTY" -"toN<\'0x\n","k7V","Tr""#l,sy","]f,ENi;","vWKY","" -"g((n","","2,(","","Q\8;+7#Mq","1{b)v" -"I4+","","[( se",".D3%QouV;%","4>W!A",">Uw`E,xJv" -"DwR4m?",")L,u5""","6G$3%$HiG","'|yFywU","DjT","[m1_YNjJ" -"1&U@ow!A","x9TI)M6\J","!x&","Jv)?#z/0","mHkE43(#M]","j>'Y" -"l=","BG!","\L'h+PQO","&[6N7>","","M" -"_;KP -Q","D~)z4A4o_w","kl&","/","B^sY",":" -"[',|w)","Jd","/{r0","""|cJH76/[",">Qja^O;","jfX" -"@;k2`;H","3N_(D}E[","G,3]","=","<","eev~>" -"e","~","q]$Ho~","GfXA$V.ukt","'TA{","/KZt)ess" -"0,mZ.}<","","!t>u={Wi""C","#""[!{",".Z{HZ",">rTnP[{" -"D];g8""z&H~","/.#_","1@L1","","R6L8W'","pcFXOGm'/" -".$%vc{","~yxd~G4*1","y","D","kBgBv""?A]'","" -"bF3""!4%O","p:,ZPA*",">'pL<~","m.LuDB","Oy{,`6M~Ng","W=L=H|ZNH<" -"qWQ3~@4=U","","URuEI)v~Ly","&RV","G.ZZ_XA>o5","-bp" -"$]LZP","C","[!/n","","`?[MQ","l{%B?]" -"","ef8M","QYq","@]mUz~","S![","o>x" -"bBr0fIQ","$`!c","^d1Y-I<","h>ywp""","&%","%" -"W4+f.","mNTCn","S*2qWW","7S","?8kjD84@CO",")T:0" -"HCS&TN4=}","-.cTz8c0!",";c4WW'","","i#{X^-?$m","m?D}JJR" -"^3CAzaBv","W","g|IV=`",",_I","%+%q;b","u ?" -" !YW`Smd","","O?","","{WeO:Dl","G.@0om2D" -"ON_" -"xb!,k<","]@>DX~CAv","u'H>z}XrJ","JEyy6JpO)","*RF[%6q9B_","eAOZ*>+Z" -"Cx_-o","q>J2`u","!Gc>AC","GR","b<+J';BWy*","P" -">Uy:'(0)it","o#]oCMH","$dqJKQ)JjW","B@}iKE","B","kL4]*s5" -"w_k""QA<","N,g$eqH","bJ","Ua\2g","p*","wt-s+p" -"t","O@#1WP!","d-Pq","8%=Vf","ik","F_}E1&a]","nBfw=U" -"^_$j!w","","cYkkG","s|wS3Q","x&Dks&","2A" -"?GmVudUd9","N}.+2","%nRDx-+","|Ag7","aQ<*W1d","!`}k}Vk" -"\0_$9{N","WBV^Mr","x-","","+",")nXV$YDH" -" >/H=BN","TH6{q<*","I5$p,H","Hs0kRJ4","Yf<%+","$`w0J" -",C3q{2h""X","?PH76*>\p0","v=N"," Dc;=f\52'4m","cbN--%" -"u5l\","k[ 6=","xh""qA]J","VX7","E2*0tg","~" -";Vvb($%L)","lI 2D","m]kY~+XT/9","m)5","","AKLMgK.m," -"vBMCW","V[","n*P,af","(>","~XBuxh}","j" -"XT","F}UEA","j#~BK","g7C","@l","d/OcT-+M;" -"P|pB_n~}0","L","O","zY]",";""-B","e>.x" -"$hg@FzVuec","H;,Kv","Hw.XKk2OrZ",":+3z8$!","V*4:FkV*","p}hiB9.&[R" -"","Q!#!6P/","Sb`<","|x}]o","TxB%},jrj","fwGncH" -"By3(O:,lZ","@-","$8=""I5FF","s(","|_QfdY?`}","\saa/eFMT" -"UR2`U","I",";VL<+H","5VK",".V-q6"":","CIh""E!," -"fYfm)!","","dY-|jg`Fl""","","Doq","+" -"3_A","lNi\CV","*#0+*TBm2=Tl} +","9=SI^m" -"EiRk6oQBQo","qj?tVv$a","iX","uftdmnN","v.6","PPn*4.EK{" -")f5S","{","B-oa-:?","w3=!AN;?-@","","N<" -"","""l","VlKy","IZ+ ,5N","9'o.a%H","*.'u1""jC" -"0MT3Rz_","()kd","","GF","Cj""ntU8","$UL~xYW1" -"WkwEEC","","""ASSq","","D^[Do","AoSoUnQt","^rn{c]l*","y|2uS","78" -"P0h}^8tl","@0aZgTN","@fl<","Wm*","9pYy(;","@Lc5s$`1gD" -"iQa45[.c{X","0l3nBo_|Vr","TaYJ","z+V","K","l]C[oEaGbF" -"","mvQrj'dC1o","j",":r\6{o~PQ|","","?W=" -"86fo[","{)[z",".O@","","`fw?D8hUAep","47TW#).","+q|-,|","h3uP" -"^E39i~","M$\I5],!N",".eD:4","@5K","~","KTe3l" -"OHk","/n'*rblt)m","[0.'bT","=zjy%t_Nap","kd","J:%)aC" -"rqU}85x>","It^Y=]","Ul-x4b;!kK",":WufT)[97","&Z F&v[TZf","!FT`8Pv,T" -"","wZ]","z2{k)",";**k3F,7(",":_T0~S""",";V&&;34%R" -"C{d5lt~","u>Z","","\","mB0N.","tIW`k=u U" -";biUHorBT","45k1i<-eD","{VrMw","!qM","Vhr!","Y78_Y" -"7Y9{GsBEw>","q=V","9M[EiZfNy","C","s}Wwyq:{h","lg" -"1Fi]","tx;Xhip","{sR","1Jq","","8CBr?<-" -"v.X","b","","","^Lry9",";K@X" -"0\E`e6ID~\","[","7","cv%M","nAQf{W?q","mm>v),TM8" -"","{1_5hB(DQG","?7$ Xm","z6VTG}]*Gr","vzy","G(6bCkD!g2" -". 6tY","","P2","+4&)2sJRD","G##","&{" -"]*TBo","c","L","g1+J:V","","@WZXyy*3e" -"__c*","T{U%VJ8K","p2!i;r","","","Te7u`K" -"8g","rhp","<03V\k1@",".^UAWt7","vva\CqT'C{",">rdq" -"HvGi","k!P-`%m3","Eg'x","2","xp-W9O]h8","$zKf0Ak(" -"RR-rW","sN2","y|$4)b","-b x7+HDJ_","9QTQ&0u","VM" -"jR@8o+.!eH","$gZfMB>$8A","","*C@:\cM","l/{@}^F?v j.r:","h","""","Zso+" -"jczC*@6S","uXYJLEF","*bS*a+wf",")_-B","*}EY-8","-~g/8" -"$",",k","","[0","$t","[g}\kb&" -"","","Kk%qFAaA{q","B}fQ6p$`","p37","n;!jik" -"w 788?Xp","4KHhNNG{","k/4ndZ='!c","BHG5n\\c","'&vs@V3-" -"","}Qwvm^td@",";o;?Jc"," fFSsL","O$${:;q","`8M[O" -"yHsHt_Z","N%aO$","(SsgbVS","5pP>L","Z<_)%j>*}","xSP" -"hQJ(nz-","pvEO" -"h""H4i","Vx#.4eFSP","P%b","g29/ohJ""~","1""W>c>7,Ff" -";JP;lF=","","sk","2pgI","","" -"PNJCZk`B$b","o_rES_{G'","","c; 5f8X@]\","5501hCLwp{","k-|~QTz" -"5|-'3H","(MBjQ","^L!]ELN!","FtK#er:,w","n~d6_w10","~Pv" -"{^h|}DK90\","\S0dCXF@","~Q6yqV4","0~^eD","p.(?f","" -"O`{32q/6>","gr@D","","[^: ~0+d","b6E","5n3dZ" -")","_F",";PXBX~JYz","","VSgfwg);F","]5(>W@ON" -"i'","_zl|Ly","c#0um=K","AYJz","BG",")rd(,k)MYv" -"7","-[eJkQ","g5DV2","6Q7>","5MWw9Am.","3" -"y 3@hOj{","O~V-",":","%ll#","wn]I;1","bE'1gAdTqv" -"M","J0zmzLj&","X-}8(d%q","&/kHn)lC!","","(" -" ^4JD`-","egb"",]Y","@u,G`b","1)|T1rnI""","M7w}J`-)","WJM6" -",UNTcL1J","M>","1","PxdP?/Lm","6(I+D)7Jur","s>?Y;s" -"\W1%TE","ky[f5PQ","j","!UpdZ","}H^m","I" -"%""","s_y;Z","""6vk8","=v07[5","3=gkHmvH",";2FXcoB=" -"Rkg`vQ","g9wm@_" -"3\|1Tn\","/0X","\a4+\vz","","y}","" -"\a5G67'""",")yr",".J*:vr1*ME","b","AwS&Jo","if~2d" -"`3O","L*f""`","9&8z","6A\","FFJ$[$!reS","I2aP f" -"x^Z>*[_ .","2vg*ZX,","U5z]f","\,BLCRZP","FZ@""","u?s7w5W@B" -"amMNm9WUb","]GXr","Sp.","7;h_i! 4","QW.","N1" -"","aj,$Um\5","Xma","=j","|KQ?tg%8","]4:Fn:}fL" -"(6(i+-Q/,j","XW>","s0y/","O9W'C1zw","fc`,n","B","jk#jL9","lM%Na<","!","fbhYVV" -"Av","7,]T$","",".8o6g","-\8","|xsPPd%e" -"$#p8>D&c4G","xd)%mt71L","""Q","JGoXI9z","J" -"Q Q","OY/ ","~!;5Dm","r zv","]yxPpvQ=1","BYY=U" -"w~vY","(m|@Q8",";8im94=.","g","7k'","@" -"Q>2=V","#","~g","(g6at" -"",">dTi\_95r","*sIaw|g*^","SK","*","rv" -"8S4-5D).3R","cnm","]","!O","nH=""+_'+","" -" &G","""P~[Z"," !Z","CyW0 dkajc","D2I#HdCMkN","~G;4" -" 8.s~6V(0y(" -"Pb","Nh5fY*vmU","F2'","<1UjC.""Og","","=" -"5u$","_ywJ5B","G.8","gS mW:7J","","`ihU-\2}" -""," D`n","Bm","P#(@2","M6^f{=}@PE","[`j3F " -"z"," ","iBrsxGF`","fT_5''>zNJ","Pgv=?DYXDG","eiU}dhlk" -"","rxD","Dq!?)oZ1rj"," g_7Y2J","","Zvq7Ca+*" -"cHDEOx/Jw","4S9!vN","#i](lCG]","El7O""$","OLeNUQ;'O6","mvbL1" -"bR8Tc",">c:!m@AT","","~6#:G'G","T'","RaV:E{6r","Le?u{tcR","XjuH1@" -"<$L{r!",";","GST~*T'a'","","}3}`FQ","I","\" -"=Mb","^EKB["," a4","K2p)_@","_9^0","y6`nJb%lI-" -"GmKxKI>B","2y >!lm","tFF","","1","d/Kyg" -":Lh=","(/i6nm|","%L5>","XiFs""","iWj_0D]>A}"," " -"-XBS+","$ooq'A","wQ% .h5","]",")>8l#m/","9" -"j3","z","","cZBb9}","@N9","Z`@%!" -"{","o\_*]L=*%v","xkK'","A",")FfU_SJW{v","VgtO" -":Ppg","LDT","S`jrrI*","UsvG-","","N(jPK]" -"=qxY","iY","tD,4u","BLm4","nXky\B=>","Y" -"","S'v!jtVN~a","","]_\!)F","o4we",":Q" -"|z#","m E~R3^","_pQd(_QXxD","&Bg?y\q_n","1z$H","k" -"IVtq2euva","CzAvYu:/~","%H~X%" -"ZE6Gx","Zf:","@e$","p","]WO4J",".7k-U0Qsia" -"h$$4}d9)*I","(LYf7","lrw,o","B}","tg3Y~MR","F" -"\SMp./?","XN","qt","M","hy","OYl" -"x'OB","n>/WnKEjRa^","Ej=$RJy" -"FOqxm 3a;","0RAOKOC:","{","pL8g7*","[{","Xq" -"-hL","DZT","qn0{rQ:Z^","","$T_yha&Q","eTI@sO>&s" -"gku;x5wO>o","t","`","ilv-urL$f","" -"8RbT7x7!U","x4[7@C*s","yw^ yT","&BA 3@O","u_gEPsg{","p" -"~~75UkG!>","gf>H","^,id","nwua[ JEL}","/\3jp+2])" -"(iD?","MYP_@bd6""","%!(I+1H","","\&cI","SnzW" -"C+C,FzV","4K`-&p`;~","pIXwz3@>8$","1.","aX+Y","HbA.OA,[Ec" -"kfp#yjnNs~",";eT|","vsjh3%p~",">RI|'&0J=","u","_" -"1\ImZd@$v.","UB","[)#0euLp`","<+/ep","&","/Y!6" -".=>;D>NT",":I_LgJ0xL","|z\_b/8s","HPe,","UIohz$hnd","* z" -"0Ukdlv/Pw","3{","","","","uXk^WOG" -"rw`Z;Bb`ev","B|c3V","M4M","pAe_C:","U9au#*Bp>","[4Fm_]t," -";","h@ZV?","","#./5""K~]","",";8Jtxz" -"BBC4@jng`","u8lD G>]48","OZf>6oj","" -"-Z(}8{",";_)n9h#/lo","","gIvZg","X_On#p4","^","Fhg",".","aJz7p" -"Ke","M#jJVuB1Fb","eB>S","F1]","[/","=tCCB$k'W:" -",,4_","fC=00a","ReK+mxC<",";6Eh",")B","RL" -"Ql4:EHi+4","wG]b!`$","~.Bq","t0:$f\E1","","d:M""" -"J","","L)X{#2","%","Dr0Q=","Fw0@o%1z}" -"DcEB*4\H","'H","4;tb[a","G","(","""4 c:<5p" -"Jp@~_eb","Deg","uXv","","k","6JL-","DU)N?4IGQ" -"AS`q","V+DgaCsEuc","#mMs","","iJkBL",".Q|t O" -">SE","w","[m?","Lkx+uqS""+Z","jEl","*UXJkG]c" -"Xx3","h!9UUKGH,F","","_Isxv)^DD","Z","" -"&UY","[*S","g:`7Dnuwj@","26BfG8{","o%>2eT%h|?","/ue_a9" -"fg\@g,ey","j]%w","dLZ9IVtKbz","Wa/","&o7?!QK%","uDf" -"^wl0(3"," &f>`lwIL ","0>lt9Hg""q","al","","47!k" -"v0","Ksf(m$","\",")","","QU7mR?" -"$5PbDf,i","","?gQb)","V'4)","%0|)fJ^Yx","@+l?0`B}k" -"L=L7","WR#@,\e_","","b","%_.{_$","d" -"6-?Pl.","^P.om""XB^","CVk","AuOs(U h$","^S]9n.3+","[""+" -"I%D/\S*","x#f1%","Qo","FCQjLg=F9","r_iYR?]]N","" -"23Lw3m","qvOa8Ykh","7d{)","","WaHk$","{8L3r]$hy6" -"0h","$1^*q",",!N","Vo~@qe","$-%V)O%","pKuKG%5z.B","%hK:.|" -"[JFR}[mtR'","5$=>oG<","5#Pnk*","x8F\","X%/P\<7dyK","vT?50" -"ulb[Di#mi","a?rd9 i","","j90QD","0j","7c6EH" -"?WE)t4/","Qp,rvIi","H@ybC@V]#","!=",";Jzy)tX","Va" -"t2vrM]",">7f","[B ","gdhbhk","fs=g>`XJ~B","F!`GS","`x[t.t$XY","W;@R~oA7","7eP","StcV/w2C" -"{ksWf8X","L1?","w|Nq","`cGF3Nb\p9","QJ|","K#c$" -"tk]F","dZv'Te9","dkDelv","H3ewbm=}?","","):)" -"AU'i-^v7Qo","2F]2<0{""fa","dO88E7JC","?ep8h""X,","\P76P*2IZS","6." -"k","EzR;3:YRj","gCg","T1k-Nz1","fA-zc","t" -".WJ1+Ro=De","g8e(+","_eJoCv%0la","))""`<)'m+","n_1(","|" -"pgmjK(&;}4","","8?>Kd","sY","","EX(~VIHb&" -"E/4Y6","#%iu]","q!""P'H","o;9","%Kr>6&asm~","q" -"%@S#B{2E<","","?8$0o,8!s"," %o}j J}K","yE+j-","" -"f%(","<`4","g","}c","u>ik)-Q","\?mu" -"\","H","$","WuZg`:d`*A","Y|Q","Q|(P" -"l","N/","YK[&>^`ZC?","rK%MO""0'M","|ZcN|1WS","#\67" -"ds#1M@|","IJzR6F","-t)a","","Etq^","g!" -"J1wK)9G ","H&,?","&S(dJ'{","}z#DC","*T","" -"z Mx&p.|K|","@)#E}}","aC7T","X <,Pm,","8^uTz|o","R" -"(/dW9","","6","N5D`9y","","" -"","]Lc;$$1X]T","C}?mt![t1","NWp\j.","}m\","j-=IYK9/" -"xc#OKD2O2","lyXWx@x",".T\+"," :","0u","'$4" -"jAlzegNuX","+`lqS$!NOv-","^gi1A3","c^GD^:I%G" -"+f87zuY~","\v""","&","S$","JLN#","oP[NpwiQQ" -",=:lri","q0","&mVB&1","f`^c+","IN*+ ]mgJ","]Q3mBc/Ih" -"lUFwZQFYL","|j=T67","R%/Sy","gM@x","^1b, VTi$","" -"y~,","","yfAn]OTpH","7Yz1c?5CS","","=33te]w" -"M(",")~qN","/y-n2yM","","hIcIY~UX.r","LcX3RQz" -"0","xVJkO/'_(?",".[ZT+tUYx","q|""B\O","'V~9Wx1\",".e&&" -"","g8[q}B","","lKhQ$f!p","t)_sK(W","y" -"i:","aFhK95","n]u043a=H","[R0U/h;","f""","`Sc" -"","HA","P>)R","Gr","s","bU4xh""ee5" -"fn8","&suh","|$#o?s0X)","?","!E[V","Jq7""" -"T","gzvDhD","fcjimbwEc","<%0@S-fm#9","8I*}WSQa$","ExQN:7@" -"J","TYJ","","","-%f6 (z!7S","O{EaN" -"so","tH","QvQ4\%f135" -">So;u+9","=#)>(P","h\{TciLlA",">-","4r`Z`_F","-U@E>W~" -"I|","^*MI","x!""v`","=C|""A","TPBJK","^$p_" -".K9j l","i>","KLOR!{iwU","","p","oJ6M38?Xz<" -"1o","AC~E~){=$6","C+%%%RWE.","L A4EQuA","","fb#""'" -"\Uz!","V!.>(&8u>","(1t(*","Egt#B","pd/","dX" -"D&IP7.i"," jGOZ :my","\","","!G2.8`","tSf@" -".","@WP\" -""," ","^ds","C","NM""&","" -"f\>H*l^","3Z_i","*HZDhE","=O2GCEzPS%","5j#4S" -"}'84w","M","i7;/p","T\xbvh(Zvy","m:}j3m","0t:U" -"aFT6","e@N=>[","e","yw{d%zVO}","e@n","MosC" -"Z3>H{%k]","5$j",",Su#fb6_U","eIZX","KH\Q: G)","q4|1UA","J$/Rt$4Q1r","YR~6t;nh.","#)bCw","","l%Ou_Nay" -"Kd*\y,^EL]","0#m&ulCk##","C)`^\y1"," `n""Zr","","Gv&A:/#b*5" -">#KI","cF(0T9""<","$`E^p6$","<","#?","m&oxl*X" -"Q,","RvXUe_|*oP","[(MpJY>","lAa G,K","V)r+","T" -".mIQF.w4","qkP&tVq","L&","HT1JD, ","L2(Gh","rAM32T[s>x" -">","","vZ/[P\6","""n<_,B","","G" -"=","","vKiynaC}","","'go#eVf.u;","!(5O" -"","","b","H~+7Bt6v","\,BXVP+","iT^wB" -"j","!K79","f4DGj(e(",")2 V4WV","wxU#O,>0CeQ)","|Cr'of*","EYGd","z*UoM" -"]]\","E70<","*Vk-)]rsa^","","y?/qYr0","W_y$V" -"5V~X)","g9","Bo;#)","(#&^=ZA","_+d.=LT&,","/" -".y1Gtj","K5A%","\,V>wQj-_c","{x6d","_o","O&" -"D",",[<5","6?","d","+ocf:ay`","*1!3Jb","-","-AMVOE","aY;","`k'%k3S" -".Eeqz;&1","!","",""";ll*","b=YeL*","&" -"[sd?O","^/SIk+","","1L;'XJIDJ"," &v=:1@-Pr","/e61'+9&w" -"dc<(HA;}3>","{_M" -"^~r[FD+","1K","2OvR","@9","?({)i","2?ApV]:h]#" -"t","n]k+","vQv6","p","7+*P|\'","yzL" -"PqnhWiHv|","Dekm","I=","7",";fDW +","w*'T" -"r.A*Ox?Z","`c","3","5:wi\CCCx","J)","! k|~O\s&" -"R!Fy/%l","L_]g9","+","","","lfc5%6%" -"Lxl,n","^t","BBgoMVi!","\@*omRr_","G?","" -"V`?","7PW","i=",">b+D","LX" -"-ZB","{c}8j","oR-*\ylE+",")~rK4}b=","NAD=fT0","VK]" -"G","<","rHso{>","","SaiZc","@" -".T","9p5hU#YP?","w}}R?'e","#}","1.~Qz:","njV" -"\+@}qd'K","1/VGUy'97c","c5a`mH}n","$V_i&","/Ko","x/S}" -"""hfNX>3","n$","p2q%r","f","","" -"""}`&(","?-P}p:N""76","","BpdrX8","2slLCRs`*","VV4HK>|{B)" -"f7","azN\JZH)","t})1)Q8-aW","Ac&","_k@/4[W]q","s:4vUc" -"4_T","^Y0R%","GWETK",")3","*,9PHsEw","3vcB" -"9","MPFmx5A","-$@""`&bY +","?""","L%","((HX" -"9Moc",".dJ","W","yi~k",",9","{nQ" -"jQz:1<@mF)","4E\0i/v","","Kb<","W~ XK/","*\0" -">'XO+#h","-~","qPBJJCN",":W ","z)J","\032y`Bt" -"OB(8MquC","6W{@~^U","<;=Z3-.j","6","reV","" -"53i#0|&[","=ke6u","@i&xsw>","eF;d","eV8h2+|*","FSXt" -"1534*}","7OwHQ0" -"Z}J$y54\*","","7hg(gHYI","{","?D-)",":1n]E" -"c","pnP","'*nz","Xa}D)q9L","7DL","i" -"2$#p`5H!dx","","9F2|","3u","Ccik<\'","Zn&)|l1y)" -"B.~1q} H","MaT8qa'+","N%N)","$cW3""","*Jdd","1-@!nX<-" -"2DPCA':.Ih",")","'U*N>\g(","u_d6^eT","V","" -"xm12.kj","""H'lk","c/L",")|@0","LP.8P#|>","=R4P|" -"","+s","e,T7|HX|tZ",".I"")(:e","",")u-","p+kd:(ES" -"iPx","W",",","059F=a;","Z,h\c)xCS1","" -">TZd","i$b",")_Xm[","e1+'aE:3","d1m%}","?-swZR" -"A>b,RB\C" -"na","","","3k} &-","g{?Otjt","C]'" -"""er!ts","xx","^p","+*c-?H" -"HS]9'"," 8ayV}6""","@'^w#!/","A",">I"" ","%" -"`Rz(n ","./v|","YZP'R]'","hId^$i","Ir","qQ)(" -"']k+}(2VT","a-","f&)e.,","ukO'",",r`ilIjhv7","LR" -")}","d1ts%)ya_","H","Kc","#9Kn#+","h[*=""g;z~y" -"j","r","Ifa]i}Ih","e","","x][0-H]" -"@~H))=r","x]4&1pgD","}.","%{a89N{","~{#+<``","wq" -"1J","M_1}&w>s","{^e,usXNy@","N.ItrH","Sk2%r","_m22me27" -"G%xDjw4{","","%3jx","4~S|","b[gX=XRHOj","(m" -"sB","/E~Pl&A","!","K",";h!aqS+?[F","" -"d_W[=\T","Zo","H`S<","E",".6DT45n0?*","{:f \M" -"!e&`)n\?",":","ZGGCo?&|A","ubd:","","^te}P`1)fu" -"#1m","Y?*%.s$)!i","G","O""Y'b]p" -"aTe~o","f;a@_Ku4","Y[L#A","i6|e","lXM","W$J\:z6" -"36KG#","rX7\","","zM7","",")|]*nHuHDn" -"b)]","@<","I(tNADDwi`","2@sN","&4","Po0" -"nogD'S","","( r!j","33u*(<","?% XWDC[","u""X2h" -"""9AF","kk9m","","","Hosf9>RQ","" -"fo9s","","Ehm#m","A0,{w~n","=|","W[#Xv;^" -"DhDAd0W","","YU+A|/E","zfYD63","AVw(A}S;-U","`(8=" -"","b$r%>","`uG rv","j0.UQM+t","R5c:D.9>>!","#i!7~" -"JJ","X\9^%9J'","~NjY?p+B:9","j","b","-" -"~>K c""O%<","pUW","p/k~}I@Wq","8ztcxiO","s6&;^","#shZ" -"DB6","m","","p_`lCn{","wUNd%3.A","*.NtX-%" -"","s","?CE.","LS+","r'SQ\)","D\kG%P{wr" -"K5&v~""`pS>","8](}+b","""_","",";G","Kbxn.$d"," @0","ehml<","oT7" -"_","5gbAv')$-(","U:21uG-","YC^c","","b!O,^" -"ioUP-;gl","h2`*","nXZ","t|fWgds",".B*","vj." -"]abR:T",";[ae^B'UH","X|""b0q","&t","*","AuF0" -"Rjau8ul&","f","P8","-IU^Y)ZQ]D","5V$_UF^vo0","up" -"","?D[kd%C\K","f","xR","=","o@@6" -"c:Q-6R","m.K8w I","OgX","_Jf~-","F8KGHN","t)L" -"}C??2","r965oHDNz1"," $~","t","qhdH<<","z)gC\" -"FM&]""25","<9(N[#E<}","","'}w.!_U&","[H2Vl$gI""w","F" -"`J+^l\gy","?QiPoL6E","$jj.PL","'a(N}M4","`Q%O8","$UC@Qz" -"ww0]]","MuAX+N>",".i8m-","&=%^z/","6C/kTP.Y","" -"24""","","c%+Rs93Fu8","J:iNcX","BQ*RN" -">8|Jt$","L}","WF/xC/kLH-","55;Vr","yE=0'" -"","","MQs?h","","wO(D,;;","kCs" -"MH","d G%","U","Qg)YB+>>k8","F|2sxVmI9x","I83" -"qwG-ZboHlY","LWjmr+""","(N*","7k6 91","wNP}o@a","eX2f" -"XU[+JRFPX","","O","","8Bg","MUF\'L('" -"J*6L38s<[8","JfI`Mf~T","zH","+","~RGoZ","z_Q" -"~5 e","Uo","V5fAF0-","","@a/q","2" -"x,M*>CiM*+","J~r7*D g","W.Ux","","","_UFyZ"",[:" -"^W8F]#:c",">6","gZHx,+_a/]","Gv","sr","}" -"9'B*:Y","DWDfkr*v1y","E@","P@","","w5*$mR@" -"{""-\([G},","F;gM=0:","[)","+9t","Bs""8(2~","uQgt" -"d#","YZe!vB;?""=","q","L9h\bgDE#r","/J","fFc:AYA3_" -";U,:z)@","","l>^R_S0]",". Rp=","[.R","|[r+Uq{OC" -"N54x","w:7NbeRkO","M?}Ry591","#|@z","'IyWG","" -"h=02i<","7W#es~","","Uh","K\e",":D1" -"7dRh$","","m","VB.$e.D""""","v_",":;T9`7" -"]y){""[t","}.%)/m}","|TD=pZLz","H'|9l","[v_Ew$=","i(HlZOM" -"","=J","@am",".ZIZoUYI7","W@>6OL","~76uy6" -"","`0&3$n*T",".}","oXB*b9FH","R^6"," E[R's" -";^kkE5aup""","jLIj8","N`53;3","_d(/?;/n","h&y<","t" -"kNk;Ke5","tw\&zmY>,","{x)+K#x{jI","","3$b,d#^)","" -"Gp=1(TJ","f","(0u|#u7t't","","*:{<","" -"<","|^R|LYA","*pb" -"#Y","NlW1`","ezT^Jnm","oX@m!:","6","_? =lT" -"",">Rf*u?[","`kzNE.",",KD&,{[jH","V<~.","id84AE " -"lbn","[~11ZBK","8[:yUd","9cSn","","" -"^qgqcc","%:OK$c""","Zm6]SE uuR","","<,P_K?gb,r","AY(lB6" -"RSpH","\|U!:r","{lv)","qxVzjwG(r","X9Kr%g'","" -"d<:","fE4",".Tsv/J>lvN","","#2l~_S.","J9oH" -"OiI0$Ps4",",","Z^7oe","X}B{B~","<8ho.uw#","l !~" -"1V'","","9DDU","GgnZ]T","zECUL[Q","hobJh!h\r7" -"P)L","Y_@eaV|","P:y`#","z","#',vQj!s","kZ@""*eig" -"%%{^~RaO","","R&??QE","=","dT 19e","" -"(j","s6vZr","G","j?CuNK>L<","rHaC2&\#","pZPttv[" -"<%Pplf","s~KZm","-/C""","Fz1k1Y60","K0$","QmEkIPG" -"","IW?",";Ub1ZVWo0","F/1NP#fFC","9`zW>Lc.w","n8""Qq" -"4:?","","j","D+","kyPd#oHVdt","" -"","#","S}=PCb","","oj{C;d1h:","?QV}Fyu%9\" -"wD","",")tjb/+I+","^""O","","XFHQ" -"vK","\","G/",";`/.NU","{z@e""4A","VtA4spU" -"c7,DK05",""," :fpef","LD#/F#R(_D","aVn?_k ","t +eq4Tg8" -"v|8x","s0G|G","8C","<\Q","R0t","%R""C[" -"T_1<","""$E18g3","E?<","6e_x,","|e{9!fL%""","z" -"B","mM\",";oz-\E6d",")","w:8?]N","TNoQ?HOx`" -"prWQ2edO(","@P_=\","",".K@`!hgm$O","Pwn","#]#6" -"","a,@?#=s5\","5eO",")z","'B[9","}'N","ZipE" -"!'.f",">f>\_'Tg","W?EW","h","(p_u:}t","6vYcvmT4P@" -"0","","X","pkZh ","fuem|2w&","|LXXsM}-iG" -"","OR","N0,%vYTx2","7lr9E=c#^}","?i8Et#^<","h2" -"99","qo'*YR","{U3:f","F","x]EJX4","R""Yjuk8U" -",`*[o]UA","G5,tTLZM","","(tQ3>hRT:","d}0M","2WhW[\L" -"5","v4ew","%u{3","fF#ay","u$[","$Nv4S(Ip16" -"oR6WW'y?_","+czdXh)`Fn","CbWLwO","k;.zHc2U#","1)MP3P:yN5","t/+)" -"V53~m""Jc","h3Ld[k","o3OUr0u a1","Z/kzq","B""","&$Q{ .#6FD" -"O",".0y?YQv^n","Of>\Y7~B",")*h72"," ","E3" -"a,V}""x","h(XYXKwEP ","P","I/yDSK61C","Wf,Q84n","" -"ICCY,l4#]","1=^bd*","t44[pF","O0:\n","","7e@1<;^_d,:d'o","+o?""uUt:23" -"x3X<6","shK:t","H&9K","Inud[","9B","t" -"z5","qb%fZ6z[W,","|s","","X","RZH\$P3/G" -"%@0GqM","|?}:mh","MlVt","Zq%U","+i'6","+1mM?J" -"A$&",";B:h%","S6","7J$wz","Z","U}" -"k","M{%U-,,","Fh7_K8Wpk",")hQ9u23t","qX3#0eoq~","h?_EptSeiv" -";Kz3" -"h~xRIUu>Hl","g,","x7I,(-""rs","&.","C3|K}2t6","w[@sG$I)%n" -"",""";[N66I","tJ]T9","RbaC{","_55_z@sA#M","1-UnR3c" -":re""28A_-}","A","~-)S","0","JZQg$\E.","$SWi" -"=3NxWzs","{qJ0[,C" -"7Xm|#","","Md#%,EXZJ","&Y!(AH(","{Etq(|","o_" -")%/yN","K8","|ph9V","J4*","","" -"0!","n","Fh","<-4d}Ao8","t[dx,","_y" -"%d_S!WX-z","""I9&}0;B","-7bHs3i6QG","q/K}[iI4U","1Pqpu",">A;8UR" -"8","m.4J","","!","??FqZ.2H_" -"N]PSgH","|Qf \#M4#","m,c","',v`AY","c","'kqc14EUH|" -"|'","GJ5/)a!N","H","XDjj(x","/C[\jl]^","JKgp,UPF" -"kxxi_A",":f","|hb{u","","-rh3~w)@G","=G" -"a[8","T1","1bqV41","[>=bA","02(" -"qQ`?",":T4M'*","l[j[w]#Df","","kw~E?e]Af)","ew~o x" -"6Abb","Kt<^N`,"," P~","ZrQW*","aoX~NI""","}" -"*tws","~SUh.","OKpR&T<:","M+wo}|1/","","(VN}j" -"`_.Z","5}KX;""ch""","`mKKtX#;","K}K|xiHk?","trVy^tAM^W","","Gc-(" -"[b9^97%-|","lb9<:J*|","J","e","","\yxp3dTh~" -"gel4=","y$","+gqzP, i" -"~TrZ MZ[w","{bQaO@l$}","c ","e",";'IB08L<0","dm83LY3" -"tXv","8t90ODWV","(@4?U+}","h","rE","i>c CwpPM" -"BCe]Kplg","Ge~`3;","S0&kZkPw4U","Id@6lyw ND","`8,Q(9vEb","Z\}_3[|-_{" -"OPC-ov","R","2.c%1f9","%}c}srAJc3","(u""2gWUIc-","0MU/v" -"g,y""mG I","8*3Y*/_","{6F~","@","9R7P%","NUOc" -"U""l<+O%*","tX6(^9HC2","&Kb[","](41~9]cW","v'.sX8O","" -"kl","mn","N9","%*?H@0w","p-C+ci:h:V","" -"WUb","","K{8Xs,","}/7C=","ybRC`","+<#~>$52l","U!2","" -"=tRxwd","","H%*tXfM+[","w\=^7",":w","Min[*8" -"RwFFL0@","NGzjX","6=ml'#O.fU","*] A0hm","1(","*eQXu" -"zl5^$,","__(faA`tT+","`e<\u7","Odd*TmpU8","M","_*""[5aZ6E" -"y+FQiy""","|C/w~d+","","U","(Kb\u","db,@" -"s","9","","R'ksKw8V","wJ:2B7","X@Kzh{" -"2","t[0Jg+io","rlMzm","pslFfg0","9P\J'","~d^""2" -"#0","`","p_MvZzd-","Si","1UhGDN64@F","T%nizDfy" -"xg","PK3:N","rla2(r","Sp ","BY""","FY!~/" -":Hu","P","gYmIGX%","+ehAD","","MpW?q_j" -"&O/!,e","c[tn","aY/5&5Is{","H>h","yrI`#","H6K7" -"3K$W\:%!","&n]|:0^/","aj.","C?5!2(","QO","o6+\G" -";Moc",">=-iF=K","`eA[U[9L","","5S:9:r""","fT}J*06""h}" -"j","*","WP6y^/Jn>*","OS[l8","]<","{Z\Y8d" -"QS","n0tVf","HVa~e","Pun=8#j2<","E-T^=p7","" -"w","^","Z","u.","4J;4+vW!S","9" -"aG","s>sT!SU`","s7i43","@8QR50^CYTX@u","rg" -"$bGY[)5OQ","kHG\B*i",",U&f[GU\Eu","rn3j+8aCR","w\=t#4L;","" -"7^So","`KBSSu8","A krj:k0FB","{","B{g~4&Q","~8Wo4","}I","}","@SgM" -"!5 P@ p^-b","#tKl9","4&","KYYE","\K)PsgY!","q},pFW$E" -"@AB#Y","/GFo","O7t9j^&XDE","mP;C.=W","-p96WVdwRp","oIo'A~#" -"ZGJs","$H?p.R","Fl=*XWGpIP","g|+Q4%x","PSaj","QeMky:3R+" -"e|Qv9rs?D,","|+c","mL*5ZgW&P","K2Q?I^G}","!<","b" -"#;1@G:rM2","","|h+uwN","})bLT","P 8yqc@9","''" -"^A%KXE~nz}","MSop7F8","LKNkYF","]SpTHYF~I","","q/e7;Yw{O" -"&C>""",":!",",e","C;*g~","a","7dJKU)dE&" -"AJ^MCPZ#A","^z","'D","yeEc%yq[g",";1i","y=O-|0Wu" -">V4W","","o%48wC","0_, +~s","",";^GI&","\E~+;|<","??V4%gasz","9z]","u] g3O" -"bcG","JrQzi)}x1","AFf2h","RUxC2","pRa/i1w6]H","" -"$}%?y%",")HpC","N$BR)","h~2NG)8a","+s?-;","f`" -"","4@T=~cC","","fI","c","+]T)vbg" -"B13F@","9C","+52","V:AN cgc~","5'pt]9cXs?","M:R!4V'VT\" -"G..XUS","LWdJS,7,$O","-: #F3o*","tS{i","gqE@o`",":;&,|L! " -"}O aB""","pS`'","0oR5","+-5Mi\8|<""","oA_^y^I[","u|z""" -"gWv","x0>U","","+","x","7}mBmY5Cji" -"Y%*9 YsrJ","kk/$]M2k+n",".LA","0Bi03U""{","aI`6tc0z,=","w&","RPC}:2DM","VZM:V;2aWG" -"~|(Q.5","prY","=>S`]3:oC","Ea1","T@lp2R""Z","C]Se@" -"","j?0 .","qXk?Q^>*"," XNP8","","B!~$jG9Y*t" -"gnO+y3[","QwWawS2H83","7UZ*B;g(2","S_oylo","gjF","le",",5CG9/Pv","M;Clqe" -":#\","bX~q;'l/w","IA)t|"," Jk|ZR%64I","},REL7","a!`naR5N'","cuP`>'""","9mi_=!Zx&","v8BzApTzu""","ZcKt","2{'I""(" -"pE\$l",">{m","V3*","","8R3X.!-gK~","p?ojc" -"5,dlP$","ov","Ta","I-Pz","^Fn""dZ|Zr4","F4SkH87" -"[DF9T{","0w\i/u","Spi8z\B-U+","59{a",")*x_TByJ@","stHZ" -"","45##TM8qs_","J8T:86eR",">hO","'s|",":TJr","rE#x," -"9t*KB","$","","F]~~_","sK=Bjn>" -"|","}","+{~~4GOnrD","Fv4""}",";u?nOmB\6&","" -"","x","Irr_.Cl!","d3 5N^","Z(=","I" -"s3",",>","GTxocT'","","&&a8NV","3#9_{" -"oK","AatU","#",",#24","8","l-+k`M!" -"o,^k;PdU\","C%)","IE]}jm","\&fho""M:m","ackx","K.b'@" -"",".\y5)^E","hoXh","&hR)lR?d#i","{0bG=:OO/","Et" -"o*EP=""y:-","(/5VbK","P?4%+v","p#s","%z[- xOxLs",".;""XyQBC0" -"Vw>C9x>>","Ga","Eb","DhO]","apAP","/uWkaFu" -"D3a1U6oE>","!\sKdBoA2","VR=","h]b:O6","$","S]&K" -"oW""K5?C9","","_","i3oor8-","Xe5acgv","kB6AP4Sv" -"u/D66*Q","s",">x6","L6qtiZ|77","q","u>^y,|_Cs:" -"C3Y","Ff/wII<){","\!A$5~yp","j^d","/>&:dIuNlM",";]8^nMN" -"","P","U~i2\E*w(","hJb 9i","Ds""D","" -"j#{!wo#",".jQ+","yU_ny\3L'T","jBk\","<","BY}:@4" -"","Macm;=hVl<","13rB%Y1","$`","","WKHRPT;fA","EGE_#A","""" -"S2","dMuJ","t t*r[K9","rSDc?&K=u9","DP*","" -"81","","","V_","""p>>6ZXG","A,`^E]K-""&" -"M04JE@o","CTET","zCk)_q","FMpG/\X^","J.YO","N|`" -"XTSkM","HHDT`;","","%1{k]}?","""b=","/ID.v" -"R","","Vm","","qbKULxV" -";qNbq|eqw3","0\o,""eVe[g","vKn\VPp:","=)j|D!z* ","9DmUUl)zf","$^!?" -"<[/" -"|Jb u","!","d^w.","A;g","!R)Xk;","lcF@OX%" -"hB!7","\f0}","tQ;O2a=""","!:}'@o*P?-","Lxq2i","!{","6" -"","3b=3;9c","KYSFO!@>B]",";2V$Zwye","^L>Qn7D","'FE" -"ui""|\","2w","m-5E;K`sdT","I,.s/I","|""nvp","(Y68%" -"8*1ufFM","9{AN ","1LML","","/e|Kj~K2 ","f]hU^" -"X?'|h?D}R{","1;^kx?","","-\","d\wh","`A" -"p""0FPO","6","Y#04%P=4","QZ!r","xZ~E2","b@" -"",":(A5]r~.","1","A>{","tku%%6l","hVOh?4z`r" -"529E=~","P","w}EEc","q7!aVh|2&","","","d.L%" -"y-I'","}DM","x",")d25=Ct=a","(}r(aDiOhg","Lph9K`~0" -".rJD%}","n%)-;76Y","at","u@H'WcG55[","T=DJj4LF9","-J(,U-xV" -"IGn.","H7Z_","4q[&{P""UKm","5=eKS",".{]","1P\Y" -"`E9D","",":","aaP%p@","63'Cc,","8PS" -"]*0VA-SBRD","""a-~i.{FwW","}T(7hu]Z","K_J)qL'","Ca*o""mQM","kPd" -"EZD","Y~",",\BJ .J4","1,q)c","","iY""y6w*#" -"XRj)}YN%","Rq9/","L7SG;6S+T","1)5'{}FPC",";&>?X"""," \" -"5S{*1bF","Of@x=mv}","N|l,9@k-qV","p&OTv=xi\","J*","dhEgs" -"7uLg>s|","5Q4x","r","%z{O","","IG%" -"^","tsI""R}6_J","&-49G[A","_k$(u@\","hzsDI","+yV6P" -"]Y","\iwci:8","H1eJ'YdP0","(uy!*WP@","\'e","""axFFr)7.&" -"0N#02UAe~f","6","d","~ zPu%$L","Rw!nc@~c"," 8pHCf" -"ej-6","N7","2s3tE,","76`ir_8nUu","{pO/rH","" -"|4\@/@n_q","cov","09.*y","o{KG,f;XfG","C{L+Gj*h}","Pw>" -"aZ>gxL;A","PMP94xo","ho7%&#XGW?","I2l","_~@" -"[#THPA@8","j[""","#+}?27v","4`M}1|G",",","?KX" -"8)v\!B~""","4@L",""":gWn"",S","!zzW5q>h$[","","ifUqg" -"!ea","d^'t8=$YLB","$~s","","a$d*1"," 3fM2pq2F\" -"|","awbAJp6%/m","XF","y","*1AXL%VaO","*]@8=R2" -"f'/x*Tz:","BGF8A","`","Ebqk","A;p","o2c)" -"m2y^=:l5","P","]vW","p!","","=?:R~\" -"#;JE4\jOfy","d:E~6<-T^=M40(","`j\","6/L,)}C!","=+r","T;&","!+Q%<" -"Z","!5","fhX6v}3QN",":jm$ff}Ja","'","9[Zf" -"J?e}-","7J1","","\^a",";nIn","" -"4_","FI|im()}","Qn","l))s]<_","&#","Ne$" -"9X./Tl+.*{","&","ori","m)","f:JZ","G6Y&" -"`x)","r=p;""oUw*J","`g","t?|RH","Ef~]HZ:","B=?J7-07" -"/D5}inwij","PGJo mM@t","AU""b6E>-rN","VBGY ivC","BG,r?uVT","p!jn","5" -"X@%qxj4","!?S^bftN",";o7M. t","%1",">Gyd","o" -"V#CL5H","","S7]XF:" -"q}Qx3|ei","+8s)a1\","Z","M(#>nrx>Kl","62IX>$","|Uw+","%enx3fhbT","39zf:" -"0pieC","1C","#e","sFmUE","9","0S|ilar" -"`9K6","OBG\Ir&Fx","#","T,","L~n`T^_","<{k,qdw" -"veC-TrqVK1","C_bZj{BYMe","Q$zE","",". ","" -"Qp;R%","}.B>%#","2Z(,8B0Xj[","\v)","_","k?Ntippq?" -"!","6n""-~>","t66>k",")tv9){i(i9"," f","\AH6oG{" -"5|8","`",":&f9","GeM{R92""e",";wU-","!}" -"=HP7BHD","Zp","oM3K{B&4tz","FhX4.kPgYz","D==bFB+%G%","|W&>Iqsv/" -"_R>R2c=~S","7G/#","NF'q%te","hJL$NG","TV","vi;" -"n","]:(UzIms","3H}tx","82","H","9O`*E" -"He~%vP""","a#","vFFg((a>p","L_b7_7x7M`","`^ #i_[Y","*ts{T%mu" -"K^J1l","4",":P>rI","}6~_AhaBc","f","Atu" -"z+",".2XW^","","]H%x","|Ue","vqw=l" -"vrc^u6T","/","","{""]K=+%w","q$tn*q'","F[#;ex\" -"OY#\h","","$","jkVo","1(","trR;O$<" -"-""C)p!wW+","NRh.HtfUnh","(ni3@","pA5un|[l?9","z]6{Yn","XSAcP UG" -"TU=5@","?AKY-*T","Xq","-","tLAqYc^uwt","""g'z" -"/`'A{","Z(Q","-vxMG)>h}","]K]*L",";/zZV^ZL9k","""0" -"h","","y^mI=R~(0t","9)m","*0zUM","h""" -"","CDyvOC&@Zw","qZHzId(M","$[Vl 6","'h\}Fx5y","B" -"X9AI~>Y","","!:","8aFO*923","m,p","g[" -"}q","","bW0A}a","","(t1q?~+"," h^j!X}VW" -"8!Q1.~ s","Py","c&Lv&\e*","ms_d2-bi3A",")#HGbA-?","" -"9C+gr#uS ","g","G![<","NMCy","D","'9PHH?" -"#.VPb","7=2B37e?4>","nPT7`","llpW","9Aj9Ooe","sJ-nNB" -"b2=S@IxIkm","+BA%Zs","W4%I55M{8'","\'D4,o>F ","=midD","9(J<" -"#bHT49QG?","","ds","BFLy\W+/x#","n","M" -"w_&Vo,","dg3'jV","4I}Y1:k;43","","Y,9FX/8j",">8+t#" -"BXQ6-pUq/?","VY","3MoQp5?","D4\'","|tX2S{\wg%",":A5kWJ8z" -"l","=Wj)t?(H","jw&L6?","(","fUlr6""9]","y'Z2,We-u-" -"U_bx*y7p,",":$]Qs9Q}fH","j|39y{>M.n","AMN6]","^","" -"){uDx:v","T","]","uxCJ","][m4ys*1;","UQ[@" -"^Vp}u}","v>ewvCQ","^mv`P@O","_Q)(I]","]w'e`","?YnBb?a" -"","Hr""x`99Q3c","9'{""WkY\EA","nSh/aN","J1z1,]","4@u" -"_","&","r&","D/rAv(","hM","u0" -"(ra?E","H4bU$8O","9q.w0[T;r{","\R","","XW!8o*k" -"]","}jHz","M-8.SSwe","i_T8m{^","oc&+^zX-@","`4"">U|I%Id" -"D3oIaNg","OV|WXNOJi","VXM1guw","''%}8oT","Q;K@c}HA","E|B1" -"%F[?","","","fOz2","`WQz+x","" -"bYi;G""';i","N=1MX}C>","qxIF{T","+!XJpV'UI","+","e|dR(*E" -"M","""zkip8g","","(OwBj?z#","^Mtv","X" -"x","XFs/K{?6","4Dw&rj|,k9","","G","yZL7" -"","","4nHhv","}++","","OW-mE2" -"q[L^hs'uT=","SR:tN'","Efc\cz","","","" -"yk8ona`{","bUiD1`n2F","B,W[GK6I","x""t9lqZn:F","Sgr~>S-p""","G~@L;" -"ap/""*WB?A]","Y","V(+C1y)","yZS}wh","nRc)","=B?*" -"0w)u2h5","g","9","","@q]uL'","Ifkh" -"ny&#vmzAXQ","0-]2i","oM","oG3I0","n}y","V[Uk" -"B","1(^AJ","d_'","_","s","" -"","6","MZ^b opH[","K}=q","?jzkO=%","@r1_kqb&" -"b7EZF","6SA","qP6]J@(J","P,ti","(Ur"," N_Bv\" -"EZ","g17W","N","#>x'","""\Mld1","FR[zD?W" -">2g.","u","Jo,|#","nd9?u","","" -",9",">Yk/*8CZ","2~T[","NZUF","M$$VVMt","*:U+C" -"XJ","T","Wjk'nBQI26","p","G.""L3>sZ","." -"]3TOkQ","4Sa%..3:[",".fW27ORchA","",";:W~`","1U9W#]W" -"uL&P","Q[7AJg[,%","^/Nd%$u","3vReU;YD","KQK6{-l2^","#i)-H!/n7" -"qrCR/-85?G","g#t="")r2)","","6a1","D$RB%R5\C","?ldH7" -"TE_jpj","sQ\\9:","""I3","\-0Y+","Q\p^","'Rd9wwIk" -"=H~=fV> *G","Et","gf!?`?-=y","tH.m<9^PD4","oB","8>h{1" -"KQ6","","_V >3J6xnk","!^@<9","J{j^","S.S9wm%?#" -"=OD:u","""B^th^`Y&","","^pC_7zY","3zI","^{1j=hG)\C" -"PyD*cT|aeq","0""Ql~","Nt-td@e","n`VXB","s)N[P[dGz","$fvP{" -"~YfBP+D(A","","#]})*A_","kZ""'",",NbG6z0N6","T%+P" -"BbC,h1","&9V","1)","X&tCA","UOL]k""","/0mU" -"U7%=[,M{tf","9OWO*d v","s_?=Q2","","N9fBp","g!N8!Rsoj%" -"+j$","`cm9N","\5.Dl","XFLRQfT.xU","x>","{*)" -"I{N!9","","Ad",".S9Ve!s*e","?pceUt/","tm\6AJ|~" -"R;A:[&>H+,","yzpYi","BZ0U}n!","v-EH","9""e","`\Rt" -"*1V9w",".""C","lm)%C&/|L","yo#tqP+8","LM","" -"","&*Y`","}v&","GeGiWR""z;A","f.","Vy,`u" -"@`fx","]\AP\zF=<(",":Oo%c;gvx","&.","FGkz"".",",f&MXV" -"$5","~5_`2","QKN|%fa7,","","wH","" -"","","+~Q""5t)S.",",g-D ","{",",as+};" -"Es.rh~;.^f","IW]!\Y$~b[","6=x","L1H)]O","aiF#}b","S`_DWAb:U" -"P `D.}l","0","J ","_UR ,","|E-Q3;:s","M\{g|dMjxy" -"","Z|7"," -GH,;0;A","~5'","*KHU{CE5~","AJ.[&1" -"ij*>L#qvt","Ma+5;Lh","","WV$43fpF}t","Ur4H=H","&t" -"3","+""}29D3-","T?XG","r_r*f\:","qOJa{","gm" -"_0M+xc","cp}[","1" -"i","eqCYG","","?","+18E|8W",")W2+R%" -"","6'WT=O[^;/","eF","G(v*xst","pPxN","KCVs3p&saz" -"","MEon","TUgSEKQl","],+-U","6qa^lp!q4x","H;#0{#ujV`" -"lW-","2rhQT","A","qY'8","^","#=}G\6rqI5" -"\sWh","dS","38 H#W","J|UT~" -"O89kTE-","&""E%){","/","KlEuc","eh S_V{jjB","" -"{W.\gK0a","V+u^2$_","@a?","|}","v@7",")~Do,`pi" -"7j'","q15qc1v","\uu","Xc,[#y2C","}FS/|x$","Q+1m.o>7" -"","RCZv]Pr#8","e/nf2"".wy","REeXl%6]","\e<1``YL+","%,/o" -"|UomE~i.","^a","H","GX:t!@WE","QhM>",";" -"=2","9KGu2v},Y","w","$E?","","" -"J/{=tmV%C","#,1-g","}Mx!>b(","JA33G","x\/h!""V","O!6Nzg" -"",">QH0d(a@AK","|=ZIX,*cd","K;[{f.fBBK","^;&p","q5;fYR" -"1k=k","'n'Q50","","","E[AZ:1m?z","|e" -"'L-NSp","~T\@!ELw#)","ad!","Y?$Y","{tcP80","" -"J&F)'""=>*","*~F]YW","q:?G.","","}RX8B""","","DuLj x'~N","","","","E[&66'|" -"2mU*]","9}E,R|P","","pT}TL?ISEt","Ak","? t" -"djk","","IC<<% ","$w!v,SO$","UY9fL|p","F>rAp;v" -"[ >","wl'd{hw",",(]","rmX","j5nl~[t=Np","6q z4:/Q;C" -"6",">XIn-fFF^K","]F{``P","",".,","\e@" -"9n!X","I}","kg|Gj9td","@@(5","~Jf","F^(>;" -"aHR7","Ix7*BleyZ:","M$@]""G'","y1n>7","","\.YP{>" -"ps5Aog_","}","J0$C.M+9yF","z.I96","y*UB","" -"jERgb","","","7b?","","`*v|V-r" -"8t]","4YOUNjYp",":J+/@rP&","","n:xFp","EOjCoPLtS" -"$( ","d9t>{#mFp*","k","{ILy]","[O@=","8Rjf`" -"F","NDNR",".","`CC","","eD" -"(~z}ka&C%","E","wIy","+eT|)0","LtY)W",",sz""w2L" -"r","j AD","WDs""*U~<","h","..s>X]k U","0" -"gO","Hxq""ny","","(%$","c-PS","f7.|XZ:" -"~pYj&)","(bmAm","","Q}BN*)",">E>N@v","9*" -"Ecbpng/","/V:","E/","HLD!''$6="," T/AMh>7","G/=>m86N%" -")gU3*!T<=f","Ug'MUU4","X;""C","lK@","x^~m","IAY" -"G3tzi;?-","-l","-tw","6CAIQKv " -"YjDe","EP*","Rg@VYU|","&","e1=`iJux0*","h" -"W","nQG3wv","","W=","iTh^9 ""#","PJ!\1-/fhl" -"_dimgIOPz","","ruAH^u","5|<>Rt{L","kk","" -"6d"," Xd$r\","_vc;"," A[","","F23Q^Gb`ea" -"","W","_,~G=|7SGB","aUHw","$#,|F","MR[5\4" -"MAnL`","esO8B/r}U","zki+%('aT","K2=","9(E&eG)YV","L9-$#Vslx" -"D","$(","NniaK""E3/l_T","(","EyM;p%T=c","xI" -"*V1`@2oxN","h;X{","YeyVi,",",","T","vG" -"m=`Pl","uj""L`MbeE","KI","netv!9ZB8%","X5+","6\O%9l3250" -"sZMn[@urg?",":TND'","5IC","LYrYg","dn","H""Rod","""a#|","" -"$p,M9((3<","H?16",",F","Uou\`i{/'","7SBk+@","v YR" -"sKEW]|z,","`4B","m>","hO^le-Sp|","!Rxc>f~`","V" -"MRy^niI#^W","","","vA=]Knpq5","7Ax[}",",R" -">^k!YZ+z.","N+-eI","WE~""|-1zjy","/`K/17","{:=""l","" -"ZaF?4uSE\4",":M","rHx&8","&MzX`N"," >aG^L\@t*","|'r@,0" -"#m","""X?B_","X|,%%?","@`z","Qa%PUf","27A" -"0sNK_W$","[{WW#i","","bU"," e0fa\==p","C0$A`@NR5" -"OQGkN[","[gV;73[","","&0.c"," 41z","%)I7m""(kOP" -"sW?0VX*tl","$@t\zH",", 6AxCK-$","]9h_b >","-?ie"," A$sk}c" -"0(iHD","zmv%","-&","oZ][s9","cu3!`P4x4","n, " -"#0EP.mtx","S@]s;","6Nj","b","Q8H|;","" -"-/;\*#","}>","XwPhAK1[6a","0Yn","23","Qx!|lS6" -"2O&T3DWG","#PKZrJG","D W","aQHEw/4/"," b","klBBNEA","8k6",")L<^V","!b;|akP" -"ZPF9Vy-:","SQ%)4Mp","Srdq2/n._" -"<,=((V!","te","V|P$[$/","JgIDE","iXu>=-","1CVf1mrA" -"Dj98#RG _[","n@?HK6dz""@","rHLT","Lk","{[=xY","","D(C,uB","` S{[ti4" -"]0dR&wYZ","utp","y6","","+,p;TJP+1","[!{" -"`}E}!}Q","ej9(5OQe","=T'j:( $v",")sH","9ueJeL","" -"8n8eTE3","#4","\rlM~\","?f=>7g","","\" -"mD`$&]N|f#","k","_xpJ|",">w'u2","rodIU?h","Vp E#M" -"EwK","T","L;v","dUgvgm7","pPYA7krakU",".>}D" -",Q","D5u7~$z,","x+@K;","Sj-!8""U","","'!0*h5QX1." -"}k",".P","td?@Q._","VM""",""""," fpv-" -"Wwh3","m-AS@`,","TxS",")l1","'SSW0cdB@ZZ9","b{UsQjg2$","5\E-=Zf","","FNj8X","#d" -"l-",".'bEHrm","a0td","4=b\O_","~ArL[","V^""Eh#h" -"vn~","'""(PH","","[NuNt3y+","18uv:D","w\=pX""" -"$~,^vwlN&E","t","","TY8%j+L32","lt)NY} ","A/xc'vYrz" -"Y","qRdO","=-IsfX;I","E5+n","b/e-\.DtsC7" -" wj","","scL$","&7+)CQ:","","qNn" -"6ki?`(K:T","S';Ni","P4","B%j,.kDiI","l","fl4&v^" -"dMdiZ4=\","K1'ZZnY`","WsH0","","{#S\`Jb>","$" -"kV((5#","xV*Dc>","TeZ}EC","9!e","i)\X","G" -"YfCZ[CA?","71jR~$h'X","K[+-,C","SvfR","Iaj2","" -"UM>W","B'!""<","eF}/F","qCE0'","R/w6M","]`SK~N]`7b" -"o(:F}o","y+&W$","w ,&y","@=.e=qC","*3/*%(=R","Rj}C748o|!" -"#8ij|OlO","Qb","ldMsGXz\c","{PwuC9ORE","FW||r^|","g" -"[A(","%!3D3qN","eZO","n4Fw.:","G~wdG","" -"<","J}@>Tn","%}b-<","#","X']" -"<(&\\1G","\P.R$.~(","1G.","srP","2o_T-.-","" -":H.5","","","CxnO)2L","VX x0","u~f\*" -"~!f:so",".k[#1t*K","_H.>*^ !V","p)>#h",".0i","2=??m""" -"XZ|","8|dQzJY?",")4bHG?w%","","~TMQv!kTB`","1%$Y@W\%" -"tt$oh=3n","v}","s!]rr[<-3","T38VpO5^","]Pj(%{o'","Dyw@#Wwj" -"]>uE[a","9iF{9AEo","^ogx5","mt","V>","Po+PMC:G" -"HN`{X.","J",",_","d| ",".~","+=X" -"zUW@7","sxVm","1|="," %","g?Hjdb-nQ","f-P" -"=m","]t",",CSO)&1","ACm","e","]{" -"{4%j);c"," ?_7","R","&^g","c{(","-Vju3qlM@," -"zx","dE46kz/","~V2L`[~cH","","iG\",":" -"","J!2Gq","q\0Psz(:?m","H3=kH]=K","A"," " -"FT^g5>","M=Z%YJ!{~","v+","%LNy+#9","4|(S","1/HRtxuU|" -"{o|2oR9k","WAs=}Y","aqWf","C$s","b","$""tQz3sw`r" -"wZ","G$k>'{?q$","","f._!*","D0`S5*Kt","" -"","x#;Sir^TPo","'20#","A @V","FnJxC8@k([","=@h_> 3p" -"74,kgf","","YL~|)K5","PJ11_y",".","Yrv" -"wz:2cC_","MI4Ef","#1Uo","57cax(","73","8" -"8]tv~tau!","~uxDQ","$Duy","ej=Zs/","3KK+","5M" -"I{lsbr","%a>MvkAn|w","L*r!]","kSBkz","\)i=","L" -"5","LUq|_]#Q","8[;V","U","x]Zy\OK","[p'%yX)^q" -"-HuYPT.J[l","1C`smvf","X4PYL","n;N/N","d+l","T_+" -"ZW}ot]","\1^&/_t""" -" ","/Bwvj","<[=8VqI",">+P","Klz/u1ps+~","-xl,V" -"p","X7jx=LGW+",",","_Ua4CYT-","yW7m","w)uU$I{[4R" -"z","Aa","FXX`)%E","","a","b" -"=Kr#bxmmq*","V/w:","","5o oQ$'1","D|]6[","gb<" -"=IRc9A!=w[","0lRRcu6jyZ","#""","","","r}" -"","&K*DQvP`","","]@@1Y","zNvqD{B-.;","rRt1yu6p;'" -"m","jFJ`$Jg","Dci_7]{UF","@; kbb)" -"= 6(gd]zK","%:""rOA","]UNvls):^","bw?<7r W!J" -"tu(R1h0v-","/lc$V;:n]"," uDm$<","s}","*W;+2 [","hT6d.LvZa" -"","~-_2g?","{","m0o","~8","=msEu" -"1< <$","Lg$}N","aj","9:.=mK""_+K","YDJc5csE","V" -"l#","g^p@fb/","/ZMbc0k","xdHXp","G","wAx^t!y#f" -"M)","6x","DfqF","sX(WBL]ch","\W#=iq",">RN'%oxs&," -"=","Bp'e!","^&.Epk","4'n2X9","awF?kV","q|XH.1Wr" -"DzPOe.9N","}wkuS5E","yHGn_<@",">r","/j[","M%" -"","<.t-N+f|>","oU3{}","z","W","7nR4^" -"tlq","r8w","/Vz(6uv","jEkLh","0fM","rkGk9lclrc" -"$u)FlIAqI","]O@c","lSNG.kl4:","U@b-=j2","~" -"0b\,v'Q","z3J-E:h","=9]%E","RWKPcqV","+",",6P[qFFZ$K" -"u3x=dPE","pE"":!k","l`Em3#bX","Tbms}'gTT&",";Vu5b-H","a^UG-t" -"Qd{84Ax","(`Tj;","7","slGG6<>xe","-","O" -"X|M}","LH","7x","",">[ZI2oW","4Uvwa[x2" -"l",""">>'9""4z",">C\Rzdf","594[^oC","W",">" -"*4D4W","Nt~","(_SW","k2Z!F#C>_?","VLDE['9z@}","].G""tu" -"WqZ!&o","j+9{QIU","cKCEHb>3|","d:M\|dLl)B","h{X:g","[WQ{+wf}" -"","+","~Wu$!Ub","N","" -"Q87","v",";x4m","J h,W","kNW","oLlQ" -"tn","#kXw","dM[ ~j;","`*^Ixk","S>LD","0bgS,p\^`" -"bc0VMYJ","a)2A","oSZ2.O","_*Aua{","&i#P5um","u~ F\3?W63" -".hQfq@[","nhkC.q","""dN","op","(""U-MI|F","~!~t-5n{=S" -"y%?","bwxm-=#","T5","`ShN4 pv`e","u","vxQ/]$7^m","#","avu7D$","","|u" -"@Czp'","?""&]s7","q","n!`","vvJV}i0L3m","4!T!" -":IcC","7=;>yv#I","F4TS9","[l","RNj93iz","+np1D" -"3","","]XMt]l","`j=}D","SX:9w8","6t" -"Rx=TAx={8F]","cI","c@H","" -"l@wVdWV=~s","8","&7WIizx","z&n:yA","3hwiuXI*","/S0|=:4GG" -"Zf,5RiHf\;","neFp?",",","B","-qK!6s]","6""wTc*N?" -"|f9","","I`N" -"m","","","WS^3x","gl""""|59","O?a" -"()","\DgIL","7","gwPU|knaA;","H.z3x","RYfn","KQM","p{lpx8","ucbs3""sDU!" -"[","UG`_X","\H}tv6""%","Esp9W_j[k","fD(7\7{b<","m" -"$&XQNcSQ","'MT!bV","DeT7Z&f:V.","/Fap`","Lh{7,?;","M0KIoc:;" -"K6","*?1Q}","",";hf$sE","@V@=JVWo","Opk" -"nVIN","y"," /X","xMWy?80]2G","w","|" -"gf[","|swiB$G%","T" -"l04j)%","&","#""","lA+JV3:e>","SMV: 6","X +pBY" -"|+%ar","Rh;","{","6kzX*",":^*y)4}z","D8m7!-Ef""m" -"PNC","R6A","ZV","87-Z","LKi/wY","rdDn3_KXs" -"do&`C]foe","]0N-jN","trQ'@<]4M","d'2","=a.fbg;S" -"","","p","9sg'uSs","zUAOCiW+5E","95H" -"\bciML","","`i.-#!A0X","|BF@`+jU:U","","+9r/$S ~$N" -"ek+s?bWt","'}","}IEOS.F","","#9WN^rT","" -"9'mAm","G9Y ","XY>t(i6@s|","mXQ4g'`l?M","","yVcse2" -"","","Q`Jn.? Xe","a~53Ff","q$","Z'i" -"","N.BV2m"," 1m*Be#+","w*Cz/%I""'I","+C^Pgd","%m$nS" -"",";","F=[.EpKv","6t`,","@","" -"A","","J@K(","7ap'$mI","{$OTs/Fs0!","g.)Dd" -"6J_","FeHvZ8g","$ZI#Orb","Qp|iRxGDo3","ZVu","G" -"uv)l}""S:","W3kwn3","","3|","WD'3|TVhew","35)v0+cEz" -"+]vFKwQ}J","o\b[(Adk2%","1 @!ug'","n|:zBN(?x","n?u-","r<^IP,2" -"b* hj!pp]7","&Ck","j/O%w","4@3PW#","/*2","Y" -"PhueOrt","ce""[eY","E","","aSlch=b" -"_PRLP:","e~-51",":rM9,OcE5 ","[q23'","09j#","x+^&!kIqSt" -"g! tMLhqk","'fJ[Y9d","xQZ;<","(o;,t(0",".%'$jL","M]h*UY3\d" -";bkMy)","","sAm2",")gFe","u5=bn9a/","kB[_.5n" -"%iZ","L$","cx4gQr","""H'$lNUhY?","HR""""9K YR","q({8?aJ" -"73c"" oBx;;","G~D:vh","WMyJUiqqv","Ld^5K}","W[]58RF","^)A" -"","","`F","y*q.1eV#`","p(","}87" -"B}","qVAxg*","]h@Mxx","#e>4","[h/n>","JQi|mXd3KK" -"]K9"")L|9Kp","f$c_.R","fR""6zAyR","%3qX4","hC'vL","@5tzcN" -"","8u\'FZA5d","WZ'=3","g","+e[;","" -"4Ys!z#9PL",")K+rNIgG""@","e-j5","2qrlai_K","~JP@","'Ig" -"F#_WY?&","4x~X!<~`3'","o,1UP}SaQ","n`y","z8-nh/]J","~tQx~3v:&," -"~~&j=UzU","V'^AT","R#cw0","wra","8@Z","84?l" -"f4xf","5","&10J9*.Z,","u","9$+koqH'3w","*-" -"5M7xn","/j","","<}0%-]","+","rg" -"","8LOd","3T0J_X,$","Jmbh?'F","|m/","eidJC/" -"$H!l{","nlw5.=,",",d.@7^","#M*DR@Uv K" -"}E}*&u>!>l","]>","^Y4p","CTA89eM,D","*6QO","TkZO5Wlu" -"js'r""",":h(","dxt","LD`?`qv""s%","OJ4i","L^qos:}MS@" -"=$s+[bM",")r|7#Va{k7","J","]","7e:{V@%9 ","QaAbt&LL" -"gr}-qu","r$a<",".","","~pv#70T`^","*mf-" -"y)""Ggkm\@t",",2_A","","@d_3Nh","LE ","&_DA" -"MOD~CS:0","8-","@CtqXf2","Q","","WJ>O" -">9+[+m","{ytHorhJ","egj) 6h'tT","|('",",qzG/","=t-" -"X&P","Mx'D_",""," 1Wy4Et","VG6\?\","zux55" -""";gWk","","2","iL,zy",",&","h" -"a","16~*""+58j","c1LEVYi>!","","","=" -":;Nrfu/Vgq","0?A","sQVBo ","Kx","bP8tj*1Ikp","g" -"-W","d","BL7R+\G","","rs","iL;'yJ;" -"$S","i8)E09","V+<*","b","%s+","`Z$P" -"4$kZ|08rBa","P;2W","t3yh73pa","","W/","" -"Gukr5","PPa7|Pi","FJ","","-e>8n,_","iwUlE" -"",",ypj","S;ac","-0j","Jte-2n'd" -"45S@Ts","3p","Cz","jEpI7}znj","*[#Y$","7z)D_+A<" -"f:]*s:[LS)","Z*W24[",";j]G","1_?W$+o_xe","0h(_[","Np?'>","" -"|/m0<_`","h64#f{Y=Sx","lE7=J","Ps#i3Fc$","t\\'\","xuM:" -"fP",",uH*mK<","st25Pb,F\","WoMmepO2>","?+>F&hu0","p" -"{","Q","]4","R3YnS","i(l","" -"+o7&p>yzn","rg","=@b","","W:y*$ahX","0|*Wk-Kl.8" -"""Wc.(/","*Q]!Zy","G+inbj-:p","*Ix&s~sdRp","<)","_8Xk[,r\#)" -"F>P","M_WtMOwU","7S\>`|xB","H Mt&v","""~kk(","OJIxt-" -"6q=b7","I_@4chB(fD","cGr>h","'D ","Ej%PyZ7CtN","X2*/h0MD`D" -">+_[65C#c$","%TB9","ul>z6","?51i","GZb/U","9/]F8o<]]" -"Qf","(R""8","","k\j","%1.Yr$s","Jdf[" -"E","7Q","HpXW","""g","1B","" -"w*$","GXtzoTd","wk&C:zzzL","~K<","/3V","tWyp""5x" -"sFh,3Q$","I","Eq8Ed@)J","O:)uVYJB","9%b23(@{v","|S'g" -"gVbR","Nu}l","Iwx>~","$E(ChS`l","|2J/\#%","5d81" -"","Lw","3o].b0 ","lR=Mr","g3C^","1^^l|&V8" -"9~~fT*","s0"";sZd","W0Z=","%(d`mVK","","hIke-" -"gzx\bI'v}f","S}>L]27","6","dRAY7","","VW#46kzhC" -"IeDL#aL","]?L&>MG:x","1L`{;`r","","hd1Gm}'U","" -"{","``st1&","it0$^'*","V^","\@7a","EXA''" -"D","z|+(^!mY","b","Uv0`m","=5p@IlyjiA","DT'O","\H>|fj" -"?hp6IP",":F?m/ka<1#","6dE","S","M|u9G{*H$T",".a%.6 LPHS" -"&.-zF%@z#]","e4B=`6[!QC",">","en","jx.","uXaNdy{" -"""#@","!JE","wuI.!Gz%","","Q_PfsezC$`","Yq^T5Upwu_" -"@c+3{I7e",">qx","A@pPoF","","U.wYH6","!" -"W>&&Z`O+]^","E`0Vw\","{2*7K>j","x17:oOWA.","EQ&","+u3$U1l" -"qcmz",":v9I","E","3CgNM!Zyuu","J3CnPxlZ1\","3zAoCIzOP~" -"Q.t ","J&9n^+6%","&!:2Reo9","C","n )D=C)7g","F?)`HLn" -"2Cr3G&.?","W7K ""gLu*","/","0%G%bIpe","jV","" -"A-8E","-W;vrHa","%",";","uOHC^6!D","5}+Bo]a!xl" -"<;""","j9v,X?ggD&","Wi^P""M=j:;x|xG","E)h(gfy3:(","V]","K: e9uf=","}#'>Bna","" -"#","r%1]4-/ d","Vo","fjt$4{.","","*Z" -"AI52g","|PLgl\'6""","jIpD","p/GZ~^gb","wHB,vy","\5" -"Es7S_|","!$IlYw""","ShaDcoA67","F5oo\?","c^cVR","'0Mg<4" -"ge@PP","mYHd[",")gT=pKN","J\vE+.D","v?","%Gigv5:N" -"","Ky","r ","i","R'e","v,LJ2|" -"","f,[_@C:lN[","","Q5","*84es9L1@X","sK`" -"&","0(&^\V","Bf\'o8Tde%","r","Zz)L=3YA2","s?_ds=," -"LBq?[","A","?}9Qv",">!BI","z+!}Ha4A","Spg1[B" -",@T ;M","","?3+","nQMla^H","{","sp|" -"Vl6SPJ","SqB6mN&""1","","qaJ'bl","","" -"yv@usc","","?zAaKO5","g(:(FQ)VT","","Q" -"Pr+=+","h","","Rr)C][" -"%c%o,","X,Z>C_%""3","Kj6hh>C?)H","6n:i+G_^e8","","aBEH" -"",".e]Kn'","1ZrSG}#rZB","L69","SR{(","C&ju>,}K\x" -"I-2x""Rrc&"," b&SLKl","\y/+Y.e","3X3","[g","$7j1;du@" -"5_2""FEMGJ"," lS`fl1","4bEh'v^&9F","hzw&u`2%n","#","v|8VT" -"v_E5DH","&!pR4D$lL[","[;:n7j","",".as$S)yF3B","jL~" -"7+#U9evL.",">M{","zgYU(K","FM;M","Z{?,6E9&",">^6hf`P" -"GT/","9dGdsq",":/s+xB>","E@","`","wd" -"C/~nk","_b","F+wu\HU","=cSkL/wU-","^zE","o`2,BG8","OPV+{x;Q","6)<{bwo" -"0","#","K",":,fb){bD","N'p""0RP&=Q","IOc.+N" -"$KWlF+rHT","h[[q91~Q","","dbI<","","P_XIMZ""4L;","&k4[&rC","/nb3" -"D}#QOPR","F=","fZj>^)]\9T","HV!hK","","]Fn" -"@7`&","3/]|@A#aLk","HhR>JY4-","r/8yT3","h?Et1m","cTH7k""_5" -"M$i.O'f","g@M","{Zzd{g?","Gth","","w+~(Zp" -"hbLQD$7\-","B}h0]j +v",":.:#C",";>/7","m98u!M","i*h!V`4`Z0" -"d%^","1/","Yv""Z;-","","{","QCJyMZ^X?" -"X","iz`3{tm*cE","qF",".[","HcG46","." -"991I;pz#'{","","&R%>c","BZ-|tO","tmt?","p" -"Y9o/43","","6GCu}","iwp~f0","=^y+","qK9}a" -".yq#%CcH","8(cQf","TbxTg?+","Jho/nr!9pX","a","t2z>" -"3m","L?cHNvo81P","s'vc Q&)o","","p","zZ" -"a$","{",".z oVLjsq","7","Hg"," qo" -"2?7","X",">|s>%%A","","{~","BE}|E^yt5C" -"IZ|@_)%28u",";","V cCIZU)","","#?E>/}","6YK" -".","x^hsN*2hV","c&ot","9F%[ m$c","P.h?LE","9744" -"hG:ey4lW:*","O i","OowDOrq4","-vRlPVi'B",",","4 wqI" -"eG","uj.{b4","","D]-*3P>uw","GFNY","""" -"9""|HX6JQ","D%","* ","^v(E[Lp","=uTx+0","{r(Tp`" -"H*p!#E]","|!u#]""6'n","{,|(I","ObQ0Iwsz","*2_gQ7B7('","G" -"6I[TcL","ai:MvfPt","*eat2L","nv"," k}5","_^{\?b_.s" -"Ohe[,0[3e ","|PKyw%s^","[s]JWg"">?k","92q. ",">r$3=BQ","+%%L1N" -"}Q5L1 ","JA~yY""","55o=;qh8~*","c51/)E3snj","}XVo?R(V","x" -"hiTVAZD]",")]"," 4km[","2","l?/^bH~b","d|'J2" -"","","p@","OAQ$","/3/!Nf","\4-" -"NOef7RR6",":Pv?U'E:$","U","5eWeM","+t2B}","l^N\GsW" -"","q+c%?","mmg!","?l6GoO","tJzl!" -"k%CwZK!6R)","","['","E1h#]~fx,","0s!_so9,X>","'ZDf$" -"A&0TSD/","","nq4rPnfq","+>G","fe5>H44","jL&\c""6" -"-YV\x|YH","","","I`lz|P",";XA","" -"","6rnX#KJZ","^J>.J{","nT5","qE(4y","#u/u!&>JJ?""",".[C5b"," ##f)J","WS9e/g@","+a)" -"Ih2jwR[?","/:a","4y&!w~","XE;;^#8","N$\]0x*","" -"m","XFD","4QZ","Ny,HT|~P","x""","" -"+iL2","rHxM>^\","IB;L~Qh","","/~D$","ie/pC<~5r^" -"Kwv","vRU","","NBTr","ae=_P22-p5","@*Zo'ar" -"1","~6G""+N","B'ImQomu f","d8R","s","frrai?hD1" -"[:_@","~JC->,KA""","ar*'>",",E#%}u","+d\go|99""","E*r*+/:|5" -"n""j]1)bP","k+y0iZd9q0","5L/m3@e","i8"")(\","K~","%" -"D@9","eG","&3y8","","8(w%","me4$yFW" -"Pzx6heCkcx","gW6t{A4|",")Ul)","26","[e[d3I","i27kE;a" -"t_JN,","cS/2@'DO","22.AdL@R?a","+","%5e2OMLu","h(;96sI" -"p&o{{wgA","","","","X3Jc]tZ1","HhS","!{M-MGO<","h|`<","xrk4[~AeO" -"9-nSy","[i","tp-","]1@Dlg","kU","!j\ho" -"Z{ ':6","MU?ysE","[","Ie0?w ","d`","\R" -"N,&$gmPK","$St\V5T","cml>7k","","F}","('50I_" -"-#3&9K\reC",".2'","\F9#>c0>","QvMG","""=O","bkmKhVqr7" -"0",":#3","!K+j rf","q09E =Ea","%#e^}dyD","2,(M*s" -"e!:^8*[Y^","","/kl[(i:'vj","L()=(UDb+<","qDNH","tQ_7lG_" -"6yBv","","#r","L&1P*#","lT`DMe,9s(","q""QBkRSW2" -";RTJ","xn","}xAZH0Bf-","lZCl+s]!j","=Ex=;7I(|r","0ZbhNU,8=a" -"","uW-3ptELpa","W%TCuF*;","/`~@-C5?""","%?Naa;","nyEf;L7y!" -";f;`t*=Y6","gHn","C?F`};","QRZ1","'DJ][gy","L:=+`_1c]" -"(2G","{,B#0B-qz","zeF7","?^+.hwCe","z#Sa)","*mD =k." -"'L>=","+" -"2H!",":x{dqv","+",";SNYqc","2%","G&^\[" -"%iC9^lY>","~:WA/eT",">","RBi]B,\3|","sZ","#Y:%%a^a" -"JRlT7+1","A`gP","Blsw""Ew:;","CP>.6rQ","LO_","Yk1" -"-t=JvO","!]sr","""","01dx=pc","B""L_","OW" -"%","w1!S0","Z;c;","2i@","5:rX4Z(_j","^bJg" -"O","r{Al/PQ)","Vys AP7M","ri+QE",",","M$k" -"ZouZ3u",".eM>-[|{5","amsJ/U{Chc",".","g","nWS[P" -"*k5=","*f","/Q:`5XIKy","45","h2q" -"","B","","_a1V1","jil*(z[?{","clJeSFGmq<" -"VIMR}!$","","\BEc|J8dx","y*w=a>","f0AMfL","oi]" -"e'X'Nn","ok","N","wD[4","","+12E" -"IcrO","E-3+4I8.\","L$","","Y"," lXL(9" -"Fwf^","jPf",":%(ln%jY","","I{m#","VY.$AV`Sw]" -"W,%H2>","a^UvVH","WY","qqaI^F!Vmn","Q%H~jh4HE","d#" -"J4IvLSF","aG9E""","va","cA","le9%)9","Bwy" -"~dT3A","x$$",")o90{V_6RD","6Joh!wqezL",":1mYh","DYbPZJ" -"tB","MM?fQ=,","Gm&T1","7LYo[1c-","X8Fa>Q|","!=:" -"8b|.iQ 1W",":fQqqc","(srw\Of1","hw>twY?~","*=&","A*" -"|a","C'yLi~}C/P","[,q*4","1$B","~RLxmnvB1C","GMyO95J" -"'","S:4wN","JGp","XOgy,)gEK","(-MJ","r]3PF" -"_^{a>`72","r:lb\ZAYct","3KC$n@A","Jvn","dlA=","Wd)9" -"Jq>x~z#x","N#$-`1f","r",":","{y.","o(\" -"KmK`uJ1bG^","bqj","_aBc!gGk","E5''" -"A<>B","","~$?","qR","jY""","9CkRu hn-n" -"5""VZfg8^^G","CoC","W2.([i&\I","Z{*","}?>;2b0","|g-[","|jT:-J6Xq(""/5&H","","<" -"Y7<}Wu[","O{9c","VB\3!3","BA`R6+N","n}W+_a51+)",".Ii_&2&HO&" -"r","/bu{i/J1zZ","WiK","i9gJ;","sw}?_b~kIU","dL" -"Eg","(q=",".:-","y","i0EgI,","&FlD2" -"v6q8DS7Z","gxeT","f","Y","G!K2V4r#M+","%Q+,_0Cr\D" -"$)*2","<^","z,W4NUHmI#",",9","}^WCH","&LVLV$","vOH(n\>J*&","%'F3,l","m^`8""","AJ","3T" -"*","5Dtb_Y7V","P2+$TT","yYX09a6","k","" -"dB""5","WCsv{tz","T","","","-Cvo\" -">pM/","^H","yjbU-Y","OX","F[(~u7*P","sr," -"fY""","0yF}^yKpO","","",".BKyLg","@MPkL0" -"X","mN","8uq-{","f7}R"":oB","Me",":p" -"","sdxSg","$,_i@U4R","YJ)","J","n6=aK" -"1LmLbC3 p","/(/6r","o(?:kOC","Jj&g2","/ne >S$>EL",",FPYM|" -"","C","9[P#$inlUd","HU}","r3x","sYKa" -"kM|SP<{I]N","F""a=e0A=","X@-s","lB%","~ZN-c","|HR" -"","Ip%P'*8GO@","Qio,hHM ~","l5w*""(:K2&","","qw\P6H:" -"2x2l(eJc#T","{I8G8#L","ycDF","Ro`","9Jca","%FNZS" -"^hNiedR}0","O.w","w'Z3$+@<","n4[I#",".'1/RUvxo","ESm!JU" -"W","","Cn","Es&D","1>|qceZS","c" -"GNCOr/n4",")HhO?yRJX","w","/|3(|qM","|}E`f","" -"fl?!XY-Qye","_5Vi","[,d","u3#6","h6","dC)" -"Glvf!+","O:[K8","C&","$p^;<#::sQ","""X!{","" -"UN2N>5","rVo'{8&u=&",";9I`hl6D(","=4AS3F","])U+","orfTuN7u" -"","J@","Y=","=Ql","@5v;9L :u","`>kyY" -"xum7","","D&#,AP","{mBX$gi","V0Ov","Q" -";,IxZ" -"'*RN~A","L?I!4rw|","@'AeCfvj;Q","Pv","Ha","vnV~?:HV" -"tcl|?eN","","",";*>%","f&i","-U-e4<*hR5" -":iPd","hk","i65t(n!>0","{","n(eP5?l+[","Ch5" -"3>[N26no#r","jOoQ\6*30l","V]0Vk#","%>?","7H=f5_d","'4" -"K[","m{Vo@_esn","M{=4U&$","8","vJe$UbU]","""ts" -"f",">wm=}q%3cp","","i`'""","]Y!E!_lU`","Tnv?TV" -"i/E'","lTkgm/uQ","o","X@{#/","3>A1","/(GDFW" -"!j%5D;","-ON","mcs0(khy","A}ADG58vbA","0|Gy,S\+","3aH%" -"sy1zB8W2L6","~0~0fxi%h","xooZs{@M>","CvLa62","I1M2@f)L","C" -"vNl@!l,","M`q}(W","5p!t%H+X<","+G=$,>sG5","","6" -"@jrzq","hB=","","U&n+Ek7P`(","zj","yZm;" -"","0]","fXQm&p$md","|'""v","\E520s" -"?$6,>","nn1<6OQ","d?5^QPx","@|lQ`5m","PK^(bnW^","PU-'" -"!;""F-","}17PjCBK","VXpm""G-",">9","S,Y.+u,","];=)Tg" -"HUvnz5f","-","","aQ","Vw+>","+mZh" -"H+29W""","W","RF$9Bf$z","&","HhOu,/" -"-L]R_!1^lR","c=:t_","M{%Xk7{f","","","t.hSS`*a" -"W7BF%SamV&","\g42","9on4&:",";6?e{=m* ","r","NChdJ\&P&2" -"c2MLf_","Unr","r>RMGg;*","'wkg0","a]O={K.~5Q","D^I~","`" -"Uy!mkR!}2","Q","gX}\-I[yk5","iZ'ri","{`+KNPP","~[*:J" -"q","+7[2{2*;\R","uzHg\","4_/Ka6_","Yu$","(?n","*]1B","G7=vw`^" -"D;uQX_yoA","#2FwW`To)K","~3KaS[","KH67Rk","{iYo1ge","73/c&5tLxr" -"$oth##sNO","@q",">B5v","`X ","f6","Zk+" -"G:","R,$","8","_\s3*","$/","/d/;|" -"C","o#@;`;g","i)7BJ","Yjh7a","<9ul@i","^[fMq","EF}E(:oD" -"&y","N.u!H","+RN","u","_7\G","pcA8Yl^eZ" -"","P","3P>!","o","~5OWah","|!","Od:pvdD","-U7z7\" -"SbDX8ZJW","S>h3:C_.`","')SLc6!>v"," cg$lg)ob<","","DNwfnm$6-)" -"","Z/&la,}(W","]","DEZHzFk}=}","","&K\" -"+T","=|0","{","jw[dHnc$_","7goKy%X'","@W" -"k H2]6","2""Nc8 SM","","","$X( ","i1""Y," -"EA>g2CW,","1C","}kcAGI<+$","r","*","" -";2M]cbb1","eMs|gMag~"," ,J>PEP","","","QjR5" -"6i\s+","YXbo>+gP^(","=S(]EJFOg","-Qi","RP5{JgjnC"," 5D" -"uc","t-Nn:TOk9l","Got\.Y,Zv",";S$x,u=Wq'","~`w()Q&","x2v" -"a","^ZX<%nFNw8","IY1DK8","{","@hK","u6]5+/>`/9","'" -"V`\RI{8","po","RV4","~gMG7Ez3u-","!8e?gU\ZQ","_8KYZTm;$" -"","FX}hk6{mJ","K=xs","o","OzZau","A5,QMsO" -"/~","B1","&@0k^","d^Hm!%;ORT","^;43gD,_7=","]" -"{&t~V<,t","oOF*0gc3T%",".>","g_{]?","M!@N4hVA\i","p(3=MW(" -"8C""w{[",")$x\Jv)Ao7","cf/F?-ld","Q%>X:","@","SuF:<42" -"Y%x\q","$","/Ag{ H","#vZv|4","+","HNO5Z y$'" -"P-L,JzC\O","-}i'jpM0D","","[z","([","JXP/ {UoF" -"@vF_+Zq2","iaGO$Hz","}d)","","6ydu&","b" -"m.ze\;4_","][OZ","\VF0$e","ME>W4","","7;" -"a~X>i>;E ","=..TSN5IY","9`","o2=GZbZTQ","i0-","_b|QsOSu" -"HjInmRx&","!7LgEXKQ[",".8^bq~pRA","m)t*a}","","rC:{" -"","5+NAC_*h","","X6","z6D]]!","3o6ThM7N" -"CA+PH|CQE","#D","eH`oD0fS|8","","I^6u","wd_n""" -"1X1d<","]/^sZB]=w",",","Wz","fHSf1.twFh","afkl2/" -"]\C3&""6"," ","]","PF","H""@B","9" -"r00KOp|","-","R16F","","X~IGj F3","$c" -"bi>","d7Hv","[:.","TI$##k(mR}",".B|YdVR4;*","JM[=]J" -"Ex z+Eh7","Ja","Uw02 -","]","`]w0bi","" -"qb!1","Ft?B=#","-M","0KoI5[sQ,""","1S$T@%sz)g" -"={","","","e6;|","E""a02(pe","","1v3D}'J" -"/b0","s=Eb?5$1","Jr","t')TV+","B{/G","uQVkmvl" -"Rj","fwyByySt;","@I,S","f_i/\GFb","<3Is_%Y4","#45{aKn-" -"}","LD?8I[31}M","U,anzV&Ir","e43","T~sa:","!gIa=T{5* " -"FZza7*Vp&)","Lr","cPQo.od%80","p8","R","xI`Pj" -"gv","/@z0?z-'IS","1bYF,","v4N]0-uaV:","_R&4","t7'AUt#E" -"q""T","","V=!SO","~YGK)WWC","sm.(.Na","SBH!@5" -"wC2b=g","['mrq;+cO","xV{h","","akQtP5k","T}:cr" -":/J","!",":/Hq""9","","6=Z_kL","M>X3F?" -"'^n/U","%&uJd#SK","6G`xh8MFC","","M%+w|M{~","d>8T" -"Uk","Y#y)})5X","a_","ZMJ(.l-]","/K*","M.G!:","7}}%@I",">_0][,","DT","#\&" -"-)G.Qy","UI,","3b]o0h*<[","q9\","yYr+","-Q|VW" -"WV","62ldDw:","Tg>","|","Ijn4B","rH6EgcQ" -"5\2T/9<","U6wKfM@8","M:@wF-","./|`ZF^^'I","""57yS{3G","B" -"n_jV","?i}C\*>E9 ","JS:;yR" -"M","E@5;_","U","96QR6#!9!-","uCV1e(Y6No","+VQ8)^""" -"E',5Ez","qzbShb",",;0d~M","vv,fb:E",".tAz98n",">S" -"","-BiHqx","6$J.","((v","pih.*F","}IRC""" -"Mr~v","xU`","","k$XN*J","^\w","w." -"","j>J~kiIo$L","gm","NIB","1&UB:9aw-s","F.xAr1nE" -"rz5'y'","4/>AH","~a","g*GAfy","9XLfL!Ern","vW6SQ#lMMW" -"|uu`V1*","In'F7yn","lkaqoN2:Q0","","`","/U""Y7mB9+e" -"R5","x?Z,FT~*H","K~I","80;bt9:5$H","W",")." -">.Lpxd","rWr4`J*&","n,\By$-8+",":J",">\GI","h/zpf%-" -"hwg<1\/S/","d4<","d{D*","M","77fki~8Bi","" -"IY8I]=8p+Z","Ub=.'","$^1a]]R","LI6!","h","'T/&hi" -"qjF?cG};:","\38>Hc","e^+-`jJ","}","K,VXVZ~B1N","oES8" -"#","","P6\MW|~V3\","BokP#","E*'Ej3GO*8","rJ" -"W}su>","rcQcJt{1}N","c=0z@m(y)F","moR^X","0\XD","Rr8$,;6P)" -"::)V6Q|c|B","{v","tU","tH.f4|%cAO",",dA)w!uL*","-fY","_*[~W7T","f" -"QL","",")>X/Y","wgXEuL\","~T","![8uQ" -"","","M$s{#<'~","|d][","LJk","Osf" -"!oH","uS","Z7","QSz/","yXF{X@%","~" -" {","B1N{6swX?","T'}@2q4y","I","k","G!KgP;Y" -"W8D-","L+Fr","~[C,U8K_f`","+wO2","?Yy7","" -"r#,\%Co4@","#[Y0jL?",",D","o^"," !(paQF","" -"","3:d@).{","bmURnX0'i_","-p/*(@"," ","Vo" -"","P6Xv/7 ","&","","ohO38@""","=J):z" -"RX","","!7M?NQ","Bzi"," s;2","Dt~Kf%}" -"","OQV:t","LN=RBNVy H","NOh","3","" -"`uO","\-t)wk/hPR","~uQ+{cEI","rS_+&$a","kMJ7fC!","=G","{kp)Aw","joB","d^/e0YSrl" -"IMv$O","Atc5kK","0nTfQWz","KG41X^" -"yxWd$20qt(","gVgwi","?f","Pa~""","=" -"P&w!JO6","zx`D"," a1B&","h:_(Ie;" -"jk/#.d","&iDBe 8","O8TL8O@","WuBmy;hH[","","HIK4+!I" -"Y[;?j?z[4k","z3","","Ffxe-","4]6d/2Bd","03rugQ" -"PUL9FtNL","yaYi=5","#m","Xi","&0S4i)T9`b","Kp9h@" -"7i]"">++x}]","`%Jm*u1","`{C&6]","#oQ","UXA :F","rQC61<" -"`","e_t,T","","FMjz","K};tdY(yNa","" -"K0tM=E!>#","Q.y","2s;R51p[DV"," 8i","f","!" -"H{""Fw)^j!6","th","|","{lA^QA=US",".IZr=xd+","Tn" -"|>K-[k9pE","Z]n0","K,3s{B","@l","{j3f$r>S","#2ti6" -"l","j.HeasNPH","x&""<","iR2FT4Q>^","jnHi""u(J5=",";X" -"2_,ch`","oW'","DIGCYT{","{w"";' b*","","U<+}?2EG" -"A@lAq","00KZ]<","v[c&[","aT.h"," n!?6",":6" -"7+)wQHw#b","K%ALf1ug&","h7","5","rAJWl-E","I>""]KkD" -"L3}o,!l-A6","~tE.","2W?D","zWahMD","hD3MX{h","<$Z" -"[l8","|h?fPS?H","kGMqLEX","""pOx0","I/'o<8_","\\","^q5y","","X" -"6dnMzlxE~;","3h","&S","RV?wX_","lH)Un$v>","A0q;; Rg:" -"x46Me","KRJ)E6YV","S6","NxF3Xe`","5Kx@+g'","4{rXn7d;" -"jKKh]Nbd","mwvt$)nL_#","]V$n","z7lNQH2","MF""9;",",`k*5o" -"YOq","GCj^va","u@G7Qn","0\7","|","" -"h]","ntAfy7zi","0_y*@Oe~","B9KE","7;","B@\wW" -"M","n^","5%e$m'$)ZU","","Mt?]e,","N|Z1Q" -"{VEwFi).r","bQcI3","m.","pS(<","r.R;yx,5a","[xjE" -"kd(","UF:X(]P","vf(dV0-","UT#","y!Ut{q#","^c}e|3;H" -"$'A+","`","H@D#}2AP^q","\-n","Lc`mb<","|-D2c5V" -"",";^-'&MU","9{o}^(41]","<`","96s.?>L1%5","+?i" -"o~^","g\Mz<)(","Y","Vi_?]4!MFi",",","" -"Knc#xK'G","I_\f)<","xJ!","x*",".w~s$o,","""3P#","/>9b1@Mz","]G|/","e4UsHl$","J^YR2/s1@W","Gls\#$hDF" -"bh0zBn","","G#Nvg","}9%e=a\","","x""T1/q" -"]/0Lp","]5L_ [*","u To^","","{Q@","kyP6.uHY1" -"QUXjd","""1BRv*-5",":b6>",")fDs","~)._.","VSyuG`#1","`4:e!Hr#(i","T%KP",");`%R","t" -"[x>G'","~Y*LU","R\mx;}","?Khr#?yh]","pE+8\k.&#I","." -"!xee","XjR\ w","]Fg(2>D\7","9f[UR","|v","vYdyU7j" -"<;(zk","md@","]K1aK(S","mm","""$3|])p","T>4X.N}e" -"s,]","}i;vBr+","+pr-" -"\Gf" -"T-b","13lg~d@T",">]HMXT","J*bQi.Gp","+","" -"[= ?x]","f9d_.;","~u/WuJ","=B7","8(G';V <\","jJ1X","j.","%sS","St+&}b;qZ" -"XA*","","28@TX`?n","jbJg0Xa#:z","p9%60","zpD" -"","z","vbB1e","?q","F","MjTNN" -"TD;E9uXF","","XI6Qh'\$2b","]jBMoDA","R?Ezs","Qc" -"'",":gj","i","N8$7","}^"," Cd%@R<" -"&SOX7e9u9N","Tv2yH-|B","/[\*B","FH7%T]r|<","'Yl","" -"o{0","C'","*","cv","v}","" -"NuGy+x1!N","","","b*","zB,]5La","" -"",".","","y[<^oc","","`#k#w[" -"Qjb}22","B^D6o*_Loh","fVyvi)@","","~G","3]N_" -"Z~|K|f6|Oa","`WE>(PJuu","B@wzpD;","x","=",";tgXMUNF<" -">|(","J]GI""5{0.3","\wQ[w`D","9079X3NUW","z$|",":lM)w" -"@/c%","93ZJ.+=\mk","5ui_N%/","]","$@o",";!FlH4$" -"xcgXX","20#","PSUlab","Vkf","fW8","0A#>""nd" -"De!^",",}qqc,RB/k","c4\","sn#",";","=bgp" -"1Ryoy","*oUI+","Cd","50{0pm,n6","kt[z","" -"yt**","fy7%","Ie320&NhS0","3DP","Ccg{",">E1" -"-.Z!:^Y6v","M5/B","%~*`Z","C8CyOD","&q]","~" -"'pgL5/0gpI",",m[ r""gGx","f7C/N""","","*3#*;xD)!","B\" -"LKi","x9BW^","\O-9"," !D/zsCKd","|INL>4","o}:y" -"MA~kMkwsRl","p","u}","EJ](7|i!","s'2","Ds1-M`Uj""X" -"qn)dj.","""er","","HAR&x*1","zUzu!tI","QYwB&>-0)" -"y$","ZK_f~&fq(b","+.","%]ha?X","D:a7ypd","GU" -"","","$/U","","4P}f]Pd","`dB2>3XAoP" -"|Xu","Sp|?]l","",":I","c4b<0","!a7-'r,o$" -")","fUNO'@:P-t","@{@)(fl|","\HJ;|m.","3_Px_","Y]WHtd`a" -"@[+k?*#QT","?","Z]zwW: ","+)1F","pc?3Sigt","" -"lk1@:","cd\'",",dEl?","H4~|","YGq~g","" -"LSt3OV","v]1Uu*{","G(y-TmBL>","dtk","LNq","" -"Bi3Id9R{","3l""?\","","C@|_RD/w21","$=BDA8" -"`[ Y.0","z;{","+n",":,z","]lo;zSh","X`!HCUXJ/H" -"vR83Ib","{g","qm->~!","`nBroYF#K","|5",";PF\rfd" -"","}}","R<`,Ri",",","=T"," P-)" -"","b[b89C_I","K^!0","hP","{r8>N","D::C~n" -"hdyQK","""07:jB{",",20G?d","\OEvWr","+u","3L`%dOs$#3" -"qDJ[=Xp",")<+e]u","!_mwrd#^R""","[FvtG","i:","C~" -"EDmN","","@[i|:2",":M'yof 'n","(","T" -". 50`Ia~Qe","@!&<\Q","=","2M|$.7_w","]# fQ""T","ZVf" -"]t","+1& D.u",")!:aE'u~}0","4HA","d#qoS","O}v]3;v" -"C","^3.","BRU1ac.","c#pHg#n!;","lQ","OF^BbQ+nJ" -"OxC%[]V?<","#p8ur9g","f%t.+viSba","u;)K:.1~","a","<2~83g^" -"de:$I","y","+|Y^r8!]c","","9Xv?t{1PN}(","0C","]0T","5}D|v\\","=|K","+5*n","!ElE^e","4.""" -"sT4-'1t","H'l","^y!~O","=Ou5l,h","?","'1r'9p

d","-Qbvc(n:Q","c\gspW^","@ZB3","I[lL6M?xA1","m:6)bH""uJ" -"H*f5VYX","+2Jf6DL0","|Jj","^K.Ui\0>",":Rc","Atc9:hJZy" -"_8)_g9pe","POa)WT","""lL+b_eK","Cgg","Xtb","R" -"<>q-@""w;","\x,%T5]kS" -"M[{:ip(O]V","U# P.AC","44)vfbfO","3","D","1H" -"MG","92Q dmDH","8K4Jn","","B?L","b4rk6X~5GK" -"R!cYx-","S39N|","VKcj3VE","{St8=9w3`w","7Ex^B"," F/XxD.O" -"+S","%","P\k}IW","[ZF(9a]bH","hf","u" -"TnA%F){`j","e2;","-CT|6([;","w","vR8^","w\O~|" -"I.L","","3[`","Bpb","HOI-H","I%" -"Ye4fq]LeS","n^","Gl+>eX+","n5c,w^z q","M+Wg4","MK1y7/s" -"","5","Z l","\R$dt66uB6","","7vtS" -";p","L","r","4:|i[\lk-1","0[?9","L-!c:.Z" -"qL2B","+","pMa6-","-7T?","XrSN$B","~gH:4u~`" -"V/q","Ne)2lTC",".r","~","bo[=","c xcta#zU" -"*s","w'Kd,(6%K","","dTY4","Ud/E[m7d","" -"WF1~Z9ey","q","2W\o\2","<=8R8{f9oo","",";AOU<#Z:~`" -"UAd","J",".b6","8DN^]3dZ=F","rmfNjZ1{","1!iS!.~M" -"1U","phL^S(k2","","R","b(z B","J5C+zG_" -"M6I<]KmFP","#U}l3Ej"," ",",7V]h|lMYE","nk'@+","Vsh2" -"1an/.:d\Aw","w)I1","*s-VWon","o5N","{r","M)n" -"N","@ta","ld(SB?/|",",","].R","MY=WFw.0!T" -"_2_ee","AjD-]U",".}9","""N3_-","Uc)z4Q","" -"`Nh","'YZ_K%","~3v>JbjK*",",aHA2T","vlT~","M01cPO:d" -"%""=/","A,KeHm","-5qe$oa","","&'Q~I","5z5P }'" -"Qq])","","`8","LJ","h","u`" -"@o#NVZ9O","w-","IsM[yR-JC8","mz\XUEe ","","z+EjF""+Rm","h","<-|R9Ni@:","","Dr{/ZUP","t_ m\<}" -"6q~","&5L3","Sp%1t>mw~","","`>/c-","R*Q#cCo#" -"0Y@j8","r26#|uxSC","#o\p]Y","!$A>,]yI","E'?-",")%=Q${7(Z" -"iI","_9IG93yU","Yli=A@gi~","|%17","""B,y",";RoMaqx" -"@wh","W'2N(O0K","m=4FW?K)m/","9W$T","^q-i""","7:r #a" -"[X7aL!X{4",".$","_;/_","|IGc=8A","r#k?},Z|D","v03x4)c" -"h,)","g:y^","1~k","j$","!-wcbhC","!mD'p" -"i]f2,ndU.","UO?yjn0*r9","c8`/1D K","szhv)V.->A","","XSoe>" -"M/%gr",";KW"")5","Oh`x","*ib*","s","Xoz-G(JPa" -"P%*C8Po","{5Z","v","6Vm1mcw'pu","D>F3&8[y","09e*cu" -"9kK@4^wz_","G","> ","HuJ4-","kY]5vhxy","*H?TuXW","PNA6-C7^Q","Ts:J","F" -"G\Sk","","I:","^JfS>YGRD","H","j" -"","#E""","xf^K>eG+Z?","7*&ou","gx>s","c^!" -"D6^j"," oQ","S{",";w;","4KC<(","" -"Lt","&gPpli6}|(","Pr?kT","kNcB3e+Ck","qPnByk[r","]j;v0PutuX" -"X$k","=)T)4!q]Q","'T~rv)","","J'E[um","IPt\'~" -"8{+<4s9","NL\j)l4j","u""69pBva>c","o0o#%:Ad","w","~4","!F" -"z>R`gOw","kD>IZ(](-","B","A","%@8@","oSAp,xJE" -"SwqY ","ts%0H","h","!>","k6W(}X","v" -"yD,Ypjzv","mBs6","v","#f","4T @@H\W6%" -"fZ*1nUi",")xt","nF","D6U:qu[*","R=cLp$r.P]","!cxpw" -"*w_njO","fvK_2F[%","isa|%$X[.","(viUh","Sh; 2W","Y[*^.n" -"","\#I\M:.4a","1np?j","{","","p,2y,Q" -"(_lTsz~=TC","veCy%8zjpZ","Qf""Vld&8}","f$`gMUQFc","&]","I;`#_s" -":BcyN","GjB6dZ{Rd_","M9Uh","XPa","s':G""sw","HT4K^xOLM" -"""G/Q""`","`R3Ibn""","PjJS","!",")","4" -"$_,~","dgvVy","yy}e*","~6`oywRos","wP:)4uW@KV","I","R}NI3m","'Yt;V_0C" -"0vd~wmZ7","","","t_SI;r$","B{G","{E*&^^j<9'" -"F*oK","(To.aG","4""%=g3","Ig46,}ZUN","W0zJL","D,7[&Jy)." -"b7S",">cp{^ ","x}+J","","Y/DwZAg","*" -"","[es\x;1~","3Fi4U!tl","","c{*+S",">" -"uH","?U+$[[Bp`g","'","N5S;'","","""" -"+a$Ms?8ED","]ve~@P+""I","7Yz","_","qI)m u" -"I\?","","<%Wu'","yviC:vV","","n84" -"[fX!\","","L|i7B?(","YO@kbC3","Bn/""","nF#*","","","T","^M%WpBd","C{MA" -"k0^","bgO<*","U%{K:bA?","D","9?l`Y}h","YoP&U}0W" -"uQ",",pI['i^","@,msdH5","/&`pE'","GO@3WP","" -"p,D5dY>F","#l)4:z>Q","4Rlx|(","BV1/5g[w V" -"*|a1DL","{{k&bY@|ho","Mn3-d#"," l%-J^","j","GV/" -"Sl","dka:`a","HS+Px","pF`'?'C\8P","7_6(Hdq-_S","%He1}qQ)" -"!)F","xHu=r","5yCOXn3V","Xb1+Y;>>)I","JU#i","w4-1H" -"cA","-Z",":y6J`t?0J8","Eb","C?f!","qTb^?c)>I>" -"(5};","i%","-TfO?~3x9","G.(~tDOl5","[qc4","J`E^c<%" -"%bj0A",">4F","r%","6^","%7oXb@Ba<","JD?t""Cj_v" -"Q","","d","5{D",",","/e2H1N","=aw?c%","}zx1 ,Z","PY2" -"yNmB/UQq","rf^""\","qya8x","PKVs","x+^ O_G6","cL" -"","ZyRxpw~","PCajf{$D5","","G&","Wqi_" -"`""ik","Dnem6JvoL(","iVBg H","","aJh""|y9","8*","$\68\%zv","S{=(a!R","e" -"cy","","UTl",">;>x+\z]"," %^","k" -"4mt","P{;2),_","^,""","PCo[","Shop","K9Q`z" -"y:X","z:","gvJA$OfYw","9c~GX5OggZ","$0","t-@k>ry" -"","C","H{"".c9","0Wq?9","4n#|","piP^," -"s-oj($O","~HX","c.BSEk=H","mUy-4]{/","",")""BaQ#" -"z","","$7?3j","k~ 6;(""l6b","Im","v" -"7""U\tJf$42","[j","[#x1~u]4#M","j:","z}kk94O",";G1-","Js","mXK<--FDb9","" -")M;#*S","i","&9;@SIX{;","{b)}]X","51","/-bN.MN'" -"""xCY","","'61Mg3y\=","$/j%Q)/","TW&(h\i@GP" -"Du!","""'Oy 'Z","b:%8f8=XlE","T{0""HSm!3","`*jxI=","" -"9","d$$","o}8t#C\3P","mYxb","%Dc9*JE1","Z`""[B,U`","6AzNGtXWt",")2I!G","++'Mb@tux","~H2E.G(\","}Whl"";$-?2" -"2\","cQ","Z27g","ICj]n1" -"IrZ uQ6K.v","x0'#:s_a","vI" -"sP+kU\","[","g""7_y","v\f$x^","!aKiL,H","Zs{Rj" -"snNQ0T",":{rD","&!","k\`TUNSTtW","4f}(7L]G","" -",H273~a","l3vF^S","]ORT(Qz","NmY","4","Q" -"Ty|R#r","X","hJ#f}Lu|","ME","'","" -"=aMV~#~<","N,","-'Csk,J","bWK$tB.%i" -"i4k[NdH`4","U=]v38GLuQ","\Wu9r.iSH>","}cLq","{ '#","whfKl" -"~O/{",":FL""7;","?:\#vur2ZX","R","Zw8zZit","ZE2tfb>" -"=#/Y*S","QrvY@wv_","0M2){","fOAK@@8","B,(K&=8","Y" -"/r aTHPl","?","xv%zL^c<",":4f7e","Ij?hV_?","0z,-z!^>" -"!1mLC&","@9)@{y:","4QF","m?*^F","!G8","8]p^]J/","D'.v|j" -"*o:*y )v@3","#k","2?j/O_m","A:Z6>`%","E.diTT&,","_rohH?","r.'_-Ysi" -"EMJ","24VWJ","I\""6}LQU","*t8e^fNzhN","Kr#w","e7\<\%@`" -"\7GnX}","","7Pd""k(0'^","]","''N""FP)Ck","-F-7dL*z{s" -"uTVk,<t-;/V","k\",".","w7#c.W" -"""+@),:V'Rn","$","*","p&0UB",">C","^2q2i,N.!" -"F|p","l3?ZvpN","DDPW","" -"NP B?[h",",$6Kew","?>>01","","#cn%1p7c","p:" -"i!","Qp+:h}xiL",".]%5""nnP","DZR6|>","-AC6`C6V{7","YZ4Tf" -"I""}eD;{x1A","ICnW&]UU","w/+c/!","L""p'","C","(k" -"G","6n]u@^x","fF","8Z. 7\\Fc","4^YIC6v1"," i:IYq" -"D9k"">J-","'K`]]V$&","","-A'{51I&.f","T!","QmWc" -"go'4Y_","lgije;}C","I+aC","0U^46","X","gwID8[s" -"4","(?'t{4",";Av@^","Ln]","1_&_r=:,","?kKf'=5}?N" -"2W}LdI0G-","W8Ugf","wfi{R","u[mW((Ln@","Zn!~4CT","M/dUo\S)G4" -"%","","|~","w%Q&","c2F/#3M_TQ","0" -"P^","SBM&'OuL","M|6\a:+$","","}","(l1Z75N'" -"3?kD/c_@""B","/Ln:ZH,d",")4ykVY[+z","ZcP","i","{D*L/" -"IdN,Lh\gNA","W<9xisj","Yt<~KVR' >",">*","qL4ELo","" -"M+VcI%+@","u<(2[","" -"V_UoQmTC2","dSLJG|","4BPdqd.Q","iR1t6","fPdd=","oh=7&jn" -";pbA","w_xz=zr","%(rE]","=Xb*O","H%","'8WbZnI>J" -"","/w|L4lA66","","Hr1AQM\","0v""3","@\" -"sR","PMS{*JD^Da","r4f!|S","m$j5:","8,f2e-wo","7D{,mx!" -">h60}P@U_","q1i1","E","2a_","a} ","0V" -"",",eT&F","C",")S8o`^R","kkeF^N^","(s4Q_:]" -"9TlG.| [pe","pv","j1gu",">>","C5v'","gNHt1J" -"fm8 r8]Wv#","dG1wZz00?k","N+m@","a#I","6","07fKI[t" -"",".s","Y",";Iz{","","wzVT*" -"4kD`9^bH","BB639","U","aE^!zs!dPX",":5B#+b","[OK}k=k" -"[6","3r7twC.","\Zg!^""*","GbT<%iC%4","","4" -"T|","0 e?9#rJ","m[+Ud<#[","fJ!n0sQ]","=3?`z0","P""~" -"","\)","r`#-qf:4","+D\5c)uLEp","","" -"""X~i._5'<","=G~e+(L","","!d5Htw","<$w_71","b" -"Zb%ia",";,GBWibWi","""@","`#rmH% g","'faQgw:s,zVCoB" -"M9&A&4x:pY","Es{})","5"," l{hN)" -"o0GC[","","Gu","cq5ud/8>*M","s%SR","#s " -"Xo","-vuY","dFF/J" -"Cire0-RGM*","])'Q2}0K\s","$)8\","","N6Wc0","/u1N/" -"QE|(","rID/$UC{a","INp|dv@pS{","hyoK&%pq","yee>*G%yR,","bBWJw" -" +","e@*:=>`B","woR4","7Q2@NPJi^","_G3","" -"6z""","]~@9","-K+j&+yY6","MeOr=" -"}e:7J","j\WVx_':Rt","xW{","$AJeiS","Z!Q/S","+=m]" -"\",";v|C6`e85""","io<1?-+","!:'N-","A,$1]2","pV","vum=ZU" -"e',.E&EM[B","57`=@kxh","):3:","u0zMA'He)","=]cAT","V`NW","Z&l&~w","ZjiEt","","","jc7" -"*=jgc+fL","","n_l=Y","^PDTwcv~x","u&)$Zp qYU","<>" -";E}","G]CXC","2 e7)$=","""","U9><}j","P","gr","M@5","|." -",Vuxw>S'j","$m[@8y",")4u3[","Ga`x>K/+>","}o","~Ot" -"^U-+TT","FHD","Z7fl","H$","OCj","t$XV" -"5z6P-","","","JS","[7<{T","/L\y=1`Eyf" -"v]K\4fOj","w'oI$G""LM ","uum]Q>&nM","","~A0G)WH","il" -"l","4","mn?","ot#c","VzP}sy65uo","$',u?;Iw" -"8[$mIq*","6{Z","WV[RiMU","Q]2G!","YjZ.W^EQSg","#B,6" -"","DS","W_=O#","^VP&:Ed]'","AB9e-<[","t" -"tt",";","6OXm[","5!d5nS",".:P","60(48","","L2nv96","s-","WM""x:%","xx@","","w@","F I-" -"{Cxh","","5P~ilp1","}\cKj`","hR}?Ae6J","z!" -"*K","|WFI6","YBXwY.bne%","]k9*D@U[5","Y\G","" -"{","am*HEtW","","xXht","g<>;rp|A","2\29#9-o2J" -"c9w$%2S","","H" -"76Bi4:iULa","qX4""J","/TJb","; ","","R" -"","Q\hZ%3CU","Reo^)yTz[\","P1","]wxJP/","" -"!M","KV)","g3O:SL VX","hl+y,aai;","c`","" -"-qR(>""","V;F+!","1","%@vN;%","""p3pUC","4!^}vE" -"c","{(.(`*rjt" -"}I0E:","","cP~&?#","uIXH2i!","H","Bn1]X!" -",lU;8d[","xbSL","y","Q f1XNt ","r*8Dha}","?*[Hg~Uu{" -"tV","Q nm","xm|.","*LI91.F@%","" -"^V3w>9d/E","@X","k'~Pa+","\Wf}","d""NRf*ex","Q2@o,:" -"WSFyMp","r_NG]","^^Z2<&)H)6","a>}""`JE","W ~iTZ","&wqU" -"p,","2jqA","^uhS&~YI_j","Pl ",";#%s9.k","r*" -"^6ny:","","(X-","E]_b7F","9%","" -"ZxI=TB>","wpok","AC# ","*yr","g;+)","" -"z[@;go`=A","+g2","f","W|M""5I","]\m1/aSY6","Wi}b" -" c+^@r","ru6z-c*9;",".Tc29]","~vj36qux%","L_NQ","R-.S" -"xMe:iI8n(","=z}(H~","oUFP<","q~6jat","Fw\a","~&Z$!-&[o" -"o~x0qMT^","Z 5A|",";","YAo[#_'","kJ9-DCg","E=DvK)1;" -"a0aM","%","GJTr4q","gg,SZ^","","i1xA7" -"zdC-M~y;L","jE%&Y","IM#dixX{fB","","sTY1y'!&","v8 GhpP" -"c+*)0","","j`)rF@Attf"," _" -"u1GDnO","0c78Lb","sE","v1+'F-oV`","Kt","+mz,h!$h9N" -"WBp%ZHHxP","n\:j,Q\yb",".7!dK","I*_Q7","'S'~C4(|Z" -"3Q0zA[Qcc[","YmxHr@E0","Ks"," iz[Y{q_H","0","l).1~" -"}{|qK","3","","&y sNI^T]]","F@]U]Bw`A(","-" -"j","1","Hg+`hi","HoV","S""2@+~[c7","" -"sfH","Eh]Rb","uC@}xC5B+_","w@","","8nn" -"'c71","","c","~':E-","D*qwlE\)X","Q&a" -",0","OR","P~loB","QM",")w 0 ""","`n" -"Ef&Y_Pp","^",">]6p""ZSY","m_lE'","g","FnJ" -"KR","wG SN._Nxx","DH4k^&","A:~C","E","uXnx:N8E=" -"M","","IqEa)X6G","{-7^HZ","u$F","G2" -"yBy5","B_u_X8","QWT Nij","rhg","Vv+:""","" -":;w","2v/H","z""`Ie/+9","|Uo*","Po,td",";DT~iBGu," -"`s!(p]1RXw","2iC/#a","ww=K%[aOH","N%Sd","aeyD","K." -"]obQQjN","9;edTJO","^es,C""","n=LqmBbY>i","tKn7","1u`p" -"%","Bh!q.z^@vK","kjVk0GJ","a:5-","","&dQ" -".","[U?pf","S4^\$Z v1","]/hM#`*","=","Q`Td4RP\(" -"d9d_","-ly;SO","0y:bX=Bhb3","RAgf",":8XqzEJ!","oSUDCyH)c" -"Cd<8",">","}8de/[C","MVdTrzCbbW","","kSKS=D1:o}" -"hvw.F","+SBS","\`ZQg","FX,O`EoVf4","4tg^!i","a" -"@Me","w:(Rx","mvlFQv++Dz","","'","p" -"""","94'6Xo ","+'",")*Zj'","g","ZcUj/[S6(" -"9;h2R{tS""!","! P","y","T2k.i*^&s","vM","{s&" -"'KnsN>DO42","coPF","D9ydC>V","E1q ","Vl!x}","q+z}urY6Oh" -"a9>o02>","X%","d34MR","P",":G","h|hod" -"YZz:y","elx2$'d","q","we;K","k*^Flq","" -"W~]","p7X","CagX_M_l",")_@","","u.&" -"","4$C>4_D)","wDh","h%25t2+","RbpE","/pcf""" -"!",""",y","Iox/yx","65","JEflds7","5+" -"M^.rY","Auvh<{_Mq","[`M_/ET0?%","FE""{SR[","Fz2A","z7-/" -"'u","]A","r~&""JH@p~","\UD.","A\}l","Q7%\Mr" -"3%","x[","","h3s","","N@ZFRUsX" -"']|","ERo`>Zs-.","]^wq`iuk","E","CFFBG$","Ek" -"_'","?y4^""Q","B_-","{s","SG","a" -"GCf}0","+E","'x][Y","g$^h3 86n~","t {KfF","","wg,U[7h","=ebag\GxPj","" -"?\i>gbAOe","p/\&$z","INQhg4)=@!","P~:;bf","-","Bn","N4=}:\L3","TSJy{","(L3NVw","hDM'L" -"GP5`LDVx4","h","Vf.","U^|ggLhK=H","py^du{=8","C$w4XM|kg" -")Xo>x07","%~V{","YT!m8g","Syisp","fb@ KU","Z6" -"YAB:ZA_3+","~TPD","Lsd6QH","58~&r","","X^" -"S;{","0I]iC?M","n+U_e","K","P?Nm#K#;Y:",",lUi" -"","KpP","Pt l","}I{bot/ts","=h M","d#dH5eTqf" -"?4c46%$y","#C$Ib5H-","","*~eM'f9","","G+4Ut""9G" -"dL7|",">;","Hj{fQK^a","=}?","zX&<@N" -"t","NGgwnD!","(sKfr","33hqVpX","](]`R","GH_|}x`""O" -"zzzC$T^EO","FLYu","&0Xy~`\Vs","",",;>d0ag66B","d?#" -"~","OwFYcF*%","P[hQK3z","SZ1[9xjnu","v2x{"," 4/de<" -"~gi5\ua ","D`1C)","s_[|[Z[jM-","sAzDoB3","'JZKhhKU","qi" -"/r;?fl""]","wkCxHw/@bp",".","]f_&**_D","Z!`eD","BxmNgUKQ5" -"UBQV","fM0]?","ea+fC)B$","}","\v,]c{]<(W","0\pw/8uy" -"w}duH","y4msg","(D=OtUZc&t","aDYIZ","k""<8S(v","9pOU|","Mi","**""dU]" -"_cdC.`/=","R%na","wW","Z","}UC},.S","L4*L" -":e%"," w>i","a|%7j","=%j}(19g;U","vJen1j`75","qso" -"7X:HuS","hw|Kd","z","","3hz$L0S$T","nayBvnNzl" -"UU",":{5U*TS$V","@D)0I","x$G","^mum/","p" -"?V]J!G4c","t","~]O","wk|\ t)M","Nm7","Y&m" -"OR+TUs","`","l2u:a%?c","'d4f","' w|","{" -"7NS6r[@","m:59(k","4pT[m9i0Y>","","6A<","M!X>*{cQ" -"","uv[<","~!uMx=m;K:","KRK2|","j5","`X," -"","9pY7D-C","/","CsPr5M_$eH","G6XJAu","$0qg'S" -"rzz","$8W[ejr$q","","b\t6>~{~%","z0L","=" -"(""C.,yOR*k","E>T|",")6nK2E>","","Ma)vW%","O4" -":Z#bMS'K4","B1R`+8%,","[zNJlg?","b}","t<.c","=e}6A'ZJM\" -"zeYk'5","-E%??fT","~3NrD","","0`SzOR_","&nF||\P/!*" -"j4X6t qZD","$&","VH,bX/iqx%","Lb#?nJOL","O@r""","~pV;d]=!" -"","/6S}WJ:","qw\D7&}|p(i,9",")Gt6|s","36lpT@","iuQc" -" WpI)^Yas","FeXfJ*","lzljk.t","fD?Cq","g",",(H1Vh](" -"q""","","<'az","M[mi","*%Tjk:fY\","iyDF \L" -"7T*uj","!ih","rqXO","\h3i*i&","lx/cL,Z?H","}Wwn@Ug@y[" -"dDobT>97","it","SUGaTg?4g","[~Rn`Vqq","_?oI`G6@P","fh[" -"i:9oaO:;@L","XFt{%Ll\","?!7|L8BG","l","ZKJf","","O","17MvwUY","efGn","pBx{R-}Lbm" -"$1","t7Ra`","fGX","kVD4n","!C4Kg>5Izk" -"r8=NCPVr","t4@7e,(DRF","wg3a}","bUXZM(Vi","1-S.M","Yz@" -" X%v5j9",";*z","" -"ck7\C","","W--","3Rkn.XS","IOx7>f","#HRJFU(N=e" -"jU""[fymZ$!","","As~1RPB","*SZ#M3","Ea9-#7 m:f",":]fiXKd" -"$`Y8bM","DEnVz=&`","nG;_EWiji`","((jhe` uGB","2[d",">#hx3cxOS" -"C*YAih^ViO","hOF","$Sagt","qC(1!B%","C>>Q*UJq0","@" -"Kz)HE","*Pcj4Us9sx","VXI]f"," I!Otau\x","l9YKUpq?","" -"","CR8`","rb>",">Q\|D7n^;","cv~","fP(&" -"VhMQ","h5E","","\H1r}yR","V*[}N4T","I" -"{8p}*]NO","HZ;","':cu-<*d","KG>gw","/(VFB4d","o$*9>/rQc3" -"aWY","Nf:N&R0pR`","+(1*f4","-uyDp/*Cf","lMF#","B)KTS.ZV\b" -"S5Qh[8ox(]","s","5iG*?U;","uV_3,","YAzid]Cmg",")" -"r6$K+","'J","fR$R","K50uWL~","9~Ps","JKV^m>.9","CA?A]F({",")hw'$gVN","" -"T9'.#Q8LO","u","_65","|6>l*","0_""""","0" -"yEh^`5C-","Vm""D","qO","d/mS+e","r[z" -"v9hk/Qfb","1J","%HSp","","DlO-e;;",".*?48=:Au," -"F=(tb","w(B17O<","kId-""6l","","52","+gbm,z,aX4" -"'=","r&fL2UD","5,","q+.","U0Z6MxY[","}" -"CJ)O-","#E]vp(E-","#y","nN'nfp","?e&6MCC/","U7k","zt>)!","9" -";s","hgL9","","Dj{n","x?|PL.b","yac" -".6dc","Yq^im","|","1J{","","" -"Yja""M6","`UO1w7{pk`","b^h]=1N","2p*cdX68","u]|aq;ol","g^ UX1o-" -" 9V5}q3","Gf","","c","i","*mBe" -"k5Vz",">","d\?!*+5B","-","q\5j4","7 ET'" -"\&""""","\5JE@h`r*]","","!Vf"," ~","wF$+`536^WQ75a","fBF-JG(5U","XeQK!C""d6","D","7JCH" -"tgv((?2U&","x","W8ddA""_}/g","&h*s<","Z-t ","8$" -".VJR=B1","xG=`]s","yH$j","@@[W","R[@P3","( =0]Cc3@" -"O$r=/s|","vt:Fv","","V{i@_1","l.W+-E_","b!" -"5( DQc*","'}AV\",",#i{):#","Q<&fvv@ @","QQCLac%v-","&_pD" -")Uek)9j","I%GZ","r:qC@","QG5S5@","FB(hOn,","#yT." -"","UUN:f9<","","v^7v[IQ=","7","" -"4n","B 9T+;6Op-","U%Ug.:W," -"4%MMt97]3","tf","C-)","3={;CYcQ:C","b#ZrVuwu=","r`/OZ" -"|LCn","LD+S_@C\",";","&qY*","sR-","(i"".`2j" -";I","K;%","a0OMM0","J$A0","R\c+!#]","p@Jaia^8w" -":-fzi","jeDk","^D8`","{g#U*$,C","5Y/3jU2l2","i!w LKb? g" -"g)^","v0\A","dA7n A","DI","@-^4;Ng`1","" -"Q]WZ7ePI5g","oWTo6V|","B>zL!dKZ","9","&'_@SR","KOr" -"AE#:0A^;m/","f","D9","W[l","Ulp}}ysx","e*dsWDA`~" -"0:kJL","2=_JO","i","z[QRG^Z","zzu+W","u?'];_[?,M" -"Qx@z0-}m","wKFe_%","","2Y?S[QE61?j","wbvhFqO","3w_sgCNb;l","LR" -"\~5v","`z","","kEB}","1?]?=CX32","S" -"sj.m","~`22qb}""]","^F","`COA","@fh,UR(zU","5lx6pvQ$M" -"Eth>1lx-","d[/Qd>0","Ust-""z8","w?","[)*vGi","[x`.|," -"v","dC","%""","x1i2K.p'=","E0^&^-","4Xv?9" -"QP{0+*",".'~|$[O-rH","d]Uk0{Y5*]",",F5AhPgNw","s4G:9Z^(5","?8R3V" -"}!&rF","Qd>(EU:K73","I)=","-_EO=>","q4*;","!1" -"48`\","+?D""W","r/Wrjc~3@y","T","*{:t]e","[Q~tiplY" -"jaNna<+@?","< ""!%u","","agI1IM","","D(n8(7" -"","k","Fr\{*J'Z37","qW=[x","QN)","J1" -"S9fMPCZ07?","r40rg3A'","[d2p","1","CJ""i",";3;4(EAn" -"4,=2?;A$_","","kdA",".fl5","Y","c{z}AO#Q" -"S,`)>?r","bg;dqM&^9","TDJ^}OH6!_","&& A","utD.",":Z~GUJZo~" -"[:UMq6%","","Wm6X VpV","YjqrGsJ^","G(@8_","E" -"X","Q?:","Oo:q$S}","I/`OG*7","","e" -"P?G}/zAPqd","pi2$J","stk>'Ec+gZ","RLzg2*","(#t6RJ#v","/NEi`!3*" -"}",";O","","xqEvY,Otf","4VeTY|","Y89/" -",'","\d>y9^o-C","&DTe4","N6kMA@8<5!","T","Sz" -":4lcZ+&T","^v","X6pZOs","!/z",",",":xst" -"<).Z>>$","R","xzY\>","B7","_","o[3:ZZo?" -"","&>=","g?$aElH+","B9[","O!1}+","R;0WgK.","%o/Q9y(" -"Z{F0x|=lT","V>UJ#7r#v","Dh""j*^","`","&Vk))5I2]","'3:t(&" -"/Jb","`xa","1eI89S","","v;mdlg)mh@","" -"","J/'\+","","kN","<","@WF2v_=%rc" -"","|Wm,ob/","TuoB)K|(@E","ZP","|f=xY)/#U","Al(D","+",":iX" -"*n","ug pb[dHu","[aMO*7Zwx2",":Q@U!w","p",")JPzK" -"+vf""8%[T","Gxv}?","/YsX","PD\e\DZ,","","&,`z" -"7G[gJK.1)n","t+YIExD>@","U0>$NA]$","yZ*L9-2r","|t.L9U}q","" -"-,hT>LR9q","|0y","&","=Us7q^E","E""nt=c","XtT~" -"^",",_J:XO9","u-Xl$(+%","tU)W-O","j$,$a%(\i{","G|O" -"Mu","/j`.5H^>","","H`nk!_Hug&","+$U]-}M","MtU$mX^lP" -"(4gk^AxHGK","etSi$+","TG","hs|4I*Iv[)","","|&78" -"","{sjW\O""","V_","W]AlB) C","t>z`]a7H1","=" -"","kT","",";","Rz>_mPR","H]uI@s6fU$" -"j!3tLX}C","\N|(","TJ,nx","y^C","z","6()?O\dBj" -"}1J%XD26","Zm","a","q29b","pTH3","mt]tD.b\XE" -"C`","%$L%.xb\","MT",",","%rz","+SaFh@PJ1" -"n!*5q","","EDMS&""","","T","" -"+","sW`EfAJ#6D","","c&","!RG3mS","}a0qwjc}" -"","4","joB","8BHb]Cn",">`" -"`Op6(CdKN}","NCH!P0k57","a|!O6*mi","U""%yC","""0G~","C}CedO" -"\zz;0","ZJv","-~<}re","","sa4mu","!0" -".=O6.P<","?O$ss","U","65D>X$\{t","F>V","|VNqC" -"l","U","3%lv=e","xNa!ns","[rux","'mX~o" -"!Fmx4V","a.ik","1q","l6HzDDl*)","Y0vi42]`","&Egq" -"Y","r\N","FF","|2[;","ez0H)B","^Fj*:_" -"pI=","",">[9vK","a","","@,_IP=NR\" -"A/x<#","J","O","h,R""zSi@y3","QD:sQdEU,",".W.\V4L[`4" -"M3^F","0""CD8-xd","j!W0","XX;","j-u8OrgGw" -"lt2cth^R","","8>***B4o@'","_4","Ew? ,","3j}qe`" -"~","BL ","f","o""r J","G^f/,",";)^7" -"q-;:D@GkwP","tw8O","|8&","sDgR","w{eHl=Sl","$}" -"hlJFk"," ","\ uI","8" -"J#;Q","\N/h{","u(eznIXEoE","?%g ","myydNO","cd#L !" -"PrJ)T","v","dh' $>","U \-@~m","nG","/yk" -"$L(1;",",-3n}J","a_-d,j","3","]","!mY%jv2" -"&'Ry",".4","",")i]rP-","4","$""C#-QF\E" -"L&AIt","VD]\B{f/","`is95zj","}F8FY","C"," " -"*(]e(1P*O","3VT","P","}l:>s" -"x!?LmJ:sV","^Ce@DW4","5E(3FFNc","tUd)Om","RICDpT2!S","&Th6m)W)","?veTq","DQ;""_}i=b1","'g>" -",miP3t#_","aonhrAdul)","""Mra.","&c","","DZ" -"J)PLS}XL","jf/&)\qNZ","Vh","r=U]GS^","p<[hHDj","6(@>.O0Y" -"k35`p%+~F","Eh(J","7hek_","=l]$?`_","O4Ue~","Ob98qPm0Hk" -"h","~:l;}v","(","Q>!W@","&4wfpNAO?",":hwj6Gb{IZ" -"36jjAw","`[w","(,wN^x;j3B","+#vX3wFS","","d$3/?" -"xiB","T#rzlr}","BSB",")","o_2m2+Bm","~r<4eA""5$'" -"H ,uT(.","f","qdyPW(jE","xXn","","|RI|" -",'K","6.o2eFt","","=?7Qfe6","`zO?","+(=x5dRi;" -"/iON","A$","^X%l4Pj$","E$f","2","aV" -"2-#ki<8(.","/h{4}7joC","gu!2x1","8(Lf4nv","<","8_R%H" -"d}{f)k]dy*","<_)flkg-]1","2/","MIE","=R[C^M","(VG+" -"L2I\> ","Pb\I{c""Lf{","s?z(,PK+_","Dg~,lDuX","Tx-T","fG","bf""H","[Z8I","Y[","+D3^" -".6f","y""-(o","Z#++~<",">9V>`nPz","-nxW^Mzf@o" -"*,_E*0","<7""j&[O 8","#k@)>,o-","Os|","][3",");n" -"","%p?D#5;","]r@r""IDmD","gg=Y","f05fQ&.}#","it(M+o@_B_" -"hgkeED","uHh_ra({",",(","/","$J#.>7","$K~3" -"","=-GsX","kTlfow","&k|!","lbUA","-'We" -"{j##","?2^-2`Z9(d","13|x\B(Lc*","m9*B#","~7hy","l!q5" -"TBnW,\Fe","uaOtsq","^ID7rR%","2;+wvT}c/","6&&h","59CVp:" -"=f|~+H?t","5vPij","~;e","z8UWCu$\T+","G","E>H0" -"1Af","`O&J7","",")_n;iJjz","g=n^hSUF","mk0;3(VU(P" -"UXiAM=A","","@#","xtdXe-aOgf","_Kf._Uiev","FmUtmgr;" -"TePh.P","7AV_jW","","",";8gh<+e2","" -",nO","ZPrOobHD",";bvU(F!qXr","0W;t$Lb","@","D>4K." -"","5","(L","UC7q6""""4b%","C","T54be4|NQ-" -"PVYwa","1H""d;+M8O","","","40GHJg3%","O" -"x5GywI3t","*%","eUJ 9mY","tyO","6lKipQi","_Z>PDO|" -"X*j@","","E","hs","~X_Gz^m",")" -"Ia}P ","{g","-","hzz8[vQ","jB\X>#(+""","hDy" -"Dl_4yHk^+","JPSQ8(cqSq","H!5{sSA]g!","Y,:f*2","cD{NE&Bx'I","" -"","RjIaNtq}^3","Y","","RyAvo","4=0ORc&>4," -"B5","","*(ZW","","J0Yd`","{`zwlvi" -"qEy",".'?MP","""})m""_","""4jy2)ac",">bR,ZDUW\","tP:.z/g" -":F","m8Ema_","",";B\JGV<",";O Nr0?Q1""","4:Z}" -"=|r.\rLwL","0YN|3|gLr6","Xt>K-'L","OC,tw_<3~:","",";dAJ""^QO:c" -"{","]_r;","|",":jqsuf","k7~;V","O" -"od.6I","rK(#","C","$&Z","""R4n 3?vmC","z~R-B.Z" -"ODBbMnT","{",">)LQ","#c,K^7>#","BS9]","eC""" -">","Lf!`","@iL","iVb@EPA","","eu" -"2\*u]JVd3","x9w=xu","_`[7#8XRQL","Yp","~y6P","@W5v`\jRy" -"vh2","I!","A.RYB(",":u~*oxp@2","P!q","[.(F'!R" -"N?;4bJIYx","j6TBnK","","D6CY5","","D" -"| 9${?0","ZnTB2oM","}kq","e9UEGq74A","~","UP^|7" -"*#/)","oW$F,wL$ ","","z^C\N:","","lIX" -")!lW53=$C","!EJL8==","5(","W(TR2o","zsh%","Q!lb. mCQ)" -"\ZV5{gFy3","k#xTOtdqCH","Q2Q.\iu)","NF%x(","M","o)U" -"zeA,5G+","#Vq=K)V","!" -"{>^@j","iTEL|","Jy-_SU/'wH","@lh_","]+l36).","csK0M" -"wQL_","L","Kpef:","Q<","15ho( r","c" -"^(pD","\V)%","uV# H&%)}","H]""#_GU","Z3^A","1""" -"][SBqb2","sm","z","fj]/9","","@J>J?syq" -"$>pc@U","Pc\",";+m6b66ydo","+?jE`.\Q,2","{iQ ","" -"63HSx","'_+eJi","yH",",vWtmMy","Y","xgPWJ:" -"7l39<","","#:SBey#j0:","n1r;{)","B_0C","" -"d","a{eaS _W7","[pZC}4xc","mx^&c","6Xg?#e","" -"Km","x","Pkc*287","60=J","$ciiq>0","aOP","DyL{VAko^2","nCx;^4" -"""AL/","Kvu`","?Ri=~\","Uwo)>>GUx]","T","PUlR=uXl" -",-Z}","NS%s7YSmx","M\~G!8","Fa6!RE!%>","]","AC" -"ITrnuX$z=","Pd ","TN{P]Qx{\R","%""FET","cC)muo","b""7W]?#K" -":XOT","J""mLD\S6&R","]F(XDy%V","V","[72S_fq","SUBd:2#;#e" -"z1e4l4","&:","(Nn","Hfu&s*","g{[kt$5r ","}E" -"","`KT6Md","JA~=","E^[rtkE&","q@(|","&" -"4p:C7+U","(","|P\;TB","/R4I=]i!&","<","[Ioaxib+s[" -" l@i$?","]KeEV{^G","c/O",")xU qf'","JkR","O&\" -".;F9","-0^rp","`n& ","0@`7+!&xS","._fu-y]$N;","i/" -"7:!%75w(","g&W","0n}}h","GecP&'P","y/.WA,","GMh>f[Ub" -"'|sUuHc@","|)JV07o","}>+;p++m3o","1z:],\","[PL","" -"xS6&\2F","vZ0jhcZdOM","$","","C?$@6 lx","cELb,/QZD0" -"6O'^2X6>LY",">kDfL{T|Jq","rq3wv&m#|","GU ","GeD0$","H^" -"$p'v=","","77#","vI+TaW","kU","vn" -"Z3kq+","r(N","ovb:xf","Vk",":5&':7iD",",c}" -"'","@v""","pC9[X#5bLZ","cannP=c9h","6'L0)#KgA1","uFTUYz" -"7y\","Fk'","e~0ucbP_8","}1!ULDjnev",";)J(L","lz" -"eZa6Bj","NY>>E|s=:n","08","G"," [^i)$'","p9wy" -"j'FE"""""" J","","+Y$YLVW","UpmY58Z",",|ot8" -"SY","*:i6","K{RMh8d63'","40SGVof","{~7","|]LrN\)Qf7" -"[>E","s","cG","D6D0nwmqc","""j","QV-H+=!5p" -"T/4SaW","""O9w,|d=","8:5VZYfX.)","8;)H","","""BGhSH70" -"EgC23","&HG","tOT","oohuHfm","","f3Np*4V" -">-wot","pXL}l","%jI!-","q","43SyeR)","&>+V0" -"z","JSqgq","G)7d]o2r%","B ilJ.$","=HVoj""Uuh","ilIlT}^","y!R!}" -"7M+AnR","","V'r","n<(FlA","uG;d","4z," -"CJF|q%}j","<","CxTe)+!!K","rVVSu","-1 ""","t8)A$,G|R&" -".l","L`","ZHr,(","f@DS:",",W))Tu [}","XptY3~qqvx" -"=","sY","tHQ1;~F$",";'|usG<{","/./+","H;PD0x{" -"$T8[+?Hu0","F'RnV#NHX","","+d{I5}N(i","ol?@","s0lmSM","w","54VRh","W?c_" -"~h!,Sh56D","Bl thgiQM","{t","_k[nc ","A9.LZnVV","FIk$lY" -"vmZclCsBW","e=C;6","8{/x0Kzl4",",6fi","v'`ib;v^]","JZ|kZ(o:2" -"HkMT>:p_","c*WOX$i9","?","ZTjO5","J704GZ","Hgh!7q" -">","rk C5&Vp","0BK\]{n","px!PiJT#E","q),`J","0@f8[e=#" -"!$d","y+.<&l","3!]CAr&jU4","","CZ3v'/6;`","N" -"kovwCdyB7S","P","t|6&hRY","@Aw};","^:Izb=vz/n","s1{_" -"]Y!ZV&r","Sebf","x_<","Jk0(","SLK","j" -"NbR]CZ","G}q}}i","y","T","vj","eO" -":Oh,{`W""i","BeRUryiixF","U\]d,YB",";8@j(]zX`" -"?M8=[x1:","z85dvP,SzL","2w2E+mH7S^","W","""\$5qvEF~:","'""2-wPFw0T" -"CG","<2&;!sbo&s","g","D=d(t4O","qb^&CgN8b-","($ea[u" -"","","j&","","#G&+s","FK)","2Wogt","e""(![yggn ","?Po\r[7","s[{f%|W","" -"jpe@V[(;0","{,","~Tjexb","*u|jJd22(/","6v>w",":","","]fzYg" -"yk?t","O)*'%fQPq","nXWAcQzL",",++~/VV8",",*he>{","7znYjvFD(" -"H?","0wH4C%z1be","}\p50","P-xf]^]-/)","XP?[q","ki%@DJC(vW" -""".","HE X)s","{.G8p&","<^yu_9#=g","]b%%-9","QJ2MWO<=F(" -"","|jvCB+f45","'/""cSFn(=""","6HD2","=o=","F`HNwtt" -";%VJ:V",")kd+esu~mf","|N]d4sT[i ","bu-l",";kV_K$c478","98`" -"8Y#]7K;B","#DRFsv9","a","a^TA]L>Le","Y,*Msah:W5","xkKLzd \n" -"@gx}z7%y","6rcx'WpG`=","0/)Fe<","#+A8W","SM<*pl(""","xDg " -"2I?","WU@","+.","3 t","{#_","hP+8D1$L" -"T1Z%)LG","Be","f+jpbEpM$X",":LS","-'N$B1","r$;>h?\" -"","@s","O9:B","'K1{{","oj+19Y;Uc","" -"E}~!z","_!2~K","h\#x^v%","LpxO","Y$","VByN" -"%qty&3IdoX","q","{5xS1+@yC/",")%pPx","r$fHG%Sa","" -"Xf13,Mjp91","(C7-p5%sw","@D[JL","MAmWJ","","[u3?^k4" -"Jv","`F?U","92]","","B:","<+sO|rg" -"\IO9lcAD","IZ*VuA}qxb","2\#zO","F)%d","3D~HCj","bs']M" -"6d6V","""","z%Gc%T?|","^XUF{d","wj}Rrg\Vl|","""/fQE+0J" -"V-()QED""L","1y","r","UDV","3Q>0GM/","","&pR{qC$","=q","Qfu``/","#yA" -"W^R&4","+","_HHxJRL","~+Mn'|gs","9[SQh]","wNzqV}" -"*je*sKQT","R%X^S#C'q","""","-f}^2\6","B!+u%gd""yB","m" -":<","T>hT",")P6Y3","C>","c_w$MySQF]","N" -"?\)H",",!I4G}$e8","rf4|=q'E/Y","\@v=V","cAi=a","3pJa*[d-" -"Ocn@Z$z<+","?k","","wD4MH1xc#","_byG$% t","!C6E=``@*" -"w6$B","p","iP-","]cj","hQ!i<)","erz=2C%,." -"Nw7^`;#3b,","JG/$N","!aAOC","\","~mZn8fb<;l","}UK% 8QL" -"^y!ZvbA:B","Z4mZ4riw","X","fzgiH^~o*6","E","J.&7" -"@6H5",")","d","70CM","y",";xQ@?" -"'","akxgy>NC","UJS","fTSh|`S","""%""isoHd","" -"pT1@0=x","p,i","KBH","w;KA->iE_G","ZYm(","+k=4D}6+H" -"P4Au+$V7Y","o;%>E8","{5",">","\","" -";`""H,v ","","0iN)","qWS7\Hj3R","U:\p}]","0*Su@" -"YBik""tKo","Wv_S4UZ","q?-#[Rf/vR","G","+(","N$ea1" -"Q","^R\Wx","{","`;$$R;}uX","n@nz?6u","b],'zR)P" -"haBm:",",1$","YY","","E71%z","" -"@","Revc","4sScb","fy4m","D=i?10X}P","|rtBrZgcoH" -"8yE4fWPl(","#eq5`.Tj6}","[/)","","","7F*2Q-" -"((K'Rb","hb,c","@i7KT)qJ.!","&WT1$W+","o","=NtVGs/z" -"P?I#!{k","p$","","?Ark)YUq6c","&NTxt","" -"V","W*M","QhXxQ>ZM)V",",Ss^","mwUN","V" -"L%pOM","s&%""e","|.0","","W;kC`a;^""]","v0x2s" -"Q","PHd;","y","p?)ofu BHd","+8","H6q~M" -"f^","9/","[","","9>3MClis","q"")@Xk$^c%" -"PJpB_F","T","","z;8\=:5LY","!)M4N_KS|b","o" -"","-rMJC","A_7U}#H","""cG!NW+jy","x+{A","UiW=|*" -"M","3p","|js&~(W""o","m^o3","K:oWx'}7FF","vKpA?\WR<" -".Z'Toi3.","Kw3M5'","D{)`J|p%","y> <",")Tzjh?/5;""","hkHe2dg/" -"F","","YQ#bjKU","|oyIi.Pn","X%lZJ%G","4p`$gA" -"0<3BcF>","mj#?'cr","?eg","?c\gBxpIL","C^V","4h+/}>2" -"|Gyedrt","&U8j-39",",o{OR|#K&","e*+{TfoLt","7#EHo&yK","-l),i@5@sy" -"( Ru-","8YA_.{ lbA","B","?1","Y?q18G]:","F" -"`"," {@yUR`","N%sfb]._}","2+H","a?(","~488\v,~" -"e%}/?__","1m|&Zwk\H","m;y0J","A?&_bN)","*{YY4g mOv","" -"+o+1~PR^rP","9s:","9[","{","","vSm,]mcX" -"v:Uc","","zmyt","D?hl.Q)_ ","M3`U&^u)","'|b0""I" -"$!Y","`l[rU","P*SX0*7ews","E4tEEV","r4Mc$i?Y","x`-43E" -"XFz","ICV{D","eFh{;F.:","H}L(F8","EFq","UE:7WM7E^" -"","","/",">mK|c?""","fFRcp *!","O" -"","uP4b","","+","WYE+","@*|s}GBT|" -"-1|U","; 0i3FvNS","","U",">Z?`X" -");UmU,5L)U","X0LaKcd","o#"," #f5m]7l",";Vk[u","YD~H3]4 f^" -"@<^43=q|","9J3_Px-_),","(B4s","H'E&","Azb3n","nkLm%@cG","%yh]S\#nbQ" -"yl8%1 Z<","%3+}","|ElVJ","qYMWxz","-O2E","z" -"/~Z}]!Y[","^s>/.","]r*","6G>","W4-","P9%%W28CrK" -"f}hbE",".{w(H.sVl","<","+yR;f$","Z_R","" -"@""^=KMw+&aV=","q>SH7K","X=","YrPU@Qz}" -"R='#.C","%V7VRk","m](y.J",";","],#","/" -"j^;6V","~aY""ZoE","-4~pU""q9 z","Hfy't40","%k$!cb","` t f" -"T,Oyx)dBN","E,","iOWQ`","qUSyf","Gic)PI\","4" -"","b7'-v","mrR""[}68,z","z","1~LW","MEx0E=" -"$7","=","OPyk[tg","T|Jv>","","|}MiE8*\b0" -"xg?ey","r&%L9`&O","E6V]U","Uo^lp_","Jd#","JHC" -"75r","Dm8""","PKDe(jR@","Q|3]{I6,~G","g","x_Z*}" -"+.+",".Q"," H 4&i"," r9x;]?","L$FE#|b`%d","Km%5*Y,=Z{" -"t),H>6^mo","T]v|=?W)","Gq","U6m"",","Iv M","STWnPUuF" -"S_28GTA$/","cy_m(3?.","%Esg;RS^F?7" -"*Lm*BZ;1","","{}:4[j.","","T","w2e:|" -"bn>vI","1wRW=$#hBO","l","aWbEFt.","geWriwB",">" -"[,2""N3N1F","2np3C","F>HPSX","P$NF3,N*\","`","%." -"j*@Vckc","q:a","""5","Au!lI)","","" -""," 2*7g,dY","","zcz5O","Jd4",";Q~U7" -"'r`G","0:-l~C%",";{6bGzD","fzc""w#+2hB","5 .ec",">L*.c+9" -"bLrT9|.","&","BuGS3",";W-;+","","Y8Sg<5AF""" -"t[){H{C","7P)M"," 8J","]G7","uxnCx72","#" -"9Jpg;,S40U","7~,]","pB9I","""F","O","KX<" -"S7D+""Ct?,m","K3y/tj","","hBn'@6;Q","^*,@fi",">I)JxVCGjS" -"",";IC]JIRG","#@","K","!`wp","C#!Lq`ouC" -"\D&{2<7","A)vo{?u","",">","][F","|" -"o,h","VZ,L[K/a?","""%","q'RP_={?","}L]?","/f#W","Sgg`" -"xjzKX","","FgVv","UP7","D'","" -"&","HJot_~M-","Iz","","hl*?wrgh"";","r.j8*" -"cw\34","y%sO=Xx","!'1b!YH","KR","k?daX23=#","R/G" -"&Gd_P","6Uotb;w-","{f,ub","qY0#|=g","Y+@RF3~","yF" -"cyj? /&fo","(o!i","M}W1O","o!sNA[HtT","E/<%Z !Z;","gMGl#t" -"_FWHy","0=|0""<6jb*"," {l7jc,h","","RE<0N5lhD","#msM7=" -"M","h1>y","Rae]'L6"," WxK$",";","WCJu" -"Jn<","Mx/~Gb]cE,_]F" -"$(GZ'.a@|","P*","F[R@~","QC""nTGV[|","Gqx","" -"B$j4S.QyR "," @ub/","Q;-{Rg&","=","mp}cqJ" -"K",".;p-:cf],B",",d.ahp?<","Ax2'E.d2bW","","""N" -"","tmw#$!W4","X wR|2","J","M`py!r9-","u*>" -"Uah","","^vGgUW","_a=","q","?8" -"Kk!","3","-dAP]|WlTd","2daZ 4$M","Sm:%J|J","|4.Y0]FG*=" -"T(zz47nK","rrW!","+m6&","$>O","*b?8/","3Z&0vdO" -"","""1#Wzhd|Q","znf","Ix^_U","B""!<","]" -"YD","j+P6yT","}qELaS","Poi,1DYx5y","9","JAFlfy39F" -"""_A1","!Gz8FKW|Q","gK3xAlVP","h{[J]g","Mp^XsE={",",~""@{O=a9" -"|5}%ou{h","","rEt0m$+","3H}","/agu""#I(","ZA8" -"rTg","C|JOy""K","PAiUKV(>sm","9d%*oE't","k]xpx1C","Mn" -"FIFq\ +","t","","PF?4J","KiV)9rDEWa","&!!a" -"HZF`-Bl","*3T)/2>5ZT","k","4_=2","D*&","T$Reie3o" -"[?N1^","v_qS#k@5F ","","qQ=JSLC","g8J340B:","VpJ" -"#","8!o#?9fD;W8[&%","W5dd*H|","w!+N#2'Kv","","1z" -"A","?U-:+9$Ad","fgG(5$xfYB","be{|1\v+8N","bjh]GeV","U" -"t_q ho","IAN>9OHx ","Nz#i;","","","q3&Ee&4KU" -"k","e","1M@K)D","<%]x:","g@ucMqR","cEU" -"h2{z1","?4/","","","","a<(" -"","l2e6","CT","S7C4osiM!",">h'cl.t/X","yM70tqVeJ" -"5W~n0\","A:&{Ct","Q|~","!j?Q2-","","oZzcS|BOk*" -"","@m9W: 1PY+","d'","T6Z@XI8#","*C","{WY0" -"c|oq^LLWk","c","v~:H","TUjFM2W`#S","+J>E","fRd44" -"","-k_+,H-P+<","j,nLk@","wU16tnz","IB/(#b","],}l<","A(4{hV\S","EU1fDRJDK?","th2M{@VM" -"dd7'7F","u","ez[F\=/","-ND",".%{f|@r@J","}",".r4/b[2+" -"$","|Hl})","mAi^/0%,","","M","42Q1zn2Fj" -"","~kIZCuW|Y","@a;&\W""sVM","""js;V","Ty""-","udU';ci" -"","C@l-Xr=",";4o","FAciX1_.x{","","X" -"Xo=}hYQA","OdLO5~D","GOou_fr","%h|"," iaH)6MCG","Pm?|EKwe=" -"reI:O","rO0","geUs",")","$1'{C)sTH","dF^m,s48/" -"\`A","iCt&`","SQ%x4H>","S","eNJB","F$v=" -"Y4@#","Zx","b;Lzw52FR2","WR","w^21u"" ","c" -"vza hr","h*"""," vr","bu^3R:>tx","'","[" -"","nz(Mu","1Y?<","WY","^","+R.'D7~-V|" -"[","M_0V?}g","4&yc?/.V","v+yw""2N}j=","C","q^G*d<#cOt" -"","[G?YXdCQ8","y","gS2","","GK'ws#@b%","gz_L:!P\R","yjF","K+j5dt","""u*c&z","H" -">ccvc =Y=",",lfu","ob[@GMfb\N","DJYb*-`""","GZ`j?Um~E~","-j/Wl?!}U^" -"TP8ng:k|c","","#Dy[-M[0S","@b'O1rt","fs'","wm;YJd" -"g""vzo=7~j:","#C'.JT","af""<6"")","Uk8u","P00^t:%kI " -"fYg%",";'EvJ)""",",g1~Bn""","HOgS(*iG",",N4][1","`>Qg7'hb" -"j:C^/D&","L}" -"y","3KHns2","yphC]>","g2^","iz","c49k$t>%&j" -"_B5~%W4",">mYNa|)LQ&","|h`O3F","$c" -",B..bVR","PBp%ghU","i","6-n;|w","(?fll%2","v>\w7ZO}>S" -"+}8","+A^","=nEbX;T=kl","/)r.",")7R" -"c(TUPDMq9","S$Y","!{H","ar&s""}X","]n9^ynwJ","KA^XuPC" -"G=@{ |4tp","x","","Q%g'bU*>ko","","8/;_x!&d" -"Eye%U sT","D!vqs,",",/-dIm['","b$6ns","!O4&B","w2-FQ5" -"","vb","Ag","Iz","xAq","Sg/0" -"Ci","Gr_x","rZ.bLnI_n`","IF`&&","<\8x","(Dgo""","%RK>]iM|","G&N" -"g&","MuXViHSk",";sqY..}Qa","]x6","GQfWk/|m",">+{6FTcJ" -"","8eQ9T+","/#c-U[..","6s{","#_'E","56E" -"tJ{)","IazQ","st","}J`& ","pBX6d","7_yYf\kW}" -"r[d|?PuJx","","HHK1 >X","uC",">WJf}[86m","1#" -"FBzo 4PP50D","x","a5=Q|Gp","VMc1PB","0pWSRoYZx" -"#Oy=/-T","EN>S3I^","g`","hKRa]","tX","8" -"Lu&","SI","|>cxM(","B","&HK#%-$a1","Ep" -")V=@P+ ","bNbg","W"," R%w","U-;2Y","" -"kp.~#P{","10C .ckv|v","/rh_7j","vC/","Be6]Ah0s8n","8_s@]","K6EN","JIi,""bWH;g","IpmjQ " -"q3""hoZ-","u{(=+GD!","","","WWs","6t[" -"aL*GReab","g","]xy(zaP","f","=5+kzD","|l8&" -"{}Z`o_","2nro$","mZ Nx},it\",")^~O2Xg<","","=v?" -"]A#4=YjX~","","a7L","Vi6KCa","n-MKd{%^J2","vSCEKmv" -"Qr>","dK",")v`V\","|PyobH;`D","t4","$6","" -"\L}Os","PubF`","7\b?'p","","n19&@B","Q!vM5" -"<&Dl7![","z1*0","/C0;tyxCW","mx~",":lK38^$","w)F" -"=ST:y};;6m","kIja&","$h""nqTG?QX","Mv" -")2M8g\j&","9 ","M.SAW4:""","DX*%","LjMZ]-","V2Y_" -"X|LW.","","ADMXR%rM","+*","}3*Uv ","&" -"`<","r~%h:O(","v--@~@Z_","AWrujA%9ksC","@/",".^p(!" -"7n","[",">bsF","0&i4rnFUn)","\z\$-","5" -"s=zO_X:V","1]X","+2-=","","|$","F({0B9AzL)" -"[l^P","Qsnx:6'","W,R8qFs4X:","XE","B5Hv%u","z#>" -"DgGoEDI|}","#2eDN>0","a","I([""Z" -"O","E",">O","yia.Z","!W","Wst" -"rieJAB)j","Jh>X0'W","0%[Tbb1wU","yu\r!bR&oJ","mL{:Y","" -"g)+9v","\V7G","","i65","u1z""","mwMA0mduA" -"""] Mmz0x","W)Z7Z]I.","Y>Gy?s~","B^VT/[","!1Po*","GRTX)#s8""" -"Qg","D","f","F:;ZMn","","^z" -"m!N+>,G>","rBM)f","S/WddM","*7x~bK?~",":rGV#_=OLS","8*uQ,c" -"NV]byBNum=","]j?#zg&Q""","",",>WC&q","a&ggxHA","6","S","S","vB`v\$X\" -" $I>Qn(","F$vCj}W^""","f,m$(`","Tk&1","g","" -"F""r_833","M","","@:W$gx","rZdtt)y","S1 " -"}I+H?^U","@hvC3b!|L,","O","","nu z9>%#bt}","UnXI/vn-" -"@\6 ","z,fUI78CJ","uqM,A+|[~","~86o","Ttg\v","'W&'.!S|" -"(]+1","DWn>pl0y","5>pp{","pE:","t""n4ovOCp","q9^Nt" -"i","7XNxL.","Y@E2~}Ua?T","NvkqS;","b+XAuT~'tg","{IH" -"","2A)","t?-N)j","uOVY","&-EZa","`" -"E52JNq=h<","iPtlx","Y","","faS","p+Y""o" -"{$]","=S>&n","Q&V","IAYvv","2!_Nzwu8","]fB," -"i2=",">UW","","O{1@""V@nqa","CK","T" -"U%","T","F","-93t\^>","0","Vd" -",m_G&8""\99","-H`NpPZM","!8TxU^","`CKOAeq","T[lX&""4","" -";=t",":l<2DTlM","e7tof`Qgz","pm-xU:m","uffMI!%R","6.R" -"f:^k|)$","8j;c SN""y#","::[^#t%flO",">y[","lYlT2Lh","x\|jiZC=kb" -"$OEjV!'","L","iJbq(/t*P","cn>p<|O\","%c","_&IRa0L" -"""","uq3"," \_u","'+.z+'EcHU","+vjE8","" -"@1Q(^","q!HDi","5 J)22","Z","Hr_;WiMS","6q" -"w$(iH|P","]Q","q86n/","aemHb","S%J3,>3","j\>9/kZw" -";F","*4","[a)2;4","m;*R","B3(pp%","|s6C]" -"N0xX","gK$48$i","" -"LC4Mu","","~MP,U,-g6","0x ({8G^ ","","tL5zhiA|Q" -"drlO","$F\3 95","\","w^n( ^","","uA BKj" -"",".^p+]_D'C>","(r/=:*","(&*#7a.",""," L 2" -"b01`BI&dTL",")$Qd","","YKZw","rs","V""q?W","r]\AR%9eQ","ar2 (X" -"""Q*?lEd","Mr7aZ",">y76","iK","is","wQ" -"_$MJZ","6""%\-","Ea]","$","","" -"\p","vMKAJE(]","Qv"," ;.+w5$","_I~","<.DUo/H7" -">^{","afP:>acaF+","&)Cy","*nyEfBQj;:","EC?=KR}","+7" -"1&vw9Ao","A\C""2!xul(","1|{mLsD","9cSg)y194","WKTG'_!c.",";x!?YBad+" -"","","sN+","","w5w","8J2w6cg*" -"E","6,WQ:}G-H","","1C","5","1" -"cMk","WCj.J{:","f=&4","m^3^","RU","" -"b-~5b^P-O","p%4XTKcK|","od","b5",":",";L!q" -"g\T&","X$vd[#",",PM""H""","a","S Ja]E","$dJ]8" -"<'e#%x","n ","""nfqy","2U","O","yY" -"]S","m","rwU{1YoBts","hf7~qC+,wl","=&P?","<$g" -"K6s#","s}Yz;","aw","S0Gl","Y""IO^C","g[Dj" -"1UuW?- ","lO\","!W)kOeH2OK","","QV!oGl I%","" -"MH$ 2","",">DlLK","[U<-0","","g" -"KZ","","CL&e1nnJG`","e","8&[8\X>a","jJS" -"Z",".3eN\","eW' tBt","+u}:=X","UxJUIs~W^-","TN" -"!mMfsPH","HFNPePB","","Xs^#VQp","K .>g,N","> *_d-" -"{)]y""","(]Z4%","?HL{,#3[NT","","|)-Gm$DVV","" -"O","","vF2@q""","i0","i-=/`k7","yH)-$h0B^" -"F%mKA","O#Cx:]t","J~{,V&","Y^>""V*","v/QKA""","VU7FI0" -"Bt<>","3NNIq","Xb2""\ju7nm","gnKl]","jk3(`l","'\>t vwR" -"ZY","}[J))N%R","","","4Wmf","RK" -"aH&Zd!KIDR",",?ZMK?&v79","A","h1v","K%9~""Arg8=","S&","Lo|8","yeP$IgQ-u"," 2_2}fw","S'CH" -">f{Y","Nk","5q[EGW[","M[n{V\~","_-'b","" -"u/3S\~","m3j7:.JjF0","PH3(yO4@ k","^7?M+m\-z,","K",";<|gC$=Qo" -"\mjYcUz","?uhpF1N=ao","","{F`cP","hzx$EV1h","" -"G%"," OQf{?UJ","%U>>w[[","+|W)E:xR#/","0","QRp" -"d9J;.(VV","G{MC5","^z","}E|p[","H!hX0/",".')Kn#OU#u" -"ym","CnD=D","w;E2:t","g728X.XV'","Od4c:","[uq" -".eDWg","","yw","","H%u","+f!>V&N3 T" -"pA5""(P","t+","","L\36R","*lOLX8[>IY","#&""B[K" -"3\$Ho","f","F!sU!5JE!","baZjc","DVFA","yH&cnw{hJ$" -"""= d(Uu","6.8","QtHv","wltHY}kP","=?F"," /AuX","u$jdzb","sl~BeJgoZy" -"|O>nuG","={.Q>DKh","]o5","x-I\J","]fv F","61Bh7S-" -"<","ZU}""6\",":gR","Y""Fr-tK","Y90yK","w}" -"""EZ[,^dq","u$K]glZ]fX","o""3 b","7,DfS8""EH)",":[XN","rk5~" -"","^:","8.}","&C{,B3)","{ Q^66YOjx","N7|hz+J" -"')Gi(QfwRV","s8|tR&H","C2L>r~'Q","","""g!8WWDydX","_8)v3#QZc," -"UI%*Z+EaC n/T*0","5Qj6q&",",I!9Yf)-","O7""h$","cc};2[W/H ","qi." -"#f&Xc!8_","L/+Sv","-|N-OTo3j",";G]R","9zhHI$[(TA","?cr2"":" -"+(OUct<;TV",".U","imZSB","6bZ3n p{",")w3|,AJ7a","pXq" -"tZZ=2tjg","s:KP]","0\I","hCT9Y","}1k"," OHsW" -"","","ftw40/,","OIT3z2yp&K","","lDAFzM6z" -"","x:1FVv","(-i}","6SZ5`FfS","*$yk","ST%Y" -"B[","6`u{","c","mRb5" -"<}CxG","wdS1l" -"v!K&ctH","9-tk","L8DKsx1E3*","YnI&&(!3!D","dfNpbnp","$Z+TlYK" -"\Jw@%Z","8>Rv?Vamp","&45","0vJlPq","@|-6 '","i:" -",B4E","28","8Ese|pGFa","s","/'up,-",">#In," -"Dcr)4'KN","","5`kb$","'uMK;X",",H.","_K>4}eq-" -"<\r= ,","/MT=6","4Zf5Y","q","X>hcA?n","xL}u%PV" -"C","T2OE","Q'ptg={w$}","dolr5\","hhG}l0O5]","M" -"","P8$","6)Vfr<","1sF)}?=.mf","`7!Zb","" -"0)","h?<)X","|9xwC d","uxU","%CXVw$U","rTFHWR" -".4N(h:8","","ykN5F5bg%}",".@M%t","KP,""ZiX","k?e\b{E:" -"z}zN7v.iJh","+L:BY*'","c","YN=PxD]e^","x[i'NTtO(","8:*zHd" -"xw","o2m,U=","Y","G[Z<>ln","h)d>","/cre+6}" -"xd","OV4.,#3d","KMbT7Z","Jv ","mW|g-/c","fJ\" -"{<|(!P","""uP]z;io",">39","JC","JL*7i%1","qy%n*!" -"Efqv+19gb",",^","(""c(","]9ZhpF+""V}","&lf=cA`~o9","pxnqY!^" -"P","n?","/~QJg`$$6","7XA","j!Al","^7mg" -"y0/Q,pS","/G|FD&=eH","LZQ4oH\{F","i","K!+mU6","u!YAg4" -"=|-f<","=cpf","F[bW&=x?","G1s7w+","0[e7Lqk@N-","Q\p{vW6""O/" -"pG}4J}##","/nU56phs","0%wr%^4,S","""","cJcRi.Sj)","R," -"G","","","(2_l|doqUR","F0FF",",F^" -"[#*'","/rd","^- +HT\!&i","Av?t B","z:jL|{","/" -"bC'W","r98","Fy]","}\1+rzKI_W","y","9T{vO" -"-fk0~4","CV=a2sl+$$","w$~I\T","{vRXai","u","WT" -"5","0hY","jhk}#Ef\","m^tv2*[(","7*","}XR$AM}Io" -"RPk","","yAaG","t1","hNzKKop","{)RG" -"","9c","}EDN^+","%l","2","099=:" -"T!A| }RR","$G^u","a]J:Z9S","A2md{@7b","%>K*afb6O","""'W ~Rtz" -"!j7@sH'S","]Z","`tCQR}","!X'}(2","$`)J^]","A4a)" -"s","eXI!,AOn","=!e:D","96","-4&","B#wJOP" -"S2 ","ae!rLIGc3","_.<","@lkfd9:R","mFw#)s}O",",_","N24NK","^9])","=Fl" -"mA","c-EU","W|v","^dP)","{P59","{n=OSV~" -"h&0zs6","@/,a9]sv","N~","J\R)7B","^A|U","2f~l4w" -"?Z;cu.","1?#^eU","W^otY","A","+JAX","LA;","t" -"pexG4{","m([kDbr#","H)",">S}n/Yp;","h5gRE","gZr3ll8N" -"lEr","5_1fz@AUi","MC","=Wy5u%","~","{aeJEa;0 " -"r","gl-q{~","Ar5","#}1Ks!5'K","w$FC","r5!" -"f","i","<-\[@X4l&","tJ#=","j~SZU86,B,","Cd>9s\~`WG" -"qV[Nvy}RGz","AahvU-I,A6","s\I`;GQ5b","G/mPIa1}","._m","E8aZ!lZvB" -"YZw-> ","{}UK","kzw_9g" -"vuY\7!K!Z5","qE\?","Qi;","Gw6NLB. ;","","b[kw:M*" -"b%","G","xqjT+B>7M","%IR^pRgW4f","J.@V;p{","vhcJ+V" -"h""","K(R=SZJ","^PdEa%^R","@S#oT","T?+""","$C#;o]94;" -"9","n","=fl","P3j#(m","EsdN","60""oa" -"#w*l","CR","GPo""","J""{nZ C;","nKY:P8",";t'2" -"8OU=`","n)9rtw {>","YchZ$dap","","tnnM[8","P" -"Gc""","","","J'Ws","n0DRQ4","FY=Z+" -"_c.bgs","L,m4lr-","t""!zm+z?","","""","RGQ||" -"",",Q@e","k^N@5Q(1z`","","p<9C[",");{<" -"D-gAzD1UEp","b","e.Q6>W","@","UPZ`MTb} ","" -"%A T0[XV""","BK/@?$2;","A.we","mq/uaN~","?=h5L""dLOw",";.n]mr1" -"K","z/HBrSj","j/f","-tp5","dk6]l;tn","vEf2q" -"`8F|_1l07z","!T?","a34HX!4A",")?Lj3Q%,O" -"XbA~","!(0VBdS\a","y2+1","","se","x]" -"j8|","zpuMz","Zx!.^","pE,Q","+","O1}g&" -"-Rj3z&","22","7fgr'b","P*YUXoGzOL","Id","7@6('" -"","~Mn!","zU|U","","mK*rw0","r\Thj" -"'ES^=V",";%~E$fUc","","6/J?","7p8V+'D""tQ","WN?)|9;_sK" -"X?fx""","","","|","[FCyM8","lt1" -"Q:6_NG8"," M","5vO1~","aeL$>K;","({0Y|gn,N{","#[=F0@" -"ws'erE4myY","0spk|3QK","_pIarmCx","nv0""H$wt0T","3v#P","4XJn","a7" -"*+EH4D","8Mkt1D","","y@PpS\D","_>$GB&","5$Tc5" -";","D","|","u}O","NQ0j}4$$","E@]`z9'(" -"Xm^S5rm;%<","PRd","","Fr~-8","cK2P%-> ,v","","1","/Uz" -"(82+{8",">#6f","~%p?+","XGib 7QuID" -"9o:4n[7(+T","fWk~}<|3",">","b","G/E?F","UNpx4Z8" -"I^]W,M5|P","C7","TbKD:N YD","R|'\%","`Ub!1","{*f" -"H",">=","Bu|wuQ?","HegP",".A*&4x<;&f","FLuhcOB" -"e!)","JB$Q`X0F","M","8bg{","_ imFTj~~T","HW:" -"M*x","% +x:p/O","","K[^P&Ux'","O=Oq","k|Y" -"","Cp.a5!","0gg__6G/By","L#(CMmio","",">E""K" -"#`7=j","J","","","L>$py/","R)q3CTl" -"i.","D=","%_>On#]B","" -"","1jfHH","gI/[Y""","#b!k","B|^4#DNcP",":" -"","_wv[3","nC~TVh>G2","YCy=uRO3/","0%++b[v","3dY=AF" -"","bd","D}*vg2CH53","-~","-7i}_U[&","f[O^oGx" -"!/m `(Q4#%","^,ghnAK","ry=md_r<_x","6!+zjh@h",")/","/(" -"(2$S8","=''0]","","","u}+G=f5`","[@-" -"2Xg" -"","+N`#JAwY&","h&","Dz~~8N]7H3","(NCI>jmu","aHy!P9/%Ba" -"&=#","Yq'W","'M6bl","nuUh>K",",M","2K_eT8YS%" -"1""[,8H","jT-)","J9ix(RDM,","}","ky~,'m Jn" -"$","","VVjnJ","$z]j","Bo|Mtn(wGo",".m" -"p","9JK4",")Uo|34ojc","","I\wE{","b\|H1w[iR" -"N.r}Z!","YsgQ","G3cUX","Nby5_",")d0","9([?z" -"UIJO~cs7","[ZHr","l')h/G~","83M","n","f*+YXo","XRXcm\(^+|" -"LS4hCw8","}`uu{ ","O>r v#!",".8","e","RXxFv" -"","4F^nM}n*","'gehCKSk2J","\JY]","q","s53" -"V~F.j,j6t","nq","{@\##Ol","","ij2","'k^t(b" -"0","J/6[Jf%j","?*wS!|_44","","CH,Z","]Y*" -"s~%/!UT","v","6..v1","H,","7zuN""?8","Kmk1D[i","?@j@p~-8Je","p90y9 Iy" -"","Sk6|vQ&lmF","8H(G'&5Ts"," !t","\/Y","MAJGBxi" -"|DkfGX8\","4-o=R*B'L","mp8G4kY","7O^S","i$5MQ=yt","Ab&U","g`etY{;H*)","","Xv","q","6ky6" -"=tEtq&","","DfR`2W","9NE","yF'P*P ","c" -"=B","O[7)3bo","<=7T3eC@&Z","","i","o.B4" -"?#[h/8\a","9f","qaG7p6x]F&","'gSreOQwR","/E }r9","" -"","","F+k4j]F",")O*d","","k7s VlaK)h" -"=d{jlC","B","tJ'^8nb","_""e%6,lU","0:","=" -"^v?bc","~<","c","~$u6I)lB","n","aF," -"s",":WMDU&[","&@""~+G","N","by","g0$LD;?""S+" -"M]",")Zz({Rw","eK*53J","S8vOP=Er","@EkS|8","" -"1x9b","No@","3a","","YQ?]XA#",">zc" -"?p~F]","JG]E}C","Kf '!P`4","(","sI""p=W?)I","5<9T" -"IEj+\]|r9","","+ uB","sxb","}.c","+BJ`!C29Nl" -"6zkl4=z","{\b9Nt[","R\=8S$","=bCc1","/","" -" ","i4m'$T KH\",",-[V1gyE",",3vPcP0","u","ju.sNB*Y" -"j)E/7>]l/n","}R/<8","[","[m90:G","","Mpfb" -"aW,7$7XC","q-","6Cx!yp","j","+kA!7g","l,2(S7/ev4" \ No newline at end of file diff --git a/pythonFiles/tests/ipython/scripts.py b/pythonFiles/tests/ipython/scripts.py deleted file mode 100644 index 4fe5c8473485..000000000000 --- a/pythonFiles/tests/ipython/scripts.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -import re -import os -import json -import sys -import imp - - -def check_for_ipython(): - if int(sys.version[0]) >= 3: - try: - from IPython import get_ipython - - return not get_ipython() == None - except ImportError: - pass - return False - - -def execute_script(file, replace_dict=dict([])): - from IPython import get_ipython - - regex = ( - re.compile("|".join(replace_dict.keys())) - if len(replace_dict.keys()) > 0 - else None - ) - - # Open the file. Read all lines into a string - contents = "" - with open(file, "r") as fp: - for line in fp: - # Replace the key value pairs - contents += ( - line - if regex == None - else regex.sub(lambda m: replace_dict[m.group()], line) - ) - - # Execute this script as a cell - result = get_ipython().run_cell(contents) - return result.success - - -def get_variables(capsys): - path = os.path.dirname(os.path.abspath(__file__)) - file = os.path.abspath( - os.path.join(path, "../../datascience/getJupyterVariableList.py") - ) - if execute_script(file): - read_out = capsys.readouterr() - return json.loads(read_out.out) - else: - raise Exception("Getting variables failed.") - - -def find_variable_json(varList, varName): - for sub in varList: - if sub["name"] == varName: - return sub - - -def get_variable_value(variables, name, capsys): - varJson = find_variable_json(variables, name) - path = os.path.dirname(os.path.abspath(__file__)) - file = os.path.abspath( - os.path.join(path, "../../datascience/getJupyterVariableValue.py") - ) - keys = dict([("_VSCode_JupyterTestValue", json.dumps(varJson))]) - if execute_script(file, keys): - read_out = capsys.readouterr() - return json.loads(read_out.out)["value"] - else: - raise Exception("Getting variable value failed.") - - -def get_data_frame_info(variables, name, capsys): - varJson = find_variable_json(variables, name) - path = os.path.dirname(os.path.abspath(__file__)) - file = os.path.abspath( - os.path.join(path, "../../datascience/getJupyterVariableDataFrameInfo.py") - ) - keys = dict([("_VSCode_JupyterTestValue", json.dumps(varJson))]) - if execute_script(file, keys): - read_out = capsys.readouterr() - return json.loads(read_out.out) - else: - raise Exception("Get dataframe info failed.") - - -def get_data_frame_rows(varJson, start, end, capsys): - path = os.path.dirname(os.path.abspath(__file__)) - file = os.path.abspath( - os.path.join(path, "../../datascience/getJupyterVariableDataFrameRows.py") - ) - keys = dict( - [ - ("_VSCode_JupyterTestValue", json.dumps(varJson)), - ("_VSCode_JupyterStartRow", str(start)), - ("_VSCode_JupyterEndRow", str(end)), - ] - ) - if execute_script(file, keys): - read_out = capsys.readouterr() - return json.loads(read_out.out) - else: - raise Exception("Getting dataframe rows failed.") diff --git a/pythonFiles/tests/ipython/test_variables.py b/pythonFiles/tests/ipython/test_variables.py deleted file mode 100644 index 6519607c2fbe..000000000000 --- a/pythonFiles/tests/ipython/test_variables.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import pytest -import sys -import os -import json -from .scripts import ( - get_variable_value, - get_variables, - get_data_frame_info, - get_data_frame_rows, - check_for_ipython, -) -import imp - -haveIPython = check_for_ipython() - - -@pytest.mark.skipif( - not haveIPython, reason="Can't run variable tests without IPython console" -) -def test_variable_list(capsys): - from IPython import get_ipython - - # Execute a single cell before we get the variables. - get_ipython().run_cell("x = 3\r\ny = 4\r\nz=5") - vars = get_variables(capsys) - have_x = False - have_y = False - have_z = False - for sub in vars: - have_x |= sub["name"] == "x" - have_y |= sub["name"] == "y" - have_z |= sub["name"] == "z" - assert have_x - assert have_y - assert have_z - - -@pytest.mark.skipif( - not haveIPython, reason="Can't run variable tests without IPython console" -) -def test_variable_value(capsys): - from IPython import get_ipython - - # Execute a single cell before we get the variables. This is the variable we'll look for. - get_ipython().run_cell("x = 3") - vars = get_variables(capsys) - varx_value = get_variable_value(vars, "x", capsys) - assert varx_value - assert varx_value == "3" - - -@pytest.mark.skipif( - not haveIPython, reason="Can't run variable tests without IPython console" -) -def test_dataframe_info(capsys): - from IPython import get_ipython - - # Setup some different types - get_ipython().run_cell( - """ -import pandas as pd -import numpy as np -ls = list([10, 20, 30, 40]) -df = pd.DataFrame(ls) -se = pd.Series(ls) -np1 = np.array(ls) -np2 = np.array([[1, 2, 3], [4, 5, 6]]) -dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} -obj = {} -col = pd.Series(data=np.random.random_sample((7,))*100) -dfInit = {} -idx = pd.date_range('2007-01-01', periods=7, freq='M') -for i in range(30): - dfInit[i] = col -dfInit['idx'] = idx -df2 = pd.DataFrame(dfInit).set_index('idx') -df3 = df2.iloc[:, [0,1]] -se2 = df2.loc[df2.index[0], :] -""" - ) - vars = get_variables(capsys) - df = get_variable_value(vars, "df", capsys) - se = get_variable_value(vars, "se", capsys) - np = get_variable_value(vars, "np1", capsys) - np2 = get_variable_value(vars, "np2", capsys) - ls = get_variable_value(vars, "ls", capsys) - obj = get_variable_value(vars, "obj", capsys) - df3 = get_variable_value(vars, "df3", capsys) - se2 = get_variable_value(vars, "se2", capsys) - dict1 = get_variable_value(vars, "dict1", capsys) - assert df - assert se - assert np - assert ls - assert obj - assert df3 - assert se2 - assert dict1 - verify_dataframe_info(vars, "df", "index", capsys, True) - verify_dataframe_info(vars, "se", "index", capsys, True) - verify_dataframe_info(vars, "np1", "index", capsys, True) - verify_dataframe_info(vars, "ls", "index", capsys, True) - verify_dataframe_info(vars, "np2", "index", capsys, True) - verify_dataframe_info(vars, "obj", "index", capsys, False) - verify_dataframe_info(vars, "df3", "idx", capsys, True) - verify_dataframe_info(vars, "se2", "index", capsys, True) - verify_dataframe_info(vars, "df2", "idx", capsys, True) - verify_dataframe_info(vars, "dict1", "index", capsys, True) - - -def verify_dataframe_info(vars, name, indexColumn, capsys, hasInfo): - info = get_data_frame_info(vars, name, capsys) - assert info - assert "columns" in info - assert len(info["columns"]) > 0 if hasInfo else True - assert "rowCount" in info - if hasInfo: - assert info["rowCount"] > 0 - assert info["indexColumn"] - assert info["indexColumn"] == indexColumn - - -@pytest.mark.skipif( - not haveIPython, reason="Can't run variable tests without IPython console" -) -def test_dataframe_rows(capsys): - from IPython import get_ipython - - # Setup some different types - path = os.path.dirname(os.path.abspath(__file__)) - file = os.path.abspath(os.path.join(path, "random.csv")) - file = file.replace("\\", "\\\\") - dfstr = "import pandas as pd\r\ndf = pd.read_csv('{}')".format(file) - get_ipython().run_cell(dfstr) - vars = get_variables(capsys) - df = get_variable_value(vars, "df", capsys) - assert df - info = get_data_frame_info(vars, "df", capsys) - assert "rowCount" in info - assert info["rowCount"] == 6000 - rows = get_data_frame_rows(info, 100, 200, capsys) - assert rows - assert rows["data"][0]["+h2"] == "Fy3 W[pMT[" - get_ipython().run_cell( - """ -import pandas as pd -import numpy as np -ls = list([10, 20, 30, 40]) -df = pd.DataFrame(ls) -se = pd.Series(ls) -np1 = np.array(ls) -np2 = np.array([[1, 2, 3], [4, 5, 6]]) -obj = {} -""" - ) - vars = get_variables(capsys) - np2 = get_variable_value(vars, "np2", capsys) - assert np2 - info = get_data_frame_info(vars, "np2", capsys) - assert "rowCount" in info - assert info["rowCount"] == 2 - rows = get_data_frame_rows(info, 0, 2, capsys) - assert rows - assert rows["data"][0] diff --git a/pythonFiles/tests/run_all.py b/pythonFiles/tests/run_all.py deleted file mode 100644 index ce5a62649962..000000000000 --- a/pythonFiles/tests/run_all.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -# Replace the "." entry. -import os.path -import sys - -sys.path[0] = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -from tests.__main__ import main, parse_args - - -if __name__ == "__main__": - mainkwargs, pytestargs = parse_args() - ec = main(pytestargs, **mainkwargs) - sys.exit(ec) diff --git a/pythonFiles/tests/test_normalize_for_interpreter.py b/pythonFiles/tests/test_normalize_for_interpreter.py deleted file mode 100644 index 37a2dce5cb7d..000000000000 --- a/pythonFiles/tests/test_normalize_for_interpreter.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import pytest -import sys -import textwrap - -import normalizeForInterpreter - - -class TestNormalizationScript(object): - """Basic unit tests for the normalization script.""" - - @pytest.mark.skipif( - sys.version_info.major == 2, - reason="normalizeForInterpreter not working for 2.7, see GH #4805", - ) - def test_basicNormalization(self, capsys): - src = 'print("this is a test")' - normalizeForInterpreter.normalize_lines(src) - captured = capsys.readouterr() - assert captured.out == src - - @pytest.mark.skipif( - sys.version_info.major == 2, - reason="normalizeForInterpreter not working for 2.7, see GH #4805", - ) - def test_moreThanOneLine(self, capsys): - src = textwrap.dedent( - """\ - # Some rando comment - - def show_something(): - print("Something") - """ - ) - normalizeForInterpreter.normalize_lines(src) - captured = capsys.readouterr() - assert captured.out == src - - @pytest.mark.skipif( - sys.version_info.major == 2, - reason="normalizeForInterpreter not working for 2.7, see GH #4805", - ) - def test_withHangingIndent(self, capsys): - src = textwrap.dedent( - """\ - x = 22 - y = 30 - z = -10 - result = x + y + z - - if result == 42: - print("The answer to life, the universe, and everything") - """ - ) - normalizeForInterpreter.normalize_lines(src) - captured = capsys.readouterr() - assert captured.out == src - - @pytest.mark.skipif( - sys.version_info.major == 2, - reason="normalizeForInterpreter not working for 2.7, see GH #4805", - ) - def test_clearOutExtraneousNewlines(self, capsys): - src = textwrap.dedent( - """\ - value_x = 22 - - value_y = 30 - - value_z = -10 - - print(value_x + value_y + value_z) - - """ - ) - expectedResult = textwrap.dedent( - """\ - value_x = 22 - value_y = 30 - value_z = -10 - print(value_x + value_y + value_z) - - """ - ) - normalizeForInterpreter.normalize_lines(src) - result = capsys.readouterr() - assert result.out == expectedResult - - @pytest.mark.skipif( - sys.version_info.major == 2, - reason="normalizeForInterpreter not working for 2.7, see GH #4805", - ) - def test_clearOutExtraLinesAndWhitespace(self, capsys): - src = textwrap.dedent( - """\ - if True: - x = 22 - - y = 30 - - z = -10 - - print(x + y + z) - - """ - ) - expectedResult = textwrap.dedent( - """\ - if True: - x = 22 - y = 30 - z = -10 - - print(x + y + z) - - """ - ) - normalizeForInterpreter.normalize_lines(src) - result = capsys.readouterr() - assert result.out == expectedResult diff --git a/pythonFiles/tests/testing_tools/adapter/.data/NormCase/tests/A/b/C/test_Spam.py b/pythonFiles/tests/testing_tools/adapter/.data/NormCase/tests/A/b/C/test_Spam.py deleted file mode 100644 index 3501b9e118e5..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/NormCase/tests/A/b/C/test_Spam.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_okay(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/README.md b/pythonFiles/tests/testing_tools/adapter/.data/complex/README.md deleted file mode 100644 index 8a3c908d3fbd..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/README.md +++ /dev/null @@ -1,157 +0,0 @@ - -## Directory Structure - -``` -pythonFiles/tests/testing_tools/adapter/.data/ - tests/ # test root - test_doctest.txt - test_pytest.py - test_unittest.py - test_mixed.py - spam.py # note: no "test_" prefix, but contains tests - test_foo.py - test_42.py - test_42-43.py # note the hyphen - testspam.py - v/ - __init__.py - spam.py - test_eggs.py - test_ham.py - test_spam.py - w/ - # no __init__.py - test_spam.py - test_spam_ex.py - x/y/z/ # each with a __init__.py - test_ham.py - a/ - __init__.py - test_spam.py - b/ - __init__.py - test_spam.py -``` - -## Tests (and Suites) - -basic: - -* `./test_foo.py::test_simple` -* `./test_pytest.py::test_simple` -* `./test_pytest.py::TestSpam::test_simple` -* `./test_pytest.py::TestSpam::TestHam::TestEggs::test_simple` -* `./test_pytest.py::TestEggs::test_simple` -* `./test_pytest.py::TestParam::test_simple` -* `./test_mixed.py::test_top_level` -* `./test_mixed.py::MyTests::test_simple` -* `./test_mixed.py::TestMySuite::test_simple` -* `./test_unittest.py::MyTests::test_simple` -* `./test_unittest.py::OtherTests::test_simple` -* `./x/y/z/test_ham.py::test_simple` -* `./x/y/z/a/test_spam.py::test_simple` -* `./x/y/z/b/test_spam.py::test_simple` - -failures: - -* `./test_pytest.py::test_failure` -* `./test_pytest.py::test_runtime_failed` -* `./test_pytest.py::test_raises` - -skipped: - -* `./test_mixed.py::test_skipped` -* `./test_mixed.py::MyTests::test_skipped` -* `./test_pytest.py::test_runtime_skipped` -* `./test_pytest.py::test_skipped` -* `./test_pytest.py::test_maybe_skipped` -* `./test_pytest.py::SpamTests::test_skipped` -* `./test_pytest.py::test_param_13_markers[???]` -* `./test_pytest.py::test_param_13_skipped[*]` -* `./test_unittest.py::MyTests::test_skipped` -* (`./test_unittest.py::MyTests::test_maybe_skipped`) -* (`./test_unittest.py::MyTests::test_maybe_not_skipped`) - -in namespace package: - -* `./w/test_spam.py::test_simple` -* `./w/test_spam_ex.py::test_simple` - -filename oddities: - -* `./test_42.py::test_simple` -* `./test_42-43.py::test_simple` -* (`./testspam.py::test_simple` not discovered by default) -* (`./spam.py::test_simple` not discovered) - -imports discovered: - -* `./v/test_eggs.py::test_simple` -* `./v/test_eggs.py::TestSimple::test_simple` -* `./v/test_ham.py::test_simple` -* `./v/test_ham.py::test_not_hard` -* `./v/test_spam.py::test_simple` -* `./v/test_spam.py::test_simpler` - -subtests: - -* `./test_pytest.py::test_dynamic_*` -* `./test_pytest.py::test_param_01[]` -* `./test_pytest.py::test_param_11[1]` -* `./test_pytest.py::test_param_13[*]` -* `./test_pytest.py::test_param_13_markers[*]` -* `./test_pytest.py::test_param_13_repeat[*]` -* `./test_pytest.py::test_param_13_skipped[*]` -* `./test_pytest.py::test_param_23_13[*]` -* `./test_pytest.py::test_param_23_raises[*]` -* `./test_pytest.py::test_param_33[*]` -* `./test_pytest.py::test_param_33_ids[*]` -* `./test_pytest.py::TestParam::test_param_13[*]` -* `./test_pytest.py::TestParamAll::test_param_13[*]` -* `./test_pytest.py::TestParamAll::test_spam_13[*]` -* `./test_pytest.py::test_fixture_param[*]` -* `./test_pytest.py::test_param_fixture[*]` -* `./test_pytest_param.py::test_param_13[*]` -* `./test_pytest_param.py::TestParamAll::test_param_13[*]` -* `./test_pytest_param.py::TestParamAll::test_spam_13[*]` -* (`./test_unittest.py::MyTests::test_with_subtests`) -* (`./test_unittest.py::MyTests::test_with_nested_subtests`) -* (`./test_unittest.py::MyTests::test_dynamic_*`) - -For more options for pytests's parametrize(), see -https://docs.pytest.org/en/latest/example/parametrize.html#paramexamples. - -using fixtures: - -* `./test_pytest.py::test_fixture` -* `./test_pytest.py::test_fixture_param[*]` -* `./test_pytest.py::test_param_fixture[*]` -* `./test_pytest.py::test_param_mark_fixture[*]` - -other markers: - -* `./test_pytest.py::test_known_failure` -* `./test_pytest.py::test_param_markers[2]` -* `./test_pytest.py::test_warned` -* `./test_pytest.py::test_custom_marker` -* `./test_pytest.py::test_multiple_markers` -* (`./test_unittest.py::MyTests::test_known_failure`) - -others not discovered: - -* (`./test_pytest.py::TestSpam::TestHam::TestEggs::TestNoop1`) -* (`./test_pytest.py::TestSpam::TestNoop2`) -* (`./test_pytest.py::TestNoop3`) -* (`./test_pytest.py::MyTests::test_simple`) -* (`./test_unittest.py::MyTests::TestSub1`) -* (`./test_unittest.py::MyTests::TestSub2`) -* (`./test_unittest.py::NoTests`) - -doctests: - -* `./test_doctest.txt::test_doctest.txt` -* (`./test_doctest.py::test_doctest.py`) -* (`../mod.py::mod`) -* (`../mod.py::mod.square`) -* (`../mod.py::mod.Spam`) -* (`../mod.py::mod.spam.eggs`) diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/mod.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/mod.py deleted file mode 100644 index b8c495503895..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/mod.py +++ /dev/null @@ -1,51 +0,0 @@ -""" - -Examples: - ->>> square(1) -1 ->>> square(2) -4 ->>> square(3) -9 ->>> spam = Spam() ->>> spam.eggs() -42 -""" - - -def square(x): - """ - - Examples: - - >>> square(1) - 1 - >>> square(2) - 4 - >>> square(3) - 9 - """ - return x * x - - -class Spam(object): - """ - - Examples: - - >>> spam = Spam() - >>> spam.eggs() - 42 - """ - - def eggs(self): - """ - - Examples: - - >>> spam = Spam() - >>> spam.eggs() - 42 - """ - return 42 diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/spam.py deleted file mode 100644 index 4c4134d75584..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/spam.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42-43.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42-43.py deleted file mode 100644 index 4c4134d75584..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42-43.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42.py deleted file mode 100644 index 4c4134d75584..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_42.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.py deleted file mode 100644 index 27cccbdb77cc..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.py +++ /dev/null @@ -1,6 +0,0 @@ -""" -Doctests: - ->>> 1 == 1 -True -""" diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.txt b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.txt deleted file mode 100644 index 4b51fde5667e..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_doctest.txt +++ /dev/null @@ -1,15 +0,0 @@ - -assignment & lookup: - ->>> x = 3 ->>> x -3 - -deletion: - ->>> del x ->>> x -Traceback (most recent call last): - ... -NameError: name 'x' is not defined - diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_foo.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_foo.py deleted file mode 100644 index e752106f503a..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_foo.py +++ /dev/null @@ -1,4 +0,0 @@ - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_mixed.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_mixed.py deleted file mode 100644 index e9c675647f13..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_mixed.py +++ /dev/null @@ -1,27 +0,0 @@ -import pytest -import unittest - - -def test_top_level(): - assert True - - -@pytest.mark.skip -def test_skipped(): - assert False - - -class TestMySuite(object): - - def test_simple(self): - assert True - - -class MyTests(unittest.TestCase): - - def test_simple(self): - assert True - - @pytest.mark.skip - def test_skipped(self): - assert False diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest.py deleted file mode 100644 index 39d3ece9c0ba..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest.py +++ /dev/null @@ -1,227 +0,0 @@ -# ... - -import pytest - - -def test_simple(): - assert True - - -def test_failure(): - assert False - - -def test_runtime_skipped(): - pytest.skip('???') - - -def test_runtime_failed(): - pytest.fail('???') - - -def test_raises(): - raise Exception - - -@pytest.mark.skip -def test_skipped(): - assert False - - -@pytest.mark.skipif(True) -def test_maybe_skipped(): - assert False - - -@pytest.mark.xfail -def test_known_failure(): - assert False - - -@pytest.mark.filterwarnings -def test_warned(): - assert False - - -@pytest.mark.spam -def test_custom_marker(): - assert False - - -@pytest.mark.filterwarnings -@pytest.mark.skip -@pytest.mark.xfail -@pytest.mark.skipif(True) -@pytest.mark.skip -@pytest.mark.spam -def test_multiple_markers(): - assert False - - -for i in range(3): - def func(): - assert True - globals()['test_dynamic_{}'.format(i + 1)] = func -del func - - -class TestSpam(object): - - def test_simple(): - assert True - - @pytest.mark.skip - def test_skipped(self): - assert False - - class TestHam(object): - - class TestEggs(object): - - def test_simple(): - assert True - - class TestNoop1(object): - pass - - class TestNoop2(object): - pass - - -class TestEggs(object): - - def test_simple(): - assert True - - -# legend for parameterized test names: -# "test_param_XY[_XY]*" -# X - # params -# Y - # cases -# [_XY]* - extra decorators - -@pytest.mark.parametrize('', [()]) -def test_param_01(): - assert True - - -@pytest.mark.parametrize('x', [(1,)]) -def test_param_11(x): - assert x == 1 - - -@pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) -def test_param_13(x): - assert x == 1 - - -@pytest.mark.parametrize('x', [(1,), (1,), (1,)]) -def test_param_13_repeat(x): - assert x == 1 - - -@pytest.mark.parametrize('x,y,z', [(1, 1, 1), (3, 4, 5), (0, 0, 0)]) -def test_param_33(x, y, z): - assert x*x + y*y == z*z - - -@pytest.mark.parametrize('x,y,z', [(1, 1, 1), (3, 4, 5), (0, 0, 0)], - ids=['v1', 'v2', 'v3']) -def test_param_33_ids(x, y, z): - assert x*x + y*y == z*z - - -@pytest.mark.parametrize('z', [(1,), (5,), (0,)]) -@pytest.mark.parametrize('x,y', [(1, 1), (3, 4), (0, 0)]) -def test_param_23_13(x, y, z): - assert x*x + y*y == z*z - - -@pytest.mark.parametrize('x', [ - (1,), - pytest.param(1.0, marks=[pytest.mark.skip, pytest.mark.spam], id='???'), - pytest.param(2, marks=[pytest.mark.xfail]), - ]) -def test_param_13_markers(x): - assert x == 1 - - -@pytest.mark.skip -@pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) -def test_param_13_skipped(x): - assert x == 1 - - -@pytest.mark.parametrize('x,catch', [(1, None), (1.0, None), (2, pytest.raises(Exception))]) -def test_param_23_raises(x, catch): - if x != 1: - with catch: - raise Exception - - -class TestParam(object): - - def test_simple(): - assert True - - @pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) - def test_param_13(self, x): - assert x == 1 - - -@pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) -class TestParamAll(object): - - def test_param_13(self, x): - assert x == 1 - - def test_spam_13(self, x): - assert x == 1 - - -@pytest.fixture -def spamfix(request): - yield 'spam' - - -@pytest.fixture(params=['spam', 'eggs']) -def paramfix(request): - return request.param - - -def test_fixture(spamfix): - assert spamfix == 'spam' - - -@pytest.mark.usefixtures('spamfix') -def test_mark_fixture(): - assert True - - -@pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) -def test_param_fixture(spamfix, x): - assert spamfix == 'spam' - assert x == 1 - - -@pytest.mark.parametrize('x', [ - (1,), - (1.0,), - pytest.param(1+0j, marks=[pytest.mark.usefixtures('spamfix')]), - ]) -def test_param_mark_fixture(x): - assert x == 1 - - -def test_fixture_param(paramfix): - assert paramfix == 'spam' - - -class TestNoop3(object): - pass - - -class MyTests(object): # does not match default name pattern - - def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest_param.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest_param.py deleted file mode 100644 index bd22d89f42bd..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_pytest_param.py +++ /dev/null @@ -1,18 +0,0 @@ -import pytest - - -# module-level parameterization -pytestmark = pytest.mark.parametrize('x', [(1,), (1.0,), (1+0j,)]) - - -def test_param_13(x): - assert x == 1 - - -class TestParamAll(object): - - def test_param_13(self, x): - assert x == 1 - - def test_spam_13(self, x): - assert x == 1 diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_unittest.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_unittest.py deleted file mode 100644 index dd3e82535739..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/test_unittest.py +++ /dev/null @@ -1,66 +0,0 @@ -import unittest - - -class MyTests(unittest.TestCase): - - def test_simple(self): - self.assertTrue(True) - - @unittest.skip('???') - def test_skipped(self): - self.assertTrue(False) - - @unittest.skipIf(True, '???') - def test_maybe_skipped(self): - self.assertTrue(False) - - @unittest.skipUnless(False, '???') - def test_maybe_not_skipped(self): - self.assertTrue(False) - - def test_skipped_inside(self): - raise unittest.SkipTest('???') - - class TestSub1(object): - - def test_simple(self): - self.assertTrue(True) - - class TestSub2(unittest.TestCase): - - def test_simple(self): - self.assertTrue(True) - - def test_failure(self): - raise Exception - - @unittest.expectedFailure - def test_known_failure(self): - raise Exception - - def test_with_subtests(self): - for i in range(3): - with self.subtest(i): # This is invalid under Py2. - self.assertTrue(True) - - def test_with_nested_subtests(self): - for i in range(3): - with self.subtest(i): # This is invalid under Py2. - for j in range(3): - with self.subtest(i): # This is invalid under Py2. - self.assertTrue(True) - - for i in range(3): - def test_dynamic_(self, i=i): - self.assertEqual(True) - test_dynamic_.__name__ += str(i) - - -class OtherTests(unittest.TestCase): - - def test_simple(self): - self.assertTrue(True) - - -class NoTests(unittest.TestCase): - pass diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/testspam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/testspam.py deleted file mode 100644 index 7ec91c783e2c..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/testspam.py +++ /dev/null @@ -1,9 +0,0 @@ -''' -... -... -... -''' - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/spam.py deleted file mode 100644 index 18c92c09306e..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/spam.py +++ /dev/null @@ -1,9 +0,0 @@ - -def test_simple(self): - assert True - - -class TestSimple(object): - - def test_simple(self): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_eggs.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_eggs.py deleted file mode 100644 index f3e7d9517631..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_eggs.py +++ /dev/null @@ -1 +0,0 @@ -from .spam import * diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_ham.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_ham.py deleted file mode 100644 index 6b6a01f87ec5..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_ham.py +++ /dev/null @@ -1,2 +0,0 @@ -from .spam import test_simple -from .spam import test_simple as test_not_hard diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_spam.py deleted file mode 100644 index 18cf56f90533..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/v/test_spam.py +++ /dev/null @@ -1,5 +0,0 @@ -from .spam import test_simple - - -def test_simpler(self): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam.py deleted file mode 100644 index 6a0b60d1d5bd..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam.py +++ /dev/null @@ -1,5 +0,0 @@ - - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam_ex.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam_ex.py deleted file mode 100644 index 6a0b60d1d5bd..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/w/test_spam_ex.py +++ /dev/null @@ -1,5 +0,0 @@ - - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/a/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/a/test_spam.py deleted file mode 100644 index bdb7e4fec3a5..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/a/test_spam.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -... -""" - - -# ... - -ANSWER = 42 - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/b/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/b/test_spam.py deleted file mode 100644 index 4923c556c29a..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/b/test_spam.py +++ /dev/null @@ -1,8 +0,0 @@ - - -# ?!? -CHORUS = 'spamspamspamspamspam...' - - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/test_ham.py b/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/test_ham.py deleted file mode 100644 index 4c4134d75584..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/complex/tests/x/y/z/test_ham.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/simple/tests/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/simple/tests/test_spam.py deleted file mode 100644 index 4c4134d75584..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/simple/tests/test_spam.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_simple(): - assert True diff --git a/pythonFiles/tests/testing_tools/adapter/.data/syntax-error/tests/test_spam.py b/pythonFiles/tests/testing_tools/adapter/.data/syntax-error/tests/test_spam.py deleted file mode 100644 index 54d6400a3465..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/.data/syntax-error/tests/test_spam.py +++ /dev/null @@ -1,7 +0,0 @@ - -def test_simple(): - assert True - - -# A syntax error: -: diff --git a/pythonFiles/tests/testing_tools/adapter/pytest/test_cli.py b/pythonFiles/tests/testing_tools/adapter/pytest/test_cli.py deleted file mode 100644 index f5d41f603be0..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/pytest/test_cli.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import unittest - -from ....util import Stub, StubProxy -from testing_tools.adapter.errors import UnsupportedCommandError -from testing_tools.adapter.pytest._cli import add_subparser - - -class StubSubparsers(StubProxy): - def __init__(self, stub=None, name="subparsers"): - super(StubSubparsers, self).__init__(stub, name) - - def add_parser(self, name): - self.add_call("add_parser", None, {"name": name}) - return self.return_add_parser - - -class StubArgParser(StubProxy): - def __init__(self, stub=None): - super(StubArgParser, self).__init__(stub, "argparser") - - def add_argument(self, *args, **kwargs): - self.add_call("add_argument", args, kwargs) - - -class AddCLISubparserTests(unittest.TestCase): - def test_discover(self): - stub = Stub() - subparsers = StubSubparsers(stub) - parser = StubArgParser(stub) - subparsers.return_add_parser = parser - - add_subparser("discover", "pytest", subparsers) - - self.assertEqual( - stub.calls, [("subparsers.add_parser", None, {"name": "pytest"}),] - ) - - def test_unsupported_command(self): - subparsers = StubSubparsers(name=None) - subparsers.return_add_parser = None - - with self.assertRaises(UnsupportedCommandError): - add_subparser("run", "pytest", subparsers) - with self.assertRaises(UnsupportedCommandError): - add_subparser("debug", "pytest", subparsers) - with self.assertRaises(UnsupportedCommandError): - add_subparser("???", "pytest", subparsers) - self.assertEqual( - subparsers.calls, - [ - ("add_parser", None, {"name": "pytest"}), - ("add_parser", None, {"name": "pytest"}), - ("add_parser", None, {"name": "pytest"}), - ], - ) diff --git a/pythonFiles/tests/testing_tools/adapter/pytest/test_discovery.py b/pythonFiles/tests/testing_tools/adapter/pytest/test_discovery.py deleted file mode 100644 index 7d1a065d3f1b..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/pytest/test_discovery.py +++ /dev/null @@ -1,1386 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import print_function, unicode_literals - -try: - from io import StringIO -except ImportError: # 2.7 - from StringIO import StringIO -from os import name as OS_NAME -import sys -import unittest - -import pytest -import _pytest.doctest - -from ....util import Stub, StubProxy -from testing_tools.adapter.util import fix_path, fix_relpath, fix_fileid, PATH_JOIN -from testing_tools.adapter.info import TestInfo, TestPath, ParentInfo -from testing_tools.adapter.pytest import _pytest_item as pytest_item -from testing_tools.adapter.pytest._discovery import discover, TestCollector - - -class StubPyTest(StubProxy): - def __init__(self, stub=None): - super(StubPyTest, self).__init__(stub, "pytest") - self.return_main = 0 - - def main(self, args, plugins): - self.add_call("main", None, {"args": args, "plugins": plugins}) - return self.return_main - - -class StubPlugin(StubProxy): - - _started = True - - def __init__(self, stub=None, tests=None): - super(StubPlugin, self).__init__(stub, "plugin") - if tests is None: - tests = StubDiscoveredTests(self.stub) - self._tests = tests - - def __getattr__(self, name): - if not name.startswith("pytest_"): - raise AttributeError(name) - - def func(*args, **kwargs): - self.add_call(name, args or None, kwargs or None) - - return func - - -class StubDiscoveredTests(StubProxy): - - NOT_FOUND = object() - - def __init__(self, stub=None): - super(StubDiscoveredTests, self).__init__(stub, "discovered") - self.return_items = [] - self.return_parents = [] - - def __len__(self): - self.add_call("__len__", None, None) - return len(self.return_items) - - def __getitem__(self, index): - self.add_call("__getitem__", (index,), None) - return self.return_items[index] - - @property - def parents(self): - self.add_call("parents", None, None) - return self.return_parents - - def reset(self): - self.add_call("reset", None, None) - - def add_test(self, test, parents): - self.add_call("add_test", None, {"test": test, "parents": parents}) - - -class FakeFunc(object): - def __init__(self, name): - self.__name__ = name - - -class FakeMarker(object): - def __init__(self, name): - self.name = name - - -class StubPytestItem(StubProxy): - - _debugging = False - _hasfunc = True - - def __init__(self, stub=None, **attrs): - super(StubPytestItem, self).__init__(stub, "pytest.Item") - if attrs.get("function") is None: - attrs.pop("function", None) - self._hasfunc = False - - attrs.setdefault("user_properties", []) - - self.__dict__.update(attrs) - - if "own_markers" not in attrs: - self.own_markers = () - - def __repr__(self): - return object.__repr__(self) - - def __getattr__(self, name): - if not self._debugging: - self.add_call(name + " (attr)", None, None) - if name == "function": - if not self._hasfunc: - raise AttributeError(name) - - def func(*args, **kwargs): - self.add_call(name, args or None, kwargs or None) - - return func - - -class StubSubtypedItem(StubPytestItem): - def __init__(self, *args, **kwargs): - super(StubSubtypedItem, self).__init__(*args, **kwargs) - if "nodeid" in self.__dict__: - self._nodeid = self.__dict__.pop("nodeid") - - @property - def location(self): - return self.__dict__.get("location") - - -class StubFunctionItem(StubSubtypedItem, pytest.Function): - @property - def function(self): - return self.__dict__.get("function") - - -class StubDoctestItem(StubSubtypedItem, _pytest.doctest.DoctestItem): - pass - - -class StubPytestSession(StubProxy): - def __init__(self, stub=None): - super(StubPytestSession, self).__init__(stub, "pytest.Session") - - def __getattr__(self, name): - self.add_call(name + " (attr)", None, None) - - def func(*args, **kwargs): - self.add_call(name, args or None, kwargs or None) - - return func - - -class StubPytestConfig(StubProxy): - def __init__(self, stub=None): - super(StubPytestConfig, self).__init__(stub, "pytest.Config") - - def __getattr__(self, name): - self.add_call(name + " (attr)", None, None) - - def func(*args, **kwargs): - self.add_call(name, args or None, kwargs or None) - - return func - - -def generate_parse_item(pathsep): - if pathsep == "\\": - - def normcase(path): - path = path.lower() - return path.replace("/", "\\") - - else: - raise NotImplementedError - ########## - def _fix_fileid(*args): - return fix_fileid(*args, **dict(_normcase=normcase, _pathsep=pathsep,)) - - def _normalize_test_id(*args): - return pytest_item._normalize_test_id( - *args, **dict(_fix_fileid=_fix_fileid, _pathsep=pathsep,) - ) - - def _iter_nodes(*args): - return pytest_item._iter_nodes( - *args, - **dict( - _normalize_test_id=_normalize_test_id, - _normcase=normcase, - _pathsep=pathsep, - ) - ) - - def _parse_node_id(*args): - return pytest_item._parse_node_id(*args, **dict(_iter_nodes=_iter_nodes,)) - - ########## - def _split_fspath(*args): - return pytest_item._split_fspath(*args, **dict(_normcase=normcase,)) - - ########## - def _matches_relfile(*args): - return pytest_item._matches_relfile( - *args, **dict(_normcase=normcase, _pathsep=pathsep,) - ) - - def _is_legacy_wrapper(*args): - return pytest_item._is_legacy_wrapper(*args, **dict(_pathsep=pathsep,)) - - def _get_location(*args): - return pytest_item._get_location( - *args, - **dict( - _matches_relfile=_matches_relfile, - _is_legacy_wrapper=_is_legacy_wrapper, - _pathsep=pathsep, - ) - ) - - ########## - def _parse_item(item): - return pytest_item.parse_item( - item, - **dict( - _parse_node_id=_parse_node_id, - _split_fspath=_split_fspath, - _get_location=_get_location, - ) - ) - - return _parse_item - - -################################## -# tests - - -class DiscoverTests(unittest.TestCase): - - DEFAULT_ARGS = [ - "--collect-only", - ] - - def test_basic(self): - stub = Stub() - stubpytest = StubPyTest(stub) - plugin = StubPlugin(stub) - expected = [] - plugin.discovered = expected - - parents, tests = discover([], _pytest_main=stubpytest.main, _plugin=plugin) - - self.assertEqual(parents, []) - self.assertEqual(tests, expected) - self.assertEqual( - stub.calls, - [ - ("pytest.main", None, {"args": self.DEFAULT_ARGS, "plugins": [plugin]}), - ("discovered.parents", None, None), - ("discovered.__len__", None, None), - ("discovered.__getitem__", (0,), None), - ], - ) - - def test_failure(self): - stub = Stub() - pytest = StubPyTest(stub) - pytest.return_main = 2 - plugin = StubPlugin(stub) - - with self.assertRaises(Exception): - discover([], _pytest_main=pytest.main, _plugin=plugin) - - self.assertEqual( - stub.calls, - [("pytest.main", None, {"args": self.DEFAULT_ARGS, "plugins": [plugin]}),], - ) - - def test_no_tests_found(self): - stub = Stub() - pytest = StubPyTest(stub) - pytest.return_main = 5 - plugin = StubPlugin(stub) - expected = [] - plugin.discovered = expected - - parents, tests = discover([], _pytest_main=pytest.main, _plugin=plugin) - - self.assertEqual(parents, []) - self.assertEqual(tests, expected) - self.assertEqual( - stub.calls, - [ - ("pytest.main", None, {"args": self.DEFAULT_ARGS, "plugins": [plugin]}), - ("discovered.parents", None, None), - ("discovered.__len__", None, None), - ("discovered.__getitem__", (0,), None), - ], - ) - - def test_stdio_hidden(self): - pytest_stdout = "spamspamspamspamspamspamspammityspam" - stub = Stub() - - def fake_pytest_main(args, plugins): - stub.add_call("pytest.main", None, {"args": args, "plugins": plugins}) - print(pytest_stdout, end="") - return 0 - - plugin = StubPlugin(stub) - plugin.discovered = [] - buf = StringIO() - - sys.stdout = buf - try: - discover([], hidestdio=True, _pytest_main=fake_pytest_main, _plugin=plugin) - finally: - sys.stdout = sys.__stdout__ - captured = buf.getvalue() - - self.assertEqual(captured, "") - self.assertEqual( - stub.calls, - [ - ("pytest.main", None, {"args": self.DEFAULT_ARGS, "plugins": [plugin]}), - ("discovered.parents", None, None), - ("discovered.__len__", None, None), - ("discovered.__getitem__", (0,), None), - ], - ) - - def test_stdio_not_hidden(self): - pytest_stdout = "spamspamspamspamspamspamspammityspam" - stub = Stub() - - def fake_pytest_main(args, plugins): - stub.add_call("pytest.main", None, {"args": args, "plugins": plugins}) - print(pytest_stdout, end="") - return 0 - - plugin = StubPlugin(stub) - plugin.discovered = [] - buf = StringIO() - - sys.stdout = buf - try: - discover([], hidestdio=False, _pytest_main=fake_pytest_main, _plugin=plugin) - finally: - sys.stdout = sys.__stdout__ - captured = buf.getvalue() - - self.assertEqual(captured, pytest_stdout) - self.assertEqual( - stub.calls, - [ - ("pytest.main", None, {"args": self.DEFAULT_ARGS, "plugins": [plugin]}), - ("discovered.parents", None, None), - ("discovered.__len__", None, None), - ("discovered.__getitem__", (0,), None), - ], - ) - - -class CollectorTests(unittest.TestCase): - def test_modifyitems(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - config = StubPytestConfig(stub) - collector = TestCollector(tests=discovered) - - testroot = fix_path("/a/b/c") - relfile1 = fix_path("./test_spam.py") - relfile2 = fix_path("x/y/z/test_eggs.py") - - collector.pytest_collection_modifyitems( - session, - config, - [ - StubFunctionItem( - stub, - nodeid="test_spam.py::SpamTests::test_one", - name="test_one", - location=("test_spam.py", 12, "SpamTests.test_one"), - fspath=PATH_JOIN(testroot, "test_spam.py"), - function=FakeFunc("test_one"), - ), - StubFunctionItem( - stub, - nodeid="test_spam.py::SpamTests::test_other", - name="test_other", - location=("test_spam.py", 19, "SpamTests.test_other"), - fspath=PATH_JOIN(testroot, "test_spam.py"), - function=FakeFunc("test_other"), - ), - StubFunctionItem( - stub, - nodeid="test_spam.py::test_all", - name="test_all", - location=("test_spam.py", 144, "test_all"), - fspath=PATH_JOIN(testroot, "test_spam.py"), - function=FakeFunc("test_all"), - ), - StubFunctionItem( - stub, - nodeid="test_spam.py::test_each[10-10]", - name="test_each[10-10]", - location=("test_spam.py", 273, "test_each[10-10]"), - fspath=PATH_JOIN(testroot, "test_spam.py"), - function=FakeFunc("test_each"), - ), - StubFunctionItem( - stub, - nodeid=relfile2 + "::All::BasicTests::test_first", - name="test_first", - location=(relfile2, 31, "All.BasicTests.test_first"), - fspath=PATH_JOIN(testroot, relfile2), - function=FakeFunc("test_first"), - ), - StubFunctionItem( - stub, - nodeid=relfile2 + "::All::BasicTests::test_each[1+2-3]", - name="test_each[1+2-3]", - location=(relfile2, 62, "All.BasicTests.test_each[1+2-3]"), - fspath=PATH_JOIN(testroot, relfile2), - function=FakeFunc("test_each"), - own_markers=[ - FakeMarker(v) - for v in [ - # supported - "skip", - "skipif", - "xfail", - # duplicate - "skip", - # ignored (pytest-supported) - "parameterize", - "usefixtures", - "filterwarnings", - # ignored (custom) - "timeout", - ] - ], - ), - ], - ) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./test_spam.py::SpamTests", "SpamTests", "suite"), - ("./test_spam.py", "test_spam.py", "file"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./test_spam.py::SpamTests::test_one", - name="test_one", - path=TestPath( - root=testroot, - relfile=relfile1, - func="SpamTests.test_one", - sub=None, - ), - source="{}:{}".format(relfile1, 13), - markers=None, - parentid="./test_spam.py::SpamTests", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./test_spam.py::SpamTests", "SpamTests", "suite"), - ("./test_spam.py", "test_spam.py", "file"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./test_spam.py::SpamTests::test_other", - name="test_other", - path=TestPath( - root=testroot, - relfile=relfile1, - func="SpamTests.test_other", - sub=None, - ), - source="{}:{}".format(relfile1, 20), - markers=None, - parentid="./test_spam.py::SpamTests", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./test_spam.py", "test_spam.py", "file"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./test_spam.py::test_all", - name="test_all", - path=TestPath( - root=testroot, - relfile=relfile1, - func="test_all", - sub=None, - ), - source="{}:{}".format(relfile1, 145), - markers=None, - parentid="./test_spam.py", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./test_spam.py::test_each", "test_each", "function"), - ("./test_spam.py", "test_spam.py", "file"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./test_spam.py::test_each[10-10]", - name="test_each[10-10]", - path=TestPath( - root=testroot, - relfile=relfile1, - func="test_each", - sub=["[10-10]"], - ), - source="{}:{}".format(relfile1, 274), - markers=None, - parentid="./test_spam.py::test_each", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ( - "./x/y/z/test_eggs.py::All::BasicTests", - "BasicTests", - "suite", - ), - ("./x/y/z/test_eggs.py::All", "All", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::All::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile2), - func="All.BasicTests.test_first", - sub=None, - ), - source="{}:{}".format(fix_relpath(relfile2), 32), - markers=None, - parentid="./x/y/z/test_eggs.py::All::BasicTests", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ( - "./x/y/z/test_eggs.py::All::BasicTests::test_each", - "test_each", - "function", - ), - ( - "./x/y/z/test_eggs.py::All::BasicTests", - "BasicTests", - "suite", - ), - ("./x/y/z/test_eggs.py::All", "All", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::All::BasicTests::test_each[1+2-3]", - name="test_each[1+2-3]", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile2), - func="All.BasicTests.test_each", - sub=["[1+2-3]"], - ), - source="{}:{}".format(fix_relpath(relfile2), 63), - markers=["expected-failure", "skip", "skip-if"], - parentid="./x/y/z/test_eggs.py::All::BasicTests::test_each", - ), - ), - ), - ], - ) - - def test_finish(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_eggs.py") - session.items = [ - StubFunctionItem( - stub, - nodeid=relfile + "::SpamTests::test_spam", - name="test_spam", - location=(relfile, 12, "SpamTests.test_spam"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py::SpamTests", "SpamTests", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::SpamTests::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="SpamTests.test_spam", - sub=None, - ), - source="{}:{}".format(fix_relpath(relfile), 13), - markers=None, - parentid="./x/y/z/test_eggs.py::SpamTests", - ), - ), - ), - ], - ) - - def test_doctest(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - doctestfile = fix_path("x/test_doctest.txt") - relfile = fix_path("x/y/z/test_eggs.py") - session.items = [ - StubDoctestItem( - stub, - nodeid=doctestfile + "::test_doctest.txt", - name="test_doctest.txt", - location=(doctestfile, 0, "[doctest] test_doctest.txt"), - fspath=PATH_JOIN(testroot, doctestfile), - ), - # With --doctest-modules - StubDoctestItem( - stub, - nodeid=relfile + "::test_eggs", - name="test_eggs", - location=(relfile, 0, "[doctest] test_eggs"), - fspath=PATH_JOIN(testroot, relfile), - ), - StubDoctestItem( - stub, - nodeid=relfile + "::test_eggs.TestSpam", - name="test_eggs.TestSpam", - location=(relfile, 12, "[doctest] test_eggs.TestSpam"), - fspath=PATH_JOIN(testroot, relfile), - ), - StubDoctestItem( - stub, - nodeid=relfile + "::test_eggs.TestSpam.TestEggs", - name="test_eggs.TestSpam.TestEggs", - location=(relfile, 27, "[doctest] test_eggs.TestSpam.TestEggs"), - fspath=PATH_JOIN(testroot, relfile), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/test_doctest.txt", "test_doctest.txt", "file"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/test_doctest.txt::test_doctest.txt", - name="test_doctest.txt", - path=TestPath( - root=testroot, - relfile=fix_relpath(doctestfile), - func=None, - ), - source="{}:{}".format(fix_relpath(doctestfile), 1), - markers=[], - parentid="./x/test_doctest.txt", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::test_eggs", - name="test_eggs", - path=TestPath( - root=testroot, relfile=fix_relpath(relfile), func=None, - ), - source="{}:{}".format(fix_relpath(relfile), 1), - markers=[], - parentid="./x/y/z/test_eggs.py", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::test_eggs.TestSpam", - name="test_eggs.TestSpam", - path=TestPath( - root=testroot, relfile=fix_relpath(relfile), func=None, - ), - source="{}:{}".format(fix_relpath(relfile), 13), - markers=[], - parentid="./x/y/z/test_eggs.py", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::test_eggs.TestSpam.TestEggs", - name="test_eggs.TestSpam.TestEggs", - path=TestPath( - root=testroot, relfile=fix_relpath(relfile), func=None, - ), - source="{}:{}".format(fix_relpath(relfile), 28), - markers=[], - parentid="./x/y/z/test_eggs.py", - ), - ), - ), - ], - ) - - def test_nested_brackets(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_eggs.py") - session.items = [ - StubFunctionItem( - stub, - nodeid=relfile + "::SpamTests::test_spam[a-[b]-c]", - name="test_spam[a-[b]-c]", - location=(relfile, 12, "SpamTests.test_spam[a-[b]-c]"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ( - "./x/y/z/test_eggs.py::SpamTests::test_spam", - "test_spam", - "function", - ), - ("./x/y/z/test_eggs.py::SpamTests", "SpamTests", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::SpamTests::test_spam[a-[b]-c]", - name="test_spam[a-[b]-c]", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="SpamTests.test_spam", - sub=["[a-[b]-c]"], - ), - source="{}:{}".format(fix_relpath(relfile), 13), - markers=None, - parentid="./x/y/z/test_eggs.py::SpamTests::test_spam", - ), - ), - ), - ], - ) - - def test_nested_suite(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_eggs.py") - session.items = [ - StubFunctionItem( - stub, - nodeid=relfile + "::SpamTests::Ham::Eggs::test_spam", - name="test_spam", - location=(relfile, 12, "SpamTests.Ham.Eggs.test_spam"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ( - "./x/y/z/test_eggs.py::SpamTests::Ham::Eggs", - "Eggs", - "suite", - ), - ("./x/y/z/test_eggs.py::SpamTests::Ham", "Ham", "suite"), - ("./x/y/z/test_eggs.py::SpamTests", "SpamTests", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::SpamTests::Ham::Eggs::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="SpamTests.Ham.Eggs.test_spam", - sub=None, - ), - source="{}:{}".format(fix_relpath(relfile), 13), - markers=None, - parentid="./x/y/z/test_eggs.py::SpamTests::Ham::Eggs", - ), - ), - ), - ], - ) - - def test_windows(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = r"C:\A\B\C" - altroot = testroot.replace("\\", "/") - relfile = r"X\Y\Z\test_Eggs.py" - session.items = [ - # typical: - StubFunctionItem( - stub, - # pytest always uses "/" as the path separator in node IDs: - nodeid="X/Y/Z/test_Eggs.py::SpamTests::test_spam", - name="test_spam", - # normal path separator (contrast with nodeid): - location=(relfile, 12, "SpamTests.test_spam"), - # path separator matches location: - fspath=testroot + "\\" + relfile, - function=FakeFunc("test_spam"), - ), - ] - tests = [ - # permutations of path separators - (r"X/test_a.py", "\\", "\\"), # typical - (r"X/test_b.py", "\\", "/"), - (r"X/test_c.py", "/", "\\"), - (r"X/test_d.py", "/", "/"), - (r"X\test_e.py", "\\", "\\"), - (r"X\test_f.py", "\\", "/"), - (r"X\test_g.py", "/", "\\"), - (r"X\test_h.py", "/", "/"), - ] - for fileid, locfile, fspath in tests: - if locfile == "/": - locfile = fileid.replace("\\", "/") - elif locfile == "\\": - locfile = fileid.replace("/", "\\") - if fspath == "/": - fspath = (testroot + "/" + fileid).replace("\\", "/") - elif fspath == "\\": - fspath = (testroot + "/" + fileid).replace("/", "\\") - session.items.append( - StubFunctionItem( - stub, - nodeid=fileid + "::test_spam", - name="test_spam", - location=(locfile, 12, "test_spam"), - fspath=fspath, - function=FakeFunc("test_spam"), - ) - ) - collector = TestCollector(tests=discovered) - if OS_NAME != "nt": - collector.parse_item = generate_parse_item("\\") - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/Y/Z/test_Eggs.py::SpamTests", "SpamTests", "suite"), - (r"./X/Y/Z/test_Eggs.py", "test_Eggs.py", "file"), - (r"./X/Y/Z", "Z", "folder"), - (r"./X/Y", "Y", "folder"), - (r"./X", "X", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id=r"./X/Y/Z/test_Eggs.py::SpamTests::test_spam", - name="test_spam", - path=TestPath( - root=testroot, # not normalized - relfile=r".\X\Y\Z\test_Eggs.py", # not normalized - func="SpamTests.test_spam", - sub=None, - ), - source=r".\X\Y\Z\test_Eggs.py:13", # not normalized - markers=None, - parentid=r"./X/Y/Z/test_Eggs.py::SpamTests", - ), - ), - ), - # permutations - # (*all* the IDs use "/") - # (source path separator should match relfile, not location) - # /, \, \ - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_a.py", "test_a.py", "file"), - (r"./X", "X", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_a.py::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=r".\X\test_a.py", - func="test_spam", - sub=None, - ), - source=r".\X\test_a.py:13", - markers=None, - parentid=r"./X/test_a.py", - ), - ), - ), - # /, \, / - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_b.py", "test_b.py", "file"), - (r"./X", "X", "folder"), - (".", altroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_b.py::test_spam", - name="test_spam", - path=TestPath( - root=altroot, - relfile=r"./X/test_b.py", - func="test_spam", - sub=None, - ), - source=r"./X/test_b.py:13", - markers=None, - parentid=r"./X/test_b.py", - ), - ), - ), - # /, /, \ - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_c.py", "test_c.py", "file"), - (r"./X", "X", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_c.py::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=r".\X\test_c.py", - func="test_spam", - sub=None, - ), - source=r".\X\test_c.py:13", - markers=None, - parentid=r"./X/test_c.py", - ), - ), - ), - # /, /, / - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_d.py", "test_d.py", "file"), - (r"./X", "X", "folder"), - (".", altroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_d.py::test_spam", - name="test_spam", - path=TestPath( - root=altroot, - relfile=r"./X/test_d.py", - func="test_spam", - sub=None, - ), - source=r"./X/test_d.py:13", - markers=None, - parentid=r"./X/test_d.py", - ), - ), - ), - # \, \, \ - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_e.py", "test_e.py", "file"), - (r"./X", "X", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_e.py::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=r".\X\test_e.py", - func="test_spam", - sub=None, - ), - source=r".\X\test_e.py:13", - markers=None, - parentid=r"./X/test_e.py", - ), - ), - ), - # \, \, / - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_f.py", "test_f.py", "file"), - (r"./X", "X", "folder"), - (".", altroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_f.py::test_spam", - name="test_spam", - path=TestPath( - root=altroot, - relfile=r"./X/test_f.py", - func="test_spam", - sub=None, - ), - source=r"./X/test_f.py:13", - markers=None, - parentid=r"./X/test_f.py", - ), - ), - ), - # \, /, \ - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_g.py", "test_g.py", "file"), - (r"./X", "X", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_g.py::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=r".\X\test_g.py", - func="test_spam", - sub=None, - ), - source=r".\X\test_g.py:13", - markers=None, - parentid=r"./X/test_g.py", - ), - ), - ), - # \, /, / - ( - "discovered.add_test", - None, - dict( - parents=[ - (r"./X/test_h.py", "test_h.py", "file"), - (r"./X", "X", "folder"), - (".", altroot, "folder"), - ], - test=TestInfo( - id=r"./X/test_h.py::test_spam", - name="test_spam", - path=TestPath( - root=altroot, - relfile=r"./X/test_h.py", - func="test_spam", - sub=None, - ), - source=r"./X/test_h.py:13", - markers=None, - parentid=r"./X/test_h.py", - ), - ), - ), - ], - ) - - def test_mysterious_parens(self): - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_eggs.py") - session.items = [ - StubFunctionItem( - stub, - nodeid=relfile + "::SpamTests::()::()::test_spam", - name="test_spam", - location=(relfile, 12, "SpamTests.test_spam"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py::SpamTests", "SpamTests", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::SpamTests::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="SpamTests.test_spam", - sub=[], - ), - source="{}:{}".format(fix_relpath(relfile), 13), - markers=None, - parentid="./x/y/z/test_eggs.py::SpamTests", - ), - ), - ), - ], - ) - - def test_imported_test(self): - # pytest will even discover tests that were imported from - # another module! - stub = Stub() - discovered = StubDiscoveredTests(stub) - session = StubPytestSession(stub) - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_eggs.py") - srcfile = fix_path("x/y/z/_extern.py") - session.items = [ - StubFunctionItem( - stub, - nodeid=relfile + "::SpamTests::test_spam", - name="test_spam", - location=(srcfile, 12, "SpamTests.test_spam"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - StubFunctionItem( - stub, - nodeid=relfile + "::test_ham", - name="test_ham", - location=(srcfile, 3, "test_ham"), - fspath=PATH_JOIN(testroot, relfile), - function=FakeFunc("test_spam"), - ), - ] - collector = TestCollector(tests=discovered) - - collector.pytest_collection_finish(session) - - self.maxDiff = None - self.assertEqual( - stub.calls, - [ - ("discovered.reset", None, None), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py::SpamTests", "SpamTests", "suite"), - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::SpamTests::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="SpamTests.test_spam", - sub=None, - ), - source="{}:{}".format(fix_relpath(srcfile), 13), - markers=None, - parentid="./x/y/z/test_eggs.py::SpamTests", - ), - ), - ), - ( - "discovered.add_test", - None, - dict( - parents=[ - ("./x/y/z/test_eggs.py", "test_eggs.py", "file"), - ("./x/y/z", "z", "folder"), - ("./x/y", "y", "folder"), - ("./x", "x", "folder"), - (".", testroot, "folder"), - ], - test=TestInfo( - id="./x/y/z/test_eggs.py::test_ham", - name="test_ham", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="test_ham", - sub=None, - ), - source="{}:{}".format(fix_relpath(srcfile), 4), - markers=None, - parentid="./x/y/z/test_eggs.py", - ), - ), - ), - ], - ) diff --git a/pythonFiles/tests/testing_tools/adapter/test___main__.py b/pythonFiles/tests/testing_tools/adapter/test___main__.py deleted file mode 100644 index e14b08ee9d5b..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/test___main__.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import unittest - -from ...util import Stub, StubProxy -from testing_tools.adapter.__main__ import ( - parse_args, - main, - UnsupportedToolError, - UnsupportedCommandError, -) - - -class StubTool(StubProxy): - def __init__(self, name, stub=None): - super(StubTool, self).__init__(stub, name) - self.return_discover = None - - def discover(self, args, **kwargs): - self.add_call("discover", (args,), kwargs) - if self.return_discover is None: - raise NotImplementedError - return self.return_discover - - -class StubReporter(StubProxy): - def __init__(self, stub=None): - super(StubReporter, self).__init__(stub, "reporter") - - def report(self, tests, parents, **kwargs): - self.add_call("report", (tests, parents), kwargs or None) - - -################################## -# tests - - -class ParseGeneralTests(unittest.TestCase): - def test_unsupported_command(self): - with self.assertRaises(SystemExit): - parse_args(["run", "pytest"]) - with self.assertRaises(SystemExit): - parse_args(["debug", "pytest"]) - with self.assertRaises(SystemExit): - parse_args(["???", "pytest"]) - - -class ParseDiscoverTests(unittest.TestCase): - def test_pytest_default(self): - tool, cmd, args, toolargs = parse_args(["discover", "pytest",]) - - self.assertEqual(tool, "pytest") - self.assertEqual(cmd, "discover") - self.assertEqual(args, {"pretty": False, "hidestdio": True, "simple": False}) - self.assertEqual(toolargs, []) - - def test_pytest_full(self): - tool, cmd, args, toolargs = parse_args( - [ - "discover", - "pytest", - # no adapter-specific options yet - "--", - "--strict", - "--ignore", - "spam,ham,eggs", - "--pastebin=xyz", - "--no-cov", - "-d", - ] - ) - - self.assertEqual(tool, "pytest") - self.assertEqual(cmd, "discover") - self.assertEqual(args, {"pretty": False, "hidestdio": True, "simple": False}) - self.assertEqual( - toolargs, - [ - "--strict", - "--ignore", - "spam,ham,eggs", - "--pastebin=xyz", - "--no-cov", - "-d", - ], - ) - - def test_pytest_opts(self): - tool, cmd, args, toolargs = parse_args( - ["discover", "pytest", "--simple", "--no-hide-stdio", "--pretty",] - ) - - self.assertEqual(tool, "pytest") - self.assertEqual(cmd, "discover") - self.assertEqual(args, {"pretty": True, "hidestdio": False, "simple": True}) - self.assertEqual(toolargs, []) - - def test_unsupported_tool(self): - with self.assertRaises(SystemExit): - parse_args(["discover", "unittest"]) - with self.assertRaises(SystemExit): - parse_args(["discover", "nose"]) - with self.assertRaises(SystemExit): - parse_args(["discover", "???"]) - - -class MainTests(unittest.TestCase): - - # TODO: We could use an integration test for pytest.discover(). - - def test_discover(self): - stub = Stub() - tool = StubTool("spamspamspam", stub) - tests, parents = object(), object() - tool.return_discover = (parents, tests) - reporter = StubReporter(stub) - main( - tool.name, - "discover", - {"spam": "eggs"}, - [], - _tools={tool.name: {"discover": tool.discover,}}, - _reporters={"discover": reporter.report,}, - ) - - self.assertEqual( - tool.calls, - [ - ("spamspamspam.discover", ([],), {"spam": "eggs"}), - ("reporter.report", (tests, parents), {"spam": "eggs"}), - ], - ) - - def test_unsupported_tool(self): - with self.assertRaises(UnsupportedToolError): - main( - "unittest", - "discover", - {"spam": "eggs"}, - [], - _tools={"pytest": None}, - _reporters=None, - ) - with self.assertRaises(UnsupportedToolError): - main( - "nose", - "discover", - {"spam": "eggs"}, - [], - _tools={"pytest": None}, - _reporters=None, - ) - with self.assertRaises(UnsupportedToolError): - main( - "???", - "discover", - {"spam": "eggs"}, - [], - _tools={"pytest": None}, - _reporters=None, - ) - - def test_unsupported_command(self): - tool = StubTool("pytest") - with self.assertRaises(UnsupportedCommandError): - main( - "pytest", - "run", - {"spam": "eggs"}, - [], - _tools={"pytest": {"discover": tool.discover}}, - _reporters=None, - ) - with self.assertRaises(UnsupportedCommandError): - main( - "pytest", - "debug", - {"spam": "eggs"}, - [], - _tools={"pytest": {"discover": tool.discover}}, - _reporters=None, - ) - with self.assertRaises(UnsupportedCommandError): - main( - "pytest", - "???", - {"spam": "eggs"}, - [], - _tools={"pytest": {"discover": tool.discover}}, - _reporters=None, - ) - self.assertEqual(tool.calls, []) diff --git a/pythonFiles/tests/testing_tools/adapter/test_discovery.py b/pythonFiles/tests/testing_tools/adapter/test_discovery.py deleted file mode 100644 index e1238282cad7..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/test_discovery.py +++ /dev/null @@ -1,614 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import, print_function - -import unittest - -from testing_tools.adapter.util import fix_path, fix_relpath -from testing_tools.adapter.info import TestInfo, TestPath, ParentInfo -from testing_tools.adapter.discovery import fix_nodeid, DiscoveredTests - - -def _fix_nodeid(nodeid): - - nodeid = nodeid.replace("\\", "/") - if not nodeid.startswith("./"): - nodeid = "./" + nodeid - return nodeid - - -class DiscoveredTestsTests(unittest.TestCase): - def test_list(self): - testroot = fix_path("/a/b/c") - relfile = fix_path("./test_spam.py") - tests = [ - TestInfo( - # missing "./": - id="test_spam.py::test_each[10-10]", - name="test_each[10-10]", - path=TestPath( - root=testroot, relfile=relfile, func="test_each", sub=["[10-10]"], - ), - source="{}:{}".format(relfile, 10), - markers=None, - # missing "./": - parentid="test_spam.py::test_each", - ), - TestInfo( - id="test_spam.py::All::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot, - relfile=relfile, - func="All.BasicTests.test_first", - sub=None, - ), - source="{}:{}".format(relfile, 62), - markers=None, - parentid="test_spam.py::All::BasicTests", - ), - ] - allparents = [ - [ - (fix_path("./test_spam.py::test_each"), "test_each", "function"), - (fix_path("./test_spam.py"), "test_spam.py", "file"), - (".", testroot, "folder"), - ], - [ - (fix_path("./test_spam.py::All::BasicTests"), "BasicTests", "suite"), - (fix_path("./test_spam.py::All"), "All", "suite"), - (fix_path("./test_spam.py"), "test_spam.py", "file"), - (".", testroot, "folder"), - ], - ] - expected = [ - test._replace(id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid)) - for test in tests - ] - discovered = DiscoveredTests() - for test, parents in zip(tests, allparents): - discovered.add_test(test, parents) - size = len(discovered) - items = [discovered[0], discovered[1]] - snapshot = list(discovered) - - self.maxDiff = None - self.assertEqual(size, 2) - self.assertEqual(items, expected) - self.assertEqual(snapshot, expected) - - def test_reset(self): - testroot = fix_path("/a/b/c") - discovered = DiscoveredTests() - discovered.add_test( - TestInfo( - id="./test_spam.py::test_each", - name="test_each", - path=TestPath(root=testroot, relfile="test_spam.py", func="test_each",), - source="test_spam.py:11", - markers=[], - parentid="./test_spam.py", - ), - [("./test_spam.py", "test_spam.py", "file"), (".", testroot, "folder"),], - ) - - before = len(discovered), len(discovered.parents) - discovered.reset() - after = len(discovered), len(discovered.parents) - - self.assertEqual(before, (1, 2)) - self.assertEqual(after, (0, 0)) - - def test_parents(self): - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_spam.py") - tests = [ - TestInfo( - # missing "./", using pathsep: - id=relfile + "::test_each[10-10]", - name="test_each[10-10]", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="test_each", - sub=["[10-10]"], - ), - source="{}:{}".format(relfile, 10), - markers=None, - # missing "./", using pathsep: - parentid=relfile + "::test_each", - ), - TestInfo( - # missing "./", using pathsep: - id=relfile + "::All::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot, - relfile=fix_relpath(relfile), - func="All.BasicTests.test_first", - sub=None, - ), - source="{}:{}".format(relfile, 61), - markers=None, - # missing "./", using pathsep: - parentid=relfile + "::All::BasicTests", - ), - ] - allparents = [ - # missing "./", using pathsep: - [ - (relfile + "::test_each", "test_each", "function"), - (relfile, relfile, "file"), - (".", testroot, "folder"), - ], - # missing "./", using pathsep: - [ - (relfile + "::All::BasicTests", "BasicTests", "suite"), - (relfile + "::All", "All", "suite"), - (relfile, "test_spam.py", "file"), - (fix_path("x/y/z"), "z", "folder"), - (fix_path("x/y"), "y", "folder"), - (fix_path("./x"), "x", "folder"), - (".", testroot, "folder"), - ], - ] - discovered = DiscoveredTests() - for test, parents in zip(tests, allparents): - discovered.add_test(test, parents) - - parents = discovered.parents - - self.maxDiff = None - self.assertEqual( - parents, - [ - ParentInfo(id=".", kind="folder", name=testroot,), - ParentInfo( - id="./x", - kind="folder", - name="x", - root=testroot, - relpath=fix_path("./x"), - parentid=".", - ), - ParentInfo( - id="./x/y", - kind="folder", - name="y", - root=testroot, - relpath=fix_path("./x/y"), - parentid="./x", - ), - ParentInfo( - id="./x/y/z", - kind="folder", - name="z", - root=testroot, - relpath=fix_path("./x/y/z"), - parentid="./x/y", - ), - ParentInfo( - id="./x/y/z/test_spam.py", - kind="file", - name="test_spam.py", - root=testroot, - relpath=fix_relpath(relfile), - parentid="./x/y/z", - ), - ParentInfo( - id="./x/y/z/test_spam.py::All", - kind="suite", - name="All", - root=testroot, - parentid="./x/y/z/test_spam.py", - ), - ParentInfo( - id="./x/y/z/test_spam.py::All::BasicTests", - kind="suite", - name="BasicTests", - root=testroot, - parentid="./x/y/z/test_spam.py::All", - ), - ParentInfo( - id="./x/y/z/test_spam.py::test_each", - kind="function", - name="test_each", - root=testroot, - parentid="./x/y/z/test_spam.py", - ), - ], - ) - - def test_add_test_simple(self): - testroot = fix_path("/a/b/c") - relfile = "test_spam.py" - test = TestInfo( - # missing "./": - id=relfile + "::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - # missing "./": - relfile=relfile, - func="test_spam", - ), - # missing "./": - source="{}:{}".format(relfile, 11), - markers=[], - # missing "./": - parentid=relfile, - ) - expected = test._replace( - id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid) - ) - discovered = DiscoveredTests() - - before = list(discovered), discovered.parents - discovered.add_test( - test, [(relfile, relfile, "file"), (".", testroot, "folder"),] - ) - after = list(discovered), discovered.parents - - self.maxDiff = None - self.assertEqual(before, ([], [])) - self.assertEqual( - after, - ( - [expected], - [ - ParentInfo(id=".", kind="folder", name=testroot,), - ParentInfo( - id="./test_spam.py", - kind="file", - name=relfile, - root=testroot, - relpath=relfile, - parentid=".", - ), - ], - ), - ) - - def test_multiroot(self): - # the first root - testroot1 = fix_path("/a/b/c") - relfile1 = "test_spam.py" - alltests = [ - TestInfo( - # missing "./": - id=relfile1 + "::test_spam", - name="test_spam", - path=TestPath( - root=testroot1, relfile=fix_relpath(relfile1), func="test_spam", - ), - source="{}:{}".format(relfile1, 10), - markers=[], - # missing "./": - parentid=relfile1, - ), - ] - allparents = [ - # missing "./": - [(relfile1, "test_spam.py", "file"), (".", testroot1, "folder"),], - ] - # the second root - testroot2 = fix_path("/x/y/z") - relfile2 = fix_path("w/test_eggs.py") - alltests.extend( - [ - TestInfo( - id=relfile2 + "::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot2, - relfile=fix_relpath(relfile2), - func="BasicTests.test_first", - ), - source="{}:{}".format(relfile2, 61), - markers=[], - parentid=relfile2 + "::BasicTests", - ), - ] - ) - allparents.extend( - [ - # missing "./", using pathsep: - [ - (relfile2 + "::BasicTests", "BasicTests", "suite"), - (relfile2, "test_eggs.py", "file"), - (fix_path("./w"), "w", "folder"), - (".", testroot2, "folder"), - ], - ] - ) - - discovered = DiscoveredTests() - for test, parents in zip(alltests, allparents): - discovered.add_test(test, parents) - tests = list(discovered) - parents = discovered.parents - - self.maxDiff = None - self.assertEqual( - tests, - [ - # the first root - TestInfo( - id="./test_spam.py::test_spam", - name="test_spam", - path=TestPath( - root=testroot1, relfile=fix_relpath(relfile1), func="test_spam", - ), - source="{}:{}".format(relfile1, 10), - markers=[], - parentid="./test_spam.py", - ), - # the secondroot - TestInfo( - id="./w/test_eggs.py::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot2, - relfile=fix_relpath(relfile2), - func="BasicTests.test_first", - ), - source="{}:{}".format(relfile2, 61), - markers=[], - parentid="./w/test_eggs.py::BasicTests", - ), - ], - ) - self.assertEqual( - parents, - [ - # the first root - ParentInfo(id=".", kind="folder", name=testroot1,), - ParentInfo( - id="./test_spam.py", - kind="file", - name="test_spam.py", - root=testroot1, - relpath=fix_relpath(relfile1), - parentid=".", - ), - # the secondroot - ParentInfo(id=".", kind="folder", name=testroot2,), - ParentInfo( - id="./w", - kind="folder", - name="w", - root=testroot2, - relpath=fix_path("./w"), - parentid=".", - ), - ParentInfo( - id="./w/test_eggs.py", - kind="file", - name="test_eggs.py", - root=testroot2, - relpath=fix_relpath(relfile2), - parentid="./w", - ), - ParentInfo( - id="./w/test_eggs.py::BasicTests", - kind="suite", - name="BasicTests", - root=testroot2, - parentid="./w/test_eggs.py", - ), - ], - ) - - def test_doctest(self): - testroot = fix_path("/a/b/c") - doctestfile = fix_path("./x/test_doctest.txt") - relfile = fix_path("./x/y/z/test_eggs.py") - alltests = [ - TestInfo( - id=doctestfile + "::test_doctest.txt", - name="test_doctest.txt", - path=TestPath(root=testroot, relfile=doctestfile, func=None,), - source="{}:{}".format(doctestfile, 0), - markers=[], - parentid=doctestfile, - ), - # With --doctest-modules - TestInfo( - id=relfile + "::test_eggs", - name="test_eggs", - path=TestPath(root=testroot, relfile=relfile, func=None,), - source="{}:{}".format(relfile, 0), - markers=[], - parentid=relfile, - ), - TestInfo( - id=relfile + "::test_eggs.TestSpam", - name="test_eggs.TestSpam", - path=TestPath(root=testroot, relfile=relfile, func=None,), - source="{}:{}".format(relfile, 12), - markers=[], - parentid=relfile, - ), - TestInfo( - id=relfile + "::test_eggs.TestSpam.TestEggs", - name="test_eggs.TestSpam.TestEggs", - path=TestPath(root=testroot, relfile=relfile, func=None,), - source="{}:{}".format(relfile, 27), - markers=[], - parentid=relfile, - ), - ] - allparents = [ - [ - (doctestfile, "test_doctest.txt", "file"), - (fix_path("./x"), "x", "folder"), - (".", testroot, "folder"), - ], - [ - (relfile, "test_eggs.py", "file"), - (fix_path("./x/y/z"), "z", "folder"), - (fix_path("./x/y"), "y", "folder"), - (fix_path("./x"), "x", "folder"), - (".", testroot, "folder"), - ], - [ - (relfile, "test_eggs.py", "file"), - (fix_path("./x/y/z"), "z", "folder"), - (fix_path("./x/y"), "y", "folder"), - (fix_path("./x"), "x", "folder"), - (".", testroot, "folder"), - ], - [ - (relfile, "test_eggs.py", "file"), - (fix_path("./x/y/z"), "z", "folder"), - (fix_path("./x/y"), "y", "folder"), - (fix_path("./x"), "x", "folder"), - (".", testroot, "folder"), - ], - ] - expected = [ - test._replace(id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid)) - for test in alltests - ] - - discovered = DiscoveredTests() - - for test, parents in zip(alltests, allparents): - discovered.add_test(test, parents) - tests = list(discovered) - parents = discovered.parents - - self.maxDiff = None - self.assertEqual(tests, expected) - self.assertEqual( - parents, - [ - ParentInfo(id=".", kind="folder", name=testroot,), - ParentInfo( - id="./x", - kind="folder", - name="x", - root=testroot, - relpath=fix_path("./x"), - parentid=".", - ), - ParentInfo( - id="./x/test_doctest.txt", - kind="file", - name="test_doctest.txt", - root=testroot, - relpath=fix_path(doctestfile), - parentid="./x", - ), - ParentInfo( - id="./x/y", - kind="folder", - name="y", - root=testroot, - relpath=fix_path("./x/y"), - parentid="./x", - ), - ParentInfo( - id="./x/y/z", - kind="folder", - name="z", - root=testroot, - relpath=fix_path("./x/y/z"), - parentid="./x/y", - ), - ParentInfo( - id="./x/y/z/test_eggs.py", - kind="file", - name="test_eggs.py", - root=testroot, - relpath=fix_relpath(relfile), - parentid="./x/y/z", - ), - ], - ) - - def test_nested_suite_simple(self): - testroot = fix_path("/a/b/c") - relfile = fix_path("./test_eggs.py") - alltests = [ - TestInfo( - id=relfile + "::TestOuter::TestInner::test_spam", - name="test_spam", - path=TestPath( - root=testroot, - relfile=relfile, - func="TestOuter.TestInner.test_spam", - ), - source="{}:{}".format(relfile, 10), - markers=None, - parentid=relfile + "::TestOuter::TestInner", - ), - TestInfo( - id=relfile + "::TestOuter::TestInner::test_eggs", - name="test_eggs", - path=TestPath( - root=testroot, - relfile=relfile, - func="TestOuter.TestInner.test_eggs", - ), - source="{}:{}".format(relfile, 21), - markers=None, - parentid=relfile + "::TestOuter::TestInner", - ), - ] - allparents = [ - [ - (relfile + "::TestOuter::TestInner", "TestInner", "suite"), - (relfile + "::TestOuter", "TestOuter", "suite"), - (relfile, "test_eggs.py", "file"), - (".", testroot, "folder"), - ], - [ - (relfile + "::TestOuter::TestInner", "TestInner", "suite"), - (relfile + "::TestOuter", "TestOuter", "suite"), - (relfile, "test_eggs.py", "file"), - (".", testroot, "folder"), - ], - ] - expected = [ - test._replace(id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid)) - for test in alltests - ] - - discovered = DiscoveredTests() - for test, parents in zip(alltests, allparents): - discovered.add_test(test, parents) - tests = list(discovered) - parents = discovered.parents - - self.maxDiff = None - self.assertEqual(tests, expected) - self.assertEqual( - parents, - [ - ParentInfo(id=".", kind="folder", name=testroot,), - ParentInfo( - id="./test_eggs.py", - kind="file", - name="test_eggs.py", - root=testroot, - relpath=fix_relpath(relfile), - parentid=".", - ), - ParentInfo( - id="./test_eggs.py::TestOuter", - kind="suite", - name="TestOuter", - root=testroot, - parentid="./test_eggs.py", - ), - ParentInfo( - id="./test_eggs.py::TestOuter::TestInner", - kind="suite", - name="TestInner", - root=testroot, - parentid="./test_eggs.py::TestOuter", - ), - ], - ) diff --git a/pythonFiles/tests/testing_tools/adapter/test_functional.py b/pythonFiles/tests/testing_tools/adapter/test_functional.py deleted file mode 100644 index b11d92c16a17..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/test_functional.py +++ /dev/null @@ -1,1522 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import, unicode_literals - -import json -import os -import os.path -import subprocess -import sys -import unittest - -import pytest - -from ...__main__ import TESTING_TOOLS_ROOT -from testing_tools.adapter.util import fix_path, PATH_SEP - - -CWD = os.getcwd() -DATA_DIR = os.path.join(os.path.dirname(__file__), ".data") -SCRIPT = os.path.join(TESTING_TOOLS_ROOT, "run_adapter.py") - - -def resolve_testroot(name): - projroot = os.path.join(DATA_DIR, name) - return projroot, os.path.join(projroot, "tests") - - -def run_adapter(cmd, tool, *cliargs): - try: - return _run_adapter(cmd, tool, *cliargs) - except subprocess.CalledProcessError as exc: - print(exc.output) - - -def _run_adapter(cmd, tool, *cliargs, **kwargs): - hidestdio = kwargs.pop("hidestdio", True) - assert not kwargs or tuple(kwargs) == ("stderr",) - kwds = kwargs - argv = [sys.executable, SCRIPT, cmd, tool, "--"] + list(cliargs) - if not hidestdio: - argv.insert(4, "--no-hide-stdio") - kwds["stderr"] = subprocess.STDOUT - argv.append("--cache-clear") - print( - "running {!r}".format(" ".join(arg.rpartition(CWD + "/")[-1] for arg in argv)) - ) - output = subprocess.check_output(argv, universal_newlines=True, **kwds) - return output - - -def fix_test_order(tests): - if sys.version_info >= (3, 6): - return tests - fixed = [] - curfile = None - group = [] - for test in tests: - if (curfile or "???") not in test["id"]: - fixed.extend(sorted(group, key=lambda t: t["id"])) - group = [] - curfile = test["id"].partition(".py::")[0] + ".py" - group.append(test) - fixed.extend(sorted(group, key=lambda t: t["id"])) - return fixed - - -def fix_source(tests, testid, srcfile, lineno): - for test in tests: - if test["id"] == testid: - break - else: - raise KeyError("test {!r} not found".format(testid)) - if not srcfile: - srcfile = test["source"].rpartition(":")[0] - test["source"] = fix_path("{}:{}".format(srcfile, lineno)) - - -# Note that these tests are skipped if util.PATH_SEP is not os.path.sep. -# This is because the functional tests should reflect the actual -# operating environment. - - -@pytest.mark.functional -class PytestTests(unittest.TestCase): - def setUp(self): - if PATH_SEP is not os.path.sep: - raise unittest.SkipTest("functional tests require unmodified env") - super(PytestTests, self).setUp() - - def complex(self, testroot): - results = COMPLEX.copy() - results["root"] = testroot - return [results] - - def test_discover_simple(self): - projroot, testroot = resolve_testroot("simple") - - out = run_adapter("discover", "pytest", "--rootdir", projroot, testroot) - result = json.loads(out) - - self.maxDiff = None - self.assertEqual( - result, - [ - { - "root": projroot, - "rootid": ".", - "parents": [ - { - "id": "./tests", - "kind": "folder", - "name": "tests", - "relpath": fix_path("./tests"), - "parentid": ".", - }, - { - "id": "./tests/test_spam.py", - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path("./tests/test_spam.py"), - "parentid": "./tests", - }, - ], - "tests": [ - { - "id": "./tests/test_spam.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_spam.py:2"), - "markers": [], - "parentid": "./tests/test_spam.py", - }, - ], - } - ], - ) - - def test_discover_complex_default(self): - projroot, testroot = resolve_testroot("complex") - expected = self.complex(projroot) - expected[0]["tests"] = fix_test_order(expected[0]["tests"]) - if sys.version_info < (3,): - decorated = [ - "./tests/test_unittest.py::MyTests::test_skipped", - "./tests/test_unittest.py::MyTests::test_maybe_skipped", - "./tests/test_unittest.py::MyTests::test_maybe_not_skipped", - ] - for testid in decorated: - fix_source(expected[0]["tests"], testid, None, 0) - - out = run_adapter("discover", "pytest", "--rootdir", projroot, testroot) - result = json.loads(out) - result[0]["tests"] = fix_test_order(result[0]["tests"]) - - self.maxDiff = None - self.assertEqual(result, expected) - - def test_discover_complex_doctest(self): - projroot, _ = resolve_testroot("complex") - expected = self.complex(projroot) - # add in doctests from test suite - expected[0]["parents"].insert( - 3, - { - "id": "./tests/test_doctest.py", - "kind": "file", - "name": "test_doctest.py", - "relpath": fix_path("./tests/test_doctest.py"), - "parentid": "./tests", - }, - ) - expected[0]["tests"].insert( - 2, - { - "id": "./tests/test_doctest.py::tests.test_doctest", - "name": "tests.test_doctest", - "source": fix_path("./tests/test_doctest.py:1"), - "markers": [], - "parentid": "./tests/test_doctest.py", - }, - ) - # add in doctests from non-test module - expected[0]["parents"].insert( - 0, - { - "id": "./mod.py", - "kind": "file", - "name": "mod.py", - "relpath": fix_path("./mod.py"), - "parentid": ".", - }, - ) - expected[0]["tests"] = [ - { - "id": "./mod.py::mod", - "name": "mod", - "source": fix_path("./mod.py:1"), - "markers": [], - "parentid": "./mod.py", - }, - { - "id": "./mod.py::mod.Spam", - "name": "mod.Spam", - "source": fix_path("./mod.py:33"), - "markers": [], - "parentid": "./mod.py", - }, - { - "id": "./mod.py::mod.Spam.eggs", - "name": "mod.Spam.eggs", - "source": fix_path("./mod.py:43"), - "markers": [], - "parentid": "./mod.py", - }, - { - "id": "./mod.py::mod.square", - "name": "mod.square", - "source": fix_path("./mod.py:18"), - "markers": [], - "parentid": "./mod.py", - }, - ] + expected[0]["tests"] - expected[0]["tests"] = fix_test_order(expected[0]["tests"]) - if sys.version_info < (3,): - decorated = [ - "./tests/test_unittest.py::MyTests::test_skipped", - "./tests/test_unittest.py::MyTests::test_maybe_skipped", - "./tests/test_unittest.py::MyTests::test_maybe_not_skipped", - ] - for testid in decorated: - fix_source(expected[0]["tests"], testid, None, 0) - - out = run_adapter( - "discover", "pytest", "--rootdir", projroot, "--doctest-modules", projroot - ) - result = json.loads(out) - result[0]["tests"] = fix_test_order(result[0]["tests"]) - - self.maxDiff = None - self.assertEqual(result, expected) - - def test_discover_not_found(self): - projroot, testroot = resolve_testroot("notests") - - out = run_adapter("discover", "pytest", "--rootdir", projroot, testroot) - result = json.loads(out) - - self.maxDiff = None - self.assertEqual(result, []) - # TODO: Expect the following instead? - # self.assertEqual(result, [{ - # 'root': projroot, - # 'rootid': '.', - # 'parents': [], - # 'tests': [], - # }]) - - @unittest.skip("broken in CI") - def test_discover_bad_args(self): - projroot, testroot = resolve_testroot("simple") - - with self.assertRaises(subprocess.CalledProcessError) as cm: - _run_adapter( - "discover", - "pytest", - "--spam", - "--rootdir", - projroot, - testroot, - stderr=subprocess.STDOUT, - ) - self.assertIn("(exit code 4)", cm.exception.output) - - def test_discover_syntax_error(self): - projroot, testroot = resolve_testroot("syntax-error") - - with self.assertRaises(subprocess.CalledProcessError) as cm: - _run_adapter( - "discover", - "pytest", - "--rootdir", - projroot, - testroot, - stderr=subprocess.STDOUT, - ) - self.assertIn("(exit code 2)", cm.exception.output) - - def test_discover_normcase(self): - projroot, testroot = resolve_testroot("NormCase") - - out = run_adapter("discover", "pytest", "--rootdir", projroot, testroot) - result = json.loads(out) - - self.maxDiff = None - self.assertTrue(projroot.endswith("NormCase")) - self.assertEqual( - result, - [ - { - "root": projroot, - "rootid": ".", - "parents": [ - { - "id": "./tests", - "kind": "folder", - "name": "tests", - "relpath": fix_path("./tests"), - "parentid": ".", - }, - { - "id": "./tests/A", - "kind": "folder", - "name": "A", - "relpath": fix_path("./tests/A"), - "parentid": "./tests", - }, - { - "id": "./tests/A/b", - "kind": "folder", - "name": "b", - "relpath": fix_path("./tests/A/b"), - "parentid": "./tests/A", - }, - { - "id": "./tests/A/b/C", - "kind": "folder", - "name": "C", - "relpath": fix_path("./tests/A/b/C"), - "parentid": "./tests/A/b", - }, - { - "id": "./tests/A/b/C/test_Spam.py", - "kind": "file", - "name": "test_Spam.py", - "relpath": fix_path("./tests/A/b/C/test_Spam.py"), - "parentid": "./tests/A/b/C", - }, - ], - "tests": [ - { - "id": "./tests/A/b/C/test_Spam.py::test_okay", - "name": "test_okay", - "source": fix_path("./tests/A/b/C/test_Spam.py:2"), - "markers": [], - "parentid": "./tests/A/b/C/test_Spam.py", - }, - ], - } - ], - ) - - -COMPLEX = { - "root": None, - "rootid": ".", - "parents": [ - # - { - "id": "./tests", - "kind": "folder", - "name": "tests", - "relpath": fix_path("./tests"), - "parentid": ".", - }, - # +++ - { - "id": "./tests/test_42-43.py", - "kind": "file", - "name": "test_42-43.py", - "relpath": fix_path("./tests/test_42-43.py"), - "parentid": "./tests", - }, - # +++ - { - "id": "./tests/test_42.py", - "kind": "file", - "name": "test_42.py", - "relpath": fix_path("./tests/test_42.py"), - "parentid": "./tests", - }, - # +++ - { - "id": "./tests/test_doctest.txt", - "kind": "file", - "name": "test_doctest.txt", - "relpath": fix_path("./tests/test_doctest.txt"), - "parentid": "./tests", - }, - # +++ - { - "id": "./tests/test_foo.py", - "kind": "file", - "name": "test_foo.py", - "relpath": fix_path("./tests/test_foo.py"), - "parentid": "./tests", - }, - # +++ - { - "id": "./tests/test_mixed.py", - "kind": "file", - "name": "test_mixed.py", - "relpath": fix_path("./tests/test_mixed.py"), - "parentid": "./tests", - }, - { - "id": "./tests/test_mixed.py::MyTests", - "kind": "suite", - "name": "MyTests", - "parentid": "./tests/test_mixed.py", - }, - { - "id": "./tests/test_mixed.py::TestMySuite", - "kind": "suite", - "name": "TestMySuite", - "parentid": "./tests/test_mixed.py", - }, - # +++ - { - "id": "./tests/test_pytest.py", - "kind": "file", - "name": "test_pytest.py", - "relpath": fix_path("./tests/test_pytest.py"), - "parentid": "./tests", - }, - { - "id": "./tests/test_pytest.py::TestEggs", - "kind": "suite", - "name": "TestEggs", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::TestParam", - "kind": "suite", - "name": "TestParam", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::TestParam::test_param_13", - "kind": "function", - "name": "test_param_13", - "parentid": "./tests/test_pytest.py::TestParam", - }, - { - "id": "./tests/test_pytest.py::TestParamAll", - "kind": "suite", - "name": "TestParamAll", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_param_13", - "kind": "function", - "name": "test_param_13", - "parentid": "./tests/test_pytest.py::TestParamAll", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_spam_13", - "kind": "function", - "name": "test_spam_13", - "parentid": "./tests/test_pytest.py::TestParamAll", - }, - { - "id": "./tests/test_pytest.py::TestSpam", - "kind": "suite", - "name": "TestSpam", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::TestSpam::TestHam", - "kind": "suite", - "name": "TestHam", - "parentid": "./tests/test_pytest.py::TestSpam", - }, - { - "id": "./tests/test_pytest.py::TestSpam::TestHam::TestEggs", - "kind": "suite", - "name": "TestEggs", - "parentid": "./tests/test_pytest.py::TestSpam::TestHam", - }, - { - "id": "./tests/test_pytest.py::test_fixture_param", - "kind": "function", - "name": "test_fixture_param", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_01", - "kind": "function", - "name": "test_param_01", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_11", - "kind": "function", - "name": "test_param_11", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_13", - "kind": "function", - "name": "test_param_13", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_13_markers", - "kind": "function", - "name": "test_param_13_markers", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_13_repeat", - "kind": "function", - "name": "test_param_13_repeat", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_13_skipped", - "kind": "function", - "name": "test_param_13_skipped", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13", - "kind": "function", - "name": "test_param_23_13", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_23_raises", - "kind": "function", - "name": "test_param_23_raises", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_33", - "kind": "function", - "name": "test_param_33", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_33_ids", - "kind": "function", - "name": "test_param_33_ids", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_fixture", - "kind": "function", - "name": "test_param_fixture", - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_mark_fixture", - "kind": "function", - "name": "test_param_mark_fixture", - "parentid": "./tests/test_pytest.py", - }, - # +++ - { - "id": "./tests/test_pytest_param.py", - "kind": "file", - "name": "test_pytest_param.py", - "relpath": fix_path("./tests/test_pytest_param.py"), - "parentid": "./tests", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll", - "kind": "suite", - "name": "TestParamAll", - "parentid": "./tests/test_pytest_param.py", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_param_13", - "kind": "function", - "name": "test_param_13", - "parentid": "./tests/test_pytest_param.py::TestParamAll", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_spam_13", - "kind": "function", - "name": "test_spam_13", - "parentid": "./tests/test_pytest_param.py::TestParamAll", - }, - { - "id": "./tests/test_pytest_param.py::test_param_13", - "kind": "function", - "name": "test_param_13", - "parentid": "./tests/test_pytest_param.py", - }, - # +++ - { - "id": "./tests/test_unittest.py", - "kind": "file", - "name": "test_unittest.py", - "relpath": fix_path("./tests/test_unittest.py"), - "parentid": "./tests", - }, - { - "id": "./tests/test_unittest.py::MyTests", - "kind": "suite", - "name": "MyTests", - "parentid": "./tests/test_unittest.py", - }, - { - "id": "./tests/test_unittest.py::OtherTests", - "kind": "suite", - "name": "OtherTests", - "parentid": "./tests/test_unittest.py", - }, - ## - { - "id": "./tests/v", - "kind": "folder", - "name": "v", - "relpath": fix_path("./tests/v"), - "parentid": "./tests", - }, - ## +++ - { - "id": "./tests/v/test_eggs.py", - "kind": "file", - "name": "test_eggs.py", - "relpath": fix_path("./tests/v/test_eggs.py"), - "parentid": "./tests/v", - }, - { - "id": "./tests/v/test_eggs.py::TestSimple", - "kind": "suite", - "name": "TestSimple", - "parentid": "./tests/v/test_eggs.py", - }, - ## +++ - { - "id": "./tests/v/test_ham.py", - "kind": "file", - "name": "test_ham.py", - "relpath": fix_path("./tests/v/test_ham.py"), - "parentid": "./tests/v", - }, - ## +++ - { - "id": "./tests/v/test_spam.py", - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path("./tests/v/test_spam.py"), - "parentid": "./tests/v", - }, - ## - { - "id": "./tests/w", - "kind": "folder", - "name": "w", - "relpath": fix_path("./tests/w"), - "parentid": "./tests", - }, - ## +++ - { - "id": "./tests/w/test_spam.py", - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path("./tests/w/test_spam.py"), - "parentid": "./tests/w", - }, - ## +++ - { - "id": "./tests/w/test_spam_ex.py", - "kind": "file", - "name": "test_spam_ex.py", - "relpath": fix_path("./tests/w/test_spam_ex.py"), - "parentid": "./tests/w", - }, - ## - { - "id": "./tests/x", - "kind": "folder", - "name": "x", - "relpath": fix_path("./tests/x"), - "parentid": "./tests", - }, - ### - { - "id": "./tests/x/y", - "kind": "folder", - "name": "y", - "relpath": fix_path("./tests/x/y"), - "parentid": "./tests/x", - }, - #### - { - "id": "./tests/x/y/z", - "kind": "folder", - "name": "z", - "relpath": fix_path("./tests/x/y/z"), - "parentid": "./tests/x/y", - }, - ##### - { - "id": "./tests/x/y/z/a", - "kind": "folder", - "name": "a", - "relpath": fix_path("./tests/x/y/z/a"), - "parentid": "./tests/x/y/z", - }, - ##### +++ - { - "id": "./tests/x/y/z/a/test_spam.py", - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path("./tests/x/y/z/a/test_spam.py"), - "parentid": "./tests/x/y/z/a", - }, - ##### - { - "id": "./tests/x/y/z/b", - "kind": "folder", - "name": "b", - "relpath": fix_path("./tests/x/y/z/b"), - "parentid": "./tests/x/y/z", - }, - ##### +++ - { - "id": "./tests/x/y/z/b/test_spam.py", - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path("./tests/x/y/z/b/test_spam.py"), - "parentid": "./tests/x/y/z/b", - }, - #### +++ - { - "id": "./tests/x/y/z/test_ham.py", - "kind": "file", - "name": "test_ham.py", - "relpath": fix_path("./tests/x/y/z/test_ham.py"), - "parentid": "./tests/x/y/z", - }, - ], - "tests": [ - ########## - { - "id": "./tests/test_42-43.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_42-43.py:2"), - "markers": [], - "parentid": "./tests/test_42-43.py", - }, - ##### - { - "id": "./tests/test_42.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_42.py:2"), - "markers": [], - "parentid": "./tests/test_42.py", - }, - ##### - { - "id": "./tests/test_doctest.txt::test_doctest.txt", - "name": "test_doctest.txt", - "source": fix_path("./tests/test_doctest.txt:1"), - "markers": [], - "parentid": "./tests/test_doctest.txt", - }, - ##### - { - "id": "./tests/test_foo.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_foo.py:3"), - "markers": [], - "parentid": "./tests/test_foo.py", - }, - ##### - { - "id": "./tests/test_mixed.py::test_top_level", - "name": "test_top_level", - "source": fix_path("./tests/test_mixed.py:5"), - "markers": [], - "parentid": "./tests/test_mixed.py", - }, - { - "id": "./tests/test_mixed.py::test_skipped", - "name": "test_skipped", - "source": fix_path("./tests/test_mixed.py:9"), - "markers": ["skip"], - "parentid": "./tests/test_mixed.py", - }, - { - "id": "./tests/test_mixed.py::TestMySuite::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_mixed.py:16"), - "markers": [], - "parentid": "./tests/test_mixed.py::TestMySuite", - }, - { - "id": "./tests/test_mixed.py::MyTests::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_mixed.py:22"), - "markers": [], - "parentid": "./tests/test_mixed.py::MyTests", - }, - { - "id": "./tests/test_mixed.py::MyTests::test_skipped", - "name": "test_skipped", - "source": fix_path("./tests/test_mixed.py:25"), - "markers": ["skip"], - "parentid": "./tests/test_mixed.py::MyTests", - }, - ##### - { - "id": "./tests/test_pytest.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_pytest.py:6"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_failure", - "name": "test_failure", - "source": fix_path("./tests/test_pytest.py:10"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_runtime_skipped", - "name": "test_runtime_skipped", - "source": fix_path("./tests/test_pytest.py:14"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_runtime_failed", - "name": "test_runtime_failed", - "source": fix_path("./tests/test_pytest.py:18"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_raises", - "name": "test_raises", - "source": fix_path("./tests/test_pytest.py:22"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_skipped", - "name": "test_skipped", - "source": fix_path("./tests/test_pytest.py:26"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_maybe_skipped", - "name": "test_maybe_skipped", - "source": fix_path("./tests/test_pytest.py:31"), - "markers": ["skip-if"], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_known_failure", - "name": "test_known_failure", - "source": fix_path("./tests/test_pytest.py:36"), - "markers": ["expected-failure"], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_warned", - "name": "test_warned", - "source": fix_path("./tests/test_pytest.py:41"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_custom_marker", - "name": "test_custom_marker", - "source": fix_path("./tests/test_pytest.py:46"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_multiple_markers", - "name": "test_multiple_markers", - "source": fix_path("./tests/test_pytest.py:51"), - "markers": ["expected-failure", "skip", "skip-if"], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_dynamic_1", - "name": "test_dynamic_1", - "source": fix_path("./tests/test_pytest.py:62"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_dynamic_2", - "name": "test_dynamic_2", - "source": fix_path("./tests/test_pytest.py:62"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_dynamic_3", - "name": "test_dynamic_3", - "source": fix_path("./tests/test_pytest.py:62"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::TestSpam::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_pytest.py:70"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestSpam", - }, - { - "id": "./tests/test_pytest.py::TestSpam::test_skipped", - "name": "test_skipped", - "source": fix_path("./tests/test_pytest.py:73"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py::TestSpam", - }, - { - "id": "./tests/test_pytest.py::TestSpam::TestHam::TestEggs::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_pytest.py:81"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestSpam::TestHam::TestEggs", - }, - { - "id": "./tests/test_pytest.py::TestEggs::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_pytest.py:93"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestEggs", - }, - { - "id": "./tests/test_pytest.py::test_param_01[]", - "name": "test_param_01[]", - "source": fix_path("./tests/test_pytest.py:103"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_01", - }, - { - "id": "./tests/test_pytest.py::test_param_11[x0]", - "name": "test_param_11[x0]", - "source": fix_path("./tests/test_pytest.py:108"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_11", - }, - { - "id": "./tests/test_pytest.py::test_param_13[x0]", - "name": "test_param_13[x0]", - "source": fix_path("./tests/test_pytest.py:113"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13", - }, - { - "id": "./tests/test_pytest.py::test_param_13[x1]", - "name": "test_param_13[x1]", - "source": fix_path("./tests/test_pytest.py:113"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13", - }, - { - "id": "./tests/test_pytest.py::test_param_13[x2]", - "name": "test_param_13[x2]", - "source": fix_path("./tests/test_pytest.py:113"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13", - }, - { - "id": "./tests/test_pytest.py::test_param_13_repeat[x0]", - "name": "test_param_13_repeat[x0]", - "source": fix_path("./tests/test_pytest.py:118"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13_repeat", - }, - { - "id": "./tests/test_pytest.py::test_param_13_repeat[x1]", - "name": "test_param_13_repeat[x1]", - "source": fix_path("./tests/test_pytest.py:118"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13_repeat", - }, - { - "id": "./tests/test_pytest.py::test_param_13_repeat[x2]", - "name": "test_param_13_repeat[x2]", - "source": fix_path("./tests/test_pytest.py:118"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13_repeat", - }, - { - "id": "./tests/test_pytest.py::test_param_33[1-1-1]", - "name": "test_param_33[1-1-1]", - "source": fix_path("./tests/test_pytest.py:123"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33", - }, - { - "id": "./tests/test_pytest.py::test_param_33[3-4-5]", - "name": "test_param_33[3-4-5]", - "source": fix_path("./tests/test_pytest.py:123"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33", - }, - { - "id": "./tests/test_pytest.py::test_param_33[0-0-0]", - "name": "test_param_33[0-0-0]", - "source": fix_path("./tests/test_pytest.py:123"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33", - }, - { - "id": "./tests/test_pytest.py::test_param_33_ids[v1]", - "name": "test_param_33_ids[v1]", - "source": fix_path("./tests/test_pytest.py:128"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33_ids", - }, - { - "id": "./tests/test_pytest.py::test_param_33_ids[v2]", - "name": "test_param_33_ids[v2]", - "source": fix_path("./tests/test_pytest.py:128"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33_ids", - }, - { - "id": "./tests/test_pytest.py::test_param_33_ids[v3]", - "name": "test_param_33_ids[v3]", - "source": fix_path("./tests/test_pytest.py:128"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_33_ids", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[1-1-z0]", - "name": "test_param_23_13[1-1-z0]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[1-1-z1]", - "name": "test_param_23_13[1-1-z1]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[1-1-z2]", - "name": "test_param_23_13[1-1-z2]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[3-4-z0]", - "name": "test_param_23_13[3-4-z0]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[3-4-z1]", - "name": "test_param_23_13[3-4-z1]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[3-4-z2]", - "name": "test_param_23_13[3-4-z2]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[0-0-z0]", - "name": "test_param_23_13[0-0-z0]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[0-0-z1]", - "name": "test_param_23_13[0-0-z1]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_23_13[0-0-z2]", - "name": "test_param_23_13[0-0-z2]", - "source": fix_path("./tests/test_pytest.py:134"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_13", - }, - { - "id": "./tests/test_pytest.py::test_param_13_markers[x0]", - "name": "test_param_13_markers[x0]", - "source": fix_path("./tests/test_pytest.py:140"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_13_markers", - }, - { - "id": "./tests/test_pytest.py::test_param_13_markers[???]", - "name": "test_param_13_markers[???]", - "source": fix_path("./tests/test_pytest.py:140"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py::test_param_13_markers", - }, - { - "id": "./tests/test_pytest.py::test_param_13_markers[2]", - "name": "test_param_13_markers[2]", - "source": fix_path("./tests/test_pytest.py:140"), - "markers": ["expected-failure"], - "parentid": "./tests/test_pytest.py::test_param_13_markers", - }, - { - "id": "./tests/test_pytest.py::test_param_13_skipped[x0]", - "name": "test_param_13_skipped[x0]", - "source": fix_path("./tests/test_pytest.py:149"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py::test_param_13_skipped", - }, - { - "id": "./tests/test_pytest.py::test_param_13_skipped[x1]", - "name": "test_param_13_skipped[x1]", - "source": fix_path("./tests/test_pytest.py:149"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py::test_param_13_skipped", - }, - { - "id": "./tests/test_pytest.py::test_param_13_skipped[x2]", - "name": "test_param_13_skipped[x2]", - "source": fix_path("./tests/test_pytest.py:149"), - "markers": ["skip"], - "parentid": "./tests/test_pytest.py::test_param_13_skipped", - }, - { - "id": "./tests/test_pytest.py::test_param_23_raises[1-None]", - "name": "test_param_23_raises[1-None]", - "source": fix_path("./tests/test_pytest.py:155"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_raises", - }, - { - "id": "./tests/test_pytest.py::test_param_23_raises[1.0-None]", - "name": "test_param_23_raises[1.0-None]", - "source": fix_path("./tests/test_pytest.py:155"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_raises", - }, - { - "id": "./tests/test_pytest.py::test_param_23_raises[2-catch2]", - "name": "test_param_23_raises[2-catch2]", - "source": fix_path("./tests/test_pytest.py:155"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_23_raises", - }, - { - "id": "./tests/test_pytest.py::TestParam::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_pytest.py:164"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParam", - }, - { - "id": "./tests/test_pytest.py::TestParam::test_param_13[x0]", - "name": "test_param_13[x0]", - "source": fix_path("./tests/test_pytest.py:167"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParam::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParam::test_param_13[x1]", - "name": "test_param_13[x1]", - "source": fix_path("./tests/test_pytest.py:167"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParam::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParam::test_param_13[x2]", - "name": "test_param_13[x2]", - "source": fix_path("./tests/test_pytest.py:167"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParam::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_param_13[x0]", - "name": "test_param_13[x0]", - "source": fix_path("./tests/test_pytest.py:175"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_param_13[x1]", - "name": "test_param_13[x1]", - "source": fix_path("./tests/test_pytest.py:175"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_param_13[x2]", - "name": "test_param_13[x2]", - "source": fix_path("./tests/test_pytest.py:175"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_spam_13[x0]", - "name": "test_spam_13[x0]", - "source": fix_path("./tests/test_pytest.py:178"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_spam_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_spam_13[x1]", - "name": "test_spam_13[x1]", - "source": fix_path("./tests/test_pytest.py:178"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_spam_13", - }, - { - "id": "./tests/test_pytest.py::TestParamAll::test_spam_13[x2]", - "name": "test_spam_13[x2]", - "source": fix_path("./tests/test_pytest.py:178"), - "markers": [], - "parentid": "./tests/test_pytest.py::TestParamAll::test_spam_13", - }, - { - "id": "./tests/test_pytest.py::test_fixture", - "name": "test_fixture", - "source": fix_path("./tests/test_pytest.py:192"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_mark_fixture", - "name": "test_mark_fixture", - "source": fix_path("./tests/test_pytest.py:196"), - "markers": [], - "parentid": "./tests/test_pytest.py", - }, - { - "id": "./tests/test_pytest.py::test_param_fixture[x0]", - "name": "test_param_fixture[x0]", - "source": fix_path("./tests/test_pytest.py:201"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_fixture", - }, - { - "id": "./tests/test_pytest.py::test_param_fixture[x1]", - "name": "test_param_fixture[x1]", - "source": fix_path("./tests/test_pytest.py:201"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_fixture", - }, - { - "id": "./tests/test_pytest.py::test_param_fixture[x2]", - "name": "test_param_fixture[x2]", - "source": fix_path("./tests/test_pytest.py:201"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_fixture", - }, - { - "id": "./tests/test_pytest.py::test_param_mark_fixture[x0]", - "name": "test_param_mark_fixture[x0]", - "source": fix_path("./tests/test_pytest.py:207"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_mark_fixture", - }, - { - "id": "./tests/test_pytest.py::test_param_mark_fixture[x1]", - "name": "test_param_mark_fixture[x1]", - "source": fix_path("./tests/test_pytest.py:207"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_mark_fixture", - }, - { - "id": "./tests/test_pytest.py::test_param_mark_fixture[x2]", - "name": "test_param_mark_fixture[x2]", - "source": fix_path("./tests/test_pytest.py:207"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_param_mark_fixture", - }, - { - "id": "./tests/test_pytest.py::test_fixture_param[spam]", - "name": "test_fixture_param[spam]", - "source": fix_path("./tests/test_pytest.py:216"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_fixture_param", - }, - { - "id": "./tests/test_pytest.py::test_fixture_param[eggs]", - "name": "test_fixture_param[eggs]", - "source": fix_path("./tests/test_pytest.py:216"), - "markers": [], - "parentid": "./tests/test_pytest.py::test_fixture_param", - }, - ###### - { - "id": "./tests/test_pytest_param.py::test_param_13[x0]", - "name": "test_param_13[x0]", - "source": fix_path("./tests/test_pytest_param.py:8"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::test_param_13[x1]", - "name": "test_param_13[x1]", - "source": fix_path("./tests/test_pytest_param.py:8"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::test_param_13[x2]", - "name": "test_param_13[x2]", - "source": fix_path("./tests/test_pytest_param.py:8"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_param_13[x0]", - "name": "test_param_13[x0]", - "source": fix_path("./tests/test_pytest_param.py:14"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_param_13[x1]", - "name": "test_param_13[x1]", - "source": fix_path("./tests/test_pytest_param.py:14"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_param_13[x2]", - "name": "test_param_13[x2]", - "source": fix_path("./tests/test_pytest_param.py:14"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_param_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_spam_13[x0]", - "name": "test_spam_13[x0]", - "source": fix_path("./tests/test_pytest_param.py:17"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_spam_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_spam_13[x1]", - "name": "test_spam_13[x1]", - "source": fix_path("./tests/test_pytest_param.py:17"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_spam_13", - }, - { - "id": "./tests/test_pytest_param.py::TestParamAll::test_spam_13[x2]", - "name": "test_spam_13[x2]", - "source": fix_path("./tests/test_pytest_param.py:17"), - "markers": [], - "parentid": "./tests/test_pytest_param.py::TestParamAll::test_spam_13", - }, - ###### - { - "id": "./tests/test_unittest.py::MyTests::test_dynamic_", - "name": "test_dynamic_", - "source": fix_path("./tests/test_unittest.py:54"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_failure", - "name": "test_failure", - "source": fix_path("./tests/test_unittest.py:34"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_known_failure", - "name": "test_known_failure", - "source": fix_path("./tests/test_unittest.py:37"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_maybe_not_skipped", - "name": "test_maybe_not_skipped", - "source": fix_path("./tests/test_unittest.py:17"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_maybe_skipped", - "name": "test_maybe_skipped", - "source": fix_path("./tests/test_unittest.py:13"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_unittest.py:6"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_skipped", - "name": "test_skipped", - "source": fix_path("./tests/test_unittest.py:9"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_skipped_inside", - "name": "test_skipped_inside", - "source": fix_path("./tests/test_unittest.py:21"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_with_nested_subtests", - "name": "test_with_nested_subtests", - "source": fix_path("./tests/test_unittest.py:46"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::MyTests::test_with_subtests", - "name": "test_with_subtests", - "source": fix_path("./tests/test_unittest.py:41"), - "markers": [], - "parentid": "./tests/test_unittest.py::MyTests", - }, - { - "id": "./tests/test_unittest.py::OtherTests::test_simple", - "name": "test_simple", - "source": fix_path("./tests/test_unittest.py:61"), - "markers": [], - "parentid": "./tests/test_unittest.py::OtherTests", - }, - ########### - { - "id": "./tests/v/test_eggs.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/v/spam.py:2"), - "markers": [], - "parentid": "./tests/v/test_eggs.py", - }, - { - "id": "./tests/v/test_eggs.py::TestSimple::test_simple", - "name": "test_simple", - "source": fix_path("./tests/v/spam.py:8"), - "markers": [], - "parentid": "./tests/v/test_eggs.py::TestSimple", - }, - ###### - { - "id": "./tests/v/test_ham.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/v/spam.py:2"), - "markers": [], - "parentid": "./tests/v/test_ham.py", - }, - { - "id": "./tests/v/test_ham.py::test_not_hard", - "name": "test_not_hard", - "source": fix_path("./tests/v/spam.py:2"), - "markers": [], - "parentid": "./tests/v/test_ham.py", - }, - ###### - { - "id": "./tests/v/test_spam.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/v/spam.py:2"), - "markers": [], - "parentid": "./tests/v/test_spam.py", - }, - { - "id": "./tests/v/test_spam.py::test_simpler", - "name": "test_simpler", - "source": fix_path("./tests/v/test_spam.py:4"), - "markers": [], - "parentid": "./tests/v/test_spam.py", - }, - ########### - { - "id": "./tests/w/test_spam.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/w/test_spam.py:4"), - "markers": [], - "parentid": "./tests/w/test_spam.py", - }, - { - "id": "./tests/w/test_spam_ex.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/w/test_spam_ex.py:4"), - "markers": [], - "parentid": "./tests/w/test_spam_ex.py", - }, - ########### - { - "id": "./tests/x/y/z/test_ham.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/x/y/z/test_ham.py:2"), - "markers": [], - "parentid": "./tests/x/y/z/test_ham.py", - }, - ###### - { - "id": "./tests/x/y/z/a/test_spam.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/x/y/z/a/test_spam.py:11"), - "markers": [], - "parentid": "./tests/x/y/z/a/test_spam.py", - }, - { - "id": "./tests/x/y/z/b/test_spam.py::test_simple", - "name": "test_simple", - "source": fix_path("./tests/x/y/z/b/test_spam.py:7"), - "markers": [], - "parentid": "./tests/x/y/z/b/test_spam.py", - }, - ], -} diff --git a/pythonFiles/tests/testing_tools/adapter/test_report.py b/pythonFiles/tests/testing_tools/adapter/test_report.py deleted file mode 100644 index 0c94ebd51567..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/test_report.py +++ /dev/null @@ -1,1113 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import json -import unittest - -from ...util import StubProxy -from testing_tools.adapter.util import fix_path, fix_relpath -from testing_tools.adapter.info import TestInfo, TestPath, ParentInfo -from testing_tools.adapter.report import report_discovered - - -class StubSender(StubProxy): - def send(self, outstr): - self.add_call("send", (json.loads(outstr),), None) - - -################################## -# tests - - -class ReportDiscoveredTests(unittest.TestCase): - def test_basic(self): - stub = StubSender() - testroot = fix_path("/a/b/c") - relfile = "test_spam.py" - relpath = fix_relpath(relfile) - tests = [ - TestInfo( - id="test#1", - name="test_spam", - path=TestPath(root=testroot, relfile=relfile, func="test_spam",), - source="{}:{}".format(relfile, 10), - markers=[], - parentid="file#1", - ), - ] - parents = [ - ParentInfo(id="", kind="folder", name=testroot,), - ParentInfo( - id="file#1", - kind="file", - name=relfile, - root=testroot, - relpath=relpath, - parentid="", - ), - ] - expected = [ - { - "rootid": "", - "root": testroot, - "parents": [ - { - "id": "file#1", - "kind": "file", - "name": relfile, - "relpath": relpath, - "parentid": "", - }, - ], - "tests": [ - { - "id": "test#1", - "name": "test_spam", - "source": "{}:{}".format(relfile, 10), - "markers": [], - "parentid": "file#1", - } - ], - } - ] - - report_discovered(tests, parents, _send=stub.send) - - self.maxDiff = None - self.assertEqual(stub.calls, [("send", (expected,), None),]) - - def test_multiroot(self): - stub = StubSender() - # the first root - testroot1 = fix_path("/a/b/c") - relfileid1 = "./test_spam.py" - relpath1 = fix_path(relfileid1) - relfile1 = relpath1[2:] - tests = [ - TestInfo( - id=relfileid1 + "::test_spam", - name="test_spam", - path=TestPath(root=testroot1, relfile=relfile1, func="test_spam",), - source="{}:{}".format(relfile1, 10), - markers=[], - parentid=relfileid1, - ), - ] - parents = [ - ParentInfo(id=".", kind="folder", name=testroot1,), - ParentInfo( - id=relfileid1, - kind="file", - name="test_spam.py", - root=testroot1, - relpath=relpath1, - parentid=".", - ), - ] - expected = [ - { - "rootid": ".", - "root": testroot1, - "parents": [ - { - "id": relfileid1, - "kind": "file", - "name": "test_spam.py", - "relpath": relpath1, - "parentid": ".", - }, - ], - "tests": [ - { - "id": relfileid1 + "::test_spam", - "name": "test_spam", - "source": "{}:{}".format(relfile1, 10), - "markers": [], - "parentid": relfileid1, - } - ], - }, - ] - # the second root - testroot2 = fix_path("/x/y/z") - relfileid2 = "./w/test_eggs.py" - relpath2 = fix_path(relfileid2) - relfile2 = relpath2[2:] - tests.extend( - [ - TestInfo( - id=relfileid2 + "::BasicTests::test_first", - name="test_first", - path=TestPath( - root=testroot2, relfile=relfile2, func="BasicTests.test_first", - ), - source="{}:{}".format(relfile2, 61), - markers=[], - parentid=relfileid2 + "::BasicTests", - ), - ] - ) - parents.extend( - [ - ParentInfo(id=".", kind="folder", name=testroot2,), - ParentInfo( - id="./w", - kind="folder", - name="w", - root=testroot2, - relpath=fix_path("./w"), - parentid=".", - ), - ParentInfo( - id=relfileid2, - kind="file", - name="test_eggs.py", - root=testroot2, - relpath=relpath2, - parentid="./w", - ), - ParentInfo( - id=relfileid2 + "::BasicTests", - kind="suite", - name="BasicTests", - root=testroot2, - parentid=relfileid2, - ), - ] - ) - expected.extend( - [ - { - "rootid": ".", - "root": testroot2, - "parents": [ - { - "id": "./w", - "kind": "folder", - "name": "w", - "relpath": fix_path("./w"), - "parentid": ".", - }, - { - "id": relfileid2, - "kind": "file", - "name": "test_eggs.py", - "relpath": relpath2, - "parentid": "./w", - }, - { - "id": relfileid2 + "::BasicTests", - "kind": "suite", - "name": "BasicTests", - "parentid": relfileid2, - }, - ], - "tests": [ - { - "id": relfileid2 + "::BasicTests::test_first", - "name": "test_first", - "source": "{}:{}".format(relfile2, 61), - "markers": [], - "parentid": relfileid2 + "::BasicTests", - } - ], - }, - ] - ) - - report_discovered(tests, parents, _send=stub.send) - - self.maxDiff = None - self.assertEqual(stub.calls, [("send", (expected,), None),]) - - def test_complex(self): - """ - /a/b/c/ - test_ham.py - MySuite - test_x1 - test_x2 - /a/b/e/f/g/ - w/ - test_ham.py - test_ham1 - HamTests - test_uh_oh - test_whoa - MoreHam - test_yay - sub1 - sub2 - sub3 - test_eggs.py - SpamTests - test_okay - x/ - y/ - a/ - test_spam.py - SpamTests - test_okay - b/ - test_spam.py - SpamTests - test_okay - test_spam.py - SpamTests - test_okay - """ - stub = StubSender() - testroot = fix_path("/a/b/c") - relfileid1 = "./test_ham.py" - relfileid2 = "./test_spam.py" - relfileid3 = "./w/test_ham.py" - relfileid4 = "./w/test_eggs.py" - relfileid5 = "./x/y/a/test_spam.py" - relfileid6 = "./x/y/b/test_spam.py" - tests = [ - TestInfo( - id=relfileid1 + "::MySuite::test_x1", - name="test_x1", - path=TestPath( - root=testroot, relfile=fix_path(relfileid1), func="MySuite.test_x1", - ), - source="{}:{}".format(fix_path(relfileid1), 10), - markers=None, - parentid=relfileid1 + "::MySuite", - ), - TestInfo( - id=relfileid1 + "::MySuite::test_x2", - name="test_x2", - path=TestPath( - root=testroot, relfile=fix_path(relfileid1), func="MySuite.test_x2", - ), - source="{}:{}".format(fix_path(relfileid1), 21), - markers=None, - parentid=relfileid1 + "::MySuite", - ), - TestInfo( - id=relfileid2 + "::SpamTests::test_okay", - name="test_okay", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid2), - func="SpamTests.test_okay", - ), - source="{}:{}".format(fix_path(relfileid2), 17), - markers=None, - parentid=relfileid2 + "::SpamTests", - ), - TestInfo( - id=relfileid3 + "::test_ham1", - name="test_ham1", - path=TestPath( - root=testroot, relfile=fix_path(relfileid3), func="test_ham1", - ), - source="{}:{}".format(fix_path(relfileid3), 8), - markers=None, - parentid=relfileid3, - ), - TestInfo( - id=relfileid3 + "::HamTests::test_uh_oh", - name="test_uh_oh", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid3), - func="HamTests.test_uh_oh", - ), - source="{}:{}".format(fix_path(relfileid3), 19), - markers=["expected-failure"], - parentid=relfileid3 + "::HamTests", - ), - TestInfo( - id=relfileid3 + "::HamTests::test_whoa", - name="test_whoa", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid3), - func="HamTests.test_whoa", - ), - source="{}:{}".format(fix_path(relfileid3), 35), - markers=None, - parentid=relfileid3 + "::HamTests", - ), - TestInfo( - id=relfileid3 + "::MoreHam::test_yay[1-2]", - name="test_yay[1-2]", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid3), - func="MoreHam.test_yay", - sub=["[1-2]"], - ), - source="{}:{}".format(fix_path(relfileid3), 57), - markers=None, - parentid=relfileid3 + "::MoreHam::test_yay", - ), - TestInfo( - id=relfileid3 + "::MoreHam::test_yay[1-2][3-4]", - name="test_yay[1-2][3-4]", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid3), - func="MoreHam.test_yay", - sub=["[1-2]", "[3=4]"], - ), - source="{}:{}".format(fix_path(relfileid3), 72), - markers=None, - parentid=relfileid3 + "::MoreHam::test_yay[1-2]", - ), - TestInfo( - id=relfileid4 + "::SpamTests::test_okay", - name="test_okay", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid4), - func="SpamTests.test_okay", - ), - source="{}:{}".format(fix_path(relfileid4), 15), - markers=None, - parentid=relfileid4 + "::SpamTests", - ), - TestInfo( - id=relfileid5 + "::SpamTests::test_okay", - name="test_okay", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid5), - func="SpamTests.test_okay", - ), - source="{}:{}".format(fix_path(relfileid5), 12), - markers=None, - parentid=relfileid5 + "::SpamTests", - ), - TestInfo( - id=relfileid6 + "::SpamTests::test_okay", - name="test_okay", - path=TestPath( - root=testroot, - relfile=fix_path(relfileid6), - func="SpamTests.test_okay", - ), - source="{}:{}".format(fix_path(relfileid6), 27), - markers=None, - parentid=relfileid6 + "::SpamTests", - ), - ] - parents = [ - ParentInfo(id=".", kind="folder", name=testroot,), - ParentInfo( - id=relfileid1, - kind="file", - name="test_ham.py", - root=testroot, - relpath=fix_path(relfileid1), - parentid=".", - ), - ParentInfo( - id=relfileid1 + "::MySuite", - kind="suite", - name="MySuite", - root=testroot, - parentid=relfileid1, - ), - ParentInfo( - id=relfileid2, - kind="file", - name="test_spam.py", - root=testroot, - relpath=fix_path(relfileid2), - parentid=".", - ), - ParentInfo( - id=relfileid2 + "::SpamTests", - kind="suite", - name="SpamTests", - root=testroot, - parentid=relfileid2, - ), - ParentInfo( - id="./w", - kind="folder", - name="w", - root=testroot, - relpath=fix_path("./w"), - parentid=".", - ), - ParentInfo( - id=relfileid3, - kind="file", - name="test_ham.py", - root=testroot, - relpath=fix_path(relfileid3), - parentid="./w", - ), - ParentInfo( - id=relfileid3 + "::HamTests", - kind="suite", - name="HamTests", - root=testroot, - parentid=relfileid3, - ), - ParentInfo( - id=relfileid3 + "::MoreHam", - kind="suite", - name="MoreHam", - root=testroot, - parentid=relfileid3, - ), - ParentInfo( - id=relfileid3 + "::MoreHam::test_yay", - kind="function", - name="test_yay", - root=testroot, - parentid=relfileid3 + "::MoreHam", - ), - ParentInfo( - id=relfileid3 + "::MoreHam::test_yay[1-2]", - kind="subtest", - name="test_yay[1-2]", - root=testroot, - parentid=relfileid3 + "::MoreHam::test_yay", - ), - ParentInfo( - id=relfileid4, - kind="file", - name="test_eggs.py", - root=testroot, - relpath=fix_path(relfileid4), - parentid="./w", - ), - ParentInfo( - id=relfileid4 + "::SpamTests", - kind="suite", - name="SpamTests", - root=testroot, - parentid=relfileid4, - ), - ParentInfo( - id="./x", - kind="folder", - name="x", - root=testroot, - relpath=fix_path("./x"), - parentid=".", - ), - ParentInfo( - id="./x/y", - kind="folder", - name="y", - root=testroot, - relpath=fix_path("./x/y"), - parentid="./x", - ), - ParentInfo( - id="./x/y/a", - kind="folder", - name="a", - root=testroot, - relpath=fix_path("./x/y/a"), - parentid="./x/y", - ), - ParentInfo( - id=relfileid5, - kind="file", - name="test_spam.py", - root=testroot, - relpath=fix_path(relfileid5), - parentid="./x/y/a", - ), - ParentInfo( - id=relfileid5 + "::SpamTests", - kind="suite", - name="SpamTests", - root=testroot, - parentid=relfileid5, - ), - ParentInfo( - id="./x/y/b", - kind="folder", - name="b", - root=testroot, - relpath=fix_path("./x/y/b"), - parentid="./x/y", - ), - ParentInfo( - id=relfileid6, - kind="file", - name="test_spam.py", - root=testroot, - relpath=fix_path(relfileid6), - parentid="./x/y/b", - ), - ParentInfo( - id=relfileid6 + "::SpamTests", - kind="suite", - name="SpamTests", - root=testroot, - parentid=relfileid6, - ), - ] - expected = [ - { - "rootid": ".", - "root": testroot, - "parents": [ - { - "id": relfileid1, - "kind": "file", - "name": "test_ham.py", - "relpath": fix_path(relfileid1), - "parentid": ".", - }, - { - "id": relfileid1 + "::MySuite", - "kind": "suite", - "name": "MySuite", - "parentid": relfileid1, - }, - { - "id": relfileid2, - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path(relfileid2), - "parentid": ".", - }, - { - "id": relfileid2 + "::SpamTests", - "kind": "suite", - "name": "SpamTests", - "parentid": relfileid2, - }, - { - "id": "./w", - "kind": "folder", - "name": "w", - "relpath": fix_path("./w"), - "parentid": ".", - }, - { - "id": relfileid3, - "kind": "file", - "name": "test_ham.py", - "relpath": fix_path(relfileid3), - "parentid": "./w", - }, - { - "id": relfileid3 + "::HamTests", - "kind": "suite", - "name": "HamTests", - "parentid": relfileid3, - }, - { - "id": relfileid3 + "::MoreHam", - "kind": "suite", - "name": "MoreHam", - "parentid": relfileid3, - }, - { - "id": relfileid3 + "::MoreHam::test_yay", - "kind": "function", - "name": "test_yay", - "parentid": relfileid3 + "::MoreHam", - }, - { - "id": relfileid3 + "::MoreHam::test_yay[1-2]", - "kind": "subtest", - "name": "test_yay[1-2]", - "parentid": relfileid3 + "::MoreHam::test_yay", - }, - { - "id": relfileid4, - "kind": "file", - "name": "test_eggs.py", - "relpath": fix_path(relfileid4), - "parentid": "./w", - }, - { - "id": relfileid4 + "::SpamTests", - "kind": "suite", - "name": "SpamTests", - "parentid": relfileid4, - }, - { - "id": "./x", - "kind": "folder", - "name": "x", - "relpath": fix_path("./x"), - "parentid": ".", - }, - { - "id": "./x/y", - "kind": "folder", - "name": "y", - "relpath": fix_path("./x/y"), - "parentid": "./x", - }, - { - "id": "./x/y/a", - "kind": "folder", - "name": "a", - "relpath": fix_path("./x/y/a"), - "parentid": "./x/y", - }, - { - "id": relfileid5, - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path(relfileid5), - "parentid": "./x/y/a", - }, - { - "id": relfileid5 + "::SpamTests", - "kind": "suite", - "name": "SpamTests", - "parentid": relfileid5, - }, - { - "id": "./x/y/b", - "kind": "folder", - "name": "b", - "relpath": fix_path("./x/y/b"), - "parentid": "./x/y", - }, - { - "id": relfileid6, - "kind": "file", - "name": "test_spam.py", - "relpath": fix_path(relfileid6), - "parentid": "./x/y/b", - }, - { - "id": relfileid6 + "::SpamTests", - "kind": "suite", - "name": "SpamTests", - "parentid": relfileid6, - }, - ], - "tests": [ - { - "id": relfileid1 + "::MySuite::test_x1", - "name": "test_x1", - "source": "{}:{}".format(fix_path(relfileid1), 10), - "markers": [], - "parentid": relfileid1 + "::MySuite", - }, - { - "id": relfileid1 + "::MySuite::test_x2", - "name": "test_x2", - "source": "{}:{}".format(fix_path(relfileid1), 21), - "markers": [], - "parentid": relfileid1 + "::MySuite", - }, - { - "id": relfileid2 + "::SpamTests::test_okay", - "name": "test_okay", - "source": "{}:{}".format(fix_path(relfileid2), 17), - "markers": [], - "parentid": relfileid2 + "::SpamTests", - }, - { - "id": relfileid3 + "::test_ham1", - "name": "test_ham1", - "source": "{}:{}".format(fix_path(relfileid3), 8), - "markers": [], - "parentid": relfileid3, - }, - { - "id": relfileid3 + "::HamTests::test_uh_oh", - "name": "test_uh_oh", - "source": "{}:{}".format(fix_path(relfileid3), 19), - "markers": ["expected-failure"], - "parentid": relfileid3 + "::HamTests", - }, - { - "id": relfileid3 + "::HamTests::test_whoa", - "name": "test_whoa", - "source": "{}:{}".format(fix_path(relfileid3), 35), - "markers": [], - "parentid": relfileid3 + "::HamTests", - }, - { - "id": relfileid3 + "::MoreHam::test_yay[1-2]", - "name": "test_yay[1-2]", - "source": "{}:{}".format(fix_path(relfileid3), 57), - "markers": [], - "parentid": relfileid3 + "::MoreHam::test_yay", - }, - { - "id": relfileid3 + "::MoreHam::test_yay[1-2][3-4]", - "name": "test_yay[1-2][3-4]", - "source": "{}:{}".format(fix_path(relfileid3), 72), - "markers": [], - "parentid": relfileid3 + "::MoreHam::test_yay[1-2]", - }, - { - "id": relfileid4 + "::SpamTests::test_okay", - "name": "test_okay", - "source": "{}:{}".format(fix_path(relfileid4), 15), - "markers": [], - "parentid": relfileid4 + "::SpamTests", - }, - { - "id": relfileid5 + "::SpamTests::test_okay", - "name": "test_okay", - "source": "{}:{}".format(fix_path(relfileid5), 12), - "markers": [], - "parentid": relfileid5 + "::SpamTests", - }, - { - "id": relfileid6 + "::SpamTests::test_okay", - "name": "test_okay", - "source": "{}:{}".format(fix_path(relfileid6), 27), - "markers": [], - "parentid": relfileid6 + "::SpamTests", - }, - ], - } - ] - - report_discovered(tests, parents, _send=stub.send) - - self.maxDiff = None - self.assertEqual(stub.calls, [("send", (expected,), None),]) - - def test_simple_basic(self): - stub = StubSender() - testroot = fix_path("/a/b/c") - relfile = fix_path("x/y/z/test_spam.py") - tests = [ - TestInfo( - id="test#1", - name="test_spam_1", - path=TestPath( - root=testroot, - relfile=relfile, - func="MySuite.test_spam_1", - sub=None, - ), - source="{}:{}".format(relfile, 10), - markers=None, - parentid="suite#1", - ), - ] - parents = None - expected = [ - { - "id": "test#1", - "name": "test_spam_1", - "testroot": testroot, - "relfile": relfile, - "lineno": 10, - "testfunc": "MySuite.test_spam_1", - "subtest": None, - "markers": [], - } - ] - - report_discovered(tests, parents, simple=True, _send=stub.send) - - self.maxDiff = None - self.assertEqual(stub.calls, [("send", (expected,), None),]) - - def test_simple_complex(self): - """ - /a/b/c/ - test_ham.py - MySuite - test_x1 - test_x2 - /a/b/e/f/g/ - w/ - test_ham.py - test_ham1 - HamTests - test_uh_oh - test_whoa - MoreHam - test_yay - sub1 - sub2 - sub3 - test_eggs.py - SpamTests - test_okay - x/ - y/ - a/ - test_spam.py - SpamTests - test_okay - b/ - test_spam.py - SpamTests - test_okay - test_spam.py - SpamTests - test_okay - """ - stub = StubSender() - testroot1 = fix_path("/a/b/c") - relfile1 = fix_path("./test_ham.py") - testroot2 = fix_path("/a/b/e/f/g") - relfile2 = fix_path("./test_spam.py") - relfile3 = fix_path("w/test_ham.py") - relfile4 = fix_path("w/test_eggs.py") - relfile5 = fix_path("x/y/a/test_spam.py") - relfile6 = fix_path("x/y/b/test_spam.py") - tests = [ - # under first root folder - TestInfo( - id="test#1", - name="test_x1", - path=TestPath( - root=testroot1, relfile=relfile1, func="MySuite.test_x1", sub=None, - ), - source="{}:{}".format(relfile1, 10), - markers=None, - parentid="suite#1", - ), - TestInfo( - id="test#2", - name="test_x2", - path=TestPath( - root=testroot1, relfile=relfile1, func="MySuite.test_x2", sub=None, - ), - source="{}:{}".format(relfile1, 21), - markers=None, - parentid="suite#1", - ), - # under second root folder - TestInfo( - id="test#3", - name="test_okay", - path=TestPath( - root=testroot2, - relfile=relfile2, - func="SpamTests.test_okay", - sub=None, - ), - source="{}:{}".format(relfile2, 17), - markers=None, - parentid="suite#2", - ), - TestInfo( - id="test#4", - name="test_ham1", - path=TestPath( - root=testroot2, relfile=relfile3, func="test_ham1", sub=None, - ), - source="{}:{}".format(relfile3, 8), - markers=None, - parentid="file#3", - ), - TestInfo( - id="test#5", - name="test_uh_oh", - path=TestPath( - root=testroot2, - relfile=relfile3, - func="HamTests.test_uh_oh", - sub=None, - ), - source="{}:{}".format(relfile3, 19), - markers=["expected-failure"], - parentid="suite#3", - ), - TestInfo( - id="test#6", - name="test_whoa", - path=TestPath( - root=testroot2, - relfile=relfile3, - func="HamTests.test_whoa", - sub=None, - ), - source="{}:{}".format(relfile3, 35), - markers=None, - parentid="suite#3", - ), - TestInfo( - id="test#7", - name="test_yay (sub1)", - path=TestPath( - root=testroot2, - relfile=relfile3, - func="MoreHam.test_yay", - sub=["sub1"], - ), - source="{}:{}".format(relfile3, 57), - markers=None, - parentid="suite#4", - ), - TestInfo( - id="test#8", - name="test_yay (sub2) (sub3)", - path=TestPath( - root=testroot2, - relfile=relfile3, - func="MoreHam.test_yay", - sub=["sub2", "sub3"], - ), - source="{}:{}".format(relfile3, 72), - markers=None, - parentid="suite#3", - ), - TestInfo( - id="test#9", - name="test_okay", - path=TestPath( - root=testroot2, - relfile=relfile4, - func="SpamTests.test_okay", - sub=None, - ), - source="{}:{}".format(relfile4, 15), - markers=None, - parentid="suite#5", - ), - TestInfo( - id="test#10", - name="test_okay", - path=TestPath( - root=testroot2, - relfile=relfile5, - func="SpamTests.test_okay", - sub=None, - ), - source="{}:{}".format(relfile5, 12), - markers=None, - parentid="suite#6", - ), - TestInfo( - id="test#11", - name="test_okay", - path=TestPath( - root=testroot2, - relfile=relfile6, - func="SpamTests.test_okay", - sub=None, - ), - source="{}:{}".format(relfile6, 27), - markers=None, - parentid="suite#7", - ), - ] - expected = [ - { - "id": "test#1", - "name": "test_x1", - "testroot": testroot1, - "relfile": relfile1, - "lineno": 10, - "testfunc": "MySuite.test_x1", - "subtest": None, - "markers": [], - }, - { - "id": "test#2", - "name": "test_x2", - "testroot": testroot1, - "relfile": relfile1, - "lineno": 21, - "testfunc": "MySuite.test_x2", - "subtest": None, - "markers": [], - }, - { - "id": "test#3", - "name": "test_okay", - "testroot": testroot2, - "relfile": relfile2, - "lineno": 17, - "testfunc": "SpamTests.test_okay", - "subtest": None, - "markers": [], - }, - { - "id": "test#4", - "name": "test_ham1", - "testroot": testroot2, - "relfile": relfile3, - "lineno": 8, - "testfunc": "test_ham1", - "subtest": None, - "markers": [], - }, - { - "id": "test#5", - "name": "test_uh_oh", - "testroot": testroot2, - "relfile": relfile3, - "lineno": 19, - "testfunc": "HamTests.test_uh_oh", - "subtest": None, - "markers": ["expected-failure"], - }, - { - "id": "test#6", - "name": "test_whoa", - "testroot": testroot2, - "relfile": relfile3, - "lineno": 35, - "testfunc": "HamTests.test_whoa", - "subtest": None, - "markers": [], - }, - { - "id": "test#7", - "name": "test_yay (sub1)", - "testroot": testroot2, - "relfile": relfile3, - "lineno": 57, - "testfunc": "MoreHam.test_yay", - "subtest": ["sub1"], - "markers": [], - }, - { - "id": "test#8", - "name": "test_yay (sub2) (sub3)", - "testroot": testroot2, - "relfile": relfile3, - "lineno": 72, - "testfunc": "MoreHam.test_yay", - "subtest": ["sub2", "sub3"], - "markers": [], - }, - { - "id": "test#9", - "name": "test_okay", - "testroot": testroot2, - "relfile": relfile4, - "lineno": 15, - "testfunc": "SpamTests.test_okay", - "subtest": None, - "markers": [], - }, - { - "id": "test#10", - "name": "test_okay", - "testroot": testroot2, - "relfile": relfile5, - "lineno": 12, - "testfunc": "SpamTests.test_okay", - "subtest": None, - "markers": [], - }, - { - "id": "test#11", - "name": "test_okay", - "testroot": testroot2, - "relfile": relfile6, - "lineno": 27, - "testfunc": "SpamTests.test_okay", - "subtest": None, - "markers": [], - }, - ] - parents = None - - report_discovered(tests, parents, simple=True, _send=stub.send) - - self.maxDiff = None - self.assertEqual(stub.calls, [("send", (expected,), None),]) diff --git a/pythonFiles/tests/testing_tools/adapter/test_util.py b/pythonFiles/tests/testing_tools/adapter/test_util.py deleted file mode 100644 index 5343d452f4b0..000000000000 --- a/pythonFiles/tests/testing_tools/adapter/test_util.py +++ /dev/null @@ -1,314 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from __future__ import absolute_import, print_function - -import ntpath -import os -import os.path -import posixpath -import shlex -import sys -import unittest - -import pytest - -from testing_tools.adapter.util import ( - fix_path, - fix_relpath, - fix_fileid, - shlex_unsplit, -) - - -@unittest.skipIf(sys.version_info < (3,), "Python 2 does not have subTest") -class FilePathTests(unittest.TestCase): - @pytest.mark.functional - def test_isolated_imports(self): - import testing_tools.adapter - from testing_tools.adapter import util - from . import test_functional - - ignored = { - os.path.abspath(__file__), - os.path.abspath(util.__file__), - os.path.abspath(test_functional.__file__), - } - adapter = os.path.abspath(os.path.dirname(testing_tools.adapter.__file__)) - tests = os.path.join( - os.path.abspath(os.path.dirname(os.path.dirname(testing_tools.__file__))), - "tests", - "testing_tools", - "adapter", - ) - found = [] - for root in [adapter, tests]: - for dirname, _, files in os.walk(root): - if ".data" in dirname: - continue - for basename in files: - if not basename.endswith(".py"): - continue - filename = os.path.join(dirname, basename) - if filename in ignored: - continue - with open(filename) as srcfile: - for line in srcfile: - if line.strip() == "import os.path": - found.append(filename) - break - - if found: - self.fail( - os.linesep.join( - [ - "", - "Please only use path-related API from testing_tools.adapter.util.", - 'Found use of "os.path" in the following files:', - ] - + [" " + file for file in found] - ) - ) - - def test_fix_path(self): - tests = [ - ("./spam.py", r".\spam.py"), - ("./some-dir", r".\some-dir"), - ("./some-dir/", ".\\some-dir\\"), - ("./some-dir/eggs", r".\some-dir\eggs"), - ("./some-dir/eggs/spam.py", r".\some-dir\eggs\spam.py"), - ("X/y/Z/a.B.c.PY", r"X\y\Z\a.B.c.PY"), - ("/", "\\"), - ("/spam", r"\spam"), - ("C:/spam", r"C:\spam"), - ] - for path, expected in tests: - pathsep = ntpath.sep - with self.subTest(r"fixed for \: {!r}".format(path)): - fixed = fix_path(path, _pathsep=pathsep) - self.assertEqual(fixed, expected) - - pathsep = posixpath.sep - with self.subTest("unchanged for /: {!r}".format(path)): - unchanged = fix_path(path, _pathsep=pathsep) - self.assertEqual(unchanged, path) - - # no path -> "." - for path in ["", None]: - for pathsep in [ntpath.sep, posixpath.sep]: - with self.subTest(r"fixed for {}: {!r}".format(pathsep, path)): - fixed = fix_path(path, _pathsep=pathsep) - self.assertEqual(fixed, ".") - - # no-op paths - paths = [path for _, path in tests] - paths.extend( - [".", "..", "some-dir", "spam.py",] - ) - for path in paths: - for pathsep in [ntpath.sep, posixpath.sep]: - with self.subTest(r"unchanged for {}: {!r}".format(pathsep, path)): - unchanged = fix_path(path, _pathsep=pathsep) - self.assertEqual(unchanged, path) - - def test_fix_relpath(self): - tests = [ - ("spam.py", posixpath, "./spam.py"), - ("eggs/spam.py", posixpath, "./eggs/spam.py"), - ("eggs/spam/", posixpath, "./eggs/spam/"), - (r"\spam.py", posixpath, r"./\spam.py"), - ("spam.py", ntpath, r".\spam.py"), - (r"eggs\spam.py", ntpath, ".\eggs\spam.py"), - ("eggs\\spam\\", ntpath, ".\\eggs\\spam\\"), - ("/spam.py", ntpath, r"\spam.py"), # Note the fixed "/". - # absolute - ("/", posixpath, "/"), - ("/spam.py", posixpath, "/spam.py"), - ("\\", ntpath, "\\"), - (r"\spam.py", ntpath, r"\spam.py"), - (r"C:\spam.py", ntpath, r"C:\spam.py"), - # no-op - ("./spam.py", posixpath, "./spam.py"), - (r".\spam.py", ntpath, r".\spam.py"), - ] - # no-op - for path in [".", ".."]: - tests.extend( - [(path, posixpath, path), (path, ntpath, path),] - ) - for path, _os_path, expected in tests: - with self.subTest((path, _os_path.sep)): - fixed = fix_relpath( - path, - _fix_path=(lambda p: fix_path(p, _pathsep=_os_path.sep)), - _path_isabs=_os_path.isabs, - _pathsep=_os_path.sep, - ) - self.assertEqual(fixed, expected) - - def test_fix_fileid(self): - common = [ - ("spam.py", "./spam.py"), - ("eggs/spam.py", "./eggs/spam.py"), - ("eggs/spam/", "./eggs/spam/"), - # absolute (no-op) - ("/", "/"), - ("//", "//"), - ("/spam.py", "/spam.py"), - # no-op - (None, None), - ("", ""), - (".", "."), - ("./spam.py", "./spam.py"), - ] - tests = [(p, posixpath, e) for p, e in common] - tests.extend( - (p, posixpath, e) for p, e in [(r"\spam.py", r"./\spam.py"),] - ) - tests.extend((p, ntpath, e) for p, e in common) - tests.extend( - (p, ntpath, e) - for p, e in [ - (r"eggs\spam.py", "./eggs/spam.py"), - ("eggs\\spam\\", "./eggs/spam/"), - (r".\spam.py", r"./spam.py"), - # absolute - (r"\spam.py", "/spam.py"), - (r"C:\spam.py", "C:/spam.py"), - ("\\", "/"), - ("\\\\", "//"), - ("C:\\\\", "C://"), - ("C:/", "C:/"), - ("C://", "C://"), - ("C:/spam.py", "C:/spam.py"), - ] - ) - for fileid, _os_path, expected in tests: - pathsep = _os_path.sep - with self.subTest(r"for {}: {!r}".format(pathsep, fileid)): - fixed = fix_fileid( - fileid, - _path_isabs=_os_path.isabs, - _normcase=_os_path.normcase, - _pathsep=pathsep, - ) - self.assertEqual(fixed, expected) - - # with rootdir - common = [ - ("spam.py", "/eggs", "./spam.py"), - ("spam.py", "\eggs", "./spam.py"), - # absolute - ("/spam.py", "/", "./spam.py"), - ("/eggs/spam.py", "/eggs", "./spam.py"), - ("/eggs/spam.py", "/eggs/", "./spam.py"), - # no-op - ("/spam.py", "/eggs", "/spam.py"), - ("/spam.py", "/eggs/", "/spam.py"), - # root-only (no-op) - ("/", "/", "/"), - ("/", "/spam", "/"), - ("//", "/", "//"), - ("//", "//", "//"), - ("//", "//spam", "//"), - ] - tests = [(p, r, posixpath, e) for p, r, e in common] - tests = [(p, r, ntpath, e) for p, r, e in common] - tests.extend( - (p, r, ntpath, e) - for p, r, e in [ - ("spam.py", r"\eggs", "./spam.py"), - # absolute - (r"\spam.py", "\\", r"./spam.py"), - (r"C:\spam.py", "C:\\", r"./spam.py"), - (r"\eggs\spam.py", r"\eggs", r"./spam.py"), - (r"\eggs\spam.py", "\\eggs\\", r"./spam.py"), - # normcase - (r"C:\spam.py", "c:\\", r"./spam.py"), - (r"\Eggs\Spam.py", "\\eggs", r"./Spam.py"), - (r"\eggs\spam.py", "\\Eggs", r"./spam.py"), - (r"\eggs\Spam.py", "\\Eggs", r"./Spam.py"), - # no-op - (r"\spam.py", r"\eggs", r"/spam.py"), - (r"C:\spam.py", r"C:\eggs", r"C:/spam.py"), - # TODO: Should these be supported. - (r"C:\spam.py", "\\", r"C:/spam.py"), - (r"\spam.py", "C:\\", r"/spam.py"), - # root-only - ("\\", "\\", "/"), - ("\\\\", "\\", "//"), - ("C:\\", "C:\\eggs", "C:/"), - ("C:\\", "C:\\", "C:/"), - (r"C:\spam.py", "D:\\", r"C:/spam.py"), - ] - ) - for fileid, rootdir, _os_path, expected in tests: - pathsep = _os_path.sep - with self.subTest( - r"for {} (with rootdir {!r}): {!r}".format(pathsep, rootdir, fileid) - ): - fixed = fix_fileid( - fileid, - rootdir, - _path_isabs=_os_path.isabs, - _normcase=_os_path.normcase, - _pathsep=pathsep, - ) - self.assertEqual(fixed, expected) - - -class ShlexUnsplitTests(unittest.TestCase): - def test_no_args(self): - argv = [] - joined = shlex_unsplit(argv) - - self.assertEqual(joined, "") - self.assertEqual(shlex.split(joined), argv) - - def test_one_arg(self): - argv = ["spam"] - joined = shlex_unsplit(argv) - - self.assertEqual(joined, "spam") - self.assertEqual(shlex.split(joined), argv) - - def test_multiple_args(self): - argv = [ - "-x", - "X", - "-xyz", - "spam", - "eggs", - ] - joined = shlex_unsplit(argv) - - self.assertEqual(joined, "-x X -xyz spam eggs") - self.assertEqual(shlex.split(joined), argv) - - def test_whitespace(self): - argv = [ - "-x", - "X Y Z", - "spam spam\tspam", - "eggs", - ] - joined = shlex_unsplit(argv) - - self.assertEqual(joined, "-x 'X Y Z' 'spam spam\tspam' eggs") - self.assertEqual(shlex.split(joined), argv) - - def test_quotation_marks(self): - argv = [ - "-x", - "''", - 'spam"spam"spam', - "ham'ham'ham", - "eggs", - ] - joined = shlex_unsplit(argv) - - self.assertEqual( - joined, - "-x ''\"'\"''\"'\"'' 'spam\"spam\"spam' 'ham'\"'\"'ham'\"'\"'ham' eggs", - ) - self.assertEqual(shlex.split(joined), argv) diff --git a/pythonFiles/tests/util.py b/pythonFiles/tests/util.py deleted file mode 100644 index 45c3536145cf..000000000000 --- a/pythonFiles/tests/util.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -class Stub(object): - def __init__(self): - self.calls = [] - - def add_call(self, name, args=None, kwargs=None): - self.calls.append((name, args, kwargs)) - - -class StubProxy(object): - def __init__(self, stub=None, name=None): - self.name = name - self.stub = stub if stub is not None else Stub() - - @property - def calls(self): - return self.stub.calls - - def add_call(self, funcname, *args, **kwargs): - callname = funcname - if self.name: - callname = "{}.{}".format(self.name, funcname) - return self.stub.add_call(callname, *args, **kwargs) diff --git a/pythonFiles/visualstudio_py_testlauncher.py b/pythonFiles/visualstudio_py_testlauncher.py deleted file mode 100644 index 521e10e707c1..000000000000 --- a/pythonFiles/visualstudio_py_testlauncher.py +++ /dev/null @@ -1,401 +0,0 @@ -# Python Tools for Visual Studio -# Copyright(c) Microsoft Corporation -# All rights reserved. -# -# 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 -# -# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS -# OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY -# IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -# MERCHANTABLITY OR NON-INFRINGEMENT. -# -# See the Apache Version 2.0 License for specific language governing -# permissions and limitations under the License. - -__author__ = "Microsoft Corporation " -__version__ = "3.0.0.0" - -import os -import sys -import json -import unittest -import socket -import traceback -from types import CodeType, FunctionType -import signal - -try: - import thread -except: - import _thread as thread - - -class _TestOutput(object): - """file like object which redirects output to the repl window.""" - - errors = "strict" - - def __init__(self, old_out, is_stdout): - self.is_stdout = is_stdout - self.old_out = old_out - if sys.version >= "3." and hasattr(old_out, "buffer"): - self.buffer = _TestOutputBuffer(old_out.buffer, is_stdout) - - def flush(self): - if self.old_out: - self.old_out.flush() - - def writelines(self, lines): - for line in lines: - self.write(line) - - @property - def encoding(self): - return "utf8" - - def write(self, value): - _channel.send_event("stdout" if self.is_stdout else "stderr", content=value) - if self.old_out: - self.old_out.write(value) - # flush immediately, else things go wonky and out of order - self.flush() - - def isatty(self): - return True - - def next(self): - pass - - @property - def name(self): - if self.is_stdout: - return "" - else: - return "" - - def __getattr__(self, name): - return getattr(self.old_out, name) - - -class _TestOutputBuffer(object): - def __init__(self, old_buffer, is_stdout): - self.buffer = old_buffer - self.is_stdout = is_stdout - - def write(self, data): - _channel.send_event("stdout" if self.is_stdout else "stderr", content=data) - self.buffer.write(data) - - def flush(self): - self.buffer.flush() - - def truncate(self, pos=None): - return self.buffer.truncate(pos) - - def tell(self): - return self.buffer.tell() - - def seek(self, pos, whence=0): - return self.buffer.seek(pos, whence) - - -class _IpcChannel(object): - def __init__(self, socket, callback): - self.socket = socket - self.seq = 0 - self.callback = callback - self.lock = thread.allocate_lock() - self._closed = False - # start the testing reader thread loop - self.test_thread_id = thread.start_new_thread(self.readSocket, ()) - - def close(self): - self._closed = True - - def readSocket(self): - try: - data = self.socket.recv(1024) - self.callback() - except OSError: - if not self._closed: - raise - - def receive(self): - pass - - def send_event(self, name, **args): - with self.lock: - body = {"type": "event", "seq": self.seq, "event": name, "body": args} - self.seq += 1 - content = json.dumps(body).encode("utf8") - headers = ("Content-Length: %d\n\n" % (len(content),)).encode("utf8") - self.socket.send(headers) - self.socket.send(content) - - -_channel = None - - -class VsTestResult(unittest.TextTestResult): - def startTest(self, test): - super(VsTestResult, self).startTest(test) - if _channel is not None: - _channel.send_event(name="start", test=test.id()) - - def addError(self, test, err): - super(VsTestResult, self).addError(test, err) - self.sendResult(test, "error", err) - - def addFailure(self, test, err): - super(VsTestResult, self).addFailure(test, err) - self.sendResult(test, "failed", err) - - def addSuccess(self, test): - super(VsTestResult, self).addSuccess(test) - self.sendResult(test, "passed") - - def addSkip(self, test, reason): - super(VsTestResult, self).addSkip(test, reason) - self.sendResult(test, "skipped") - - def addExpectedFailure(self, test, err): - super(VsTestResult, self).addExpectedFailure(test, err) - self.sendResult(test, "failed", err) - - def addUnexpectedSuccess(self, test): - super(VsTestResult, self).addUnexpectedSuccess(test) - self.sendResult(test, "passed") - - def sendResult(self, test, outcome, trace=None): - if _channel is not None: - tb = None - message = None - if trace is not None: - traceback.print_exc() - formatted = traceback.format_exception(*trace) - # Remove the 'Traceback (most recent call last)' - formatted = formatted[1:] - tb = "".join(formatted) - message = str(trace[1]) - _channel.send_event( - name="result", - outcome=outcome, - traceback=tb, - message=message, - test=test.id(), - ) - - -def stopTests(): - try: - os.kill(os.getpid(), signal.SIGUSR1) - except: - try: - os.kill(os.getpid(), signal.SIGTERM) - except: - pass - - -class ExitCommand(Exception): - pass - - -def signal_handler(signal, frame): - raise ExitCommand() - - -def main(): - import os - import sys - import unittest - from optparse import OptionParser - - global _channel - - parser = OptionParser( - prog="visualstudio_py_testlauncher", - usage="Usage: %prog [

+ +``` +XXX +``` + +

+ diff --git a/resources/report_issue_user_data_template.md b/resources/report_issue_user_data_template.md new file mode 100644 index 000000000000..037b844511d3 --- /dev/null +++ b/resources/report_issue_user_data_template.md @@ -0,0 +1,21 @@ +- Python version (& distribution if applicable, e.g. Anaconda): {0} +- Type of virtual environment used (e.g. conda, venv, virtualenv, etc.): {1} +- Value of the `python.languageServer` setting: {2} + +
+User Settings +

+ +``` +{3}{4} +``` +

+
+ +
+Installed Extensions + +|Extension Name|Extension Id|Version| +|---|---|---| +{5} +
diff --git a/resources/report_issue_user_settings.json b/resources/report_issue_user_settings.json new file mode 100644 index 000000000000..7e034651c46d --- /dev/null +++ b/resources/report_issue_user_settings.json @@ -0,0 +1,99 @@ +{ + "initialize": false, + "pythonPath": "placeholder", + "onDidChange": false, + "defaultInterpreterPath": "placeholder", + "defaultLS": false, + "envFile": "placeholder", + "venvPath": "placeholder", + "venvFolders": "placeholder", + "activeStateToolPath": "placeholder", + "condaPath": "placeholder", + "pipenvPath": "placeholder", + "poetryPath": "placeholder", + "pixiToolPath": "placeholder", + "devOptions": false, + "globalModuleInstallation": false, + "languageServer": true, + "languageServerIsDefault": false, + "logging": true, + "useIsolation": false, + "changed": false, + "_pythonPath": false, + "_defaultInterpreterPath": false, + "workspace": false, + "workspaceRoot": false, + "linting": { + "enabled": true, + "cwd": "placeholder", + "flake8Args": "placeholder", + "flake8CategorySeverity": false, + "flake8Enabled": true, + "flake8Path": "placeholder", + "ignorePatterns": false, + "lintOnSave": true, + "maxNumberOfProblems": false, + "banditArgs": "placeholder", + "banditEnabled": true, + "banditPath": "placeholder", + "mypyArgs": "placeholder", + "mypyCategorySeverity": false, + "mypyEnabled": true, + "mypyPath": "placeholder", + "pycodestyleArgs": "placeholder", + "pycodestyleCategorySeverity": false, + "pycodestyleEnabled": true, + "pycodestylePath": "placeholder", + "prospectorArgs": "placeholder", + "prospectorEnabled": true, + "prospectorPath": "placeholder", + "pydocstyleArgs": "placeholder", + "pydocstyleEnabled": true, + "pydocstylePath": "placeholder", + "pylamaArgs": "placeholder", + "pylamaEnabled": true, + "pylamaPath": "placeholder", + "pylintArgs": "placeholder", + "pylintCategorySeverity": false, + "pylintEnabled": false, + "pylintPath": "placeholder" + }, + "analysis": { + "completeFunctionParens": true, + "autoImportCompletions": true, + "autoSearchPaths": "placeholder", + "stubPath": "placeholder", + "diagnosticMode": true, + "extraPaths": "placeholder", + "useLibraryCodeForTypes": true, + "typeCheckingMode": true, + "memory": true, + "symbolsHierarchyDepthLimit": false + }, + "testing": { + "cwd": "placeholder", + "debugPort": true, + "promptToConfigure": true, + "pytestArgs": "placeholder", + "pytestEnabled": true, + "pytestPath": "placeholder", + "unittestArgs": "placeholder", + "unittestEnabled": true, + "autoTestDiscoverOnSaveEnabled": true, + "autoTestDiscoverOnSavePattern": "placeholder" + }, + "terminal": { + "activateEnvironment": true, + "executeInFileDir": "placeholder", + "launchArgs": "placeholder", + "activateEnvInCurrentTerminal": false + }, + "tensorBoard": { + "logDirectory": "placeholder" + }, + "experiments": { + "enabled": true, + "optInto": true, + "optOutFrom": true + } +} diff --git a/resources/walkthrough/create-environment.svg b/resources/walkthrough/create-environment.svg new file mode 100644 index 000000000000..bb48e1b16711 --- /dev/null +++ b/resources/walkthrough/create-environment.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/create-notebook.svg b/resources/walkthrough/create-notebook.svg new file mode 100644 index 000000000000..05dadc0cc6de --- /dev/null +++ b/resources/walkthrough/create-notebook.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/data-science.svg b/resources/walkthrough/data-science.svg new file mode 100644 index 000000000000..506bed2161b1 --- /dev/null +++ b/resources/walkthrough/data-science.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/environments-info.md b/resources/walkthrough/environments-info.md new file mode 100644 index 000000000000..7bdc61a96e2e --- /dev/null +++ b/resources/walkthrough/environments-info.md @@ -0,0 +1,10 @@ +## Python Environments + +Create Environment Dropdown + +Python virtual environments are considered a best practice in Python development. A virtual environment includes a Python interpreter and any packages you have installed into it, such as numpy or Flask. + +After you create a virtual environment using the **Python: Create Environment** command, you can install packages into the environment. +For example, type `python -m pip install numpy` in an activated terminal to install `numpy` into the environment. + +🔍 Check out our [docs](https://aka.ms/pythonenvs) to learn more. diff --git a/resources/walkthrough/install-python-linux.md b/resources/walkthrough/install-python-linux.md new file mode 100644 index 000000000000..78a12870799f --- /dev/null +++ b/resources/walkthrough/install-python-linux.md @@ -0,0 +1,22 @@ +# Install Python on Linux + +To install the latest version of Python on [Debian-based Linux distributions](https://www.debian.org/), you can create a new terminal (Ctrl + Shift + `) and run the following commands: + + +``` +sudo apt-get update +sudo apt-get install python3 python3-venv python3-pip +``` + +For [Fedora-based Linux distributions](https://getfedora.org/), you can run the following: + +``` +sudo dnf install python3 +``` + +To verify if Python was successfully installed, run the following command in the terminal: + + +``` +python3 --version +``` diff --git a/resources/walkthrough/install-python-macos.md b/resources/walkthrough/install-python-macos.md new file mode 100644 index 000000000000..470d682d4eb2 --- /dev/null +++ b/resources/walkthrough/install-python-macos.md @@ -0,0 +1,15 @@ +# Install Python on macOS + +If you have [Homebrew](https://brew.sh/) installed, you can install Python by running the following command in the terminal (Ctrl + Shift + `): + +``` +brew install python3 +``` + +If you don't have Homebrew, you can download a Python installer for macOS from [python.org](https://www.python.org/downloads/mac-osx/). + +To verify if Python was successfully installed, run the following command in the terminal: + +``` +python3 --version +``` diff --git a/resources/walkthrough/install-python-windows-8.md b/resources/walkthrough/install-python-windows-8.md new file mode 100644 index 000000000000..f25f2f7d024d --- /dev/null +++ b/resources/walkthrough/install-python-windows-8.md @@ -0,0 +1,15 @@ +## Install Python on Windows + +If you don't have Python installed on your Windows machine, you can install it [from python.org](https://www.python.org/downloads). + +To verify it's installed, create a new terminal (Ctrl + Shift + `) and try running the following command: + +``` +python --version +``` + +You should see something similar to the following: +``` +Python 3.9.5 +``` +For additional information about using Python on Windows, see [Using Python on Windows at Python.org](https://docs.python.org/3.10/using/windows.html). diff --git a/resources/walkthrough/interactive-window.svg b/resources/walkthrough/interactive-window.svg new file mode 100644 index 000000000000..83446ed8e66a --- /dev/null +++ b/resources/walkthrough/interactive-window.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/learnmore.svg b/resources/walkthrough/learnmore.svg new file mode 100644 index 000000000000..c5fd67e75471 --- /dev/null +++ b/resources/walkthrough/learnmore.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/walkthrough/open-folder.svg b/resources/walkthrough/open-folder.svg new file mode 100644 index 000000000000..1615718a83dd --- /dev/null +++ b/resources/walkthrough/open-folder.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/play-button-dark.png b/resources/walkthrough/play-button-dark.png new file mode 100644 index 000000000000..113ad62b87c2 Binary files /dev/null and b/resources/walkthrough/play-button-dark.png differ diff --git a/resources/walkthrough/python-interpreter.svg b/resources/walkthrough/python-interpreter.svg new file mode 100644 index 000000000000..0f6e262321ec --- /dev/null +++ b/resources/walkthrough/python-interpreter.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/walkthrough/rundebug2.svg b/resources/walkthrough/rundebug2.svg new file mode 100644 index 000000000000..6d1fe753cc4f --- /dev/null +++ b/resources/walkthrough/rundebug2.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/conda-environment.json b/schemas/conda-environment.json index 86ea60213263..fb1e821778c3 100644 --- a/schemas/conda-environment.json +++ b/schemas/conda-environment.json @@ -1,7 +1,7 @@ { "title": "conda environment file", - "description": "Support for conda's enviroment.yml files (e.g. `conda env export > environment.yml`)", - "id": "https://raw.githubusercontent.com/Microsoft/vscode-python/master/schemas/conda-environment.json", + "description": "Support for conda's environment.yml files (e.g. `conda env export > environment.yml`)", + "id": "https://raw.githubusercontent.com/Microsoft/vscode-python/main/schemas/conda-environment.json", "$schema": "http://json-schema.org/draft-04/schema#", "definitions": { "channel": { @@ -41,7 +41,7 @@ } } }, - "required": [ "pip" ] + "required": ["pip"] } ] } diff --git a/schemas/condarc.json b/schemas/condarc.json index 00ae69dee929..a881315d3137 100644 --- a/schemas/condarc.json +++ b/schemas/condarc.json @@ -1,7 +1,7 @@ { "title": ".condarc", "description": "The conda configuration file; https://conda.io/docs/user-guide/configuration/use-condarc.html", - "id": "https://raw.githubusercontent.com/Microsoft/vscode-python/master/schemas/condarc.json", + "id": "https://raw.githubusercontent.com/Microsoft/vscode-python/main/schemas/condarc.json", "$schema": "http://json-schema.org/draft-04/schema#", "definitions": { "channel": { @@ -59,7 +59,14 @@ } }, "ssl_verify": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] }, "offline": { "type": "boolean" diff --git a/scripts/cleanup-eslintignore.js b/scripts/cleanup-eslintignore.js new file mode 100644 index 000000000000..848f5a9c4910 --- /dev/null +++ b/scripts/cleanup-eslintignore.js @@ -0,0 +1,44 @@ +const fs = require('fs'); +const path = require('path'); + +const baseDir = process.cwd(); +const eslintignorePath = path.join(baseDir, '.eslintignore'); + +fs.readFile(eslintignorePath, 'utf8', (err, data) => { + if (err) { + console.error('Error reading .eslintignore file:', err); + return; + } + + const lines = data.split('\n'); + const files = lines.map((line) => line.trim()).filter((line) => line && !line.startsWith('#')); + const nonExistentFiles = []; + + files.forEach((file) => { + const filePath = path.join(baseDir, file); + if (!fs.existsSync(filePath) && file !== 'pythonExtensionApi/out/') { + nonExistentFiles.push(file); + } + }); + + if (nonExistentFiles.length > 0) { + console.log('The following files listed in .eslintignore do not exist:'); + nonExistentFiles.forEach((file) => console.log(file)); + + const updatedLines = lines.filter((line) => { + const trimmedLine = line.trim(); + return !nonExistentFiles.includes(trimmedLine) || trimmedLine === 'pythonExtensionApi/out/'; + }); + const updatedData = `${updatedLines.join('\n')}\n`; + + fs.writeFile(eslintignorePath, updatedData, 'utf8', (err) => { + if (err) { + console.error('Error writing to .eslintignore file:', err); + return; + } + console.log('Non-existent files have been removed from .eslintignore.'); + }); + } else { + console.log('All files listed in .eslintignore exist.'); + } +}); diff --git a/scripts/issue_velocity_summary_script.py b/scripts/issue_velocity_summary_script.py new file mode 100644 index 000000000000..94929d1798a9 --- /dev/null +++ b/scripts/issue_velocity_summary_script.py @@ -0,0 +1,110 @@ +""" +This script fetches open issues from the microsoft/vscode-python repository, +calculates the thumbs-up per day for each issue, and generates a markdown +summary of the issues sorted by highest thumbs-up per day. Issues with zero +thumbs-up are excluded from the summary. +""" + +import requests +import os +from datetime import datetime, timezone + + +GITHUB_API_URL = "https://api.github.com" +REPO = "microsoft/vscode-python" +TOKEN = os.getenv("GITHUB_TOKEN") + + +def fetch_issues(): + """ + Fetches all open issues from the specified GitHub repository. + + Returns: + list: A list of dictionaries representing the issues. + """ + headers = {"Authorization": f"token {TOKEN}"} + issues = [] + page = 1 + while True: + query = ( + f"{GITHUB_API_URL}/repos/{REPO}/issues?state=open&per_page=25&page={page}" + ) + response = requests.get(query, headers=headers) + if response.status_code == 403: + raise Exception( + "Access forbidden: Check your GitHub token and permissions." + ) + response.raise_for_status() + page_issues = response.json() + if not page_issues: + break + issues.extend(page_issues) + page += 1 + return issues + + +def calculate_thumbs_up_per_day(issue): + """ + Calculates the thumbs-up per day for a given issue. + + Args: + issue (dict): A dictionary representing the issue. + + Returns: + float: The thumbs-up per day for the issue. + """ + created_at = datetime.strptime(issue["created_at"], "%Y-%m-%dT%H:%M:%SZ").replace( + tzinfo=timezone.utc + ) + now = datetime.now(timezone.utc) + days_open = (now - created_at).days or 1 + thumbs_up = issue["reactions"].get("+1", 0) + return thumbs_up / days_open + + +def generate_markdown_summary(issues): + """ + Generates a markdown summary of the issues. + + Args: + issues (list): A list of dictionaries representing the issues. + + Returns: + str: A markdown-formatted string summarizing the issues. + """ + summary = "| URL | Title | 👍 | Days Open | 👍/day |\n| --- | ----- | --- | --------- | ------ |\n" + issues_with_thumbs_up = [] + for issue in issues: + created_at = datetime.strptime( + issue["created_at"], "%Y-%m-%dT%H:%M:%SZ" + ).replace(tzinfo=timezone.utc) + now = datetime.now(timezone.utc) + days_open = (now - created_at).days or 1 + thumbs_up = issue["reactions"].get("+1", 0) + if thumbs_up > 0: + thumbs_up_per_day = thumbs_up / days_open + issues_with_thumbs_up.append( + (issue, thumbs_up, days_open, thumbs_up_per_day) + ) + + # Sort issues by thumbs_up_per_day in descending order + issues_with_thumbs_up.sort(key=lambda x: x[3], reverse=True) + + for issue, thumbs_up, days_open, thumbs_up_per_day in issues_with_thumbs_up: + summary += f"| {issue['html_url']} | {issue['title']} | {thumbs_up} | {days_open} | {thumbs_up_per_day:.2f} |\n" + + return summary + + +def main(): + """ + Main function to fetch issues, generate the markdown summary, and write it to a file. + """ + issues = fetch_issues() + summary = generate_markdown_summary(issues) + with open("endorsement_velocity_summary.md", "w") as f: + f.write(summary) + + +if __name__ == "__main__": + main() diff --git a/scripts/onCreateCommand.sh b/scripts/onCreateCommand.sh new file mode 100644 index 000000000000..3d473d1ee172 --- /dev/null +++ b/scripts/onCreateCommand.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Install pyenv and Python versions here to avoid using shim. +curl https://pyenv.run | bash +echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc +echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc +# echo 'eval "$(pyenv init -)"' >> ~/.bashrc + +export PYENV_ROOT="$HOME/.pyenv" +command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" +# eval "$(pyenv init -)" Comment this out and DO NOT use shim. +source ~/.bashrc + +# Install Python via pyenv . +pyenv install 3.8.18 3.9:latest 3.10:latest 3.11:latest + +# Set default Python version to 3.8 . +pyenv global 3.8.18 + +npm ci + +# Create Virutal environment. +pyenv exec python -m venv .venv + +# Activate Virtual environment. +source /workspaces/vscode-python/.venv/bin/activate + +# Install required Python libraries. +/workspaces/vscode-python/.venv/bin/python -m pip install nox +nox --session install_python_libs + +/workspaces/vscode-python/.venv/bin/python -m pip install -r build/test-requirements.txt +/workspaces/vscode-python/.venv/bin/python -m pip install -r build/functional-test-requirements.txt + +# Below will crash codespace +# npm run compile diff --git a/snippets/python.json b/snippets/python.json deleted file mode 100644 index b1954d45cf17..000000000000 --- a/snippets/python.json +++ /dev/null @@ -1,253 +0,0 @@ -{ - "if": { - "prefix": "if", - "body": [ - "if ${1:expression}:", - "\t${2:pass}" - ], - "description": "Code snippet for an if statement" - }, - "if/else": { - "prefix": "if/else", - "body": [ - "if ${1:condition}:", - "\t${2:pass}", - "else:", - "\t${3:pass}" - ], - "description": "Code snippet for an if statement with else" - }, - "elif": { - "prefix": "elif", - "body": [ - "elif ${1:expression}:", - "\t${2:pass}" - ], - "description": "Code snippet for an elif" - }, - "else": { - "prefix": "else", - "body": [ - "else:", - "\t${1:pass}" - ], - "description": "Code snippet for an else" - }, - "while": { - "prefix": "while", - "body": [ - "while ${1:expression}:", - "\t${2:pass}" - ], - "description": "Code snippet for a while loop" - }, - "while/else": { - "prefix": "while/else", - "body": [ - "while ${1:expression}:", - "\t${2:pass}", - "else:", - "\t${3:pass}" - ], - "description": "Code snippet for a while loop with else" - }, - "for": { - "prefix": "for", - "body": [ - "for ${1:target_list} in ${2:expression_list}:", - "\t${3:pass}" - ], - "description": "Code snippet for a for loop" - }, - "for/else": { - "prefix": "for/else", - "body": [ - "for ${1:target_list} in ${2:expression_list}:", - "\t${3:pass}", - "else:", - "\t${4:pass}" - ], - "description": "Code snippet for a for loop with else" - }, - "try/except": { - "prefix": "try/except", - "body": [ - "try:", - "\t${1:pass}", - "except ${2:expression} as ${3:identifier}:", - "\t${4:pass}" - ], - "description": "Code snippet for a try/except statement" - }, - "try/finally": { - "prefix": "try/finally", - "body": [ - "try:", - "\t${1:pass}", - "finally:", - "\t${2:pass}" - ], - "description": "Code snippet for a try/finally statement" - }, - "try/except/else": { - "prefix": "try/except/else", - "body": [ - "try:", - "\t${1:pass}", - "except ${2:expression} as ${3:identifier}:", - "\t${4:pass}", - "else:", - "\t${5:pass}" - ], - "description": "Code snippet for a try/except/else statement" - }, - "try/except/finally": { - "prefix": "try/except/finally", - "body": [ - "try:", - "\t${1:pass}", - "except ${2:expression} as ${3:identifier}:", - "\t${4:pass}", - "finally:", - "\t${5:pass}" - ], - "description": "Code snippet for a try/except/finally statement" - }, - "try/except/else/finally": { - "prefix": "try/except/else/finally", - "body": [ - "try:", - "\t${1:pass}", - "except ${2:expression} as ${3:identifier}:", - "\t${4:pass}", - "else:", - "\t${5:pass}", - "finally:", - "\t${6:pass}" - ], - "description": "Code snippet for a try/except/else/finally statement" - }, - "with": { - "prefix": "with", - "body": [ - "with ${1:expression} as ${2:target}:", - "\t${3:pass}" - ], - "description": "Code snippet for a with statement" - }, - "def": { - "prefix": "def", - "body": [ - "def ${1:funcname}(${2:parameter_list}):", - "\t${3:pass}" - ], - "description": "Code snippet for a function definition" - }, - "def(class method)": { - "prefix": "def(class method)", - "body": [ - "def ${1:funcname}(self, ${2:parameter_list}):", - "\t${3:pass}" - ], - "description": "Code snippet for a class method" - }, - "def(static class method)": { - "prefix": "def(static class method)", - "body": [ - "@staticmethod", - "def ${1:funcname}(${2:parameter_list}):", - "\t${3:pass}" - ], - "description": "Code snippet for a static class method" - }, - "def(abstract class method)": { - "prefix": "def(abstract class method)", - "body": [ - "def ${1:funcname}(self, ${2:parameter_list}):", - "\traise NotImplementedError" - ], - "description": "Code snippet for an abstract class method" - }, - "class": { - "prefix": "class", - "body": [ - "class ${1:classname}(${2:object}):", - "\t${3:pass}" - ], - "description": "Code snippet for a class definition" - }, - "lambda": { - "prefix": "lambda", - "body": [ - "lambda ${1:parameter_list}: ${2:expression}" - ], - "description": "Code snippet for a lambda statement" - }, - "if(main)": { - "prefix": "__main__", - "body": [ - "if __name__ == \"__main__\":", - " ${1:pass}" - ], - "description": "Code snippet for a `if __name__ == \"__main__\": ...` block" - }, - "async/def": { - "prefix": "async/def", - "body": [ - "async def ${1:funcname}(${2:parameter_list}):", - "\t${3:pass}" - ], - "description": "Code snippet for an async statement" - }, - "async/for": { - "prefix": "async/for", - "body": [ - "async for ${1:target} in ${2:iter}:", - "\t${3:block}" - ], - "description": "Code snippet for an async for statement" - }, - "async/for/else": { - "prefix": "async/for/else", - "body": [ - "async for ${1:target} in ${2:iter}:", - "\t${3:block}", - "else:", - "\t${4:block}" - ], - "description": "Code snippet for an async for statement with else" - }, - "async/with": { - "prefix": "async/with", - "body": [ - "async with ${1:expr} as ${2:var}:", - "\t${3:block}" - ], - "description": "Code snippet for an async with statement" - }, - "ipdb": { - "prefix": "ipdb", - "body": "import ipdb; ipdb.set_trace()", - "description": "Code snippet for ipdb debug" - }, - "pdb": { - "prefix": "pdb", - "body": "import pdb; pdb.set_trace()", - "description": "Code snippet for pdb debug" - }, - "pudb": { - "prefix": "pudb", - "body": "import pudb; pudb.set_trace()", - "description": "Code snippet for pudb debug" - }, - "add/new/cell": { - "prefix": "add/new/cell", - "body": "# %%", - "description": "Code snippet to add a new cell" - }, - "mark/markdown": { - "prefix": "mark/markdown", - "body": "# %% [markdown]", - "description": "Code snippet to add a new markdown cell" - } -} diff --git a/sprint-planning.github-issues b/sprint-planning.github-issues new file mode 100644 index 000000000000..1fbd09a790e8 --- /dev/null +++ b/sprint-planning.github-issues @@ -0,0 +1,72 @@ +[ + { + "kind": 1, + "language": "markdown", + "value": "# Query constants" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc=repo:microsoft/vscode-python\n$open=is:open\n$upvotes=sort:reactions-+1-desc" + }, + { + "kind": 1, + "language": "markdown", + "value": "# Priority issues 🚨" + }, + { + "kind": 1, + "language": "markdown", + "value": "## Important/P1" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc $open label:\"important\"" + }, + { + "kind": 1, + "language": "markdown", + "value": "# Regressions 🔙" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc $open label:\"regression\"" + }, + { + "kind": 1, + "language": "markdown", + "value": "# Partner asks" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc $open label:\"partner ask\"" + }, + { + "kind": 1, + "language": "markdown", + "value": "# Upvotes 👍" + }, + { + "kind": 1, + "language": "markdown", + "value": "## Enhancements 💪" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc $open $upvotes label:\"feature-request\" " + }, + { + "kind": 1, + "language": "markdown", + "value": "## Bugs 🐜" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$pvsc $open $upvotes label:\"bug\"" + } +] diff --git a/src/client/activation/aaTesting.ts b/src/client/activation/aaTesting.ts deleted file mode 100644 index c6b4765f25a9..000000000000 --- a/src/client/activation/aaTesting.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { ValidateABTesting } from '../common/experimentGroups'; -import { IExperimentsManager } from '../common/types'; -import { IExtensionSingleActivationService } from './types'; - -@injectable() -export class AATesting implements IExtensionSingleActivationService { - constructor(@inject(IExperimentsManager) private experiments: IExperimentsManager) {} - - public async activate(): Promise { - this.experiments.sendTelemetryIfInExperiment(ValidateABTesting.experiment); - this.experiments.sendTelemetryIfInExperiment(ValidateABTesting.control); - } -} diff --git a/src/client/activation/activationManager.ts b/src/client/activation/activationManager.ts index b47f7b2e9620..9e97c5c48857 100644 --- a/src/client/activation/activationManager.ts +++ b/src/client/activation/activationManager.ts @@ -8,30 +8,58 @@ import { TextDocument } from 'vscode'; import { IApplicationDiagnostics } from '../application/types'; import { IActiveResourceService, IDocumentManager, IWorkspaceService } from '../common/application/types'; import { PYTHON_LANGUAGE } from '../common/constants'; -import { traceDecorators } from '../common/logger'; -import { IDisposable, Resource } from '../common/types'; +import { IFileSystem } from '../common/platform/types'; +import { IDisposable, IInterpreterPathService, Resource } from '../common/types'; +import { Deferred } from '../common/utils/async'; +import { StopWatch } from '../common/utils/stopWatch'; import { IInterpreterAutoSelectionService } from '../interpreter/autoSelection/types'; -import { IInterpreterService } from '../interpreter/contracts'; +import { traceDecoratorError } from '../logging'; +import { sendActivationTelemetry } from '../telemetry/envFileTelemetry'; import { IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService } from './types'; @injectable() export class ExtensionActivationManager implements IExtensionActivationManager { public readonly activatedWorkspaces = new Set(); + + protected readonly isInterpreterSetForWorkspacePromises = new Map>(); + private readonly disposables: IDisposable[] = []; + private docOpenedHandler?: IDisposable; + constructor( - @multiInject(IExtensionActivationService) private readonly activationServices: IExtensionActivationService[], + @multiInject(IExtensionActivationService) private activationServices: IExtensionActivationService[], @multiInject(IExtensionSingleActivationService) - private readonly singleActivationServices: IExtensionSingleActivationService[], + private singleActivationServices: IExtensionSingleActivationService[], @inject(IDocumentManager) private readonly documentManager: IDocumentManager, - @inject(IInterpreterService) private readonly interpreterService: IInterpreterService, @inject(IInterpreterAutoSelectionService) private readonly autoSelection: IInterpreterAutoSelectionService, @inject(IApplicationDiagnostics) private readonly appDiagnostics: IApplicationDiagnostics, @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, - @inject(IActiveResourceService) private readonly activeResourceService: IActiveResourceService + @inject(IFileSystem) private readonly fileSystem: IFileSystem, + @inject(IActiveResourceService) private readonly activeResourceService: IActiveResourceService, + @inject(IInterpreterPathService) private readonly interpreterPathService: IInterpreterPathService, ) {} - public dispose() { + private filterServices() { + if (!this.workspaceService.isTrusted) { + this.activationServices = this.activationServices.filter( + (service) => service.supportedWorkspaceTypes.untrustedWorkspace, + ); + this.singleActivationServices = this.singleActivationServices.filter( + (service) => service.supportedWorkspaceTypes.untrustedWorkspace, + ); + } + if (this.workspaceService.isVirtualWorkspace) { + this.activationServices = this.activationServices.filter( + (service) => service.supportedWorkspaceTypes.virtualWorkspace, + ); + this.singleActivationServices = this.singleActivationServices.filter( + (service) => service.supportedWorkspaceTypes.virtualWorkspace, + ); + } + } + + public dispose(): void { while (this.disposables.length > 0) { const disposable = this.disposables.shift()!; disposable.dispose(); @@ -41,52 +69,65 @@ export class ExtensionActivationManager implements IExtensionActivationManager { this.docOpenedHandler = undefined; } } - public async activate(): Promise { + + public async activate(startupStopWatch: StopWatch): Promise { + this.filterServices(); await this.initialize(); + // Activate all activation services together. + await Promise.all([ - Promise.all(this.singleActivationServices.map(item => item.activate())), - this.activateWorkspace(this.activeResourceService.getActiveResource()) + ...this.singleActivationServices.map((item) => item.activate()), + this.activateWorkspace(this.activeResourceService.getActiveResource(), startupStopWatch), ]); - await this.autoSelection.autoSelectInterpreter(undefined); } - @traceDecorators.error('Failed to activate a workspace') - public async activateWorkspace(resource: Resource) { + + @traceDecoratorError('Failed to activate a workspace') + public async activateWorkspace(resource: Resource, startupStopWatch?: StopWatch): Promise { + const folder = this.workspaceService.getWorkspaceFolder(resource); + resource = folder ? folder.uri : undefined; const key = this.getWorkspaceKey(resource); if (this.activatedWorkspaces.has(key)) { return; } this.activatedWorkspaces.add(key); - // Get latest interpreter list in the background. - this.interpreterService.getInterpreters(resource).ignoreErrors(); - await this.autoSelection.autoSelectInterpreter(resource); - await Promise.all(this.activationServices.map(item => item.activate(resource))); + if (this.workspaceService.isTrusted) { + // Do not interact with interpreters in a untrusted workspace. + await this.autoSelection.autoSelectInterpreter(resource); + await this.interpreterPathService.copyOldInterpreterStorageValuesToNew(resource); + } + await sendActivationTelemetry(this.fileSystem, this.workspaceService, resource); + await Promise.all(this.activationServices.map((item) => item.activate(resource, startupStopWatch))); await this.appDiagnostics.performPreStartupHealthCheck(resource); } - public async initialize() { + + public async initialize(): Promise { this.addHandlers(); this.addRemoveDocOpenedHandlers(); } - public onDocOpened(doc: TextDocument) { + + public onDocOpened(doc: TextDocument): void { if (doc.languageId !== PYTHON_LANGUAGE) { return; } const key = this.getWorkspaceKey(doc.uri); + const hasWorkspaceFolders = (this.workspaceService.workspaceFolders?.length || 0) > 0; // If we have opened a doc that does not belong to workspace, then do nothing. - if (key === '' && this.workspaceService.hasWorkspaceFolders) { + if (key === '' && hasWorkspaceFolders) { return; } if (this.activatedWorkspaces.has(key)) { return; } - const folder = this.workspaceService.getWorkspaceFolder(doc.uri); - this.activateWorkspace(folder ? folder.uri : undefined).ignoreErrors(); + this.activateWorkspace(doc.uri).ignoreErrors(); } - protected addHandlers() { + + protected addHandlers(): void { this.disposables.push(this.workspaceService.onDidChangeWorkspaceFolders(this.onWorkspaceFoldersChanged, this)); } - protected addRemoveDocOpenedHandlers() { + + protected addRemoveDocOpenedHandlers(): void { if (this.hasMultipleWorkspaces()) { if (!this.docOpenedHandler) { this.docOpenedHandler = this.documentManager.onDidOpenTextDocument(this.onDocOpened, this); @@ -98,13 +139,14 @@ export class ExtensionActivationManager implements IExtensionActivationManager { this.docOpenedHandler = undefined; } } - protected onWorkspaceFoldersChanged() { - //If an activated workspace folder was removed, delete its key - const workspaceKeys = this.workspaceService.workspaceFolders!.map(workspaceFolder => - this.getWorkspaceKey(workspaceFolder.uri) + + protected onWorkspaceFoldersChanged(): void { + // If an activated workspace folder was removed, delete its key + const workspaceKeys = this.workspaceService.workspaceFolders!.map((workspaceFolder) => + this.getWorkspaceKey(workspaceFolder.uri), ); const activatedWkspcKeys = Array.from(this.activatedWorkspaces.keys()); - const activatedWkspcFoldersRemoved = activatedWkspcKeys.filter(item => workspaceKeys.indexOf(item) < 0); + const activatedWkspcFoldersRemoved = activatedWkspcKeys.filter((item) => workspaceKeys.indexOf(item) < 0); if (activatedWkspcFoldersRemoved.length > 0) { for (const folder of activatedWkspcFoldersRemoved) { this.activatedWorkspaces.delete(folder); @@ -112,10 +154,12 @@ export class ExtensionActivationManager implements IExtensionActivationManager { } this.addRemoveDocOpenedHandlers(); } - protected hasMultipleWorkspaces() { - return this.workspaceService.hasWorkspaceFolders && this.workspaceService.workspaceFolders!.length > 1; + + protected hasMultipleWorkspaces(): boolean { + return (this.workspaceService.workspaceFolders?.length || 0) > 1; } - protected getWorkspaceKey(resource: Resource) { + + protected getWorkspaceKey(resource: Resource): string { return this.workspaceService.getWorkspaceFolderIdentifier(resource, ''); } } diff --git a/src/client/activation/activationService.ts b/src/client/activation/activationService.ts deleted file mode 100644 index 3275e164835e..000000000000 --- a/src/client/activation/activationService.ts +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import '../common/extensions'; - -import { inject, injectable } from 'inversify'; -import { ConfigurationChangeEvent, Disposable, OutputChannel, Uri } from 'vscode'; - -import { LSNotSupportedDiagnosticServiceId } from '../application/diagnostics/checks/lsNotSupported'; -import { IDiagnosticsService } from '../application/diagnostics/types'; -import { IApplicationShell, ICommandManager, IWorkspaceService } from '../common/application/types'; -import { STANDARD_OUTPUT_CHANNEL } from '../common/constants'; -import { LSControl, LSEnabled } from '../common/experimentGroups'; -import { traceError } from '../common/logger'; -import { - IConfigurationService, - IDisposableRegistry, - IExperimentsManager, - IOutputChannel, - IPersistentStateFactory, - IPythonSettings, - Resource -} from '../common/types'; -import { swallowExceptions } from '../common/utils/decorators'; -import { noop } from '../common/utils/misc'; -import { IInterpreterService, PythonInterpreter } from '../interpreter/contracts'; -import { IServiceContainer } from '../ioc/types'; -import { sendTelemetryEvent } from '../telemetry'; -import { EventName } from '../telemetry/constants'; -import { Commands } from './languageServer/constants'; -import { RefCountedLanguageServer } from './refCountedLanguageServer'; -import { - IExtensionActivationService, - ILanguageServerActivator, - ILanguageServerCache, - LanguageServerType -} from './types'; - -const jediEnabledSetting: keyof IPythonSettings = 'jediEnabled'; -const languageServerSetting: keyof IPythonSettings = 'languageServer'; -const workspacePathNameForGlobalWorkspaces = ''; - -interface IActivatedServer { - key: string; - server: ILanguageServerActivator; - jedi: boolean; -} - -@injectable() -export class LanguageServerExtensionActivationService - implements IExtensionActivationService, ILanguageServerCache, Disposable { - private cache = new Map>(); - private activatedServer?: IActivatedServer; - private readonly workspaceService: IWorkspaceService; - private readonly output: OutputChannel; - private readonly appShell: IApplicationShell; - private readonly interpreterService: IInterpreterService; - private resource!: Resource; - - constructor( - @inject(IServiceContainer) private serviceContainer: IServiceContainer, - @inject(IPersistentStateFactory) private stateFactory: IPersistentStateFactory, - @inject(IExperimentsManager) private readonly abExperiments: IExperimentsManager - ) { - this.workspaceService = this.serviceContainer.get(IWorkspaceService); - this.interpreterService = this.serviceContainer.get(IInterpreterService); - this.output = this.serviceContainer.get(IOutputChannel, STANDARD_OUTPUT_CHANNEL); - this.appShell = this.serviceContainer.get(IApplicationShell); - const commandManager = this.serviceContainer.get(ICommandManager); - const disposables = serviceContainer.get(IDisposableRegistry); - disposables.push(this); - disposables.push(this.workspaceService.onDidChangeConfiguration(this.onDidChangeConfiguration.bind(this))); - disposables.push(this.workspaceService.onDidChangeWorkspaceFolders(this.onWorkspaceFoldersChanged, this)); - disposables.push(this.interpreterService.onDidChangeInterpreter(this.onDidChangeInterpreter.bind(this))); - disposables.push( - commandManager.registerCommand(Commands.ClearAnalyisCache, this.onClearAnalysisCaches.bind(this)) - ); - } - - public async activate(resource: Resource): Promise { - // Get a new server and dispose of the old one (might be the same one) - this.resource = resource; - const interpreter = await this.interpreterService.getActiveInterpreter(resource); - const key = await this.getKey(resource, interpreter); - - // If we have an old server with a different key, then deactivate it as the - // creation of the new server may fail if this server is still connected - if (this.activatedServer && this.activatedServer.key !== key) { - this.activatedServer.server.deactivate(); - } - - // Get the new item - const result = await this.get(resource, interpreter); - - // Now we dispose. This ensures the object stays alive if it's the same object because - // we dispose after we increment the ref count. - if (this.activatedServer) { - this.activatedServer.server.dispose(); - } - - // Save our active server. - this.activatedServer = { key, server: result, jedi: result.type === LanguageServerType.Jedi }; - - // Force this server to reconnect (if disconnected) as it should be the active - // language server for all of VS code. - this.activatedServer.server.activate(); - } - - public async get(resource: Resource, interpreter?: PythonInterpreter): Promise { - // See if we already have it or not - const key = await this.getKey(resource, interpreter); - let result: Promise | undefined = this.cache.get(key); - if (!result) { - // Create a special ref counted result so we don't dispose of the - // server too soon. - result = this.createRefCountedServer(resource, interpreter, key); - this.cache.set(key, result); - } else { - // Increment ref count if already exists. - result = result.then(r => { - r.increment(); - return r; - }); - } - return result; - } - - public dispose() { - if (this.activatedServer) { - this.activatedServer.server.dispose(); - } - } - @swallowExceptions('Send telemetry for Language Server current selection') - public async sendTelemetryForChosenLanguageServer(jediEnabled: boolean): Promise { - const state = this.stateFactory.createGlobalPersistentState('SWITCH_LS', undefined); - if (typeof state.value !== 'boolean') { - await state.updateValue(jediEnabled); - } - if (state.value !== jediEnabled) { - await state.updateValue(jediEnabled); - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_CURRENT_SELECTION, undefined, { - switchTo: jediEnabled - }); - } else { - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_CURRENT_SELECTION, undefined, { - lsStartup: jediEnabled - }); - } - } - - /** - * Checks if user has not manually set `jediEnabled` setting - * @param resource - * @returns `true` if user has NOT manually added the setting and is using default configuration, `false` if user has `jediEnabled` setting added - */ - public isJediUsingDefaultConfiguration(resource: Resource): boolean { - const settings = this.workspaceService.getConfiguration('python', resource).inspect('jediEnabled'); - if (!settings) { - traceError('WorkspaceConfiguration.inspect returns `undefined` for setting `python.jediEnabled`'); - return false; - } - return ( - settings.globalValue === undefined && - settings.workspaceValue === undefined && - settings.workspaceFolderValue === undefined - ); - } - - /** - * Checks if user is using Jedi as intellisense - * @returns `true` if user is using jedi, `false` if user is using language server - */ - public useJedi(): boolean { - if (this.isJediUsingDefaultConfiguration(this.resource)) { - if (this.abExperiments.inExperiment(LSEnabled)) { - return false; - } - // Send telemetry if user is in control group - this.abExperiments.sendTelemetryIfInExperiment(LSControl); - } - const configurationService = this.serviceContainer.get(IConfigurationService); - let enabled = configurationService.getSettings(this.resource).jediEnabled; - const languageServerType = configurationService.getSettings(this.resource).languageServer; - enabled = enabled || languageServerType === LanguageServerType.Jedi; - this.sendTelemetryForChosenLanguageServer(enabled).ignoreErrors(); - return enabled; - } - - protected async onWorkspaceFoldersChanged() { - //If an activated workspace folder was removed, dispose its activator - const workspaceKeys = await Promise.all( - this.workspaceService.workspaceFolders!.map(workspaceFolder => this.getKey(workspaceFolder.uri)) - ); - const activatedWkspcKeys = Array.from(this.cache.keys()); - const activatedWkspcFoldersRemoved = activatedWkspcKeys.filter(item => workspaceKeys.indexOf(item) < 0); - if (activatedWkspcFoldersRemoved.length > 0) { - for (const folder of activatedWkspcFoldersRemoved) { - const server = await this.cache.get(folder); - server?.dispose(); // This should remove it from the cache if this is the last instance. - } - } - } - - private async onDidChangeInterpreter() { - // Reactivate the resource. It should destroy the old one if it's different. - return this.activate(this.resource); - } - - private async createRefCountedServer( - resource: Resource, - interpreter: PythonInterpreter | undefined, - key: string - ): Promise { - const configurationService = this.serviceContainer.get(IConfigurationService); - let serverType = configurationService.getSettings(this.resource).languageServer; - if (!serverType) { - serverType = LanguageServerType.Jedi; - } - - switch (serverType) { - case LanguageServerType.None: - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_NONE, undefined, undefined); - break; - case LanguageServerType.Node: - // No telemetry in development phase. - break; - case LanguageServerType.Microsoft: - if (this.useJedi()) { - serverType = LanguageServerType.Jedi; - break; - } - const lsNotSupportedDiagnosticService = this.serviceContainer.get( - IDiagnosticsService, - LSNotSupportedDiagnosticServiceId - ); - const diagnostic = await lsNotSupportedDiagnosticService.diagnose(undefined); - lsNotSupportedDiagnosticService.handle(diagnostic).ignoreErrors(); - if (diagnostic.length) { - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_PLATFORM_SUPPORTED, undefined, { - supported: false - }); - serverType = LanguageServerType.Jedi; - } - break; - default: - serverType = LanguageServerType.Jedi; - break; - } - - await this.logStartup(serverType); - let server = this.serviceContainer.get(ILanguageServerActivator, serverType); - try { - await server.start(resource, interpreter); - } catch (ex) { - if (serverType === LanguageServerType.Jedi) { - throw ex; - } - await this.logStartup(serverType); - serverType = LanguageServerType.Jedi; - server = this.serviceContainer.get(ILanguageServerActivator, serverType); - await server.start(resource, interpreter); - } - - // Wrap the returned server in something that ref counts it. - return new RefCountedLanguageServer(server, serverType, () => { - // When we finally remove the last ref count, remove from the cache - this.cache.delete(key); - - // Dispose of the actual server. - server.dispose(); - }); - } - - private async logStartup(serverType: LanguageServerType): Promise { - let outputLine; - switch (serverType) { - case LanguageServerType.Jedi: - outputLine = 'Starting Jedi Python language engine.'; - break; - case LanguageServerType.Microsoft: - outputLine = 'Starting Microsoft Python language server.'; - break; - case LanguageServerType.Node: - outputLine = 'Starting Node.js language server.'; - break; - case LanguageServerType.None: - outputLine = 'Editor support is inactive since language server is set to None.'; - break; - default: - throw new Error('Unknown langauge server type in activator.'); - } - this.output.appendLine(outputLine); - } - - private async onDidChangeConfiguration(event: ConfigurationChangeEvent) { - const workspacesUris: (Uri | undefined)[] = this.workspaceService.hasWorkspaceFolders - ? this.workspaceService.workspaceFolders!.map(workspace => workspace.uri) - : [undefined]; - if ( - workspacesUris.findIndex(uri => event.affectsConfiguration(`python.${jediEnabledSetting}`, uri)) === -1 && - workspacesUris.findIndex(uri => event.affectsConfiguration(`python.${languageServerSetting}`, uri)) === -1 - ) { - return; - } - const jedi = this.useJedi(); - if (this.activatedServer) { - if (this.activatedServer.jedi === jedi) { - return; - } - const configurationService = this.serviceContainer.get(IConfigurationService); - const lsType = configurationService.getSettings(this.resource).languageServer; - if (this.activatedServer.key === lsType) { - return; - } - } - - const item = await this.appShell.showInformationMessage( - 'Please reload the window switching between language engines.', - 'Reload' - ); - if (item === 'Reload') { - this.serviceContainer.get(ICommandManager).executeCommand('workbench.action.reloadWindow'); - } - } - private async getKey(resource: Resource, interpreter?: PythonInterpreter): Promise { - const resourcePortion = this.workspaceService.getWorkspaceFolderIdentifier( - resource, - workspacePathNameForGlobalWorkspaces - ); - interpreter = interpreter ? interpreter : await this.interpreterService.getActiveInterpreter(resource); - const interperterPortion = interpreter ? `${interpreter.path}-${interpreter.envName}` : ''; - return `${resourcePortion}-${interperterPortion}`; - } - - private async onClearAnalysisCaches() { - const values = await Promise.all([...this.cache.values()]); - values.forEach(v => (v.clearAnalysisCache ? v.clearAnalysisCache() : noop())); - } -} diff --git a/src/client/activation/commands.ts b/src/client/activation/commands.ts new file mode 100644 index 000000000000..158d9662ec46 --- /dev/null +++ b/src/client/activation/commands.ts @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; + +export namespace Commands { + export const RestartLS = 'python.analysis.restartLanguageServer'; +} diff --git a/src/client/activation/common/activatorBase.ts b/src/client/activation/common/activatorBase.ts deleted file mode 100644 index fa3956498a89..000000000000 --- a/src/client/activation/common/activatorBase.ts +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import * as path from 'path'; -import { - CancellationToken, - CodeLens, - CompletionContext, - CompletionItem, - CompletionList, - DocumentSymbol, - Hover, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - TextDocumentContentChangeEvent, - WorkspaceEdit -} from 'vscode'; -import * as vscodeLanguageClient from 'vscode-languageclient'; - -import { injectable } from 'inversify'; -import { IWorkspaceService } from '../../common/application/types'; -import { traceDecorators } from '../../common/logger'; -import { IFileSystem } from '../../common/platform/types'; -import { IConfigurationService, Resource } from '../../common/types'; -import { EXTENSION_ROOT_DIR } from '../../constants'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { - ILanguageServerActivator, - ILanguageServerDownloader, - ILanguageServerFolderService, - ILanguageServerManager -} from '../types'; - -/** - * Starts the language server managers per workspaces (currently one for first workspace). - * - * @export - * @class LanguageServerActivatorBase - * @implements {ILanguageServerActivator} - */ -@injectable() -export abstract class LanguageServerActivatorBase implements ILanguageServerActivator { - protected resource?: Resource; - constructor( - protected readonly manager: ILanguageServerManager, - private readonly workspace: IWorkspaceService, - protected readonly fs: IFileSystem, - protected readonly lsDownloader: ILanguageServerDownloader, - protected readonly languageServerFolderService: ILanguageServerFolderService, - protected readonly configurationService: IConfigurationService - ) {} - - @traceDecorators.error('Failed to activate language server') - public async start(resource: Resource, interpreter?: PythonInterpreter): Promise { - if (!resource) { - resource = this.workspace.hasWorkspaceFolders ? this.workspace.workspaceFolders![0].uri : undefined; - } - this.resource = resource; - await this.ensureLanguageServerIsAvailable(resource); - await this.manager.start(resource, interpreter); - } - - public dispose(): void { - this.manager.dispose(); - } - - public abstract async ensureLanguageServerIsAvailable(resource: Resource): Promise; - - public activate(): void { - this.manager.connect(); - } - - public deactivate(): void { - this.manager.disconnect(); - } - - public handleOpen(document: TextDocument): void { - const languageClient = this.getLanguageClient(); - if (languageClient) { - languageClient.sendNotification( - vscodeLanguageClient.DidOpenTextDocumentNotification.type, - languageClient.code2ProtocolConverter.asOpenTextDocumentParams(document) - ); - } - } - - public handleChanges(document: TextDocument, changes: TextDocumentContentChangeEvent[]): void { - const languageClient = this.getLanguageClient(); - if (languageClient) { - languageClient.sendNotification( - vscodeLanguageClient.DidChangeTextDocumentNotification.type, - languageClient.code2ProtocolConverter.asChangeTextDocumentParams({ document, contentChanges: changes }) - ); - } - } - - public provideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken - ): ProviderResult { - return this.handleProvideRenameEdits(document, position, newName, token); - } - - public provideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken - ): ProviderResult { - return this.handleProvideDefinition(document, position, token); - } - - public provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - return this.handleProvideHover(document, position, token); - } - - public provideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken - ): ProviderResult { - return this.handleProvideReferences(document, position, context, token); - } - - public provideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - context: CompletionContext - ): ProviderResult { - return this.handleProvideCompletionItems(document, position, token, context); - } - - public provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { - return this.handleProvideCodeLenses(document, token); - } - - public provideDocumentSymbols( - document: TextDocument, - token: CancellationToken - ): ProviderResult { - return this.handleProvideDocumentSymbols(document, token); - } - - public provideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - context: SignatureHelpContext - ): ProviderResult { - return this.handleProvideSignatureHelp(document, position, token, context); - } - - protected async ensureLanguageServerFileIsAvailable( - resource: Resource, - fileName: string - ): Promise { - const settings = this.configurationService.getSettings(resource); - if (!settings.downloadLanguageServer) { - return; - } - const languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - const languageServerFolderPath = path.join(EXTENSION_ROOT_DIR, languageServerFolder); - const mscorlib = path.join(languageServerFolderPath, fileName); - if (!(await this.fs.fileExists(mscorlib))) { - await this.lsDownloader.downloadLanguageServer(languageServerFolderPath, resource); - } - return languageServerFolderPath; - } - - private getLanguageClient(): vscodeLanguageClient.LanguageClient | undefined { - const proxy = this.manager.languageProxy; - if (proxy) { - return proxy.languageClient; - } - } - - private async handleProvideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.RenameParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - newName - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.RenameRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asWorkspaceEdit(result); - } - } - } - - private async handleProvideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position) - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.DefinitionRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asDefinitionResult(result); - } - } - } - - private async handleProvideHover( - document: TextDocument, - position: Position, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position) - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.HoverRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asHover(result); - } - } - } - - private async handleProvideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.ReferenceParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position), - context - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.ReferencesRequest.type, args, token); - if (result) { - // Remove undefined part. - return result.map(l => { - const r = languageClient!.protocol2CodeConverter.asLocation(l); - return r!; - }); - } - } - } - - private async handleProvideCodeLenses( - document: TextDocument, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.CodeLensParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document) - }; - const result = await languageClient.sendRequest(vscodeLanguageClient.CodeLensRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asCodeLenses(result); - } - } - } - - private async handleProvideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - context: CompletionContext - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args = languageClient.code2ProtocolConverter.asCompletionParams(document, position, context); - const result = await languageClient.sendRequest(vscodeLanguageClient.CompletionRequest.type, args, token); - if (result) { - return languageClient.protocol2CodeConverter.asCompletionResult(result); - } - } - } - - private async handleProvideDocumentSymbols( - document: TextDocument, - token: CancellationToken - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.DocumentSymbolParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document) - }; - const result = await languageClient.sendRequest( - vscodeLanguageClient.DocumentSymbolRequest.type, - args, - token - ); - if (result && result.length) { - // tslint:disable-next-line: no-any - if ((result[0] as any).range) { - // Document symbols - const docSymbols = result as vscodeLanguageClient.DocumentSymbol[]; - return languageClient.protocol2CodeConverter.asDocumentSymbols(docSymbols); - } else { - // Document symbols - const symbols = result as vscodeLanguageClient.SymbolInformation[]; - return languageClient.protocol2CodeConverter.asSymbolInformations(symbols); - } - } - } - } - - private async handleProvideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - _context: SignatureHelpContext - ): Promise { - const languageClient = this.getLanguageClient(); - if (languageClient) { - const args: vscodeLanguageClient.TextDocumentPositionParams = { - textDocument: languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document), - position: languageClient.code2ProtocolConverter.asPosition(position) - }; - const result = await languageClient.sendRequest( - vscodeLanguageClient.SignatureHelpRequest.type, - args, - token - ); - if (result) { - return languageClient.protocol2CodeConverter.asSignatureHelp(result); - } - } - } -} diff --git a/src/client/activation/common/analysisOptions.ts b/src/client/activation/common/analysisOptions.ts new file mode 100644 index 000000000000..75d0aabef9d2 --- /dev/null +++ b/src/client/activation/common/analysisOptions.ts @@ -0,0 +1,111 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import { Disposable, Event, EventEmitter, WorkspaceFolder } from 'vscode'; +import { DocumentFilter, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient/node'; +import { IWorkspaceService } from '../../common/application/types'; + +import { PYTHON, PYTHON_LANGUAGE } from '../../common/constants'; +import { ILogOutputChannel, Resource } from '../../common/types'; +import { debounceSync } from '../../common/utils/decorators'; +import { IEnvironmentVariablesProvider } from '../../common/variables/types'; +import { traceDecoratorError } from '../../logging'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { ILanguageServerAnalysisOptions, ILanguageServerOutputChannel } from '../types'; + +export abstract class LanguageServerAnalysisOptionsBase implements ILanguageServerAnalysisOptions { + protected readonly didChange = new EventEmitter(); + private readonly output: ILogOutputChannel; + + protected constructor( + lsOutputChannel: ILanguageServerOutputChannel, + protected readonly workspace: IWorkspaceService, + ) { + this.output = lsOutputChannel.channel; + } + + public async initialize(_resource: Resource, _interpreter: PythonEnvironment | undefined) {} + + public get onDidChange(): Event { + return this.didChange.event; + } + + public dispose(): void { + this.didChange.dispose(); + } + + @traceDecoratorError('Failed to get analysis options') + public async getAnalysisOptions(): Promise { + const workspaceFolder = this.getWorkspaceFolder(); + const documentSelector = this.getDocumentFilters(workspaceFolder); + + return { + documentSelector, + workspaceFolder, + synchronize: { + configurationSection: this.getConfigSectionsToSynchronize(), + }, + outputChannel: this.output, + revealOutputChannelOn: RevealOutputChannelOn.Never, + initializationOptions: await this.getInitializationOptions(), + }; + } + + protected getWorkspaceFolder(): WorkspaceFolder | undefined { + return undefined; + } + + protected getDocumentFilters(_workspaceFolder?: WorkspaceFolder): DocumentFilter[] { + return this.workspace.isVirtualWorkspace ? [{ language: PYTHON_LANGUAGE }] : PYTHON; + } + + protected getConfigSectionsToSynchronize(): string[] { + return [PYTHON_LANGUAGE]; + } + + protected async getInitializationOptions(): Promise { + return undefined; + } +} + +export abstract class LanguageServerAnalysisOptionsWithEnv extends LanguageServerAnalysisOptionsBase { + protected disposables: Disposable[] = []; + private envPythonPath: string = ''; + + protected constructor( + private readonly envVarsProvider: IEnvironmentVariablesProvider, + lsOutputChannel: ILanguageServerOutputChannel, + workspace: IWorkspaceService, + ) { + super(lsOutputChannel, workspace); + } + + public async initialize(_resource: Resource, _interpreter: PythonEnvironment | undefined) { + const disposable = this.envVarsProvider.onDidEnvironmentVariablesChange(this.onEnvVarChange, this); + this.disposables.push(disposable); + } + + public dispose(): void { + super.dispose(); + this.disposables.forEach((d) => d.dispose()); + } + + protected async getEnvPythonPath(): Promise { + const vars = await this.envVarsProvider.getEnvironmentVariables(); + this.envPythonPath = vars.PYTHONPATH || ''; + return this.envPythonPath; + } + + @debounceSync(1000) + protected onEnvVarChange(): void { + this.notifyifEnvPythonPathChanged().ignoreErrors(); + } + + protected async notifyifEnvPythonPathChanged(): Promise { + const vars = await this.envVarsProvider.getEnvironmentVariables(); + const envPythonPath = vars.PYTHONPATH || ''; + + if (this.envPythonPath !== envPythonPath) { + this.didChange.fire(); + } + } +} diff --git a/src/client/activation/common/cancellationUtils.ts b/src/client/activation/common/cancellationUtils.ts new file mode 100644 index 000000000000..d14307174107 --- /dev/null +++ b/src/client/activation/common/cancellationUtils.ts @@ -0,0 +1,100 @@ +/* eslint-disable max-classes-per-file */ +/* + * cancellationUtils.ts + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT license. + * + * Helper methods around cancellation + */ + +import { randomBytes } from 'crypto'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { + CancellationReceiverStrategy, + CancellationSenderStrategy, + CancellationStrategy, + Disposable, + MessageConnection, +} from 'vscode-languageclient/node'; + +type CancellationId = string | number; + +function getCancellationFolderPath(folderName: string) { + return path.join(os.tmpdir(), 'python-languageserver-cancellation', folderName); +} + +function getCancellationFilePath(folderName: string, id: CancellationId) { + return path.join(getCancellationFolderPath(folderName), `cancellation-${String(id)}.tmp`); +} + +function tryRun(callback: () => void) { + try { + callback(); + } catch (e) { + // No body. + } +} + +class FileCancellationSenderStrategy implements CancellationSenderStrategy { + constructor(readonly folderName: string) { + const folder = getCancellationFolderPath(folderName)!; + tryRun(() => fs.mkdirSync(folder, { recursive: true })); + } + + public async sendCancellation(_: MessageConnection, id: CancellationId) { + const file = getCancellationFilePath(this.folderName, id); + tryRun(() => fs.writeFileSync(file, '', { flag: 'w' })); + } + + public cleanup(id: CancellationId): void { + tryRun(() => fs.unlinkSync(getCancellationFilePath(this.folderName, id))); + } + + public dispose(): void { + const folder = getCancellationFolderPath(this.folderName); + tryRun(() => rimraf(folder)); + + function rimraf(location: string) { + const stat = fs.lstatSync(location); + if (stat) { + if (stat.isDirectory() && !stat.isSymbolicLink()) { + for (const dir of fs.readdirSync(location)) { + rimraf(path.join(location, dir)); + } + + fs.rmdirSync(location); + } else { + fs.unlinkSync(location); + } + } + } + } +} + +export class FileBasedCancellationStrategy implements CancellationStrategy, Disposable { + private _sender: FileCancellationSenderStrategy; + + constructor() { + const folderName = randomBytes(21).toString('hex'); + this._sender = new FileCancellationSenderStrategy(folderName); + } + + // eslint-disable-next-line class-methods-use-this + get receiver(): CancellationReceiverStrategy { + return CancellationReceiverStrategy.Message; + } + + get sender(): CancellationSenderStrategy { + return this._sender; + } + + public getCommandLineArguments(): string[] { + return [`--cancellationReceive=file:${this._sender.folderName}`]; + } + + public dispose(): void { + this._sender.dispose(); + } +} diff --git a/src/client/activation/common/defaultlanguageServer.ts b/src/client/activation/common/defaultlanguageServer.ts new file mode 100644 index 000000000000..dc40a2c0ed5b --- /dev/null +++ b/src/client/activation/common/defaultlanguageServer.ts @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { injectable } from 'inversify'; +import { PYLANCE_EXTENSION_ID } from '../../common/constants'; +import { IDefaultLanguageServer, IExtensions, DefaultLSType } from '../../common/types'; +import { IServiceManager } from '../../ioc/types'; +import { LanguageServerType } from '../types'; + +@injectable() +class DefaultLanguageServer implements IDefaultLanguageServer { + public readonly defaultLSType: DefaultLSType; + + constructor(defaultServer: DefaultLSType) { + this.defaultLSType = defaultServer; + } +} + +export async function setDefaultLanguageServer( + extensions: IExtensions, + serviceManager: IServiceManager, +): Promise { + const lsType = await getDefaultLanguageServer(extensions); + serviceManager.addSingletonInstance( + IDefaultLanguageServer, + new DefaultLanguageServer(lsType), + ); +} + +async function getDefaultLanguageServer(extensions: IExtensions): Promise { + if (extensions.getExtension(PYLANCE_EXTENSION_ID)) { + return LanguageServerType.Node; + } + + return LanguageServerType.Jedi; +} diff --git a/src/client/activation/common/downloadChannelRules.ts b/src/client/activation/common/downloadChannelRules.ts deleted file mode 100644 index ebffee922377..000000000000 --- a/src/client/activation/common/downloadChannelRules.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IPersistentStateFactory } from '../../common/types'; -import { IServiceContainer } from '../../ioc/types'; -import { FolderVersionPair, IDownloadChannelRule } from '../types'; - -const lastCheckedForLSDateTimeCacheKey = 'LS.LAST.CHECK.TIME'; -const frequencyForBetalLSDownloadCheck = 1000 * 60 * 60 * 24; // One day. - -@injectable() -export class DownloadDailyChannelRule implements IDownloadChannelRule { - public async shouldLookForNewLanguageServer(_currentFolder?: FolderVersionPair): Promise { - return true; - } -} -@injectable() -export class DownloadStableChannelRule implements IDownloadChannelRule { - public async shouldLookForNewLanguageServer(currentFolder?: FolderVersionPair): Promise { - return currentFolder ? false : true; - } -} -@injectable() -export class DownloadBetaChannelRule implements IDownloadChannelRule { - constructor(@inject(IServiceContainer) private readonly serviceContainer: IServiceContainer) {} - public async shouldLookForNewLanguageServer(currentFolder?: FolderVersionPair): Promise { - // For beta, we do this only once a day. - const stateFactory = this.serviceContainer.get(IPersistentStateFactory); - const globalState = stateFactory.createGlobalPersistentState( - lastCheckedForLSDateTimeCacheKey, - true, - frequencyForBetalLSDownloadCheck - ); - - // If we have checked it in the last 24 hours, then ensure we don't do it again. - if (globalState.value) { - await globalState.updateValue(false); - return true; - } - - return !currentFolder || globalState.value; - } -} diff --git a/src/client/activation/common/downloader.ts b/src/client/activation/common/downloader.ts deleted file mode 100644 index c029da7b14ed..000000000000 --- a/src/client/activation/common/downloader.ts +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import * as path from 'path'; -import { ProgressLocation, window } from 'vscode'; -import { IApplicationShell, IWorkspaceService } from '../../common/application/types'; -import '../../common/extensions'; -import { IFileSystem } from '../../common/platform/types'; -import { IFileDownloader, IOutputChannel, Resource } from '../../common/types'; -import { createDeferred } from '../../common/utils/async'; -import { Common, LanguageService } from '../../common/utils/localize'; -import { StopWatch } from '../../common/utils/stopWatch'; -import { IServiceContainer } from '../../ioc/types'; -import { sendTelemetryEvent } from '../../telemetry'; -import { EventName } from '../../telemetry/constants'; -import { - ILanguageServerDownloader, - ILanguageServerFolderService, - ILanguageServerOutputChannel, - IPlatformData -} from '../types'; - -// tslint:disable:no-require-imports no-any - -const downloadFileExtension = '.nupkg'; - -@injectable() -export class LanguageServerDownloader implements ILanguageServerDownloader { - private output: IOutputChannel; - constructor( - @inject(ILanguageServerOutputChannel) private readonly lsOutputChannel: ILanguageServerOutputChannel, - @inject(IFileDownloader) private readonly fileDownloader: IFileDownloader, - @inject(ILanguageServerFolderService) private readonly lsFolderService: ILanguageServerFolderService, - @inject(IApplicationShell) private readonly appShell: IApplicationShell, - @inject(IFileSystem) private readonly fs: IFileSystem, - @inject(IWorkspaceService) private readonly workspace: IWorkspaceService, - @inject(IServiceContainer) private readonly services: IServiceContainer - ) { - this.output = this.lsOutputChannel.channel; - } - - public async getDownloadInfo(resource: Resource) { - const info = await this.lsFolderService.getLatestLanguageServerVersion(resource).then(item => item!); - - let uri = info.uri; - if (uri.startsWith('https:')) { - const cfg = this.workspace.getConfiguration('http', resource); - if (!cfg.get('proxyStrictSSL', true)) { - // tslint:disable-next-line:no-http-string - uri = uri.replace(/^https:/, 'http:'); - } - } - - return [uri, info.version.raw]; - } - - public async downloadLanguageServer(destinationFolder: string, resource: Resource): Promise { - const [downloadUri, lsVersion] = await this.getDownloadInfo(resource); - const timer: StopWatch = new StopWatch(); - let success: boolean = true; - let localTempFilePath = ''; - - try { - localTempFilePath = await this.downloadFile( - downloadUri, - 'Downloading Microsoft Python Language Server... ' - ); - } catch (err) { - this.output.appendLine(LanguageService.downloadFailedOutputMessage()); - this.output.appendLine(err); - success = false; - this.showMessageAndOptionallyShowOutput(LanguageService.lsFailedToDownload()).ignoreErrors(); - sendTelemetryEvent( - EventName.PYTHON_LANGUAGE_SERVER_ERROR, - undefined, - { error: 'Failed to download (platform)' }, - err - ); - throw new Error(err); - } finally { - const usedSSL = downloadUri.startsWith('https:'); - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_DOWNLOADED, timer.elapsedTime, { - success, - lsVersion, - usedSSL - }); - } - - timer.reset(); - try { - await this.unpackArchive(destinationFolder, localTempFilePath); - } catch (err) { - this.output.appendLine(LanguageService.extractionFailedOutputMessage()); - this.output.appendLine(err); - success = false; - this.showMessageAndOptionallyShowOutput(LanguageService.lsFailedToExtract()).ignoreErrors(); - sendTelemetryEvent( - EventName.PYTHON_LANGUAGE_SERVER_ERROR, - undefined, - { error: 'Failed to extract (platform)' }, - err - ); - throw new Error(err); - } finally { - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_EXTRACTED, timer.elapsedTime, { success, lsVersion }); - await this.fs.deleteFile(localTempFilePath); - } - } - - public async showMessageAndOptionallyShowOutput(message: string) { - const selection = await this.appShell.showErrorMessage(message, Common.openOutputPanel()); - if (selection !== Common.openOutputPanel()) { - return; - } - this.output.show(true); - } - - public async downloadFile(uri: string, title: string): Promise { - const downloadOptions = { - extension: downloadFileExtension, - outputChannel: this.output, - progressMessagePrefix: title - }; - return this.fileDownloader.downloadFile(uri, downloadOptions).then(file => { - this.output.appendLine(LanguageService.extractionCompletedOutputMessage()); - return file; - }); - } - - protected async unpackArchive(destinationFolder: string, tempFilePath: string): Promise { - this.output.append('Unpacking archive... '); - - const deferred = createDeferred(); - - const title = 'Extracting files... '; - await window.withProgress( - { - location: ProgressLocation.Window - }, - progress => { - // tslint:disable-next-line:no-require-imports no-var-requires - const StreamZip = require('node-stream-zip'); - const zip = new StreamZip({ - file: tempFilePath, - storeEntries: true - }); - - let totalFiles = 0; - let extractedFiles = 0; - zip.on('ready', async () => { - totalFiles = zip.entriesCount; - if (!(await this.fs.directoryExists(destinationFolder))) { - await this.fs.createDirectory(destinationFolder); - } - zip.extract(null, destinationFolder, (err: any) => { - if (err) { - deferred.reject(err); - } else { - deferred.resolve(); - } - zip.close(); - }); - }) - .on('extract', () => { - extractedFiles += 1; - progress.report({ message: `${title}${Math.round((100 * extractedFiles) / totalFiles)}%` }); - }) - .on('error', (e: any) => { - deferred.reject(e); - }); - return deferred.promise; - } - ); - - // Set file to executable (nothing happens in Windows, as chmod has no definition there) - if (this.services) { - try { - const platformData = this.services.get(IPlatformData); - const executablePath = path.join(destinationFolder, platformData.engineExecutableName); - await this.fs.chmod(executablePath, '0764'); // -rwxrw-r-- - // tslint:disable-next-line: no-empty - } catch {} - } - - this.output.appendLine(LanguageService.extractionDoneOutputMessage()); - } -} diff --git a/src/client/activation/common/languageServerChangeHandler.ts b/src/client/activation/common/languageServerChangeHandler.ts new file mode 100644 index 000000000000..83ff204ed6e7 --- /dev/null +++ b/src/client/activation/common/languageServerChangeHandler.ts @@ -0,0 +1,112 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { ConfigurationTarget, Disposable } from 'vscode'; +import { IApplicationShell, ICommandManager, IWorkspaceService } from '../../common/application/types'; +import { PYLANCE_EXTENSION_ID } from '../../common/constants'; +import { IConfigurationService, IExtensions } from '../../common/types'; +import { createDeferred } from '../../common/utils/async'; +import { Pylance } from '../../common/utils/localize'; +import { LanguageServerType } from '../types'; + +export async function promptForPylanceInstall( + appShell: IApplicationShell, + commandManager: ICommandManager, + workspace: IWorkspaceService, + configService: IConfigurationService, +): Promise { + const response = await appShell.showWarningMessage( + Pylance.pylanceRevertToJediPrompt, + Pylance.pylanceInstallPylance, + Pylance.pylanceRevertToJedi, + Pylance.remindMeLater, + ); + + if (response === Pylance.pylanceInstallPylance) { + commandManager.executeCommand('extension.open', PYLANCE_EXTENSION_ID); + } else if (response === Pylance.pylanceRevertToJedi) { + const inspection = workspace.getConfiguration('python').inspect('languageServer'); + + let target: ConfigurationTarget | undefined; + if (inspection?.workspaceValue) { + target = ConfigurationTarget.Workspace; + } else if (inspection?.globalValue) { + target = ConfigurationTarget.Global; + } + + if (target) { + await configService.updateSetting('languageServer', LanguageServerType.Jedi, undefined, target); + } + } +} + +// Tracks language server type and issues appropriate reload or install prompts. +export class LanguageServerChangeHandler implements Disposable { + // For tests that need to track Pylance install completion. + private readonly pylanceInstallCompletedDeferred = createDeferred(); + + private readonly disposables: Disposable[] = []; + + private pylanceInstalled = false; + + constructor( + private currentLsType: LanguageServerType | undefined, + private readonly extensions: IExtensions, + private readonly appShell: IApplicationShell, + private readonly commands: ICommandManager, + private readonly workspace: IWorkspaceService, + private readonly configService: IConfigurationService, + ) { + this.pylanceInstalled = this.isPylanceInstalled(); + this.disposables.push( + extensions.onDidChange(async () => { + await this.extensionsChangeHandler(); + }), + ); + } + + public dispose(): void { + while (this.disposables.length) { + this.disposables.pop()?.dispose(); + } + } + + // For tests that need to track Pylance install completion. + get pylanceInstallCompleted(): Promise { + return this.pylanceInstallCompletedDeferred.promise; + } + + public async handleLanguageServerChange(lsType: LanguageServerType | undefined): Promise { + if (this.currentLsType === lsType || lsType === LanguageServerType.Microsoft) { + return; + } + // VS Code has to be reloaded when language server type changes. In case of Pylance + // it also has to be installed manually by the user. We avoid prompting to reload + // if target changes to Pylance when Pylance is not installed since otherwise user + // may get one reload prompt now and then another when Pylance is finally installed. + // Instead, check the installation and suppress prompt if Pylance is not there. + // Extensions change event handler will then show its own prompt. + if (lsType === LanguageServerType.Node && !this.isPylanceInstalled()) { + // If not installed, point user to Pylance at the store. + await promptForPylanceInstall(this.appShell, this.commands, this.workspace, this.configService); + // At this point Pylance is not yet installed. Skip reload prompt + // since we are going to show it when Pylance becomes available. + } + + this.currentLsType = lsType; + } + + private async extensionsChangeHandler(): Promise { + // Track Pylance extension installation state and prompt to reload when it becomes available. + const oldInstallState = this.pylanceInstalled; + + this.pylanceInstalled = this.isPylanceInstalled(); + if (oldInstallState === this.pylanceInstalled) { + this.pylanceInstallCompletedDeferred.resolve(); + } + } + + private isPylanceInstalled(): boolean { + return !!this.extensions.getExtension(PYLANCE_EXTENSION_ID); + } +} diff --git a/src/client/activation/common/languageServerFolderService.ts b/src/client/activation/common/languageServerFolderService.ts deleted file mode 100644 index a04fe1c5323c..000000000000 --- a/src/client/activation/common/languageServerFolderService.ts +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable, unmanaged } from 'inversify'; -import * as path from 'path'; -import * as semver from 'semver'; -import { EXTENSION_ROOT_DIR } from '../../common/constants'; -import { traceDecorators } from '../../common/logger'; -import { NugetPackage } from '../../common/nuget/types'; -import { IFileSystem } from '../../common/platform/types'; -import { IConfigurationService, Resource } from '../../common/types'; -import { IServiceContainer } from '../../ioc/types'; -import { - FolderVersionPair, - IDownloadChannelRule, - ILanguageServerFolderService, - ILanguageServerPackageService -} from '../types'; - -@injectable() -export abstract class LanguageServerFolderService implements ILanguageServerFolderService { - constructor( - @inject(IServiceContainer) protected readonly serviceContainer: IServiceContainer, - @unmanaged() protected readonly languageServerFolder: string - ) {} - - @traceDecorators.verbose('Get language server folder name') - public async getLanguageServerFolderName(resource: Resource): Promise { - const currentFolder = await this.getCurrentLanguageServerDirectory(); - let serverVersion: NugetPackage | undefined; - - const shouldLookForNewVersion = await this.shouldLookForNewLanguageServer(currentFolder); - if (currentFolder && !shouldLookForNewVersion) { - return path.basename(currentFolder.path); - } - - try { - serverVersion = await this.getLatestLanguageServerVersion(resource); - } catch { - serverVersion = undefined; - } - - if (currentFolder && (!serverVersion || serverVersion.version.compare(currentFolder.version) <= 0)) { - return path.basename(currentFolder.path); - } - - return `${this.languageServerFolder}.${serverVersion!.version.raw}`; - } - - @traceDecorators.verbose('Get latest version of Language Server') - public getLatestLanguageServerVersion(resource: Resource): Promise { - const minVersion = this.getMinimalLanguageServerVersion(); - const lsPackageService = this.serviceContainer.get( - ILanguageServerPackageService - ); - return lsPackageService.getLatestNugetPackageVersion(resource, minVersion); - } - - public async shouldLookForNewLanguageServer(currentFolder?: FolderVersionPair): Promise { - const configService = this.serviceContainer.get(IConfigurationService); - const autoUpdateLanguageServer = configService.getSettings().autoUpdateLanguageServer; - const downloadLanguageServer = configService.getSettings().downloadLanguageServer; - if (currentFolder && (!autoUpdateLanguageServer || !downloadLanguageServer)) { - return false; - } - const downloadChannel = this.getDownloadChannel(); - const rule = this.serviceContainer.get(IDownloadChannelRule, downloadChannel); - return rule.shouldLookForNewLanguageServer(currentFolder); - } - - public async getCurrentLanguageServerDirectory(): Promise { - const configService = this.serviceContainer.get(IConfigurationService); - if (!configService.getSettings().downloadLanguageServer) { - return { path: this.languageServerFolder, version: new semver.SemVer('0.0.0') }; - } - const dirs = await this.getExistingLanguageServerDirectories(); - if (dirs.length === 0) { - return; - } - dirs.sort((a, b) => a.version.compare(b.version)); - return dirs[dirs.length - 1]; - } - - public async getExistingLanguageServerDirectories(): Promise { - const fs = this.serviceContainer.get(IFileSystem); - const subDirs = await fs.getSubDirectories(EXTENSION_ROOT_DIR); - return subDirs - .filter(dir => path.basename(dir).startsWith(this.languageServerFolder)) - .map(dir => { - return { path: dir, version: this.getFolderVersion(path.basename(dir)) }; - }); - } - - public getFolderVersion(dirName: string): semver.SemVer { - const suffix = dirName.substring(this.languageServerFolder.length + 1); - return suffix.length === 0 - ? new semver.SemVer('0.0.0') - : semver.parse(suffix, true) || new semver.SemVer('0.0.0'); - } - - protected abstract getMinimalLanguageServerVersion(): string; - - private getDownloadChannel() { - const lsPackageService = this.serviceContainer.get( - ILanguageServerPackageService - ); - return lsPackageService.getLanguageServerDownloadChannel(); - } -} diff --git a/src/client/activation/common/languageServerPackageService.ts b/src/client/activation/common/languageServerPackageService.ts deleted file mode 100644 index 10b60cf40f39..000000000000 --- a/src/client/activation/common/languageServerPackageService.ts +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { injectable } from 'inversify'; -import { parse, SemVer } from 'semver'; -import { IApplicationEnvironment } from '../../common/application/types'; -import { PVSC_EXTENSION_ID } from '../../common/constants'; -import { traceDecorators, traceVerbose } from '../../common/logger'; -import { INugetRepository, INugetService, NugetPackage } from '../../common/nuget/types'; -import { IPlatformService } from '../../common/platform/types'; -import { IConfigurationService, IExtensions, LanguageServerDownloadChannels, Resource } from '../../common/types'; -import { IServiceContainer } from '../../ioc/types'; -import { ILanguageServerPackageService } from '../types'; -import { azureCDNBlobStorageAccount, LanguageServerDownloadChannel } from './packageRepository'; - -export const maxMajorVersion = 0; - -@injectable() -export abstract class LanguageServerPackageService implements ILanguageServerPackageService { - public maxMajorVersion: number = maxMajorVersion; - constructor( - protected readonly serviceContainer: IServiceContainer, - protected readonly appEnv: IApplicationEnvironment, - protected readonly platform: IPlatformService - ) {} - - public abstract getNugetPackageName(): string; - - @traceDecorators.verbose('Get latest language server nuget package version') - public async getLatestNugetPackageVersion(resource: Resource, minVersion?: string): Promise { - const downloadChannel = this.getLanguageServerDownloadChannel(); - const nugetRepo = this.serviceContainer.get(INugetRepository, downloadChannel); - const packageName = this.getNugetPackageName(); - traceVerbose(`Listing packages for ${downloadChannel} for ${packageName}`); - const packages = await nugetRepo.getPackages(packageName, resource); - - return this.getValidPackage(packages, minVersion); - } - - public getLanguageServerDownloadChannel(): LanguageServerDownloadChannels { - const configService = this.serviceContainer.get(IConfigurationService); - const settings = configService.getSettings(); - if (settings.analysis.downloadChannel) { - return settings.analysis.downloadChannel; - } - - if (settings.insidersChannel === 'daily' || settings.insidersChannel === 'weekly') { - return 'beta'; - } - const isAlphaVersion = this.isAlphaVersionOfExtension(); - return isAlphaVersion ? 'beta' : 'stable'; - } - - public isAlphaVersionOfExtension() { - const extensions = this.serviceContainer.get(IExtensions); - const extension = extensions.getExtension(PVSC_EXTENSION_ID)!; - const version = parse(extension.packageJSON.version)!; - return version.prerelease.length > 0 && version.prerelease[0] === 'alpha'; - } - - protected getValidPackage(packages: NugetPackage[], minimumVersion?: string): NugetPackage { - const nugetService = this.serviceContainer.get(INugetService); - const validPackages = packages - .filter(item => item.version.major === this.maxMajorVersion) - .filter(item => nugetService.isReleaseVersion(item.version)) - .sort((a, b) => a.version.compare(b.version)); - - const pkg = validPackages[validPackages.length - 1]; - minimumVersion = minimumVersion || '0.0.0'; - if (pkg.version.compare(minimumVersion) >= 0) { - return validPackages[validPackages.length - 1]; - } - - // This is a fall back, if the wrong version is returned, e.g. version is cached downstream in some proxy server or similar. - // This way, we always ensure we have the minimum version that's compatible. - return { - version: new SemVer(minimumVersion), - package: LanguageServerDownloadChannel.stable, - uri: `${azureCDNBlobStorageAccount}/${ - LanguageServerDownloadChannel.stable - }/${this.getNugetPackageName()}.${minimumVersion}.nupkg` - }; - } -} diff --git a/src/client/activation/common/loadLanguageServerExtension.ts b/src/client/activation/common/loadLanguageServerExtension.ts new file mode 100644 index 000000000000..87fa5d9e6213 --- /dev/null +++ b/src/client/activation/common/loadLanguageServerExtension.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { inject, injectable } from 'inversify'; +import { ICommandManager } from '../../common/application/types'; +import { IDisposableRegistry } from '../../common/types'; +import { IExtensionSingleActivationService } from '../types'; + +// This command is currently used by IntelliCode. This was used to +// trigger MPLS. Since we no longer have MPLS we are going to set +// this command to no-op temporarily until this is removed from +// IntelliCode + +@injectable() +export class LoadLanguageServerExtension implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: true, virtualWorkspace: true }; + + constructor( + @inject(ICommandManager) private readonly commandManager: ICommandManager, + @inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry, + ) {} + + public activate(): Promise { + const disposable = this.commandManager.registerCommand('python._loadLanguageServerExtension', () => { + /** no-op */ + }); + this.disposables.push(disposable); + return Promise.resolve(); + } +} diff --git a/src/client/activation/common/outputChannel.ts b/src/client/activation/common/outputChannel.ts new file mode 100644 index 000000000000..60a99687793e --- /dev/null +++ b/src/client/activation/common/outputChannel.ts @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { inject, injectable } from 'inversify'; +import { IApplicationShell, ICommandManager } from '../../common/application/types'; +import '../../common/extensions'; +import { IDisposableRegistry, ILogOutputChannel } from '../../common/types'; +import { OutputChannelNames } from '../../common/utils/localize'; +import { ILanguageServerOutputChannel } from '../types'; + +@injectable() +export class LanguageServerOutputChannel implements ILanguageServerOutputChannel { + public output: ILogOutputChannel | undefined; + + private registered = false; + + constructor( + @inject(IApplicationShell) private readonly appShell: IApplicationShell, + @inject(ICommandManager) private readonly commandManager: ICommandManager, + @inject(IDisposableRegistry) private readonly disposable: IDisposableRegistry, + ) {} + + public get channel(): ILogOutputChannel { + if (!this.output) { + this.output = this.appShell.createOutputChannel(OutputChannelNames.languageServer); + this.disposable.push(this.output); + this.registerCommand().ignoreErrors(); + } + return this.output; + } + + private async registerCommand() { + if (this.registered) { + return; + } + this.registered = true; + // This controls the visibility of the command used to display the LS Output panel. + // We don't want to display it when Jedi is used instead of LS. + await this.commandManager.executeCommand('setContext', 'python.hasLanguageServerOutputChannel', true); + this.disposable.push( + this.commandManager.registerCommand('python.viewLanguageServerOutput', () => this.output?.show(true)), + ); + this.disposable.push({ + dispose: () => { + this.registered = false; + }, + }); + } +} diff --git a/src/client/activation/common/packageRepository.ts b/src/client/activation/common/packageRepository.ts deleted file mode 100644 index ba073d7b1808..000000000000 --- a/src/client/activation/common/packageRepository.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { injectable } from 'inversify'; -import { AzureBlobStoreNugetRepository } from '../../common/nuget/azureBlobStoreNugetRepository'; -import { IServiceContainer } from '../../ioc/types'; - -export const azureBlobStorageAccount = 'https://pvsc.blob.core.windows.net'; -export const azureCDNBlobStorageAccount = 'https://pvsc.azureedge.net'; - -export enum LanguageServerDownloadChannel { - stable = 'stable', - beta = 'beta', - daily = 'daily' -} - -@injectable() -export abstract class StableLanguageServerPackageRepository extends AzureBlobStoreNugetRepository { - constructor(serviceContainer: IServiceContainer, packageName: string) { - super( - serviceContainer, - azureBlobStorageAccount, - `${packageName}-${LanguageServerDownloadChannel.stable}`, - azureCDNBlobStorageAccount - ); - } -} - -@injectable() -export abstract class BetaLanguageServerPackageRepository extends AzureBlobStoreNugetRepository { - constructor(serviceContainer: IServiceContainer, packageName: string) { - super( - serviceContainer, - azureBlobStorageAccount, - `${packageName}-${LanguageServerDownloadChannel.beta}`, - azureCDNBlobStorageAccount - ); - } -} - -@injectable() -export abstract class DailyLanguageServerPackageRepository extends AzureBlobStoreNugetRepository { - constructor(serviceContainer: IServiceContainer, packageName: string) { - super( - serviceContainer, - azureBlobStorageAccount, - `${packageName}-${LanguageServerDownloadChannel.daily}`, - azureCDNBlobStorageAccount - ); - } -} diff --git a/src/client/activation/extensionSurvey.ts b/src/client/activation/extensionSurvey.ts index 67ec7e68e9d6..d32ba7180c0f 100644 --- a/src/client/activation/extensionSurvey.ts +++ b/src/client/activation/extensionSurvey.ts @@ -3,15 +3,16 @@ 'use strict'; -import { inject, injectable, optional } from 'inversify'; +import { inject, injectable } from 'inversify'; import * as querystring from 'querystring'; -import { IApplicationEnvironment, IApplicationShell } from '../common/application/types'; -import { ShowExtensionSurveyPrompt } from '../common/experimentGroups'; +import { env, UIKind } from 'vscode'; +import { IApplicationEnvironment, IApplicationShell, IWorkspaceService } from '../common/application/types'; +import { ShowExtensionSurveyPrompt } from '../common/experiments/groups'; import '../common/extensions'; -import { traceDecorators } from '../common/logger'; import { IPlatformService } from '../common/platform/types'; -import { IBrowserService, IExperimentsManager, IPersistentStateFactory, IRandom } from '../common/types'; -import { Common, ExtensionSurveyBanner, LanguageService } from '../common/utils/localize'; +import { IBrowserService, IExperimentService, IPersistentStateFactory, IRandom } from '../common/types'; +import { Common, ExtensionSurveyBanner } from '../common/utils/localize'; +import { traceDecoratorError } from '../logging'; import { sendTelemetryEvent } from '../telemetry'; import { EventName } from '../telemetry/constants'; import { IExtensionSingleActivationService } from './types'; @@ -19,7 +20,7 @@ import { IExtensionSingleActivationService } from './types'; // persistent state names, exported to make use of in testing export enum extensionSurveyStateKeys { doNotShowAgain = 'doNotShowExtensionSurveyAgain', - disableSurveyForTime = 'doNotShowExtensionSurveyUntilTime' + disableSurveyForTime = 'doNotShowExtensionSurveyUntilTime', } const timeToDisableSurveyFor = 1000 * 60 * 60 * 24 * 7 * 12; // 12 weeks @@ -27,21 +28,22 @@ const WAIT_TIME_TO_SHOW_SURVEY = 1000 * 60 * 60 * 3; // 3 hours @injectable() export class ExtensionSurveyPrompt implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: false, virtualWorkspace: true }; constructor( @inject(IApplicationShell) private appShell: IApplicationShell, @inject(IBrowserService) private browserService: IBrowserService, @inject(IPersistentStateFactory) private persistentState: IPersistentStateFactory, @inject(IRandom) private random: IRandom, - @inject(IExperimentsManager) private experiments: IExperimentsManager, + @inject(IExperimentService) private experiments: IExperimentService, @inject(IApplicationEnvironment) private appEnvironment: IApplicationEnvironment, @inject(IPlatformService) private platformService: IPlatformService, - @optional() private sampleSizePerOneHundredUsers: number = 10, - @optional() private waitTimeToShowSurvey: number = WAIT_TIME_TO_SHOW_SURVEY + @inject(IWorkspaceService) private readonly workspace: IWorkspaceService, + private sampleSizePerOneHundredUsers: number = 10, + private waitTimeToShowSurvey: number = WAIT_TIME_TO_SHOW_SURVEY, ) {} public async activate(): Promise { - if (!this.experiments.inExperiment(ShowExtensionSurveyPrompt.enabled)) { - this.experiments.sendTelemetryIfInExperiment(ShowExtensionSurveyPrompt.control); + if (!(await this.experiments.inExperiment(ShowExtensionSurveyPrompt.experiment))) { return; } const show = this.shouldShowBanner(); @@ -51,11 +53,26 @@ export class ExtensionSurveyPrompt implements IExtensionSingleActivationService setTimeout(() => this.showSurvey().ignoreErrors(), this.waitTimeToShowSurvey); } - @traceDecorators.error('Failed to check whether to display prompt for extension survey') + @traceDecoratorError('Failed to check whether to display prompt for extension survey') public shouldShowBanner(): boolean { + if (env.uiKind === UIKind?.Web) { + return false; + } + + let feedbackEnabled = true; + + const telemetryConfig = this.workspace.getConfiguration('telemetry'); + if (telemetryConfig) { + feedbackEnabled = telemetryConfig.get('feedback.enabled', true); + } + + if (!feedbackEnabled) { + return false; + } + const doNotShowSurveyAgain = this.persistentState.createGlobalPersistentState( extensionSurveyStateKeys.doNotShowAgain, - false + false, ); if (doNotShowSurveyAgain.value) { return false; @@ -63,7 +80,7 @@ export class ExtensionSurveyPrompt implements IExtensionSingleActivationService const isSurveyDisabledForTimeState = this.persistentState.createGlobalPersistentState( extensionSurveyStateKeys.disableSurveyForTime, false, - timeToDisableSurveyFor + timeToDisableSurveyFor, ); if (isSurveyDisabledForTimeState.value) { return false; @@ -76,32 +93,32 @@ export class ExtensionSurveyPrompt implements IExtensionSingleActivationService return true; } - @traceDecorators.error('Failed to display prompt for extension survey') + @traceDecoratorError('Failed to display prompt for extension survey') public async showSurvey() { - const prompts = [LanguageService.bannerLabelYes(), ExtensionSurveyBanner.maybeLater(), Common.doNotShowAgain()]; - const telemetrySelections: ['Yes', 'Maybe later', 'Do not show again'] = [ + const prompts = [ExtensionSurveyBanner.bannerLabelYes, ExtensionSurveyBanner.maybeLater, Common.doNotShowAgain]; + const telemetrySelections: ['Yes', 'Maybe later', "Don't show again"] = [ 'Yes', 'Maybe later', - 'Do not show again' + "Don't show again", ]; - const selection = await this.appShell.showInformationMessage(ExtensionSurveyBanner.bannerMessage(), ...prompts); + const selection = await this.appShell.showInformationMessage(ExtensionSurveyBanner.bannerMessage, ...prompts); sendTelemetryEvent(EventName.EXTENSION_SURVEY_PROMPT, undefined, { - selection: selection ? telemetrySelections[prompts.indexOf(selection)] : undefined + selection: selection ? telemetrySelections[prompts.indexOf(selection)] : undefined, }); if (!selection) { return; } - if (selection === LanguageService.bannerLabelYes()) { + if (selection === ExtensionSurveyBanner.bannerLabelYes) { this.launchSurvey(); // Disable survey for a few weeks await this.persistentState .createGlobalPersistentState( extensionSurveyStateKeys.disableSurveyForTime, false, - timeToDisableSurveyFor + timeToDisableSurveyFor, ) .updateValue(true); - } else if (selection === Common.doNotShowAgain()) { + } else if (selection === Common.doNotShowAgain) { // Never show the survey again await this.persistentState .createGlobalPersistentState(extensionSurveyStateKeys.doNotShowAgain, false) @@ -114,7 +131,7 @@ export class ExtensionSurveyPrompt implements IExtensionSingleActivationService o: encodeURIComponent(this.platformService.osType), // platform v: encodeURIComponent(this.appEnvironment.vscodeVersion), e: encodeURIComponent(this.appEnvironment.packageJson.version), // extension version - m: encodeURIComponent(this.appEnvironment.machineId) + m: encodeURIComponent(this.appEnvironment.sessionId), }); const url = `https://aka.ms/AA5rjx5?${query}`; this.browserService.launch(url); diff --git a/src/client/activation/jedi.ts b/src/client/activation/jedi.ts deleted file mode 100644 index 58e123ca64da..000000000000 --- a/src/client/activation/jedi.ts +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { inject, injectable } from 'inversify'; -import { - CancellationToken, - CodeLens, - commands, - CompletionContext, - CompletionItem, - CompletionList, - DocumentFilter, - DocumentSymbol, - Event, - Hover, - languages, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - WorkspaceEdit -} from 'vscode'; - -import { PYTHON } from '../common/constants'; -import { traceError } from '../common/logger'; -import { IConfigurationService, IDisposable, IExtensionContext, Resource } from '../common/types'; -import { IShebangCodeLensProvider, PythonInterpreter } from '../interpreter/contracts'; -import { IServiceContainer, IServiceManager } from '../ioc/types'; -import { JediFactory } from '../languageServices/jediProxyFactory'; -import { PythonCompletionItemProvider } from '../providers/completionProvider'; -import { PythonDefinitionProvider } from '../providers/definitionProvider'; -import { PythonHoverProvider } from '../providers/hoverProvider'; -import { PythonObjectDefinitionProvider } from '../providers/objectDefinitionProvider'; -import { PythonReferenceProvider } from '../providers/referenceProvider'; -import { PythonRenameProvider } from '../providers/renameProvider'; -import { PythonSignatureProvider } from '../providers/signatureProvider'; -import { JediSymbolProvider } from '../providers/symbolProvider'; -import { ITestManagementService } from '../testing/types'; -import { BlockFormatProviders } from '../typeFormatters/blockFormatProvider'; -import { OnTypeFormattingDispatcher } from '../typeFormatters/dispatcher'; -import { OnEnterFormatter } from '../typeFormatters/onEnterFormatter'; -import { WorkspaceSymbols } from '../workspaceSymbols/main'; -import { ILanguageServerActivator } from './types'; - -@injectable() -export class JediExtensionActivator implements ILanguageServerActivator { - private static workspaceSymbols: WorkspaceSymbols | undefined; - private readonly context: IExtensionContext; - private jediFactory?: JediFactory; - private readonly documentSelector: DocumentFilter[]; - private renameProvider: PythonRenameProvider | undefined; - private hoverProvider: PythonHoverProvider | undefined; - private definitionProvider: PythonDefinitionProvider | undefined; - private referenceProvider: PythonReferenceProvider | undefined; - private completionProvider: PythonCompletionItemProvider | undefined; - private codeLensProvider: IShebangCodeLensProvider | undefined; - private symbolProvider: JediSymbolProvider | undefined; - private signatureProvider: PythonSignatureProvider | undefined; - private registrations: IDisposable[] = []; - private objectDefinitionProvider: PythonObjectDefinitionProvider | undefined; - - constructor(@inject(IServiceManager) private serviceManager: IServiceManager) { - this.context = this.serviceManager.get(IExtensionContext); - this.documentSelector = PYTHON; - } - - public async start(_resource: Resource, interpreter: PythonInterpreter | undefined): Promise { - if (this.jediFactory) { - throw new Error('Jedi already started'); - } - const context = this.context; - const jediFactory = (this.jediFactory = new JediFactory( - context.asAbsolutePath('.'), - interpreter, - this.serviceManager - )); - context.subscriptions.push(jediFactory); - const serviceContainer = this.serviceManager.get(IServiceContainer); - - this.renameProvider = new PythonRenameProvider(this.serviceManager); - this.definitionProvider = new PythonDefinitionProvider(jediFactory); - this.hoverProvider = new PythonHoverProvider(jediFactory); - this.referenceProvider = new PythonReferenceProvider(jediFactory); - this.completionProvider = new PythonCompletionItemProvider(jediFactory, this.serviceManager); - this.codeLensProvider = this.serviceManager.get(IShebangCodeLensProvider); - this.objectDefinitionProvider = new PythonObjectDefinitionProvider(jediFactory); - this.symbolProvider = new JediSymbolProvider(serviceContainer, jediFactory); - this.signatureProvider = new PythonSignatureProvider(jediFactory); - - if (!JediExtensionActivator.workspaceSymbols) { - // Workspace symbols is static because it doesn't rely on the jediFactory. - JediExtensionActivator.workspaceSymbols = new WorkspaceSymbols(serviceContainer); - context.subscriptions.push(JediExtensionActivator.workspaceSymbols); - } - - const testManagementService = this.serviceManager.get(ITestManagementService); - testManagementService - .activate(this.symbolProvider) - .catch(ex => traceError('Failed to activate Unit Tests', ex)); - } - - public deactivate() { - this.registrations.forEach(r => r.dispose()); - this.registrations = []; - } - - public activate() { - if ( - this.registrations.length === 0 && - this.renameProvider && - this.definitionProvider && - this.hoverProvider && - this.referenceProvider && - this.completionProvider && - this.codeLensProvider && - this.symbolProvider && - this.signatureProvider - ) { - // Make sure commands are in the registration list that gets disposed when the language server is disconnected from the - // IDE. - this.registrations.push( - commands.registerCommand('python.goToPythonObject', () => - this.objectDefinitionProvider!.goToObjectDefinition() - ) - ); - this.registrations.push(languages.registerRenameProvider(this.documentSelector, this.renameProvider)); - this.registrations.push( - languages.registerDefinitionProvider(this.documentSelector, this.definitionProvider) - ); - this.registrations.push(languages.registerHoverProvider(this.documentSelector, this.hoverProvider)); - this.registrations.push(languages.registerReferenceProvider(this.documentSelector, this.referenceProvider)); - this.registrations.push( - languages.registerCompletionItemProvider(this.documentSelector, this.completionProvider, '.') - ); - this.registrations.push(languages.registerCodeLensProvider(this.documentSelector, this.codeLensProvider)); - const onTypeDispatcher = new OnTypeFormattingDispatcher({ - '\n': new OnEnterFormatter(), - ':': new BlockFormatProviders() - }); - const onTypeTriggers = onTypeDispatcher.getTriggerCharacters(); - if (onTypeTriggers) { - this.registrations.push( - languages.registerOnTypeFormattingEditProvider( - PYTHON, - onTypeDispatcher, - onTypeTriggers.first, - ...onTypeTriggers.more - ) - ); - } - this.registrations.push( - languages.registerDocumentSymbolProvider(this.documentSelector, this.symbolProvider) - ); - const pythonSettings = this.serviceManager.get(IConfigurationService).getSettings(); - if (pythonSettings.devOptions.indexOf('DISABLE_SIGNATURE') === -1) { - this.registrations.push( - languages.registerSignatureHelpProvider(this.documentSelector, this.signatureProvider, '(', ',') - ); - } - } - } - - public provideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken - ): ProviderResult { - if (this.renameProvider) { - return this.renameProvider.provideRenameEdits(document, position, newName, token); - } - } - public provideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken - ): ProviderResult { - if (this.definitionProvider) { - return this.definitionProvider.provideDefinition(document, position, token); - } - } - public provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - if (this.hoverProvider) { - return this.hoverProvider.provideHover(document, position, token); - } - } - public provideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken - ): ProviderResult { - if (this.referenceProvider) { - return this.referenceProvider.provideReferences(document, position, context, token); - } - } - public provideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - _context: CompletionContext - ): ProviderResult { - if (this.completionProvider) { - return this.completionProvider.provideCompletionItems(document, position, token); - } - } - - public resolveCompletionItem(item: CompletionItem, token: CancellationToken): ProviderResult { - if (this.completionProvider) { - return this.completionProvider.resolveCompletionItem(item, token); - } - } - - public get onDidChangeCodeLenses(): Event | undefined { - return this.codeLensProvider ? this.codeLensProvider.onDidChangeCodeLenses : undefined; - } - public provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { - if (this.codeLensProvider) { - return this.codeLensProvider.provideCodeLenses(document, token); - } - } - public provideDocumentSymbols( - document: TextDocument, - token: CancellationToken - ): ProviderResult { - if (this.symbolProvider) { - return this.symbolProvider.provideDocumentSymbols(document, token); - } - } - public provideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - _context: SignatureHelpContext - ): ProviderResult { - if (this.signatureProvider) { - return this.signatureProvider.provideSignatureHelp(document, position, token); - } - } - - public dispose(): void { - this.registrations.forEach(r => r.dispose()); - if (this.jediFactory) { - this.jediFactory.dispose(); - } - } -} diff --git a/src/client/activation/jedi/analysisOptions.ts b/src/client/activation/jedi/analysisOptions.ts new file mode 100644 index 000000000000..007008dc9b13 --- /dev/null +++ b/src/client/activation/jedi/analysisOptions.ts @@ -0,0 +1,93 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import * as path from 'path'; +import { WorkspaceFolder } from 'vscode'; +import { IWorkspaceService } from '../../common/application/types'; +import { IConfigurationService, Resource } from '../../common/types'; + +import { IEnvironmentVariablesProvider } from '../../common/variables/types'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { LanguageServerAnalysisOptionsWithEnv } from '../common/analysisOptions'; +import { ILanguageServerOutputChannel } from '../types'; + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types, class-methods-use-this */ + +export class JediLanguageServerAnalysisOptions extends LanguageServerAnalysisOptionsWithEnv { + private resource: Resource | undefined; + + private interpreter: PythonEnvironment | undefined; + + constructor( + envVarsProvider: IEnvironmentVariablesProvider, + lsOutputChannel: ILanguageServerOutputChannel, + private readonly configurationService: IConfigurationService, + workspace: IWorkspaceService, + ) { + super(envVarsProvider, lsOutputChannel, workspace); + this.resource = undefined; + } + + public async initialize(resource: Resource, interpreter: PythonEnvironment | undefined) { + this.resource = resource; + this.interpreter = interpreter; + return super.initialize(resource, interpreter); + } + + protected getWorkspaceFolder(): WorkspaceFolder | undefined { + return this.workspace.getWorkspaceFolder(this.resource); + } + + protected async getInitializationOptions() { + const pythonSettings = this.configurationService.getSettings(this.resource); + const workspacePath = this.getWorkspaceFolder()?.uri.fsPath; + const extraPaths = pythonSettings.autoComplete + ? pythonSettings.autoComplete.extraPaths.map((extraPath) => { + if (path.isAbsolute(extraPath)) { + return extraPath; + } + return workspacePath ? path.join(workspacePath, extraPath) : ''; + }) + : []; + + if (workspacePath) { + extraPaths.unshift(workspacePath); + } + + const distinctExtraPaths = extraPaths + .filter((value) => value.length > 0) + .filter((value, index, self) => self.indexOf(value) === index); + + return { + markupKindPreferred: 'markdown', + completion: { + resolveEagerly: false, + disableSnippets: true, + }, + diagnostics: { + enable: true, + didOpen: true, + didSave: true, + didChange: true, + }, + hover: { + disable: { + keyword: { + all: true, + }, + }, + }, + workspace: { + extraPaths: distinctExtraPaths, + environmentPath: this.interpreter?.path, + symbols: { + // 0 means remove limit on number of workspace symbols returned + maxSymbols: 0, + }, + }, + semantic_tokens: { + enable: true, + }, + }; + } +} diff --git a/src/client/activation/jedi/languageClientFactory.ts b/src/client/activation/jedi/languageClientFactory.ts new file mode 100644 index 000000000000..70bd65da8d0d --- /dev/null +++ b/src/client/activation/jedi/languageClientFactory.ts @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import * as path from 'path'; +import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient/node'; + +import { EXTENSION_ROOT_DIR, PYTHON_LANGUAGE } from '../../common/constants'; +import { Resource } from '../../common/types'; +import { IInterpreterService } from '../../interpreter/contracts'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { ILanguageClientFactory } from '../types'; + +const languageClientName = 'Python Jedi'; + +export class JediLanguageClientFactory implements ILanguageClientFactory { + constructor(private interpreterService: IInterpreterService) {} + + public async createLanguageClient( + resource: Resource, + _interpreter: PythonEnvironment | undefined, + clientOptions: LanguageClientOptions, + ): Promise { + // Just run the language server using a module + const lsScriptPath = path.join(EXTENSION_ROOT_DIR, 'python_files', 'run-jedi-language-server.py'); + const interpreter = await this.interpreterService.getActiveInterpreter(resource); + const serverOptions: ServerOptions = { + command: interpreter ? interpreter.path : 'python', + args: [lsScriptPath], + }; + + return new LanguageClient(PYTHON_LANGUAGE, languageClientName, serverOptions, clientOptions); + } +} diff --git a/src/client/activation/jedi/languageClientMiddleware.ts b/src/client/activation/jedi/languageClientMiddleware.ts new file mode 100644 index 000000000000..c8bb99629946 --- /dev/null +++ b/src/client/activation/jedi/languageClientMiddleware.ts @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { IServiceContainer } from '../../ioc/types'; +import { LanguageClientMiddleware } from '../languageClientMiddleware'; +import { LanguageServerType } from '../types'; + +export class JediLanguageClientMiddleware extends LanguageClientMiddleware { + public constructor(serviceContainer: IServiceContainer, serverVersion?: string) { + super(serviceContainer, LanguageServerType.Jedi, serverVersion); + } +} diff --git a/src/client/activation/jedi/languageServerProxy.ts b/src/client/activation/jedi/languageServerProxy.ts new file mode 100644 index 000000000000..d7ffe8328b9e --- /dev/null +++ b/src/client/activation/jedi/languageServerProxy.ts @@ -0,0 +1,112 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import '../../common/extensions'; +import { Disposable, LanguageClient, LanguageClientOptions } from 'vscode-languageclient/node'; + +import { ChildProcess } from 'child_process'; +import { Resource } from '../../common/types'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { captureTelemetry } from '../../telemetry'; +import { EventName } from '../../telemetry/constants'; +import { JediLanguageClientMiddleware } from './languageClientMiddleware'; +import { ProgressReporting } from '../progress'; +import { ILanguageClientFactory, ILanguageServerProxy } from '../types'; +import { killPid } from '../../common/process/rawProcessApis'; +import { traceDecoratorError, traceDecoratorVerbose, traceError } from '../../logging'; + +export class JediLanguageServerProxy implements ILanguageServerProxy { + private languageClient: LanguageClient | undefined; + + private readonly disposables: Disposable[] = []; + + private lsVersion: string | undefined; + + constructor(private readonly factory: ILanguageClientFactory) {} + + private static versionTelemetryProps(instance: JediLanguageServerProxy) { + return { + lsVersion: instance.lsVersion, + }; + } + + @traceDecoratorVerbose('Disposing language server') + public dispose(): void { + this.stop().ignoreErrors(); + } + + @traceDecoratorError('Failed to start language server') + @captureTelemetry( + EventName.JEDI_LANGUAGE_SERVER_ENABLED, + undefined, + true, + undefined, + JediLanguageServerProxy.versionTelemetryProps, + ) + public async start( + resource: Resource, + interpreter: PythonEnvironment | undefined, + options: LanguageClientOptions, + ): Promise { + this.lsVersion = + (options.middleware ? (options.middleware).serverVersion : undefined) ?? + '0.19.3'; + + try { + const client = await this.factory.createLanguageClient(resource, interpreter, options); + this.registerHandlers(client); + await client.start(); + this.languageClient = client; + } catch (ex) { + traceError('Failed to start language server:', ex); + throw new Error('Launching Jedi language server using python failed, see output.'); + } + } + + @traceDecoratorVerbose('Stopping language server') + public async stop(): Promise { + while (this.disposables.length > 0) { + const d = this.disposables.shift()!; + d.dispose(); + } + + if (this.languageClient) { + const client = this.languageClient; + this.languageClient = undefined; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pid: number | undefined = ((client as any)._serverProcess as ChildProcess)?.pid; + const killServer = () => { + if (pid) { + killPid(pid); + } + }; + + try { + await client.stop(); + await client.dispose(); + killServer(); + } catch (ex) { + traceError('Stopping language client failed', ex); + killServer(); + } + } + } + + // eslint-disable-next-line class-methods-use-this + public loadExtension(): void { + // No body. + } + + @captureTelemetry( + EventName.JEDI_LANGUAGE_SERVER_READY, + undefined, + true, + undefined, + JediLanguageServerProxy.versionTelemetryProps, + ) + private registerHandlers(client: LanguageClient) { + const progressReporting = new ProgressReporting(client); + this.disposables.push(progressReporting); + } +} diff --git a/src/client/activation/jedi/manager.ts b/src/client/activation/jedi/manager.ts new file mode 100644 index 000000000000..bafdcc735a12 --- /dev/null +++ b/src/client/activation/jedi/manager.ts @@ -0,0 +1,144 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import * as fs from 'fs-extra'; +import * as path from 'path'; +import '../../common/extensions'; + +import { ICommandManager } from '../../common/application/types'; +import { IDisposable, Resource } from '../../common/types'; +import { debounceSync } from '../../common/utils/decorators'; +import { EXTENSION_ROOT_DIR } from '../../constants'; +import { IServiceContainer } from '../../ioc/types'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { captureTelemetry } from '../../telemetry'; +import { EventName } from '../../telemetry/constants'; +import { Commands } from '../commands'; +import { JediLanguageClientMiddleware } from './languageClientMiddleware'; +import { ILanguageServerAnalysisOptions, ILanguageServerManager, ILanguageServerProxy } from '../types'; +import { traceDecoratorError, traceDecoratorVerbose, traceVerbose } from '../../logging'; + +export class JediLanguageServerManager implements ILanguageServerManager { + private resource!: Resource; + + private interpreter: PythonEnvironment | undefined; + + private middleware: JediLanguageClientMiddleware | undefined; + + private disposables: IDisposable[] = []; + + private static commandDispose: IDisposable; + + private connected = false; + + private lsVersion: string | undefined; + + constructor( + private readonly serviceContainer: IServiceContainer, + private readonly analysisOptions: ILanguageServerAnalysisOptions, + private readonly languageServerProxy: ILanguageServerProxy, + commandManager: ICommandManager, + ) { + if (JediLanguageServerManager.commandDispose) { + JediLanguageServerManager.commandDispose.dispose(); + } + JediLanguageServerManager.commandDispose = commandManager.registerCommand(Commands.RestartLS, () => { + this.restartLanguageServer().ignoreErrors(); + }); + } + + private static versionTelemetryProps(instance: JediLanguageServerManager) { + return { + lsVersion: instance.lsVersion, + }; + } + + public dispose(): void { + this.stopLanguageServer().ignoreErrors(); + JediLanguageServerManager.commandDispose.dispose(); + this.disposables.forEach((d) => d.dispose()); + } + + @traceDecoratorError('Failed to start language server') + public async start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise { + this.resource = resource; + this.interpreter = interpreter; + this.analysisOptions.onDidChange(this.restartLanguageServerDebounced, this, this.disposables); + + try { + // Version is actually hardcoded in our requirements.txt. + const requirementsTxt = await fs.readFile( + path.join(EXTENSION_ROOT_DIR, 'python_files', 'jedilsp_requirements', 'requirements.txt'), + 'utf-8', + ); + + // Search using a regex in the text + const match = /jedi-language-server==([0-9\.]*)/.exec(requirementsTxt); + if (match && match.length === 2) { + [, this.lsVersion] = match; + } + } catch (ex) { + // Getting version here is best effort and does not affect how LS works and + // failing to get version should not stop LS from working. + traceVerbose('Failed to get jedi-language-server version: ', ex); + } + + await this.analysisOptions.initialize(resource, interpreter); + await this.startLanguageServer(); + } + + public connect(): void { + if (!this.connected) { + this.connected = true; + this.middleware?.connect(); + } + } + + public disconnect(): void { + if (this.connected) { + this.connected = false; + this.middleware?.disconnect(); + } + } + + @debounceSync(1000) + protected restartLanguageServerDebounced(): void { + this.restartLanguageServer().ignoreErrors(); + } + + @traceDecoratorError('Failed to restart language server') + @traceDecoratorVerbose('Restarting language server') + protected async restartLanguageServer(): Promise { + await this.stopLanguageServer(); + await this.startLanguageServer(); + } + + @captureTelemetry( + EventName.JEDI_LANGUAGE_SERVER_STARTUP, + undefined, + true, + undefined, + JediLanguageServerManager.versionTelemetryProps, + ) + @traceDecoratorVerbose('Starting language server') + protected async startLanguageServer(): Promise { + const options = await this.analysisOptions.getAnalysisOptions(); + this.middleware = new JediLanguageClientMiddleware(this.serviceContainer, this.lsVersion); + options.middleware = this.middleware; + + // Make sure the middleware is connected if we restart and we we're already connected. + if (this.connected) { + this.middleware.connect(); + } + + // Then use this middleware to start a new language client. + await this.languageServerProxy.start(this.resource, this.interpreter, options); + } + + @traceDecoratorVerbose('Stopping language server') + protected async stopLanguageServer(): Promise { + if (this.languageServerProxy) { + await this.languageServerProxy.stop(); + } + } +} diff --git a/src/client/activation/languageClientMiddleware.ts b/src/client/activation/languageClientMiddleware.ts index b37f3abd010d..d3d1e0c3c171 100644 --- a/src/client/activation/languageClientMiddleware.ts +++ b/src/client/activation/languageClientMiddleware.ts @@ -1,284 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import * as path from 'path'; -import { - CancellationToken, - CodeAction, - CodeActionContext, - CodeLens, - Command, - CompletionContext, - CompletionItem, - Definition, - DefinitionLink, - Diagnostic, - DocumentHighlight, - DocumentLink, - DocumentSymbol, - FormattingOptions, - Location, - Position, - ProviderResult, - Range, - SignatureHelp, - SymbolInformation, - TextDocument, - TextEdit, - Uri, - WorkspaceEdit -} from 'vscode'; -import { - HandleDiagnosticsSignature, - Middleware, - PrepareRenameSignature, - ProvideCodeActionsSignature, - ProvideCodeLensesSignature, - ProvideCompletionItemsSignature, - ProvideDefinitionSignature, - ProvideDocumentFormattingEditsSignature, - ProvideDocumentHighlightsSignature, - ProvideDocumentLinksSignature, - ProvideDocumentRangeFormattingEditsSignature, - ProvideDocumentSymbolsSignature, - ProvideHoverSignature, - ProvideOnTypeFormattingEditsSignature, - ProvideReferencesSignature, - ProvideRenameEditsSignature, - ProvideSignatureHelpSignature, - ProvideWorkspaceSymbolsSignature, - ResolveCodeLensSignature, - ResolveCompletionItemSignature, - ResolveDocumentLinkSignature -} from 'vscode-languageclient'; -import { HiddenFilePrefix } from '../common/constants'; -import { IPythonExtensionBanner } from '../common/types'; +import { IServiceContainer } from '../ioc/types'; +import { sendTelemetryEvent } from '../telemetry'; -export class LanguageClientMiddleware implements Middleware { - private connected = false; // Default to not forwarding to VS code. +import { LanguageClientMiddlewareBase } from './languageClientMiddlewareBase'; +import { LanguageServerType } from './types'; - public constructor(private readonly surveyBanner: IPythonExtensionBanner) { - this.handleDiagnostics = this.handleDiagnostics.bind(this); // VS Code calls function without context. - } - - public connect() { - this.connected = true; - } - - public disconnect() { - this.connected = false; - } - - public provideCompletionItem( - document: TextDocument, - position: Position, - context: CompletionContext, - token: CancellationToken, - next: ProvideCompletionItemsSignature - ) { - if (this.connected) { - this.surveyBanner.showBanner().ignoreErrors(); - return next(document, position, context, token); - } - } - - public provideHover( - document: TextDocument, - position: Position, - token: CancellationToken, - next: ProvideHoverSignature - ) { - if (this.connected) { - return next(document, position, token); - } - } - - public handleDiagnostics(uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) { - if (this.connected) { - // Skip sending if this is a special file. - const filePath = uri.fsPath; - const baseName = filePath ? path.basename(filePath) : undefined; - if (!baseName || !baseName.startsWith(HiddenFilePrefix)) { - next(uri, diagnostics); - } - } - } - - public resolveCompletionItem( - item: CompletionItem, - token: CancellationToken, - next: ResolveCompletionItemSignature - ): ProviderResult { - if (this.connected) { - return next(item, token); - } - } - public provideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - next: ProvideSignatureHelpSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, token); - } - } - public provideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken, - next: ProvideDefinitionSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, token); - } - } - public provideReferences( - document: TextDocument, - position: Position, - options: { - includeDeclaration: boolean; - }, - token: CancellationToken, - next: ProvideReferencesSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, options, token); - } - } - public provideDocumentHighlights( - document: TextDocument, - position: Position, - token: CancellationToken, - next: ProvideDocumentHighlightsSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, token); - } - } - public provideDocumentSymbols( - document: TextDocument, - token: CancellationToken, - next: ProvideDocumentSymbolsSignature - ): ProviderResult { - if (this.connected) { - return next(document, token); - } - } - public provideWorkspaceSymbols( - query: string, - token: CancellationToken, - next: ProvideWorkspaceSymbolsSignature - ): ProviderResult { - if (this.connected) { - return next(query, token); - } - } - public provideCodeActions( - document: TextDocument, - range: Range, - context: CodeActionContext, - token: CancellationToken, - next: ProvideCodeActionsSignature - ): ProviderResult<(Command | CodeAction)[]> { - if (this.connected) { - return next(document, range, context, token); - } - } - public provideCodeLenses( - document: TextDocument, - token: CancellationToken, - next: ProvideCodeLensesSignature - ): ProviderResult { - if (this.connected) { - return next(document, token); - } - } - public resolveCodeLens( - codeLens: CodeLens, - token: CancellationToken, - next: ResolveCodeLensSignature - ): ProviderResult { - if (this.connected) { - return next(codeLens, token); - } - } - public provideDocumentFormattingEdits( - document: TextDocument, - options: FormattingOptions, - token: CancellationToken, - next: ProvideDocumentFormattingEditsSignature - ): ProviderResult { - if (this.connected) { - return next(document, options, token); - } - } - public provideDocumentRangeFormattingEdits( - document: TextDocument, - range: Range, - options: FormattingOptions, - token: CancellationToken, - next: ProvideDocumentRangeFormattingEditsSignature - ): ProviderResult { - if (this.connected) { - return next(document, range, options, token); - } - } - public provideOnTypeFormattingEdits( - document: TextDocument, - position: Position, - ch: string, - options: FormattingOptions, - token: CancellationToken, - next: ProvideOnTypeFormattingEditsSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, ch, options, token); - } - } - public provideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken, - next: ProvideRenameEditsSignature - ): ProviderResult { - if (this.connected) { - return next(document, position, newName, token); - } - } - public prepareRename( - document: TextDocument, - position: Position, - token: CancellationToken, - next: PrepareRenameSignature - ): ProviderResult< - | Range - | { - range: Range; - placeholder: string; - } - > { - if (this.connected) { - return next(document, position, token); - } - } - public provideDocumentLinks( - document: TextDocument, - token: CancellationToken, - next: ProvideDocumentLinksSignature - ): ProviderResult { - if (this.connected) { - return next(document, token); - } - } - public resolveDocumentLink( - link: DocumentLink, - token: CancellationToken, - next: ResolveDocumentLinkSignature - ): ProviderResult { - if (this.connected) { - return next(link, token); - } +export class LanguageClientMiddleware extends LanguageClientMiddlewareBase { + public constructor(serviceContainer: IServiceContainer, serverType: LanguageServerType, serverVersion?: string) { + super(serviceContainer, serverType, sendTelemetryEvent, serverVersion); } } diff --git a/src/client/activation/languageClientMiddlewareBase.ts b/src/client/activation/languageClientMiddlewareBase.ts new file mode 100644 index 000000000000..f1e102a4081d --- /dev/null +++ b/src/client/activation/languageClientMiddlewareBase.ts @@ -0,0 +1,596 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import * as path from 'path'; +import { CancellationToken, Diagnostic, Disposable, Uri } from 'vscode'; +import { + ConfigurationParams, + ConfigurationRequest, + HandleDiagnosticsSignature, + LSPObject, + Middleware, + ResponseError, +} from 'vscode-languageclient'; +import { ConfigurationItem } from 'vscode-languageserver-protocol'; + +import { HiddenFilePrefix } from '../common/constants'; +import { createDeferred, isThenable } from '../common/utils/async'; +import { StopWatch } from '../common/utils/stopWatch'; +import { IEnvironmentVariablesProvider } from '../common/variables/types'; +import { IInterpreterService } from '../interpreter/contracts'; +import { IServiceContainer } from '../ioc/types'; +import { EventName } from '../telemetry/constants'; +import { LanguageServerType } from './types'; + +// Only send 100 events per hour. +const globalDebounce = 1000 * 60 * 60; +const globalLimit = 100; + +// For calls that are more likely to happen during a session (hover, completion, document symbols). +const debounceFrequentCall = 1000 * 60 * 5; + +// For calls that are less likely to happen during a session (go-to-def, workspace symbols). +const debounceRareCall = 1000 * 60; + +type Awaited = T extends PromiseLike ? U : T; +type MiddleWareMethods = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [P in keyof Middleware]-?: NonNullable extends (...args: any) => any ? Middleware[P] : never; +}; + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable prefer-rest-params */ +/* eslint-disable consistent-return */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +interface SendTelemetryEventFunc { + (eventName: EventName, measuresOrDurationMs?: Record | number, properties?: any, ex?: Error): void; +} + +export class LanguageClientMiddlewareBase implements Middleware { + private readonly eventName: EventName | undefined; + + private readonly lastCaptured = new Map(); + + private nextWindow = 0; + + private eventCount = 0; + + public workspace = { + configuration: async ( + params: ConfigurationParams, + token: CancellationToken, + next: ConfigurationRequest.HandlerSignature, + ) => { + if (!this.serviceContainer) { + return next(params, token); + } + + const interpreterService = this.serviceContainer.get(IInterpreterService); + const envService = this.serviceContainer.get(IEnvironmentVariablesProvider); + + let settings = next(params, token); + if (isThenable(settings)) { + settings = await settings; + } + if (settings instanceof ResponseError) { + return settings; + } + + for (const [i, item] of params.items.entries()) { + if (item.section === 'python') { + const uri = item.scopeUri ? Uri.parse(item.scopeUri) : undefined; + // For backwards compatibility, set python.pythonPath to the configured + // value as though it were in the user's settings.json file. + // As this is for backwards compatibility, `ConfigService.pythonPath` + // can be considered as active interpreter path. + const settingDict: LSPObject & { pythonPath: string; _envPYTHONPATH: string } = settings[ + i + ] as LSPObject & { pythonPath: string; _envPYTHONPATH: string }; + settingDict.pythonPath = (await interpreterService.getActiveInterpreter(uri))?.path ?? 'python'; + + const env = await envService.getEnvironmentVariables(uri); + const envPYTHONPATH = env.PYTHONPATH; + if (envPYTHONPATH) { + settingDict._envPYTHONPATH = envPYTHONPATH; + } + } + + this.configurationHook(item, settings[i] as LSPObject); + } + + return settings; + }, + }; + + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-empty-function + protected configurationHook(_item: ConfigurationItem, _settings: LSPObject): void {} + + private get connected(): Promise { + return this.connectedPromise.promise; + } + + protected notebookAddon: (Middleware & Disposable) | undefined; + + private connectedPromise = createDeferred(); + + public constructor( + readonly serviceContainer: IServiceContainer | undefined, + serverType: LanguageServerType, + public readonly sendTelemetryEventFunc: SendTelemetryEventFunc, + public readonly serverVersion?: string, + ) { + this.handleDiagnostics = this.handleDiagnostics.bind(this); // VS Code calls function without context. + this.didOpen = this.didOpen.bind(this); + this.didSave = this.didSave.bind(this); + this.didChange = this.didChange.bind(this); + this.didClose = this.didClose.bind(this); + this.willSave = this.willSave.bind(this); + this.willSaveWaitUntil = this.willSaveWaitUntil.bind(this); + + if (serverType === LanguageServerType.Node) { + this.eventName = EventName.LANGUAGE_SERVER_REQUEST; + } else if (serverType === LanguageServerType.Jedi) { + this.eventName = EventName.JEDI_LANGUAGE_SERVER_REQUEST; + } + } + + public connect() { + this.connectedPromise.resolve(true); + } + + public disconnect() { + this.connectedPromise = createDeferred(); + this.connectedPromise.resolve(false); + } + + public didChange() { + return this.callNext('didChange', arguments); + } + + public didOpen() { + // Special case, open and close happen before we connect. + return this.callNext('didOpen', arguments); + } + + public didClose() { + // Special case, open and close happen before we connect. + return this.callNext('didClose', arguments); + } + + public didSave() { + return this.callNext('didSave', arguments); + } + + public willSave() { + return this.callNext('willSave', arguments); + } + + public willSaveWaitUntil() { + return this.callNext('willSaveWaitUntil', arguments); + } + + public async didOpenNotebook() { + return this.callNotebooksNext('didOpen', arguments); + } + + public async didSaveNotebook() { + return this.callNotebooksNext('didSave', arguments); + } + + public async didChangeNotebook() { + return this.callNotebooksNext('didChange', arguments); + } + + public async didCloseNotebook() { + return this.callNotebooksNext('didClose', arguments); + } + + notebooks = { + didOpen: this.didOpenNotebook.bind(this), + didSave: this.didSaveNotebook.bind(this), + didChange: this.didChangeNotebook.bind(this), + didClose: this.didCloseNotebook.bind(this), + }; + + public async provideCompletionItem() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/completion', + debounceFrequentCall, + 'provideCompletionItem', + arguments, + (_, result) => { + if (!result) { + return { resultLength: 0 }; + } + const resultLength = Array.isArray(result) ? result.length : result.items.length; + return { resultLength }; + }, + ); + } + } + + public async provideHover() { + if (await this.connected) { + return this.callNextAndSendTelemetry('textDocument/hover', debounceFrequentCall, 'provideHover', arguments); + } + } + + public async handleDiagnostics(uri: Uri, _diagnostics: Diagnostic[], _next: HandleDiagnosticsSignature) { + if (await this.connected) { + // Skip sending if this is a special file. + const filePath = uri.fsPath; + const baseName = filePath ? path.basename(filePath) : undefined; + if (!baseName || !baseName.startsWith(HiddenFilePrefix)) { + return this.callNext('handleDiagnostics', arguments); + } + } + } + + public async resolveCompletionItem() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'completionItem/resolve', + debounceFrequentCall, + 'resolveCompletionItem', + arguments, + ); + } + } + + public async provideSignatureHelp() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/signatureHelp', + debounceFrequentCall, + 'provideSignatureHelp', + arguments, + ); + } + } + + public async provideDefinition() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/definition', + debounceRareCall, + 'provideDefinition', + arguments, + ); + } + } + + public async provideReferences() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/references', + debounceRareCall, + 'provideReferences', + arguments, + ); + } + } + + public async provideDocumentHighlights() { + if (await this.connected) { + return this.callNext('provideDocumentHighlights', arguments); + } + } + + public async provideDocumentSymbols() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/documentSymbol', + debounceFrequentCall, + 'provideDocumentSymbols', + arguments, + ); + } + } + + public async provideWorkspaceSymbols() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'workspace/symbol', + debounceRareCall, + 'provideWorkspaceSymbols', + arguments, + ); + } + } + + public async provideCodeActions() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/codeAction', + debounceFrequentCall, + 'provideCodeActions', + arguments, + ); + } + } + + public async provideCodeLenses() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/codeLens', + debounceFrequentCall, + 'provideCodeLenses', + arguments, + ); + } + } + + public async resolveCodeLens() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'codeLens/resolve', + debounceFrequentCall, + 'resolveCodeLens', + arguments, + ); + } + } + + public async provideDocumentFormattingEdits() { + if (await this.connected) { + return this.callNext('provideDocumentFormattingEdits', arguments); + } + } + + public async provideDocumentRangeFormattingEdits() { + if (await this.connected) { + return this.callNext('provideDocumentRangeFormattingEdits', arguments); + } + } + + public async provideOnTypeFormattingEdits() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/onTypeFormatting', + debounceFrequentCall, + 'provideOnTypeFormattingEdits', + arguments, + ); + } + } + + public async provideRenameEdits() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/rename', + debounceRareCall, + 'provideRenameEdits', + arguments, + ); + } + } + + public async prepareRename() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/prepareRename', + debounceRareCall, + 'prepareRename', + arguments, + ); + } + } + + public async provideDocumentLinks() { + if (await this.connected) { + return this.callNext('provideDocumentLinks', arguments); + } + } + + public async resolveDocumentLink() { + if (await this.connected) { + return this.callNext('resolveDocumentLink', arguments); + } + } + + public async provideDeclaration() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/declaration', + debounceRareCall, + 'provideDeclaration', + arguments, + ); + } + } + + public async provideTypeDefinition() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/typeDefinition', + debounceRareCall, + 'provideTypeDefinition', + arguments, + ); + } + } + + public async provideImplementation() { + if (await this.connected) { + return this.callNext('provideImplementation', arguments); + } + } + + public async provideDocumentColors() { + if (await this.connected) { + return this.callNext('provideDocumentColors', arguments); + } + } + + public async provideColorPresentations() { + if (await this.connected) { + return this.callNext('provideColorPresentations', arguments); + } + } + + public async provideFoldingRanges() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/foldingRange', + debounceFrequentCall, + 'provideFoldingRanges', + arguments, + ); + } + } + + public async provideSelectionRanges() { + if (await this.connected) { + return this.callNextAndSendTelemetry( + 'textDocument/selectionRange', + debounceRareCall, + 'provideSelectionRanges', + arguments, + ); + } + } + + public async prepareCallHierarchy() { + if (await this.connected) { + return this.callNext('prepareCallHierarchy', arguments); + } + } + + public async provideCallHierarchyIncomingCalls() { + if (await this.connected) { + return this.callNext('provideCallHierarchyIncomingCalls', arguments); + } + } + + public async provideCallHierarchyOutgoingCalls() { + if (await this.connected) { + return this.callNext('provideCallHierarchyOutgoingCalls', arguments); + } + } + + public async provideDocumentSemanticTokens() { + if (await this.connected) { + return this.callNext('provideDocumentSemanticTokens', arguments); + } + } + + public async provideDocumentSemanticTokensEdits() { + if (await this.connected) { + return this.callNext('provideDocumentSemanticTokensEdits', arguments); + } + } + + public async provideDocumentRangeSemanticTokens() { + if (await this.connected) { + return this.callNext('provideDocumentRangeSemanticTokens', arguments); + } + } + + public async provideLinkedEditingRange() { + if (await this.connected) { + return this.callNext('provideLinkedEditingRange', arguments); + } + } + + private callNext(funcName: keyof Middleware, args: IArguments) { + // This function uses the last argument to call the 'next' item. If we're allowing notebook + // middleware, it calls into the notebook middleware first. + if (this.notebookAddon && (this.notebookAddon as any)[funcName]) { + // It would be nice to use args.callee, but not supported in strict mode + return (this.notebookAddon as any)[funcName](...args); + } + + return args[args.length - 1](...args); + } + + private callNotebooksNext(funcName: 'didOpen' | 'didSave' | 'didChange' | 'didClose', args: IArguments) { + // This function uses the last argument to call the 'next' item. If we're allowing notebook + // middleware, it calls into the notebook middleware first. + if (this.notebookAddon?.notebooks && (this.notebookAddon.notebooks as any)[funcName]) { + // It would be nice to use args.callee, but not supported in strict mode + return (this.notebookAddon.notebooks as any)[funcName](...args); + } + + return args[args.length - 1](...args); + } + + private callNextAndSendTelemetry( + lspMethod: string, + debounceMilliseconds: number, + funcName: T, + args: IArguments, + lazyMeasures?: (this_: any, result: Awaited>) => Record, + ): ReturnType { + const now = Date.now(); + const stopWatch = new StopWatch(); + let calledNext = false; + // Change the 'last' argument (which is our next) in order to track if + // telemetry should be sent or not. + const changedArgs = [...args]; + + // Track whether or not the middleware called the 'next' function (which means it actually sent a request) + changedArgs[changedArgs.length - 1] = (...nextArgs: any) => { + // If the 'next' function is called, then legit request was made. + calledNext = true; + + // Then call the original 'next' + return args[args.length - 1](...nextArgs); + }; + + // Check if we need to reset the event count (if we're past the globalDebounce time) + if (now > this.nextWindow) { + // Past the end of the last window, reset. + this.nextWindow = now + globalDebounce; + this.eventCount = 0; + } + const lastCapture = this.lastCaptured.get(lspMethod); + + const sendTelemetry = (result: Awaited>) => { + // Skip doing anything if not allowed + // We should have: + // - called the next function in the middleware (this means a request was actually sent) + // - eventcount is not over the global limit + // - elapsed time since we sent this event is greater than debounce time + if ( + this.eventName && + calledNext && + this.eventCount < globalLimit && + (!lastCapture || now - lastCapture > debounceMilliseconds) + ) { + // We're sending, so update event count and last captured time + this.lastCaptured.set(lspMethod, now); + this.eventCount += 1; + + // Replace all slashes in the method name so it doesn't get scrubbed by @vscode/extension-telemetry. + const formattedMethod = lspMethod.replace(/\//g, '.'); + + const properties = { + lsVersion: this.serverVersion || 'unknown', + method: formattedMethod, + }; + + let measures: number | Record = stopWatch.elapsedTime; + if (lazyMeasures) { + measures = { + duration: measures, + ...lazyMeasures(this, result), + }; + } + + this.sendTelemetryEventFunc(this.eventName, measures, properties); + } + return result; + }; + + // Try to call the 'next' function in the middleware chain + const result: ReturnType = this.callNext(funcName, changedArgs as any); + + // Then wait for the result before sending telemetry + if (isThenable(result)) { + return result.then(sendTelemetry); + } + return sendTelemetry(result as any) as ReturnType; + } +} diff --git a/src/client/activation/languageServer/activator.ts b/src/client/activation/languageServer/activator.ts deleted file mode 100644 index 42194f36adbe..000000000000 --- a/src/client/activation/languageServer/activator.ts +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { inject, injectable } from 'inversify'; -import * as path from 'path'; - -import { IWorkspaceService } from '../../common/application/types'; -import { traceDecorators } from '../../common/logger'; -import { IFileSystem } from '../../common/platform/types'; -import { IConfigurationService, Resource } from '../../common/types'; -import { LanguageServerActivatorBase } from '../common/activatorBase'; -import { ILanguageServerDownloader, ILanguageServerFolderService, ILanguageServerManager } from '../types'; - -/** - * Starts the language server managers per workspaces (currently one for first workspace). - * - * @export - * @class DotNetLanguageServerActivator - * @implements {ILanguageServerActivator} - * @extends {LanguageServerActivatorBase} - */ -@injectable() -export class DotNetLanguageServerActivator extends LanguageServerActivatorBase { - constructor( - @inject(ILanguageServerManager) manager: ILanguageServerManager, - @inject(IWorkspaceService) workspace: IWorkspaceService, - @inject(IFileSystem) fs: IFileSystem, - @inject(ILanguageServerDownloader) lsDownloader: ILanguageServerDownloader, - @inject(ILanguageServerFolderService) languageServerFolderService: ILanguageServerFolderService, - @inject(IConfigurationService) configurationService: IConfigurationService - ) { - super(manager, workspace, fs, lsDownloader, languageServerFolderService, configurationService); - } - - @traceDecorators.error('Failed to ensure language server is available') - public async ensureLanguageServerIsAvailable(resource: Resource): Promise { - const languageServerFolderPath = await this.ensureLanguageServerFileIsAvailable(resource, 'mscorlib.dll'); - if (languageServerFolderPath) { - await this.prepareLanguageServerForNoICU(languageServerFolderPath); - } - } - - public async prepareLanguageServerForNoICU(languageServerFolderPath: string): Promise { - const targetJsonFile = path.join( - languageServerFolderPath, - 'Microsoft.Python.LanguageServer.runtimeconfig.json' - ); - // tslint:disable-next-line:no-any - let content: any = {}; - if (await this.fs.fileExists(targetJsonFile)) { - try { - content = JSON.parse(await this.fs.readFile(targetJsonFile)); - if ( - content.runtimeOptions && - content.runtimeOptions.configProperties && - content.runtimeOptions.configProperties['System.Globalization.Invariant'] === true - ) { - return; - } - } catch { - // Do nothing. - } - } - content.runtimeOptions = content.runtimeOptions || {}; - content.runtimeOptions.configProperties = content.runtimeOptions.configProperties || {}; - content.runtimeOptions.configProperties['System.Globalization.Invariant'] = true; - await this.fs.writeFile(targetJsonFile, JSON.stringify(content)); - } -} diff --git a/src/client/activation/languageServer/analysisOptions.ts b/src/client/activation/languageServer/analysisOptions.ts deleted file mode 100644 index 1fffcd1473aa..000000000000 --- a/src/client/activation/languageServer/analysisOptions.ts +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { inject, injectable } from 'inversify'; -import * as path from 'path'; -import { ConfigurationChangeEvent, Disposable, Event, EventEmitter, WorkspaceFolder } from 'vscode'; -import { DocumentFilter, DocumentSelector, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; - -import { IWorkspaceService } from '../../common/application/types'; -import { isTestExecution, PYTHON_LANGUAGE } from '../../common/constants'; -import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, IExtensionContext, IOutputChannel, IPathUtils, Resource } from '../../common/types'; -import { debounceSync } from '../../common/utils/decorators'; -import { IEnvironmentVariablesProvider } from '../../common/variables/types'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { ILanguageServerAnalysisOptions, ILanguageServerFolderService, ILanguageServerOutputChannel } from '../types'; - -@injectable() -export class LanguageServerAnalysisOptions implements ILanguageServerAnalysisOptions { - private envPythonPath: string = ''; - private excludedFiles: string[] = []; - private typeshedPaths: string[] = []; - private disposables: Disposable[] = []; - private languageServerFolder: string = ''; - private resource: Resource; - private interpreter: PythonInterpreter | undefined; - private output: IOutputChannel; - private readonly didChange = new EventEmitter(); - constructor( - @inject(IExtensionContext) private readonly context: IExtensionContext, - @inject(IEnvironmentVariablesProvider) private readonly envVarsProvider: IEnvironmentVariablesProvider, - @inject(IConfigurationService) private readonly configuration: IConfigurationService, - @inject(IWorkspaceService) private readonly workspace: IWorkspaceService, - @inject(ILanguageServerOutputChannel) private readonly lsOutputChannel: ILanguageServerOutputChannel, - @inject(IPathUtils) private readonly pathUtils: IPathUtils, - @inject(ILanguageServerFolderService) private readonly languageServerFolderService: ILanguageServerFolderService - ) { - this.output = this.lsOutputChannel.channel; - } - public async initialize(resource: Resource, interpreter: PythonInterpreter | undefined) { - this.resource = resource; - this.interpreter = interpreter; - this.languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - - let disposable = this.workspace.onDidChangeConfiguration(this.onSettingsChangedHandler, this); - this.disposables.push(disposable); - - disposable = this.envVarsProvider.onDidEnvironmentVariablesChange(this.onEnvVarChange, this); - this.disposables.push(disposable); - } - public get onDidChange(): Event { - return this.didChange.event; - } - public dispose(): void { - this.disposables.forEach(d => d.dispose()); - this.didChange.dispose(); - } - // tslint:disable-next-line: max-func-body-length - @traceDecorators.error('Failed to get analysis options') - public async getAnalysisOptions(): Promise { - const properties: Record = {}; - - const interpreterInfo = this.interpreter; - if (!interpreterInfo) { - // tslint:disable-next-line:no-suspicious-comment - // TODO: How do we handle this? It is pretty unlikely... - throw Error('did not find an active interpreter'); - } - - // tslint:disable-next-line:no-string-literal - properties['InterpreterPath'] = interpreterInfo.path; - - const version = interpreterInfo.version; - if (version) { - // tslint:disable-next-line:no-string-literal - properties['Version'] = `${version.major}.${version.minor}.${version.patch}`; - } else { - traceError('Unable to determine Python version. Analysis may be limited.'); - } - - let searchPaths = []; - - const settings = this.configuration.getSettings(this.resource); - if (settings.autoComplete) { - const extraPaths = settings.autoComplete.extraPaths; - if (extraPaths && extraPaths.length > 0) { - searchPaths.push(...extraPaths); - } - } - - // tslint:disable-next-line: no-suspicious-comment - // TODO: remove this setting since LS 0.2.92+ is not using it. - // tslint:disable-next-line:no-string-literal - properties['DatabasePath'] = path.join(this.context.extensionPath, this.languageServerFolder); - - const vars = await this.envVarsProvider.getEnvironmentVariables(); - this.envPythonPath = vars.PYTHONPATH || ''; - if (this.envPythonPath !== '') { - const paths = this.envPythonPath.split(this.pathUtils.delimiter).filter(item => item.trim().length > 0); - searchPaths.push(...paths); - } - - searchPaths = searchPaths.map(p => path.normalize(p)); - - this.excludedFiles = this.getExcludedFiles(); - this.typeshedPaths = this.getTypeshedPaths(); - const workspaceFolder = this.workspace.getWorkspaceFolder(this.resource); - const documentSelector = this.getDocumentSelector(workspaceFolder); - // Options to control the language client. - return { - // Register the server for Python documents. - documentSelector, - workspaceFolder, - synchronize: { - configurationSection: PYTHON_LANGUAGE - }, - outputChannel: this.output, - revealOutputChannelOn: RevealOutputChannelOn.Never, - initializationOptions: { - interpreter: { - properties - }, - displayOptions: { - preferredFormat: 'markdown', - trimDocumentationLines: false, - maxDocumentationLineLength: 0, - trimDocumentationText: false, - maxDocumentationTextLength: 0 - }, - searchPaths, - typeStubSearchPaths: this.typeshedPaths, - cacheFolderPath: this.getCacheFolderPath(), - excludeFiles: this.excludedFiles, - testEnvironment: isTestExecution(), - analysisUpdates: true, - traceLogging: true, // Max level, let LS decide through settings actual level of logging. - asyncStartup: true - } - }; - } - protected getDocumentSelector(workspaceFolder?: WorkspaceFolder): DocumentSelector { - const documentSelector: DocumentFilter[] = [ - { scheme: 'file', language: PYTHON_LANGUAGE }, - { scheme: 'untitled', language: PYTHON_LANGUAGE } - ]; - // Set the document selector only when in a multi-root workspace scenario. - if ( - workspaceFolder && - Array.isArray(this.workspace.workspaceFolders) && - this.workspace.workspaceFolders!.length > 1 - ) { - // tslint:disable-next-line:no-any - documentSelector[0].pattern = `${workspaceFolder.uri.fsPath}/**/*`; - } - return documentSelector; - } - protected getExcludedFiles(): string[] { - const list: string[] = ['**/Lib/**', '**/site-packages/**']; - this.getVsCodeExcludeSection('search.exclude', list); - this.getVsCodeExcludeSection('files.exclude', list); - this.getVsCodeExcludeSection('files.watcherExclude', list); - this.getPythonExcludeSection(list); - return list; - } - - protected getVsCodeExcludeSection(setting: string, list: string[]): void { - const states = this.workspace.getConfiguration(setting); - if (states) { - Object.keys(states) - .filter(k => (k.indexOf('*') >= 0 || k.indexOf('/') >= 0) && states[k]) - .forEach(p => list.push(p)); - } - } - protected getPythonExcludeSection(list: string[]): void { - const pythonSettings = this.configuration.getSettings(this.resource); - const paths = pythonSettings && pythonSettings.linting ? pythonSettings.linting.ignorePatterns : undefined; - if (paths && Array.isArray(paths)) { - paths.filter(p => p && p.length > 0).forEach(p => list.push(p)); - } - } - protected getTypeshedPaths(): string[] { - const settings = this.configuration.getSettings(this.resource); - return settings.analysis.typeshedPaths && settings.analysis.typeshedPaths.length > 0 - ? settings.analysis.typeshedPaths - : [path.join(this.context.extensionPath, this.languageServerFolder, 'Typeshed')]; - } - protected getCacheFolderPath(): string | null { - const settings = this.configuration.getSettings(this.resource); - return settings.analysis.cacheFolderPath && settings.analysis.cacheFolderPath.length > 0 - ? settings.analysis.cacheFolderPath - : null; - } - protected async onSettingsChangedHandler(e?: ConfigurationChangeEvent): Promise { - if (e && !e.affectsConfiguration('python', this.resource)) { - return; - } - this.onSettingsChanged(); - } - @debounceSync(1000) - protected onSettingsChanged(): void { - this.notifyIfSettingsChanged().ignoreErrors(); - } - @traceDecorators.verbose('Changes in python settings detected in analysis options') - protected async notifyIfSettingsChanged(): Promise { - const excludedFiles = this.getExcludedFiles(); - await this.notifyIfValuesHaveChanged(this.excludedFiles, excludedFiles); - - const typeshedPaths = this.getTypeshedPaths(); - await this.notifyIfValuesHaveChanged(this.typeshedPaths, typeshedPaths); - } - - protected async notifyIfValuesHaveChanged(oldArray: string[], newArray: string[]): Promise { - if (newArray.length !== oldArray.length) { - this.didChange.fire(); - return; - } - - for (let i = 0; i < oldArray.length; i += 1) { - if (oldArray[i] !== newArray[i]) { - this.didChange.fire(); - return; - } - } - } - - @debounceSync(1000) - protected onEnvVarChange(): void { - this.notifyifEnvPythonPathChanged().ignoreErrors(); - } - - protected async notifyifEnvPythonPathChanged(): Promise { - const vars = await this.envVarsProvider.getEnvironmentVariables(); - const envPythonPath = vars.PYTHONPATH || ''; - - if (this.envPythonPath !== envPythonPath) { - this.didChange.fire(); - } - } -} diff --git a/src/client/activation/languageServer/constants.ts b/src/client/activation/languageServer/constants.ts deleted file mode 100644 index 30094ca8507a..000000000000 --- a/src/client/activation/languageServer/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -export namespace Commands { - export const ClearAnalyisCache = 'python.analysis.clearCache'; -} diff --git a/src/client/activation/languageServer/languageClientFactory.ts b/src/client/activation/languageServer/languageClientFactory.ts deleted file mode 100644 index 38e923054812..000000000000 --- a/src/client/activation/languageServer/languageClientFactory.ts +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { inject, injectable, unmanaged } from 'inversify'; -import * as path from 'path'; -import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient'; - -import { EXTENSION_ROOT_DIR, PYTHON_LANGUAGE } from '../../common/constants'; -import { IConfigurationService, Resource } from '../../common/types'; -import { IEnvironmentVariablesProvider } from '../../common/variables/types'; -import { IEnvironmentActivationService } from '../../interpreter/activation/types'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { ILanguageClientFactory, ILanguageServerFolderService, IPlatformData } from '../types'; - -// tslint:disable:no-require-imports no-require-imports no-var-requires max-classes-per-file - -const dotNetCommand = 'dotnet'; -const languageClientName = 'Python Tools'; - -export class DotNetDownloadedLanguageClientFactory implements ILanguageClientFactory { - constructor( - private readonly platformData: IPlatformData, - private readonly languageServerFolderService: ILanguageServerFolderService - ) {} - - public async createLanguageClient( - resource: Resource, - _interpreter: PythonInterpreter | undefined, - clientOptions: LanguageClientOptions, - env?: NodeJS.ProcessEnv - ): Promise { - const languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - const serverModule = path.join( - EXTENSION_ROOT_DIR, - languageServerFolder, - this.platformData.engineExecutableName - ); - const options = { stdio: 'pipe', env }; - const serverOptions: ServerOptions = { - run: { command: serverModule, args: [], options }, - debug: { command: serverModule, args: ['--debug'], options } - }; - const vscodeLanguageClient = require('vscode-languageclient') as typeof import('vscode-languageclient'); - return new vscodeLanguageClient.LanguageClient( - PYTHON_LANGUAGE, - languageClientName, - serverOptions, - clientOptions - ); - } -} - -export class DotNetSimpleLanguageClientFactory implements ILanguageClientFactory { - constructor( - private readonly platformData: IPlatformData, - private readonly languageServerFolderService: ILanguageServerFolderService - ) {} - - public async createLanguageClient( - resource: Resource, - _interpreter: PythonInterpreter | undefined, - clientOptions: LanguageClientOptions, - env?: NodeJS.ProcessEnv - ): Promise { - const languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - const options = { stdio: 'pipe', env }; - const serverModule = path.join(EXTENSION_ROOT_DIR, languageServerFolder, this.platformData.engineDllName); - const serverOptions: ServerOptions = { - run: { command: dotNetCommand, args: [serverModule], options }, - debug: { command: dotNetCommand, args: [serverModule, '--debug'], options } - }; - const vscodeLanguageClient = require('vscode-languageclient') as typeof import('vscode-languageclient'); - return new vscodeLanguageClient.LanguageClient( - PYTHON_LANGUAGE, - languageClientName, - serverOptions, - clientOptions - ); - } -} - -@injectable() -export class DotNetLanguageClientFactory implements ILanguageClientFactory { - constructor( - @inject(IConfigurationService) private readonly configurationService: IConfigurationService, - @inject(IEnvironmentVariablesProvider) private readonly envVarsProvider: IEnvironmentVariablesProvider, - @inject(IEnvironmentActivationService) - private readonly environmentActivationService: IEnvironmentActivationService, - @inject(IPlatformData) private readonly platformData: IPlatformData, - @inject(ILanguageServerFolderService) - private readonly languageServerFolderService: ILanguageServerFolderService, - @unmanaged() private readonly downloadedFactory: ILanguageClientFactory, - @unmanaged() private readonly simpleFactory: ILanguageClientFactory - ) {} - - public async createLanguageClient( - resource: Resource, - interpreter: PythonInterpreter | undefined, - clientOptions: LanguageClientOptions - ): Promise { - const settings = this.configurationService.getSettings(resource); - let factory: ILanguageClientFactory; - if (this.platformData && this.languageServerFolderService) { - factory = settings.downloadLanguageServer - ? new DotNetDownloadedLanguageClientFactory(this.platformData, this.languageServerFolderService) - : new DotNetSimpleLanguageClientFactory(this.platformData, this.languageServerFolderService); - } else { - factory = settings.downloadLanguageServer ? this.downloadedFactory : this.simpleFactory; - } - const env = await this.getEnvVars(resource, interpreter); - return factory.createLanguageClient(resource, interpreter, clientOptions, env); - } - - private async getEnvVars( - resource: Resource, - interpreter: PythonInterpreter | undefined - ): Promise { - const envVars = await this.environmentActivationService.getActivatedEnvironmentVariables(resource, interpreter); - if (envVars && Object.keys(envVars).length > 0) { - return envVars; - } - return this.envVarsProvider.getEnvironmentVariables(resource); - } -} diff --git a/src/client/activation/languageServer/languageServerCompatibilityService.ts b/src/client/activation/languageServer/languageServerCompatibilityService.ts deleted file mode 100644 index 48c1e0729595..000000000000 --- a/src/client/activation/languageServer/languageServerCompatibilityService.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IDotNetCompatibilityService } from '../../common/dotnet/types'; -import { traceError } from '../../common/logger'; -import { sendTelemetryEvent } from '../../telemetry'; -import { EventName } from '../../telemetry/constants'; -import { ILanguageServerCompatibilityService } from '../types'; - -@injectable() -export class LanguageServerCompatibilityService implements ILanguageServerCompatibilityService { - constructor( - @inject(IDotNetCompatibilityService) private readonly dotnetCompatibility: IDotNetCompatibilityService - ) {} - public async isSupported(): Promise { - try { - const supported = await this.dotnetCompatibility.isSupported(); - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_PLATFORM_SUPPORTED, undefined, { - supported: supported - }); - return supported; - } catch (ex) { - traceError('Unable to determine whether LS is supported', ex); - sendTelemetryEvent(EventName.PYTHON_LANGUAGE_SERVER_PLATFORM_SUPPORTED, undefined, { - supported: false, - failureType: 'UnknownError' - }); - return false; - } - } -} diff --git a/src/client/activation/languageServer/languageServerExtension.ts b/src/client/activation/languageServer/languageServerExtension.ts deleted file mode 100644 index 1bcaa0e5be03..000000000000 --- a/src/client/activation/languageServer/languageServerExtension.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { Event, EventEmitter } from 'vscode'; -import { ICommandManager } from '../../common/application/types'; -import '../../common/extensions'; -import { IDisposable } from '../../common/types'; -import { ILanguageServerExtension } from '../types'; - -const loadExtensionCommand = 'python._loadLanguageServerExtension'; - -@injectable() -export class LanguageServerExtension implements ILanguageServerExtension { - public loadExtensionArgs?: {}; - protected readonly _invoked = new EventEmitter(); - private disposable?: IDisposable; - constructor(@inject(ICommandManager) private readonly commandManager: ICommandManager) {} - public dispose() { - if (this.disposable) { - this.disposable.dispose(); - } - } - public async register(): Promise { - if (this.disposable) { - return; - } - this.disposable = this.commandManager.registerCommand(loadExtensionCommand, args => { - this.loadExtensionArgs = args; - this._invoked.fire(); - }); - } - public get invoked(): Event { - return this._invoked.event; - } -} diff --git a/src/client/activation/languageServer/languageServerFolderService.ts b/src/client/activation/languageServer/languageServerFolderService.ts deleted file mode 100644 index bc89bb95ecea..000000000000 --- a/src/client/activation/languageServer/languageServerFolderService.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IApplicationEnvironment } from '../../common/application/types'; -import { IServiceContainer } from '../../ioc/types'; -import { LanguageServerFolderService } from '../common/languageServerFolderService'; - -@injectable() -export class DotNetLanguageServerFolderService extends LanguageServerFolderService { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - super(serviceContainer, 'languageServer'); - } - - protected getMinimalLanguageServerVersion(): string { - let minVersion = '0.0.0'; - try { - const appEnv = this.serviceContainer.get(IApplicationEnvironment); - if (appEnv) { - minVersion = appEnv.packageJson.languageServerVersion as string; - } - // tslint:disable-next-line: no-empty - } catch {} - return minVersion; - } -} diff --git a/src/client/activation/languageServer/languageServerPackageRepository.ts b/src/client/activation/languageServer/languageServerPackageRepository.ts deleted file mode 100644 index b9c8f3da797e..000000000000 --- a/src/client/activation/languageServer/languageServerPackageRepository.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IServiceContainer } from '../../ioc/types'; -import { - BetaLanguageServerPackageRepository, - DailyLanguageServerPackageRepository, - StableLanguageServerPackageRepository -} from '../common/packageRepository'; - -const languageServerPackageName = 'python-language-server'; - -@injectable() -export class StableDotNetLanguageServerPackageRepository extends StableLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - super(serviceContainer, languageServerPackageName); - } -} - -@injectable() -export class BetaDotNetLanguageServerPackageRepository extends BetaLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - super(serviceContainer, languageServerPackageName); - } -} - -@injectable() -export class DailyDotNetLanguageServerPackageRepository extends DailyLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - super(serviceContainer, languageServerPackageName); - } -} diff --git a/src/client/activation/languageServer/languageServerPackageService.ts b/src/client/activation/languageServer/languageServerPackageService.ts deleted file mode 100644 index 46998e8cc9cb..000000000000 --- a/src/client/activation/languageServer/languageServerPackageService.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IApplicationEnvironment } from '../../common/application/types'; -import { IPlatformService } from '../../common/platform/types'; -import { OSType } from '../../common/utils/platform'; -import { IServiceContainer } from '../../ioc/types'; -import { LanguageServerPackageService } from '../common/languageServerPackageService'; -import { PlatformName } from '../types'; - -const downloadBaseFileName = 'Python-Language-Server'; -export const PackageNames = { - [PlatformName.Windows32Bit]: `${downloadBaseFileName}-${PlatformName.Windows32Bit}`, - [PlatformName.Windows64Bit]: `${downloadBaseFileName}-${PlatformName.Windows64Bit}`, - [PlatformName.Linux64Bit]: `${downloadBaseFileName}-${PlatformName.Linux64Bit}`, - [PlatformName.Mac64Bit]: `${downloadBaseFileName}-${PlatformName.Mac64Bit}` -}; - -@injectable() -export class DotNetLanguageServerPackageService extends LanguageServerPackageService { - constructor( - @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IApplicationEnvironment) appEnv: IApplicationEnvironment, - @inject(IPlatformService) platform: IPlatformService - ) { - super(serviceContainer, appEnv, platform); - } - - public getNugetPackageName(): string { - switch (this.platform.osType) { - case OSType.Windows: - return PackageNames[this.platform.is64bit ? PlatformName.Windows64Bit : PlatformName.Windows32Bit]; - case OSType.OSX: - return PackageNames[PlatformName.Mac64Bit]; - default: - return PackageNames[PlatformName.Linux64Bit]; - } - } -} diff --git a/src/client/activation/languageServer/languageServerProxy.ts b/src/client/activation/languageServer/languageServerProxy.ts deleted file mode 100644 index 52576457d3a2..000000000000 --- a/src/client/activation/languageServer/languageServerProxy.ts +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import '../../common/extensions'; - -import { inject, injectable } from 'inversify'; -import { Disposable, LanguageClient, LanguageClientOptions } from 'vscode-languageclient'; - -import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, Resource } from '../../common/types'; -import { createDeferred, Deferred, sleep } from '../../common/utils/async'; -import { swallowExceptions } from '../../common/utils/decorators'; -import { noop } from '../../common/utils/misc'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; -import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; -import { EventName } from '../../telemetry/constants'; -import { ITestManagementService } from '../../testing/types'; -import { ProgressReporting } from '../progress'; -import { ILanguageClientFactory, ILanguageServerProxy } from '../types'; - -@injectable() -export class DotNetLanguageServerProxy implements ILanguageServerProxy { - public languageClient: LanguageClient | undefined; - private startupCompleted: Deferred; - private readonly disposables: Disposable[] = []; - private extensionLoadedArgs = new Set<{}>(); - private disposed: boolean = false; - - constructor( - @inject(ILanguageClientFactory) private readonly factory: ILanguageClientFactory, - @inject(ITestManagementService) private readonly testManager: ITestManagementService, - @inject(IConfigurationService) private readonly configurationService: IConfigurationService - ) { - this.startupCompleted = createDeferred(); - } - @traceDecorators.verbose('Stopping Language Server') - public dispose() { - if (this.languageClient) { - // Do not await on this. - this.languageClient.stop().then(noop, ex => traceError('Stopping language client failed', ex)); - this.languageClient = undefined; - } - while (this.disposables.length > 0) { - const d = this.disposables.shift()!; - d.dispose(); - } - if (this.startupCompleted.completed) { - this.startupCompleted.reject(new Error('Disposed Language Server')); - this.startupCompleted = createDeferred(); - } - this.disposed = true; - } - - @traceDecorators.error('Failed to start language server') - @captureTelemetry(EventName.PYTHON_LANGUAGE_SERVER_ENABLED, undefined, true) - public async start( - resource: Resource, - interpreter: PythonInterpreter | undefined, - options: LanguageClientOptions - ): Promise { - if (!this.languageClient) { - this.languageClient = await this.factory.createLanguageClient(resource, interpreter, options); - this.disposables.push(this.languageClient!.start()); - await this.serverReady(); - if (this.disposed) { - // Check if it got disposed in the interim. - return; - } - const progressReporting = new ProgressReporting(this.languageClient!); - this.disposables.push(progressReporting); - - const settings = this.configurationService.getSettings(resource); - if (settings.downloadLanguageServer) { - this.languageClient.onTelemetry(telemetryEvent => { - const eventName = telemetryEvent.EventName || EventName.PYTHON_LANGUAGE_SERVER_TELEMETRY; - sendTelemetryEvent(eventName, telemetryEvent.Measurements, telemetryEvent.Properties); - }); - } - await this.registerTestServices(); - } else { - await this.startupCompleted.promise; - } - } - @traceDecorators.error('Failed to load Language Server extension') - public loadExtension(args?: {}) { - if (this.extensionLoadedArgs.has(args || '')) { - return; - } - this.extensionLoadedArgs.add(args || ''); - this.startupCompleted.promise - .then(() => - this.languageClient!.sendRequest('python/loadExtension', args).then(noop, ex => - traceError('Request python/loadExtension failed', ex) - ) - ) - .ignoreErrors(); - } - @captureTelemetry(EventName.PYTHON_LANGUAGE_SERVER_READY, undefined, true) - protected async serverReady(): Promise { - while (this.languageClient && !this.languageClient!.initializeResult) { - await sleep(100); - } - this.startupCompleted.resolve(); - } - @swallowExceptions('Activating Unit Tests Manager for Language Server') - protected async registerTestServices() { - if (!this.languageClient) { - throw new Error('languageClient not initialized'); - } - await this.testManager.activate(new LanguageServerSymbolProvider(this.languageClient!)); - } -} diff --git a/src/client/activation/languageServer/manager.ts b/src/client/activation/languageServer/manager.ts deleted file mode 100644 index 497c8dade447..000000000000 --- a/src/client/activation/languageServer/manager.ts +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import '../../common/extensions'; - -import { inject, injectable, named } from 'inversify'; - -import { traceDecorators } from '../../common/logger'; -import { BANNER_NAME_LS_SURVEY, IDisposable, IPythonExtensionBanner, Resource } from '../../common/types'; -import { debounceSync } from '../../common/utils/decorators'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { IServiceContainer } from '../../ioc/types'; -import { captureTelemetry } from '../../telemetry'; -import { EventName } from '../../telemetry/constants'; -import { LanguageClientMiddleware } from '../languageClientMiddleware'; -import { - ILanguageServerAnalysisOptions, - ILanguageServerExtension, - ILanguageServerManager, - ILanguageServerProxy -} from '../types'; - -@injectable() -export class DotNetLanguageServerManager implements ILanguageServerManager { - private languageServerProxy?: ILanguageServerProxy; - private resource!: Resource; - private interpreter: PythonInterpreter | undefined; - private middleware: LanguageClientMiddleware | undefined; - private disposables: IDisposable[] = []; - private connected: boolean = false; - constructor( - @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, - @inject(ILanguageServerAnalysisOptions) private readonly analysisOptions: ILanguageServerAnalysisOptions, - @inject(ILanguageServerExtension) private readonly lsExtension: ILanguageServerExtension, - @inject(IPythonExtensionBanner) - @named(BANNER_NAME_LS_SURVEY) - private readonly surveyBanner: IPythonExtensionBanner - ) {} - public dispose() { - if (this.languageProxy) { - this.languageProxy.dispose(); - } - this.disposables.forEach(d => d.dispose()); - } - - public get languageProxy() { - return this.languageServerProxy; - } - @traceDecorators.error('Failed to start Language Server') - public async start(resource: Resource, interpreter: PythonInterpreter | undefined): Promise { - if (this.languageProxy) { - throw new Error('Language Server already started'); - } - this.registerCommandHandler(); - this.resource = resource; - this.interpreter = interpreter; - this.analysisOptions.onDidChange(this.restartLanguageServerDebounced, this, this.disposables); - - await this.analysisOptions.initialize(resource, interpreter); - await this.startLanguageServer(); - } - public connect() { - this.connected = true; - this.middleware?.connect(); - } - public disconnect() { - this.connected = false; - this.middleware?.disconnect(); - } - protected registerCommandHandler() { - this.lsExtension.invoked(this.loadExtensionIfNecessary, this, this.disposables); - } - protected loadExtensionIfNecessary() { - if (this.languageProxy && this.lsExtension.loadExtensionArgs) { - this.languageProxy.loadExtension(this.lsExtension.loadExtensionArgs); - } - } - @debounceSync(1000) - protected restartLanguageServerDebounced(): void { - this.restartLanguageServer().ignoreErrors(); - } - @traceDecorators.error('Failed to restart Language Server') - @traceDecorators.verbose('Restarting Language Server') - protected async restartLanguageServer(): Promise { - if (this.languageProxy) { - this.languageProxy.dispose(); - } - await this.startLanguageServer(); - } - @captureTelemetry(EventName.PYTHON_LANGUAGE_SERVER_STARTUP, undefined, true) - @traceDecorators.verbose('Starting Language Server') - protected async startLanguageServer(): Promise { - this.languageServerProxy = this.serviceContainer.get(ILanguageServerProxy); - const options = await this.analysisOptions!.getAnalysisOptions(); - options.middleware = this.middleware = new LanguageClientMiddleware(this.surveyBanner); - - // Make sure the middleware is connected if we restart and we we're already connected. - if (this.connected) { - this.middleware.connect(); - } - - // Then use this middleware to start a new language client. - await this.languageServerProxy.start(this.resource, this.interpreter, options); - this.loadExtensionIfNecessary(); - } -} diff --git a/src/client/activation/languageServer/outputChannel.ts b/src/client/activation/languageServer/outputChannel.ts deleted file mode 100644 index f37ad51db496..000000000000 --- a/src/client/activation/languageServer/outputChannel.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IApplicationShell, ICommandManager } from '../../common/application/types'; -import '../../common/extensions'; -import { IOutputChannel } from '../../common/types'; -import { OutputChannelNames } from '../../common/utils/localize'; -import { ILanguageServerOutputChannel } from '../types'; - -@injectable() -export class LanguageServerOutputChannel implements ILanguageServerOutputChannel { - public output: IOutputChannel | undefined; - private registered = false; - constructor( - @inject(IApplicationShell) private readonly appShell: IApplicationShell, - @inject(ICommandManager) private readonly commandManager: ICommandManager - ) {} - - public get channel() { - if (!this.output) { - this.output = this.appShell.createOutputChannel(OutputChannelNames.languageServer()); - this.registerCommand().ignoreErrors(); - } - return this.output; - } - private async registerCommand() { - if (this.registered) { - return; - } - this.registered = true; - // This controls the visibility of the command used to display the LS Output panel. - // We don't want to display it when Jedi is used instead of LS. - await this.commandManager.executeCommand('setContext', 'python.hasLanguageServerOutputChannel', true); - this.commandManager.registerCommand('python.viewLanguageServerOutput', () => this.output!.show(true)); - } -} diff --git a/src/client/activation/languageServer/platformData.ts b/src/client/activation/languageServer/platformData.ts deleted file mode 100644 index f616be1fc764..000000000000 --- a/src/client/activation/languageServer/platformData.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IPlatformService } from '../../common/platform/types'; -import { IPlatformData } from '../types'; - -export enum PlatformName { - Windows32Bit = 'win-x86', - Windows64Bit = 'win-x64', - Mac64Bit = 'osx-x64', - Linux64Bit = 'linux-x64' -} - -export enum PlatformLSExecutables { - Windows = 'Microsoft.Python.LanguageServer.exe', - MacOS = 'Microsoft.Python.LanguageServer', - Linux = 'Microsoft.Python.LanguageServer' -} - -@injectable() -export class PlatformData implements IPlatformData { - constructor(@inject(IPlatformService) private readonly platform: IPlatformService) {} - public get platformName(): PlatformName { - if (this.platform.isWindows) { - return this.platform.is64bit ? PlatformName.Windows64Bit : PlatformName.Windows32Bit; - } - if (this.platform.isMac) { - return PlatformName.Mac64Bit; - } - if (this.platform.isLinux) { - if (!this.platform.is64bit) { - throw new Error('Microsoft Python Language Server does not support 32-bit Linux.'); - } - return PlatformName.Linux64Bit; - } - throw new Error('Unknown OS platform.'); - } - - public get engineDllName(): string { - return 'Microsoft.Python.LanguageServer.dll'; - } - - public get engineExecutableName(): string { - if (this.platform.isWindows) { - return PlatformLSExecutables.Windows; - } else if (this.platform.isLinux) { - return PlatformLSExecutables.Linux; - } else if (this.platform.isMac) { - return PlatformLSExecutables.MacOS; - } else { - return 'unknown-platform'; - } - } -} diff --git a/src/client/activation/node/activator.ts b/src/client/activation/node/activator.ts deleted file mode 100644 index 89090581b84b..000000000000 --- a/src/client/activation/node/activator.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { inject, injectable } from 'inversify'; - -import { IWorkspaceService } from '../../common/application/types'; -import { traceDecorators } from '../../common/logger'; -import { IFileSystem } from '../../common/platform/types'; -import { IConfigurationService, Resource } from '../../common/types'; -import { LanguageServerActivatorBase } from '../common/activatorBase'; -import { ILanguageServerDownloader, ILanguageServerFolderService, ILanguageServerManager } from '../types'; - -/** - * Starts the Node.js-based language server managers per workspaces (currently one for first workspace). - * - * @export - * @class NodeLanguageServerActivator - * @implements {ILanguageServerActivator} - * @extends {LanguageServerActivatorBase} - */ -@injectable() -export class NodeLanguageServerActivator extends LanguageServerActivatorBase { - constructor( - @inject(ILanguageServerManager) manager: ILanguageServerManager, - @inject(IWorkspaceService) workspace: IWorkspaceService, - @inject(IFileSystem) fs: IFileSystem, - @inject(ILanguageServerDownloader) lsDownloader: ILanguageServerDownloader, - @inject(ILanguageServerFolderService) languageServerFolderService: ILanguageServerFolderService, - @inject(IConfigurationService) configurationService: IConfigurationService - ) { - super(manager, workspace, fs, lsDownloader, languageServerFolderService, configurationService); - } - - @traceDecorators.error('Failed to ensure language server is available') - public async ensureLanguageServerIsAvailable(resource: Resource): Promise { - await this.ensureLanguageServerFileIsAvailable(resource, 'server.bundle.js'); - } -} diff --git a/src/client/activation/node/analysisOptions.ts b/src/client/activation/node/analysisOptions.ts new file mode 100644 index 000000000000..71295649c25a --- /dev/null +++ b/src/client/activation/node/analysisOptions.ts @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { LanguageClientOptions } from 'vscode-languageclient'; +import { IWorkspaceService } from '../../common/application/types'; + +import { LanguageServerAnalysisOptionsBase } from '../common/analysisOptions'; +import { ILanguageServerOutputChannel } from '../types'; + +export class NodeLanguageServerAnalysisOptions extends LanguageServerAnalysisOptionsBase { + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(lsOutputChannel: ILanguageServerOutputChannel, workspace: IWorkspaceService) { + super(lsOutputChannel, workspace); + } + + protected getConfigSectionsToSynchronize(): string[] { + return [...super.getConfigSectionsToSynchronize(), 'jupyter.runStartupCommands']; + } + + // eslint-disable-next-line class-methods-use-this + protected async getInitializationOptions(): Promise { + return ({ + experimentationSupport: true, + trustedWorkspaceSupport: true, + } as unknown) as LanguageClientOptions; + } +} diff --git a/src/client/activation/node/languageClientFactory.ts b/src/client/activation/node/languageClientFactory.ts index c4fe31ce4d53..9543f265468f 100644 --- a/src/client/activation/node/languageClientFactory.ts +++ b/src/client/activation/node/languageClientFactory.ts @@ -1,54 +1,55 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { inject, injectable } from 'inversify'; import * as path from 'path'; -import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient'; +import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient/node'; -import { EXTENSION_ROOT_DIR, PYTHON_LANGUAGE } from '../../common/constants'; +import { PYLANCE_EXTENSION_ID, PYTHON_LANGUAGE } from '../../common/constants'; import { IFileSystem } from '../../common/platform/types'; -import { Resource } from '../../common/types'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { ILanguageClientFactory, ILanguageServerFolderService } from '../types'; +import { IExtensions, Resource } from '../../common/types'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { FileBasedCancellationStrategy } from '../common/cancellationUtils'; +import { ILanguageClientFactory } from '../types'; -// tslint:disable:no-require-imports no-require-imports no-var-requires max-classes-per-file -const languageClientName = 'Python Tools'; +export const PYLANCE_NAME = 'Pylance'; -@injectable() export class NodeLanguageClientFactory implements ILanguageClientFactory { - constructor( - @inject(IFileSystem) private readonly fs: IFileSystem, - @inject(ILanguageServerFolderService) private readonly languageServerFolderService: ILanguageServerFolderService - ) {} + constructor(private readonly fs: IFileSystem, private readonly extensions: IExtensions) {} public async createLanguageClient( - resource: Resource, - _interpreter: PythonInterpreter | undefined, - clientOptions: LanguageClientOptions + _resource: Resource, + _interpreter: PythonEnvironment | undefined, + clientOptions: LanguageClientOptions, ): Promise { - const languageServerFolder = await this.languageServerFolderService.getLanguageServerFolderName(resource); - const bundlePath = path.join(EXTENSION_ROOT_DIR, languageServerFolder, 'server.bundle.js'); - const nonBundlePath = path.join(EXTENSION_ROOT_DIR, languageServerFolder, 'server.js'); + // this must exist for node language client + const commandArgs = (clientOptions.connectionOptions + ?.cancellationStrategy as FileBasedCancellationStrategy).getCommandLineArguments(); + + const extension = this.extensions.getExtension(PYLANCE_EXTENSION_ID); + const languageServerFolder = extension ? extension.extensionPath : ''; + const bundlePath = path.join(languageServerFolder, 'dist', 'server.bundle.js'); + const nonBundlePath = path.join(languageServerFolder, 'dist', 'server.js'); const modulePath = (await this.fs.fileExists(nonBundlePath)) ? nonBundlePath : bundlePath; const debugOptions = { execArgv: ['--nolazy', '--inspect=6600'] }; + // If the extension is launched in debug mode, then the debug server options are used. const serverOptions: ServerOptions = { - run: { module: bundlePath, transport: TransportKind.ipc }, + run: { + module: bundlePath, + transport: TransportKind.ipc, + args: commandArgs, + }, // In debug mode, use the non-bundled code if it's present. The production // build includes only the bundled package, so we don't want to crash if // someone starts the production extension in debug mode. debug: { module: modulePath, transport: TransportKind.ipc, - options: debugOptions - } + options: debugOptions, + args: commandArgs, + }, }; - const vscodeLanguageClient = require('vscode-languageclient') as typeof import('vscode-languageclient'); - return new vscodeLanguageClient.LanguageClient( - PYTHON_LANGUAGE, - languageClientName, - serverOptions, - clientOptions - ); + + return new LanguageClient(PYTHON_LANGUAGE, PYLANCE_NAME, serverOptions, clientOptions); } } diff --git a/src/client/activation/node/languageClientMiddleware.ts b/src/client/activation/node/languageClientMiddleware.ts new file mode 100644 index 000000000000..dfd65f1bb418 --- /dev/null +++ b/src/client/activation/node/languageClientMiddleware.ts @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { IServiceContainer } from '../../ioc/types'; +import { LanguageClientMiddleware } from '../languageClientMiddleware'; + +import { LanguageServerType } from '../types'; + +export class NodeLanguageClientMiddleware extends LanguageClientMiddleware { + public constructor(serviceContainer: IServiceContainer, serverVersion?: string) { + super(serviceContainer, LanguageServerType.Node, serverVersion); + } +} diff --git a/src/client/activation/node/languageServerFolderService.ts b/src/client/activation/node/languageServerFolderService.ts deleted file mode 100644 index dc81535c7bd3..000000000000 --- a/src/client/activation/node/languageServerFolderService.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IServiceContainer } from '../../ioc/types'; -import { LanguageServerFolderService } from '../common/languageServerFolderService'; - -@injectable() -export class NodeLanguageServerFolderService extends LanguageServerFolderService { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - super(serviceContainer, 'nodeLanguageServer'); - } - - protected getMinimalLanguageServerVersion(): string { - return '0.0.0'; - } -} diff --git a/src/client/activation/node/languageServerPackageRepository.ts b/src/client/activation/node/languageServerPackageRepository.ts deleted file mode 100644 index 39ab7ac86a78..000000000000 --- a/src/client/activation/node/languageServerPackageRepository.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IWorkspaceService } from '../../common/application/types'; -import { IServiceContainer } from '../../ioc/types'; -import { - BetaLanguageServerPackageRepository, - DailyLanguageServerPackageRepository, - StableLanguageServerPackageRepository -} from '../common/packageRepository'; - -@injectable() -export class StableNodeLanguageServerPackageRepository extends StableLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - const config = serviceContainer.get(IWorkspaceService).getConfiguration('python'); - const packageName = config.get('blobName') || ''; - super(serviceContainer, packageName); - } -} - -@injectable() -export class BetaNodeLanguageServerPackageRepository extends BetaLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - const config = serviceContainer.get(IWorkspaceService).getConfiguration('python'); - const packageName = config.get('blobName') || ''; - super(serviceContainer, packageName); - } -} - -@injectable() -export class DailyNodeLanguageServerPackageRepository extends DailyLanguageServerPackageRepository { - constructor(@inject(IServiceContainer) serviceContainer: IServiceContainer) { - const config = serviceContainer.get(IWorkspaceService).getConfiguration('python'); - const packageName = config.get('blobName') || ''; - super(serviceContainer, packageName); - } -} diff --git a/src/client/activation/node/languageServerPackageService.ts b/src/client/activation/node/languageServerPackageService.ts deleted file mode 100644 index feacaba70a8a..000000000000 --- a/src/client/activation/node/languageServerPackageService.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { IApplicationEnvironment, IWorkspaceService } from '../../common/application/types'; -import { IPlatformService } from '../../common/platform/types'; -import { IServiceContainer } from '../../ioc/types'; -import { LanguageServerPackageService } from '../common/languageServerPackageService'; - -@injectable() -export class NodeLanguageServerPackageService extends LanguageServerPackageService { - constructor( - @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IApplicationEnvironment) appEnv: IApplicationEnvironment, - @inject(IPlatformService) platform: IPlatformService - ) { - super(serviceContainer, appEnv, platform); - } - - public getNugetPackageName(): string { - const config = this.serviceContainer.get(IWorkspaceService).getConfiguration('python'); - return config.get('packageName') || ''; - } -} diff --git a/src/client/activation/node/languageServerProxy.ts b/src/client/activation/node/languageServerProxy.ts index 1d8753065c6f..45d1d1a17fee 100644 --- a/src/client/activation/node/languageServerProxy.ts +++ b/src/client/activation/node/languageServerProxy.ts @@ -2,102 +2,235 @@ // Licensed under the MIT License. import '../../common/extensions'; -import { inject, injectable } from 'inversify'; -import { Disposable, LanguageClient, LanguageClientOptions } from 'vscode-languageclient'; - -import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, Resource } from '../../common/types'; -import { createDeferred, Deferred, sleep } from '../../common/utils/async'; -import { swallowExceptions } from '../../common/utils/decorators'; -import { noop } from '../../common/utils/misc'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; +import { + DidChangeConfigurationNotification, + Disposable, + LanguageClient, + LanguageClientOptions, +} from 'vscode-languageclient/node'; + +import { Extension } from 'vscode'; +import { IExperimentService, IExtensions, IInterpreterPathService, Resource } from '../../common/types'; +import { IEnvironmentVariablesProvider } from '../../common/variables/types'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; -import { ITestManagementService } from '../../testing/types'; +import { FileBasedCancellationStrategy } from '../common/cancellationUtils'; import { ProgressReporting } from '../progress'; import { ILanguageClientFactory, ILanguageServerProxy } from '../types'; +import { traceDecoratorError, traceDecoratorVerbose, traceError } from '../../logging'; +import { IWorkspaceService } from '../../common/application/types'; +import { PYLANCE_EXTENSION_ID } from '../../common/constants'; +import { PylanceApi } from './pylanceApi'; + +// eslint-disable-next-line @typescript-eslint/no-namespace +namespace InExperiment { + export const Method = 'python/inExperiment'; + + export interface IRequest { + experimentName: string; + } + + export interface IResponse { + inExperiment: boolean; + } +} + +// eslint-disable-next-line @typescript-eslint/no-namespace +namespace GetExperimentValue { + export const Method = 'python/getExperimentValue'; + + export interface IRequest { + experimentName: string; + } + + export interface IResponse { + value: T | undefined; + } +} -@injectable() export class NodeLanguageServerProxy implements ILanguageServerProxy { public languageClient: LanguageClient | undefined; - private startupCompleted: Deferred; + + private cancellationStrategy: FileBasedCancellationStrategy | undefined; + private readonly disposables: Disposable[] = []; - private disposed: boolean = false; + + private lsVersion: string | undefined; + + private pylanceApi: PylanceApi | undefined; constructor( - @inject(ILanguageClientFactory) private readonly factory: ILanguageClientFactory, - @inject(ITestManagementService) private readonly testManager: ITestManagementService, - @inject(IConfigurationService) private readonly configurationService: IConfigurationService - ) { - this.startupCompleted = createDeferred(); + private readonly factory: ILanguageClientFactory, + private readonly experimentService: IExperimentService, + private readonly interpreterPathService: IInterpreterPathService, + private readonly environmentService: IEnvironmentVariablesProvider, + private readonly workspace: IWorkspaceService, + private readonly extensions: IExtensions, + ) {} + + private static versionTelemetryProps(instance: NodeLanguageServerProxy) { + return { + lsVersion: instance.lsVersion, + }; } - @traceDecorators.verbose('Stopping Language Server') - public dispose() { - if (this.languageClient) { - // Do not await on this. - this.languageClient.stop().then(noop, ex => traceError('Stopping language client failed', ex)); - this.languageClient = undefined; + @traceDecoratorVerbose('Disposing language server') + public dispose(): void { + this.stop().ignoreErrors(); + } + + @traceDecoratorError('Failed to start language server') + @captureTelemetry( + EventName.LANGUAGE_SERVER_ENABLED, + undefined, + true, + undefined, + NodeLanguageServerProxy.versionTelemetryProps, + ) + public async start( + resource: Resource, + interpreter: PythonEnvironment | undefined, + options: LanguageClientOptions, + ): Promise { + const extension = await this.getPylanceExtension(); + this.lsVersion = extension?.packageJSON.version || '0'; + + const api = extension?.exports; + if (api && api.client && api.client.isEnabled()) { + this.pylanceApi = api; + await api.client.start(); + return; } + + this.cancellationStrategy = new FileBasedCancellationStrategy(); + options.connectionOptions = { cancellationStrategy: this.cancellationStrategy }; + + const client = await this.factory.createLanguageClient(resource, interpreter, options); + this.registerHandlers(client, resource); + + this.disposables.push( + this.workspace.onDidGrantWorkspaceTrust(() => { + client.sendNotification('python/workspaceTrusted', { isTrusted: true }); + }), + ); + + await client.start(); + + this.languageClient = client; + } + + @traceDecoratorVerbose('Disposing language server') + public async stop(): Promise { + if (this.pylanceApi) { + const api = this.pylanceApi; + this.pylanceApi = undefined; + await api.client!.stop(); + } + while (this.disposables.length > 0) { const d = this.disposables.shift()!; d.dispose(); } - if (this.startupCompleted.completed) { - this.startupCompleted.reject(new Error('Disposed Language Server')); - this.startupCompleted = createDeferred(); - } - this.disposed = true; - } - @traceDecorators.error('Failed to start language server') - @captureTelemetry(EventName.PYTHON_NODE_SERVER_ENABLED, undefined, true) - public async start( - resource: Resource, - interpreter: PythonInterpreter | undefined, - options: LanguageClientOptions - ): Promise { - if (!this.languageClient) { - this.languageClient = await this.factory.createLanguageClient(resource, interpreter, options); - this.disposables.push(this.languageClient!.start()); - await this.serverReady(); - if (this.disposed) { - // Check if it got disposed in the interim. - return; - } - const progressReporting = new ProgressReporting(this.languageClient!); - this.disposables.push(progressReporting); - - const settings = this.configurationService.getSettings(resource); - if (settings.downloadLanguageServer) { - this.languageClient.onTelemetry(telemetryEvent => { - const eventName = telemetryEvent.EventName || EventName.PYTHON_LANGUAGE_SERVER_TELEMETRY; - sendTelemetryEvent(eventName, telemetryEvent.Measurements, telemetryEvent.Properties); - }); + if (this.languageClient) { + const client = this.languageClient; + this.languageClient = undefined; + + try { + await client.stop(); + await client.dispose(); + } catch (ex) { + traceError('Stopping language client failed', ex); } - await this.registerTestServices(); - } else { - await this.startupCompleted.promise; + } + + if (this.cancellationStrategy) { + this.cancellationStrategy.dispose(); + this.cancellationStrategy = undefined; } } - // tslint:disable-next-line: no-empty - public loadExtension(_args?: {}) {} + // eslint-disable-next-line class-methods-use-this + public loadExtension(): void { + // No body. + } - @captureTelemetry(EventName.PYTHON_NODE_SERVER_READY, undefined, true) - protected async serverReady(): Promise { - while (this.languageClient && !this.languageClient!.initializeResult) { - await sleep(100); - } - this.startupCompleted.resolve(); + @captureTelemetry( + EventName.LANGUAGE_SERVER_READY, + undefined, + true, + undefined, + NodeLanguageServerProxy.versionTelemetryProps, + ) + private registerHandlers(client: LanguageClient, _resource: Resource) { + const progressReporting = new ProgressReporting(client); + this.disposables.push(progressReporting); + + this.disposables.push( + this.interpreterPathService.onDidChange(() => { + // Manually send didChangeConfiguration in order to get the server to requery + // the workspace configurations (to then pick up pythonPath set in the middleware). + // This is needed as interpreter changes via the interpreter path service happen + // outside of VS Code's settings (which would mean VS Code sends the config updates itself). + client.sendNotification(DidChangeConfigurationNotification.type, { + settings: null, + }); + }), + ); + this.disposables.push( + this.environmentService.onDidEnvironmentVariablesChange(() => { + client.sendNotification(DidChangeConfigurationNotification.type, { + settings: null, + }); + }), + ); + + client.onTelemetry((telemetryEvent) => { + const eventName = telemetryEvent.EventName || EventName.LANGUAGE_SERVER_TELEMETRY; + const formattedProperties = { + ...telemetryEvent.Properties, + // Replace all slashes in the method name so it doesn't get scrubbed by @vscode/extension-telemetry. + method: telemetryEvent.Properties.method?.replace(/\//g, '.'), + }; + sendTelemetryEvent(eventName, telemetryEvent.Measurements, formattedProperties, telemetryEvent.Exception); + }); + + client.onRequest( + InExperiment.Method, + async (params: InExperiment.IRequest): Promise => { + const inExperiment = await this.experimentService.inExperiment(params.experimentName); + return { inExperiment }; + }, + ); + + client.onRequest( + GetExperimentValue.Method, + async ( + params: GetExperimentValue.IRequest, + ): Promise> => { + const value = await this.experimentService.getExperimentValue(params.experimentName); + return { value }; + }, + ); + + this.disposables.push( + client.onRequest('python/isTrustedWorkspace', async () => ({ + isTrusted: this.workspace.isTrusted, + })), + ); } - @swallowExceptions('Activating Unit Tests Manager for Language Server') - protected async registerTestServices() { - if (!this.languageClient) { - throw new Error('languageClient not initialized'); + private async getPylanceExtension(): Promise | undefined> { + const extension = this.extensions.getExtension(PYLANCE_EXTENSION_ID); + if (!extension) { + return undefined; } - await this.testManager.activate(new LanguageServerSymbolProvider(this.languageClient!)); + + if (!extension.isActive) { + await extension.activate(); + } + + return extension; } } diff --git a/src/client/activation/node/manager.ts b/src/client/activation/node/manager.ts index eda6a28d23b2..5a66e4abecd0 100644 --- a/src/client/activation/node/manager.ts +++ b/src/client/activation/node/manager.ts @@ -2,88 +2,122 @@ // Licensed under the MIT License. import '../../common/extensions'; -import { inject, injectable, named } from 'inversify'; - -import { traceDecorators } from '../../common/logger'; -import { BANNER_NAME_LS_SURVEY, IDisposable, IPythonExtensionBanner, Resource } from '../../common/types'; +import { ICommandManager } from '../../common/application/types'; +import { IDisposable, IExtensions, Resource } from '../../common/types'; import { debounceSync } from '../../common/utils/decorators'; -import { PythonInterpreter } from '../../interpreter/contracts'; import { IServiceContainer } from '../../ioc/types'; -import { captureTelemetry } from '../../telemetry'; +import { PythonEnvironment } from '../../pythonEnvironments/info'; +import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; -import { LanguageClientMiddleware } from '../languageClientMiddleware'; -import { ILanguageServerAnalysisOptions, ILanguageServerManager, ILanguageServerProxy } from '../types'; +import { Commands } from '../commands'; +import { NodeLanguageClientMiddleware } from './languageClientMiddleware'; +import { ILanguageServerAnalysisOptions, ILanguageServerManager } from '../types'; +import { traceDecoratorError, traceDecoratorVerbose } from '../../logging'; +import { PYLANCE_EXTENSION_ID } from '../../common/constants'; +import { NodeLanguageServerProxy } from './languageServerProxy'; -@injectable() export class NodeLanguageServerManager implements ILanguageServerManager { - private languageServerProxy?: ILanguageServerProxy; private resource!: Resource; - private interpreter: PythonInterpreter | undefined; - private middleware: LanguageClientMiddleware | undefined; + + private interpreter: PythonEnvironment | undefined; + + private middleware: NodeLanguageClientMiddleware | undefined; + private disposables: IDisposable[] = []; - private connected: boolean = false; + + private connected = false; + + private lsVersion: string | undefined; + + private started = false; + + private static commandDispose: IDisposable; + constructor( - @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, - @inject(ILanguageServerAnalysisOptions) private readonly analysisOptions: ILanguageServerAnalysisOptions, - @inject(IPythonExtensionBanner) - @named(BANNER_NAME_LS_SURVEY) - private readonly surveyBanner: IPythonExtensionBanner - ) {} - - public dispose() { - if (this.languageProxy) { - this.languageProxy.dispose(); + private readonly serviceContainer: IServiceContainer, + private readonly analysisOptions: ILanguageServerAnalysisOptions, + private readonly languageServerProxy: NodeLanguageServerProxy, + commandManager: ICommandManager, + private readonly extensions: IExtensions, + ) { + if (NodeLanguageServerManager.commandDispose) { + NodeLanguageServerManager.commandDispose.dispose(); } - this.disposables.forEach(d => d.dispose()); + NodeLanguageServerManager.commandDispose = commandManager.registerCommand(Commands.RestartLS, () => { + sendTelemetryEvent(EventName.LANGUAGE_SERVER_RESTART, undefined, { reason: 'command' }); + this.restartLanguageServer().ignoreErrors(); + }); + } + + private static versionTelemetryProps(instance: NodeLanguageServerManager) { + return { + lsVersion: instance.lsVersion, + }; } - public get languageProxy() { - return this.languageServerProxy; + public dispose(): void { + this.stopLanguageServer().ignoreErrors(); + NodeLanguageServerManager.commandDispose.dispose(); + this.disposables.forEach((d) => d.dispose()); } - @traceDecorators.error('Failed to start Language Server') - public async start(resource: Resource, interpreter: PythonInterpreter | undefined): Promise { - if (this.languageProxy) { - throw new Error('Language Server already started'); + @traceDecoratorError('Failed to start language server') + public async start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise { + if (this.started) { + throw new Error('Language server already started'); } this.resource = resource; this.interpreter = interpreter; this.analysisOptions.onDidChange(this.restartLanguageServerDebounced, this, this.disposables); + const extension = this.extensions.getExtension(PYLANCE_EXTENSION_ID); + this.lsVersion = extension?.packageJSON.version || '0'; + await this.analysisOptions.initialize(resource, interpreter); await this.startLanguageServer(); + + this.started = true; } - public connect() { - this.connected = true; - this.middleware?.connect(); + public connect(): void { + if (!this.connected) { + this.connected = true; + this.middleware?.connect(); + } } - public disconnect() { - this.connected = false; - this.middleware?.disconnect(); + public disconnect(): void { + if (this.connected) { + this.connected = false; + this.middleware?.disconnect(); + } } @debounceSync(1000) protected restartLanguageServerDebounced(): void { + sendTelemetryEvent(EventName.LANGUAGE_SERVER_RESTART, undefined, { reason: 'settings' }); this.restartLanguageServer().ignoreErrors(); } - @traceDecorators.error('Failed to restart Language Server') - @traceDecorators.verbose('Restarting Language Server') + @traceDecoratorError('Failed to restart language server') + @traceDecoratorVerbose('Restarting language server') protected async restartLanguageServer(): Promise { - if (this.languageProxy) { - this.languageProxy.dispose(); - } + await this.stopLanguageServer(); await this.startLanguageServer(); } - @captureTelemetry(EventName.PYTHON_NODE_SERVER_STARTUP, undefined, true) - @traceDecorators.verbose('Starting Language Server') + @captureTelemetry( + EventName.LANGUAGE_SERVER_STARTUP, + undefined, + true, + undefined, + NodeLanguageServerManager.versionTelemetryProps, + ) + @traceDecoratorVerbose('Starting language server') protected async startLanguageServer(): Promise { - this.languageServerProxy = this.serviceContainer.get(ILanguageServerProxy); - const options = await this.analysisOptions!.getAnalysisOptions(); - options.middleware = this.middleware = new LanguageClientMiddleware(this.surveyBanner); + const options = await this.analysisOptions.getAnalysisOptions(); + this.middleware = new NodeLanguageClientMiddleware(this.serviceContainer, this.lsVersion); + options.middleware = this.middleware; // Make sure the middleware is connected if we restart and we we're already connected. if (this.connected) { @@ -93,4 +127,11 @@ export class NodeLanguageServerManager implements ILanguageServerManager { // Then use this middleware to start a new language client. await this.languageServerProxy.start(this.resource, this.interpreter, options); } + + @traceDecoratorVerbose('Stopping language server') + protected async stopLanguageServer(): Promise { + if (this.languageServerProxy) { + await this.languageServerProxy.stop(); + } + } } diff --git a/src/client/activation/node/pylanceApi.ts b/src/client/activation/node/pylanceApi.ts new file mode 100644 index 000000000000..4b3d21d7527e --- /dev/null +++ b/src/client/activation/node/pylanceApi.ts @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import { + CancellationToken, + CompletionContext, + CompletionItem, + CompletionList, + Position, + TextDocument, + Uri, +} from 'vscode'; + +export interface PylanceApi { + client?: { + isEnabled(): boolean; + start(): Promise; + stop(): Promise; + }; + notebook?: { + registerJupyterPythonPathFunction(func: (uri: Uri) => Promise): void; + getCompletionItems( + document: TextDocument, + position: Position, + context: CompletionContext, + token: CancellationToken, + ): Promise; + }; +} diff --git a/src/client/activation/none/activator.ts b/src/client/activation/none/activator.ts deleted file mode 100644 index 316099104141..000000000000 --- a/src/client/activation/none/activator.ts +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { injectable } from 'inversify'; -import { - CancellationToken, - CodeLens, - CompletionContext, - CompletionItem, - CompletionList, - DocumentSymbol, - Hover, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - WorkspaceEdit -} from 'vscode'; -import { Resource } from '../../common/types'; -import { PythonInterpreter } from '../../interpreter/contracts'; -import { ILanguageServerActivator } from '../types'; - -/** - * Provides 'no language server' pseudo-activator. - * - * @export - * @class NoLanguageServerExtensionActivator - * @implements {ILanguageServerActivator} - */ -@injectable() -export class NoLanguageServerExtensionActivator implements ILanguageServerActivator { - // tslint:disable-next-line: no-empty - public async start(_resource: Resource, _interpreter?: PythonInterpreter): Promise {} - // tslint:disable-next-line: no-empty - public dispose(): void {} - // tslint:disable-next-line: no-empty - public activate(): void {} - // tslint:disable-next-line: no-empty - public deactivate(): void {} - - public provideRenameEdits( - _document: TextDocument, - _position: Position, - _newName: string, - _token: CancellationToken - ): ProviderResult { - return null; - } - public provideDefinition( - _document: TextDocument, - _position: Position, - _token: CancellationToken - ): ProviderResult { - return null; - } - public provideHover( - _document: TextDocument, - _position: Position, - _token: CancellationToken - ): ProviderResult { - return null; - } - public provideReferences( - _document: TextDocument, - _position: Position, - _context: ReferenceContext, - _token: CancellationToken - ): ProviderResult { - return null; - } - public provideCompletionItems( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - _context: CompletionContext - ): ProviderResult { - return null; - } - public provideCodeLenses(_document: TextDocument, _token: CancellationToken): ProviderResult { - return null; - } - public provideDocumentSymbols( - _document: TextDocument, - _token: CancellationToken - ): ProviderResult { - return null; - } - public provideSignatureHelp( - _document: TextDocument, - _position: Position, - _token: CancellationToken, - _context: SignatureHelpContext - ): ProviderResult { - return null; - } -} diff --git a/src/client/activation/partialModeStatus.ts b/src/client/activation/partialModeStatus.ts new file mode 100644 index 000000000000..1105f6529ac8 --- /dev/null +++ b/src/client/activation/partialModeStatus.ts @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// IMPORTANT: Do not import any node fs related modules here, as they do not work in browser. +import { inject, injectable } from 'inversify'; +import type * as vscodeTypes from 'vscode'; +import { IWorkspaceService } from '../common/application/types'; +import { IDisposableRegistry } from '../common/types'; +import { Common, LanguageService } from '../common/utils/localize'; +import { IExtensionSingleActivationService } from './types'; + +/** + * Only partial features are available when running in untrusted or a + * virtual workspace, this creates a UI element to indicate that. + */ +@injectable() +export class PartialModeStatusItem implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: true, virtualWorkspace: true }; + + constructor( + @inject(IWorkspaceService) private readonly workspace: IWorkspaceService, + @inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry, + ) {} + + public async activate(): Promise { + const { isTrusted, isVirtualWorkspace } = this.workspace; + if (isTrusted && !isVirtualWorkspace) { + return; + } + const statusItem = this.createStatusItem(); + if (statusItem) { + this.disposables.push(statusItem); + } + } + + private createStatusItem() { + // eslint-disable-next-line global-require + const vscode = require('vscode') as typeof vscodeTypes; + if ('createLanguageStatusItem' in vscode.languages) { + const statusItem = vscode.languages.createLanguageStatusItem('python.projectStatus', { + language: 'python', + }); + statusItem.name = LanguageService.statusItem.name; + statusItem.severity = vscode.LanguageStatusSeverity.Warning; + statusItem.text = LanguageService.statusItem.text; + statusItem.detail = !this.workspace.isTrusted + ? LanguageService.statusItem.detail + : LanguageService.virtualWorkspaceStatusItem.detail; + statusItem.command = { + title: Common.learnMore, + command: 'vscode.open', + arguments: [vscode.Uri.parse('https://aka.ms/AAdzyh4')], + }; + return statusItem; + } + return undefined; + } +} diff --git a/src/client/activation/progress.ts b/src/client/activation/progress.ts index 4158670fa7e7..5abcb9e553c0 100644 --- a/src/client/activation/progress.ts +++ b/src/client/activation/progress.ts @@ -4,7 +4,7 @@ 'use strict'; import { Progress, ProgressLocation, window } from 'vscode'; -import { Disposable, LanguageClient } from 'vscode-languageclient'; +import { Disposable, LanguageClient } from 'vscode-languageclient/node'; import { createDeferred, Deferred } from '../common/utils/async'; export class ProgressReporting implements Disposable { @@ -20,7 +20,7 @@ export class ProgressReporting implements Disposable { this.statusBarMessage = window.setStatusBarMessage(m); }); - this.languageClient.onNotification('python/beginProgress', _ => { + this.languageClient.onNotification('python/beginProgress', (_) => { if (this.progressDeferred) { return; } @@ -31,10 +31,10 @@ export class ProgressReporting implements Disposable { if (!this.progress) { this.beginProgress(); } - this.progress!.report({ message: m }); + this.progress!.report({ message: m }); // NOSONAR }); - this.languageClient.onNotification('python/endProgress', _ => { + this.languageClient.onNotification('python/endProgress', (_) => { if (this.progressDeferred) { this.progressDeferred.resolve(); this.progressDeferred = undefined; @@ -55,12 +55,12 @@ export class ProgressReporting implements Disposable { window.withProgress( { location: ProgressLocation.Window, - title: '' + title: '', }, - progress => { + (progress) => { this.progress = progress; return this.progressDeferred!.promise; - } + }, ); } } diff --git a/src/client/activation/refCountedLanguageServer.ts b/src/client/activation/refCountedLanguageServer.ts deleted file mode 100644 index b6bf48827c48..000000000000 --- a/src/client/activation/refCountedLanguageServer.ts +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { - CancellationToken, - CodeLens, - CompletionContext, - CompletionItem, - CompletionList, - DocumentSymbol, - Hover, - Location, - LocationLink, - Position, - ProviderResult, - ReferenceContext, - SignatureHelp, - SignatureHelpContext, - SymbolInformation, - TextDocument, - TextDocumentContentChangeEvent, - WorkspaceEdit -} from 'vscode'; - -import { Resource } from '../common/types'; -import { noop } from '../common/utils/misc'; -import { PythonInterpreter } from '../interpreter/contracts'; -import { ILanguageServerActivator, LanguageServerType } from './types'; - -export class RefCountedLanguageServer implements ILanguageServerActivator { - private refCount = 1; - constructor( - private impl: ILanguageServerActivator, - private _type: LanguageServerType, - private disposeCallback: () => void - ) {} - - public increment = () => { - this.refCount += 1; - }; - - public get type() { - return this._type; - } - - public dispose() { - this.refCount = Math.max(0, this.refCount - 1); - if (this.refCount === 0) { - this.disposeCallback(); - } - } - - public start(_resource: Resource, _interpreter: PythonInterpreter | undefined): Promise { - throw new Error('Server should have already been started. Do not start the wrapper.'); - } - - public activate() { - this.impl.activate(); - } - - public deactivate() { - this.impl.deactivate(); - } - - public clearAnalysisCache() { - this.impl.clearAnalysisCache ? this.impl.clearAnalysisCache() : noop(); - } - - public handleChanges(document: TextDocument, changes: TextDocumentContentChangeEvent[]) { - this.impl.handleChanges ? this.impl.handleChanges(document, changes) : noop(); - } - - public handleOpen(document: TextDocument) { - this.impl.handleOpen ? this.impl.handleOpen(document) : noop(); - } - - public provideRenameEdits( - document: TextDocument, - position: Position, - newName: string, - token: CancellationToken - ): ProviderResult { - return this.impl.provideRenameEdits(document, position, newName, token); - } - public provideDefinition( - document: TextDocument, - position: Position, - token: CancellationToken - ): ProviderResult { - return this.impl.provideDefinition(document, position, token); - } - public provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - return this.impl.provideHover(document, position, token); - } - public provideReferences( - document: TextDocument, - position: Position, - context: ReferenceContext, - token: CancellationToken - ): ProviderResult { - return this.impl.provideReferences(document, position, context, token); - } - public provideCompletionItems( - document: TextDocument, - position: Position, - token: CancellationToken, - context: CompletionContext - ): ProviderResult { - return this.impl.provideCompletionItems(document, position, token, context); - } - public resolveCompletionItem(item: CompletionItem, token: CancellationToken): ProviderResult { - if (this.impl.resolveCompletionItem) { - return this.impl.resolveCompletionItem(item, token); - } - } - public provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { - return this.impl.provideCodeLenses(document, token); - } - public provideDocumentSymbols( - document: TextDocument, - token: CancellationToken - ): ProviderResult { - return this.impl.provideDocumentSymbols(document, token); - } - public provideSignatureHelp( - document: TextDocument, - position: Position, - token: CancellationToken, - context: SignatureHelpContext - ): ProviderResult { - return this.impl.provideSignatureHelp(document, position, token, context); - } -} diff --git a/src/client/activation/requirementsTxtLinkActivator.ts b/src/client/activation/requirementsTxtLinkActivator.ts new file mode 100644 index 000000000000..fcb6b72e545e --- /dev/null +++ b/src/client/activation/requirementsTxtLinkActivator.ts @@ -0,0 +1,26 @@ +import { injectable } from 'inversify'; +import { Hover, languages, TextDocument, Position } from 'vscode'; +import { IExtensionSingleActivationService } from './types'; + +const PYPI_PROJECT_URL = 'https://pypi.org/project'; + +export function generatePyPiLink(name: string): string | null { + // Regex to allow to find every possible pypi package (base regex from https://peps.python.org/pep-0508/#names) + const projectName = name.match(/^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*)($|=| |;|\[)/i); + return projectName ? `${PYPI_PROJECT_URL}/${projectName[1]}/` : null; +} + +@injectable() +export class RequirementsTxtLinkActivator implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: true, virtualWorkspace: true }; + + // eslint-disable-next-line class-methods-use-this + public async activate(): Promise { + languages.registerHoverProvider([{ pattern: '**/*requirement*.txt' }, { pattern: '**/requirements/*.txt' }], { + provideHover(document: TextDocument, position: Position) { + const link = generatePyPiLink(document.lineAt(position.line).text); + return link ? new Hover(link) : null; + }, + }); + } +} diff --git a/src/client/activation/serviceRegistry.ts b/src/client/activation/serviceRegistry.ts index 21897a0617e4..875afa12f0b4 100644 --- a/src/client/activation/serviceRegistry.ts +++ b/src/client/activation/serviceRegistry.ts @@ -1,216 +1,43 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { ActiveResourceService } from '../common/application/activeResource'; -import { IActiveResourceService } from '../common/application/types'; -import { registerTypes as registerDotNetTypes } from '../common/dotnet/serviceRegistry'; -import { INugetRepository } from '../common/nuget/types'; -import { - BANNER_NAME_DS_SURVEY, - BANNER_NAME_INTERACTIVE_SHIFTENTER, - BANNER_NAME_LS_SURVEY, - BANNER_NAME_PROPOSE_LS, - IPythonExtensionBanner -} from '../common/types'; -import { DataScienceSurveyBanner } from '../datascience/dataScienceSurveyBanner'; -import { InteractiveShiftEnterBanner } from '../datascience/shiftEnterBanner'; + import { IServiceManager } from '../ioc/types'; -import { LanguageServerSurveyBanner } from '../languageServices/languageServerSurveyBanner'; -import { ProposeLanguageServerBanner } from '../languageServices/proposeLanguageServerBanner'; -import { AATesting } from './aaTesting'; import { ExtensionActivationManager } from './activationManager'; -import { LanguageServerExtensionActivationService } from './activationService'; -import { DownloadBetaChannelRule, DownloadDailyChannelRule } from './common/downloadChannelRules'; -import { LanguageServerDownloader } from './common/downloader'; -import { LanguageServerDownloadChannel } from './common/packageRepository'; import { ExtensionSurveyPrompt } from './extensionSurvey'; -import { JediExtensionActivator } from './jedi'; -import { DotNetLanguageServerActivator } from './languageServer/activator'; -import { LanguageServerAnalysisOptions } from './languageServer/analysisOptions'; -import { DotNetLanguageClientFactory } from './languageServer/languageClientFactory'; -import { LanguageServerCompatibilityService } from './languageServer/languageServerCompatibilityService'; -import { LanguageServerExtension } from './languageServer/languageServerExtension'; -import { DotNetLanguageServerFolderService } from './languageServer/languageServerFolderService'; -import { - BetaDotNetLanguageServerPackageRepository, - DailyDotNetLanguageServerPackageRepository, - StableDotNetLanguageServerPackageRepository -} from './languageServer/languageServerPackageRepository'; -import { DotNetLanguageServerPackageService } from './languageServer/languageServerPackageService'; -import { DotNetLanguageServerProxy } from './languageServer/languageServerProxy'; -import { DotNetLanguageServerManager } from './languageServer/manager'; -import { LanguageServerOutputChannel } from './languageServer/outputChannel'; -import { PlatformData } from './languageServer/platformData'; -import { NodeLanguageServerActivator } from './node/activator'; -import { NodeLanguageClientFactory } from './node/languageClientFactory'; -import { NodeLanguageServerFolderService } from './node/languageServerFolderService'; +import { LanguageServerOutputChannel } from './common/outputChannel'; import { - BetaNodeLanguageServerPackageRepository, - DailyNodeLanguageServerPackageRepository, - StableNodeLanguageServerPackageRepository -} from './node/languageServerPackageRepository'; -import { NodeLanguageServerPackageService } from './node/languageServerPackageService'; -import { NodeLanguageServerProxy } from './node/languageServerProxy'; -import { NodeLanguageServerManager } from './node/manager'; -import { NoLanguageServerExtensionActivator } from './none/activator'; -import { - IDownloadChannelRule, IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService, - ILanguageClientFactory, - ILanguageServerActivator, - ILanguageServerAnalysisOptions, - ILanguageServerCache, - ILanguageServerCompatibilityService, - ILanguageServerDownloader, - ILanguageServerExtension, - ILanguageServerFolderService, - ILanguageServerManager, ILanguageServerOutputChannel, - ILanguageServerPackageService, - ILanguageServerProxy, - IPlatformData, - LanguageServerType } from './types'; +import { LoadLanguageServerExtension } from './common/loadLanguageServerExtension'; +import { PartialModeStatusItem } from './partialModeStatus'; +import { ILanguageServerWatcher } from '../languageServer/types'; +import { LanguageServerWatcher } from '../languageServer/watcher'; +import { RequirementsTxtLinkActivator } from './requirementsTxtLinkActivator'; -// tslint:disable-next-line: max-func-body-length -export function registerTypes(serviceManager: IServiceManager, languageServerType: LanguageServerType) { - serviceManager.addSingleton(ILanguageServerCache, LanguageServerExtensionActivationService); - serviceManager.addBinding(ILanguageServerCache, IExtensionActivationService); - serviceManager.addSingleton(ILanguageServerExtension, LanguageServerExtension); +export function registerTypes(serviceManager: IServiceManager): void { + serviceManager.addSingleton(IExtensionActivationService, PartialModeStatusItem); serviceManager.add(IExtensionActivationManager, ExtensionActivationManager); - - serviceManager.add( - ILanguageServerActivator, - JediExtensionActivator, - LanguageServerType.Jedi - ); - serviceManager.add(ILanguageServerAnalysisOptions, LanguageServerAnalysisOptions); - - serviceManager.addSingleton( - IPythonExtensionBanner, - LanguageServerSurveyBanner, - BANNER_NAME_LS_SURVEY - ); - serviceManager.addSingleton( - IPythonExtensionBanner, - ProposeLanguageServerBanner, - BANNER_NAME_PROPOSE_LS + serviceManager.addSingleton( + ILanguageServerOutputChannel, + LanguageServerOutputChannel, ); - serviceManager.addSingleton( - IPythonExtensionBanner, - DataScienceSurveyBanner, - BANNER_NAME_DS_SURVEY + serviceManager.addSingleton( + IExtensionSingleActivationService, + ExtensionSurveyPrompt, ); - serviceManager.addSingleton( - IPythonExtensionBanner, - InteractiveShiftEnterBanner, - BANNER_NAME_INTERACTIVE_SHIFTENTER + serviceManager.addSingleton( + IExtensionSingleActivationService, + LoadLanguageServerExtension, ); - if (languageServerType === LanguageServerType.Microsoft) { - serviceManager.add( - ILanguageServerActivator, - DotNetLanguageServerActivator, - LanguageServerType.Microsoft - ); - serviceManager.addSingleton( - INugetRepository, - StableDotNetLanguageServerPackageRepository, - LanguageServerDownloadChannel.stable - ); - serviceManager.addSingleton( - INugetRepository, - BetaDotNetLanguageServerPackageRepository, - LanguageServerDownloadChannel.beta - ); - serviceManager.addSingleton( - INugetRepository, - DailyDotNetLanguageServerPackageRepository, - LanguageServerDownloadChannel.daily - ); - serviceManager.addSingleton( - ILanguageServerCompatibilityService, - LanguageServerCompatibilityService - ); - serviceManager.addSingleton(ILanguageClientFactory, DotNetLanguageClientFactory); - serviceManager.addSingleton(IPlatformData, PlatformData); - serviceManager.add(ILanguageServerManager, DotNetLanguageServerManager); - serviceManager.add(ILanguageServerProxy, DotNetLanguageServerProxy); - serviceManager.addSingleton( - ILanguageServerFolderService, - DotNetLanguageServerFolderService - ); - serviceManager.addSingleton( - ILanguageServerPackageService, - DotNetLanguageServerPackageService - ); - registerDotNetTypes(serviceManager); - } else if (languageServerType === LanguageServerType.Node) { - serviceManager.add( - ILanguageServerActivator, - NodeLanguageServerActivator, - LanguageServerType.Node - ); - serviceManager.addSingleton( - INugetRepository, - StableNodeLanguageServerPackageRepository, - LanguageServerDownloadChannel.stable - ); - serviceManager.addSingleton( - INugetRepository, - BetaNodeLanguageServerPackageRepository, - LanguageServerDownloadChannel.beta - ); - serviceManager.addSingleton( - INugetRepository, - DailyNodeLanguageServerPackageRepository, - LanguageServerDownloadChannel.daily - ); - serviceManager.addSingleton(ILanguageClientFactory, NodeLanguageClientFactory); - serviceManager.add(ILanguageServerManager, NodeLanguageServerManager); - serviceManager.add(ILanguageServerProxy, NodeLanguageServerProxy); - serviceManager.addSingleton( - ILanguageServerFolderService, - NodeLanguageServerFolderService - ); - serviceManager.addSingleton( - ILanguageServerPackageService, - NodeLanguageServerPackageService - ); - } else if (languageServerType === LanguageServerType.None) { - serviceManager.add( - ILanguageServerActivator, - NoLanguageServerExtensionActivator, - LanguageServerType.None - ); - } - - serviceManager.addSingleton( - IDownloadChannelRule, - DownloadDailyChannelRule, - LanguageServerDownloadChannel.daily - ); - serviceManager.addSingleton( - IDownloadChannelRule, - DownloadBetaChannelRule, - LanguageServerDownloadChannel.beta - ); - serviceManager.addSingleton( - IDownloadChannelRule, - DownloadBetaChannelRule, - LanguageServerDownloadChannel.stable - ); - serviceManager.addSingleton(ILanguageServerDownloader, LanguageServerDownloader); + serviceManager.addSingleton(ILanguageServerWatcher, LanguageServerWatcher); + serviceManager.addBinding(ILanguageServerWatcher, IExtensionActivationService); - serviceManager.addSingleton( - ILanguageServerOutputChannel, - LanguageServerOutputChannel - ); serviceManager.addSingleton( IExtensionSingleActivationService, - ExtensionSurveyPrompt + RequirementsTxtLinkActivator, ); - serviceManager.addSingleton(IActiveResourceService, ActiveResourceService); - serviceManager.addSingleton(IExtensionSingleActivationService, AATesting); } diff --git a/src/client/activation/types.ts b/src/client/activation/types.ts index c5e685cfd498..e3b9b818691a 100644 --- a/src/client/activation/types.ts +++ b/src/client/activation/types.ts @@ -1,229 +1,110 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { SemVer } from 'semver'; -import { - CodeLensProvider, - CompletionItemProvider, - DefinitionProvider, - DocumentSymbolProvider, - Event, - HoverProvider, - ReferenceProvider, - RenameProvider, - SignatureHelpProvider, - TextDocument, - TextDocumentContentChangeEvent -} from 'vscode'; -import { LanguageClient, LanguageClientOptions } from 'vscode-languageclient'; -import { NugetPackage } from '../common/nuget/types'; -import { IDisposable, IOutputChannel, LanguageServerDownloadChannels, Resource } from '../common/types'; -import { PythonInterpreter } from '../interpreter/contracts'; - -export const IExtensionActivationManager = Symbol('IExtensionActivationManager'); -/** - * Responsible for activation of extension. - * - * @export - * @interface IExtensionActivationManager - * @extends {IDisposable} - */ -export interface IExtensionActivationManager extends IDisposable { - /** - * Method invoked when extension activates (invoked once). - * - * @returns {Promise} - * @memberof IExtensionActivationManager - */ - activate(): Promise; - /** - * Method invoked when a workspace is loaded. - * This is where we place initialization scripts for each workspace. - * (e.g. if we need to run code for each workspace, then this is where that happens). - * - * @param {Resource} resource - * @returns {Promise} - * @memberof IExtensionActivationManager - */ - activateWorkspace(resource: Resource): Promise; -} - -export const IExtensionActivationService = Symbol('IExtensionActivationService'); -/** - * Classes implementing this interface will have their `activate` methods - * invoked for every workspace folder (in multi-root workspace folders) during the activation of the extension. - * This is a great hook for extension activation code, i.e. you don't need to modify - * the `extension.ts` file to invoke some code when extension gets activated. - * @export - * @interface IExtensionActivationService - */ -export interface IExtensionActivationService { - activate(resource: Resource): Promise; -} - -export enum LanguageServerType { - Jedi = 'Jedi', - Microsoft = 'Microsoft', - Node = 'Node', - None = 'None' -} - -// tslint:disable-next-line: interface-name -export interface DocumentHandler { - handleOpen(document: TextDocument): void; - handleChanges(document: TextDocument, changes: TextDocumentContentChangeEvent[]): void; -} - -// tslint:disable-next-line: interface-name -export interface LanguageServerCommandHandler { - clearAnalysisCache(): void; -} - -export interface ILanguageServer - extends RenameProvider, - DefinitionProvider, - HoverProvider, - ReferenceProvider, - CompletionItemProvider, - CodeLensProvider, - DocumentSymbolProvider, - SignatureHelpProvider, - Partial, - Partial, - IDisposable {} - -export const ILanguageServerActivator = Symbol('ILanguageServerActivator'); -export interface ILanguageServerActivator extends ILanguageServer { - start(resource: Resource, interpreter: PythonInterpreter | undefined): Promise; - activate(): void; - deactivate(): void; -} - -export const ILanguageServerCache = Symbol('ILanguageServerCache'); -export interface ILanguageServerCache { - get(resource: Resource, interpreter?: PythonInterpreter): Promise; -} - -export type FolderVersionPair = { path: string; version: SemVer }; -export const ILanguageServerFolderService = Symbol('ILanguageServerFolderService'); - -export interface ILanguageServerFolderService { - getLanguageServerFolderName(resource: Resource): Promise; - getLatestLanguageServerVersion(resource: Resource): Promise; - getCurrentLanguageServerDirectory(): Promise; -} - -export const ILanguageServerDownloader = Symbol('ILanguageServerDownloader'); - -export interface ILanguageServerDownloader { - downloadLanguageServer(destinationFolder: string, resource: Resource): Promise; -} - -export const ILanguageServerPackageService = Symbol('ILanguageServerPackageService'); -export interface ILanguageServerPackageService { - getNugetPackageName(): string; - getLatestNugetPackageVersion(resource: Resource, minVersion?: string): Promise; - getLanguageServerDownloadChannel(): LanguageServerDownloadChannels; -} - -export const MajorLanguageServerVersion = Symbol('MajorLanguageServerVersion'); -export const IDownloadChannelRule = Symbol('IDownloadChannelRule'); -export interface IDownloadChannelRule { - shouldLookForNewLanguageServer(currentFolder?: FolderVersionPair): Promise; -} -export const ILanguageServerCompatibilityService = Symbol('ILanguageServerCompatibilityService'); -export interface ILanguageServerCompatibilityService { - isSupported(): Promise; -} -export enum LanguageClientFactory { - base = 'base', - simple = 'simple', - downloaded = 'downloaded' -} -export const ILanguageClientFactory = Symbol('ILanguageClientFactory'); -export interface ILanguageClientFactory { - createLanguageClient( - resource: Resource, - interpreter: PythonInterpreter | undefined, - clientOptions: LanguageClientOptions, - env?: NodeJS.ProcessEnv - ): Promise; -} -export const ILanguageServerAnalysisOptions = Symbol('ILanguageServerAnalysisOptions'); -export interface ILanguageServerAnalysisOptions extends IDisposable { - readonly onDidChange: Event; - initialize(resource: Resource, interpreter: PythonInterpreter | undefined): Promise; - getAnalysisOptions(): Promise; -} -export const ILanguageServerManager = Symbol('ILanguageServerManager'); -export interface ILanguageServerManager extends IDisposable { - readonly languageProxy: ILanguageServerProxy | undefined; - start(resource: Resource, interpreter: PythonInterpreter | undefined): Promise; - connect(): void; - disconnect(): void; -} -export const ILanguageServerExtension = Symbol('ILanguageServerExtension'); -export interface ILanguageServerExtension extends IDisposable { - readonly invoked: Event; - loadExtensionArgs?: {}; - register(): void; -} -export const ILanguageServerProxy = Symbol('ILanguageServerProxy'); -export interface ILanguageServerProxy extends IDisposable { - /** - * LanguageClient in use - */ - languageClient: LanguageClient | undefined; - start( - resource: Resource, - interpreter: PythonInterpreter | undefined, - options: LanguageClientOptions - ): Promise; - /** - * Sends a request to LS so as to load other extensions. - * This is used as a plugin loader mechanism. - * Anyone (such as intellicode) wanting to interact with LS, needs to send this request to LS. - * @param {{}} [args] - * @memberof ILanguageServerProxy - */ - loadExtension(args?: {}): void; -} - -export enum PlatformName { - Windows32Bit = 'win-x86', - Windows64Bit = 'win-x64', - Mac64Bit = 'osx-x64', - Linux64Bit = 'linux-x64' -} -export const IPlatformData = Symbol('IPlatformData'); -export interface IPlatformData { - readonly platformName: PlatformName; - readonly engineDllName: string; - readonly engineExecutableName: string; -} - -export const ILanguageServerOutputChannel = Symbol('ILanguageServerOutputChannel'); -export interface ILanguageServerOutputChannel { - /** - * Creates output channel if necessary and returns it - * - * @type {IOutputChannel} - * @memberof ILanguageServerOutputChannel - */ - readonly channel: IOutputChannel; -} - -export const IExtensionSingleActivationService = Symbol('IExtensionSingleActivationService'); -/** - * Classes implementing this interface will have their `activate` methods - * invoked during the activation of the extension. - * This is a great hook for extension activation code, i.e. you don't need to modify - * the `extension.ts` file to invoke some code when extension gets activated. - * @export - * @interface IExtensionSingleActivationService - */ -export interface IExtensionSingleActivationService { - activate(): Promise; -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { Event } from 'vscode'; +import { LanguageClient, LanguageClientOptions } from 'vscode-languageclient/node'; +import type { IDisposable, ILogOutputChannel, Resource } from '../common/types'; +import { StopWatch } from '../common/utils/stopWatch'; +import { PythonEnvironment } from '../pythonEnvironments/info'; + +export const IExtensionActivationManager = Symbol('IExtensionActivationManager'); +/** + * Responsible for activation of extension. + */ +export interface IExtensionActivationManager extends IDisposable { + // Method invoked when extension activates (invoked once). + activate(startupStopWatch: StopWatch): Promise; + /** + * Method invoked when a workspace is loaded. + * This is where we place initialization scripts for each workspace. + * (e.g. if we need to run code for each workspace, then this is where that happens). + */ + activateWorkspace(resource: Resource): Promise; +} + +export const IExtensionActivationService = Symbol('IExtensionActivationService'); +/** + * Classes implementing this interface will have their `activate` methods + * invoked for every workspace folder (in multi-root workspace folders) during the activation of the extension. + * This is a great hook for extension activation code, i.e. you don't need to modify + * the `extension.ts` file to invoke some code when extension gets activated. + */ +export interface IExtensionActivationService { + supportedWorkspaceTypes: { untrustedWorkspace: boolean; virtualWorkspace: boolean }; + activate(resource: Resource, startupStopWatch?: StopWatch): Promise; +} + +export enum LanguageServerType { + Jedi = 'Jedi', + JediLSP = 'JediLSP', + Microsoft = 'Microsoft', + Node = 'Pylance', + None = 'None', +} + +export const ILanguageServerActivator = Symbol('ILanguageServerActivator'); +export interface ILanguageServerActivator { + start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise; + activate(): void; + deactivate(): void; +} + +export const ILanguageClientFactory = Symbol('ILanguageClientFactory'); +export interface ILanguageClientFactory { + createLanguageClient( + resource: Resource, + interpreter: PythonEnvironment | undefined, + clientOptions: LanguageClientOptions, + env?: NodeJS.ProcessEnv, + ): Promise; +} +export const ILanguageServerAnalysisOptions = Symbol('ILanguageServerAnalysisOptions'); +export interface ILanguageServerAnalysisOptions extends IDisposable { + readonly onDidChange: Event; + initialize(resource: Resource, interpreter: PythonEnvironment | undefined): Promise; + getAnalysisOptions(): Promise; +} +export const ILanguageServerManager = Symbol('ILanguageServerManager'); +export interface ILanguageServerManager extends IDisposable { + start(resource: Resource, interpreter: PythonEnvironment | undefined): Promise; + connect(): void; + disconnect(): void; +} + +export const ILanguageServerProxy = Symbol('ILanguageServerProxy'); +export interface ILanguageServerProxy extends IDisposable { + start( + resource: Resource, + interpreter: PythonEnvironment | undefined, + options: LanguageClientOptions, + ): Promise; + stop(): Promise; + /** + * Sends a request to LS so as to load other extensions. + * This is used as a plugin loader mechanism. + * Anyone (such as intellicode) wanting to interact with LS, needs to send this request to LS. + */ + loadExtension(args?: unknown): void; +} + +export const ILanguageServerOutputChannel = Symbol('ILanguageServerOutputChannel'); +export interface ILanguageServerOutputChannel { + /** + * Creates output channel if necessary and returns it + */ + readonly channel: ILogOutputChannel; +} + +export const IExtensionSingleActivationService = Symbol('IExtensionSingleActivationService'); +/** + * Classes implementing this interface will have their `activate` methods + * invoked during the activation of the extension. + * This is a great hook for extension activation code, i.e. you don't need to modify + * the `extension.ts` file to invoke some code when extension gets activated. + */ +export interface IExtensionSingleActivationService { + supportedWorkspaceTypes: { untrustedWorkspace: boolean; virtualWorkspace: boolean }; + activate(): Promise; +} diff --git a/src/client/api.ts b/src/client/api.ts index 82f56db5ca73..908da4be7103 100644 --- a/src/client/api.ts +++ b/src/client/api.ts @@ -1,72 +1,169 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. 'use strict'; -import { DebugAdapterNewPtvsd } from './common/experimentGroups'; -import { traceError } from './common/logger'; -import { IExperimentsManager } from './common/types'; -import { RemoteDebuggerExternalLauncherScriptProvider } from './debugger/debugAdapter/DebugClients/launcherProvider'; -import { IDebugAdapterDescriptorFactory } from './debugger/extension/types'; +import { Uri, Event } from 'vscode'; +import { BaseLanguageClient, LanguageClientOptions } from 'vscode-languageclient'; +import { LanguageClient } from 'vscode-languageclient/node'; +import { PYLANCE_NAME } from './activation/node/languageClientFactory'; +import { ILanguageServerOutputChannel } from './activation/types'; +import { PythonExtension } from './api/types'; +import { isTestExecution, PYTHON_LANGUAGE } from './common/constants'; +import { IConfigurationService, Resource } from './common/types'; +import { getDebugpyLauncherArgs } from './debugger/extension/adapter/remoteLaunchers'; +import { IInterpreterService } from './interpreter/contracts'; +import { IServiceContainer, IServiceManager } from './ioc/types'; +import { + JupyterExtensionIntegration, + JupyterExtensionPythonEnvironments, + JupyterPythonEnvironmentApi, +} from './jupyter/jupyterIntegration'; +import { traceError } from './logging'; +import { IDiscoveryAPI } from './pythonEnvironments/base/locator'; +import { buildEnvironmentApi } from './environmentApi'; +import { ApiForPylance } from './pylanceApi'; +import { getTelemetryReporter } from './telemetry'; +import { TensorboardExtensionIntegration } from './tensorBoard/tensorboardIntegration'; +import { getDebugpyPath } from './debugger/pythonDebugger'; -/* - * Do not introduce any breaking changes to this API. - * This is the public API for other extensions to interact with this extension. - */ +export function buildApi( + ready: Promise, + serviceManager: IServiceManager, + serviceContainer: IServiceContainer, + discoveryApi: IDiscoveryAPI, +): PythonExtension { + const configurationService = serviceContainer.get(IConfigurationService); + const interpreterService = serviceContainer.get(IInterpreterService); + serviceManager.addSingleton(JupyterExtensionIntegration, JupyterExtensionIntegration); + serviceManager.addSingleton( + JupyterExtensionPythonEnvironments, + JupyterExtensionPythonEnvironments, + ); + serviceManager.addSingleton( + TensorboardExtensionIntegration, + TensorboardExtensionIntegration, + ); + const jupyterPythonEnvApi = serviceContainer.get(JupyterExtensionPythonEnvironments); + const environments = buildEnvironmentApi(discoveryApi, serviceContainer, jupyterPythonEnvApi); + const jupyterIntegration = serviceContainer.get(JupyterExtensionIntegration); + jupyterIntegration.registerEnvApi(environments); + const tensorboardIntegration = serviceContainer.get( + TensorboardExtensionIntegration, + ); + const outputChannel = serviceContainer.get(ILanguageServerOutputChannel); -export interface IExtensionApi { - /** - * Promise indicating whether all parts of the extension have completed loading or not. - * @type {Promise} - * @memberof IExtensionApi - */ - ready: Promise; - debug: { + const api: PythonExtension & { /** - * Generate an array of strings for commands to pass to the Python executable to launch the debugger for remote debugging. - * Users can append another array of strings of what they want to execute along with relevant arguments to Python. - * E.g `['/Users/..../pythonVSCode/pythonFiles/ptvsd_launcher.py', '--host', 'localhost', '--port', '57039', '--wait']` - * @param {string} host - * @param {number} port - * @param {boolean} [waitUntilDebuggerAttaches=true] - * @returns {Promise} + * Internal API just for Jupyter, hence don't include in the official types. */ - getRemoteLauncherCommand(host: string, port: number, waitUntilDebuggerAttaches: boolean): Promise; - }; -} - -export function buildApi( - // tslint:disable-next-line:no-any - ready: Promise, - experimentsManager: IExperimentsManager, - debugFactory: IDebugAdapterDescriptorFactory -) { - return { + jupyter: { + registerHooks(): void; + }; + /** + * Internal API just for Tensorboard, hence don't include in the official types. + */ + tensorboard: { + registerHooks(): void; + }; + } & { + /** + * @deprecated Temporarily exposed for Pylance until we expose this API generally. Will be removed in an + * iteration or two. + */ + pylance: ApiForPylance; + } & { + /** + * @deprecated Use PythonExtension.environments API instead. + * + * Return internal settings within the extension which are stored in VSCode storage + */ + settings: { + /** + * An event that is emitted when execution details (for a resource) change. For instance, when interpreter configuration changes. + */ + readonly onDidChangeExecutionDetails: Event; + /** + * Returns all the details the consumer needs to execute code within the selected environment, + * corresponding to the specified resource taking into account any workspace-specific settings + * for the workspace to which this resource belongs. + * @param {Resource} [resource] A resource for which the setting is asked for. + * * When no resource is provided, the setting scoped to the first workspace folder is returned. + * * If no folder is present, it returns the global setting. + */ + getExecutionDetails( + resource?: Resource, + ): { + /** + * E.g of execution commands returned could be, + * * `['']` + * * `['']` + * * `['conda', 'run', 'python']` which is used to run from within Conda environments. + * or something similar for some other Python environments. + * + * @type {(string[] | undefined)} When return value is `undefined`, it means no interpreter is set. + * Otherwise, join the items returned using space to construct the full execution command. + */ + execCommand: string[] | undefined; + }; + }; + } = { // 'ready' will propagate the exception, but we must log it here first. - ready: ready.catch(ex => { + ready: ready.catch((ex) => { traceError('Failure during activation.', ex); return Promise.reject(ex); }), + jupyter: { + registerHooks: () => jupyterIntegration.integrateWithJupyterExtension(), + }, + tensorboard: { + registerHooks: () => tensorboardIntegration.integrateWithTensorboardExtension(), + }, debug: { async getRemoteLauncherCommand( host: string, port: number, - waitUntilDebuggerAttaches: boolean = true + waitUntilDebuggerAttaches = true, ): Promise { - const useNewDAPtvsd = experimentsManager.inExperiment(DebugAdapterNewPtvsd.experiment); - - if (useNewDAPtvsd) { - // Same logic as in RemoteDebuggerExternalLauncherScriptProvider, but eventually launcherProvider.ts will be deleted. - const args = debugFactory.getRemotePtvsdArgs({ host, port, waitUntilDebuggerAttaches }); - return [debugFactory.getPtvsdPath(), ...args]; - } - - return new RemoteDebuggerExternalLauncherScriptProvider().getLauncherArgs({ + return getDebugpyLauncherArgs({ host, port, - waitUntilDebuggerAttaches + waitUntilDebuggerAttaches, }); - } - } + }, + async getDebuggerPackagePath(): Promise { + return getDebugpyPath(); + }, + }, + settings: { + onDidChangeExecutionDetails: interpreterService.onDidChangeInterpreterConfiguration, + getExecutionDetails(resource?: Resource) { + const { pythonPath } = configurationService.getSettings(resource); + // If pythonPath equals an empty string, no interpreter is set. + return { execCommand: pythonPath === '' ? undefined : [pythonPath] }; + }, + }, + pylance: { + createClient: (...args: any[]): BaseLanguageClient => { + // Make sure we share output channel so that we can share one with + // Jedi as well. + const clientOptions = args[1] as LanguageClientOptions; + clientOptions.outputChannel = clientOptions.outputChannel ?? outputChannel.channel; + + return new LanguageClient(PYTHON_LANGUAGE, PYLANCE_NAME, args[0], clientOptions); + }, + start: (client: BaseLanguageClient): Promise => client.start(), + stop: (client: BaseLanguageClient): Promise => client.stop(), + getTelemetryReporter: () => getTelemetryReporter(), + }, + environments, }; + + // In test environment return the DI Container. + if (isTestExecution()) { + (api as any).serviceContainer = serviceContainer; + (api as any).serviceManager = serviceManager; + } + return api; } diff --git a/src/client/api/types.ts b/src/client/api/types.ts new file mode 100644 index 000000000000..95556aacbd90 --- /dev/null +++ b/src/client/api/types.ts @@ -0,0 +1,349 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { CancellationToken, Event, Uri, WorkspaceFolder, extensions } from 'vscode'; + +/* + * Do not introduce any breaking changes to this API. + * This is the public API for other extensions to interact with this extension. + */ +export interface PythonExtension { + /** + * Promise indicating whether all parts of the extension have completed loading or not. + */ + ready: Promise; + debug: { + /** + * Generate an array of strings for commands to pass to the Python executable to launch the debugger for remote debugging. + * Users can append another array of strings of what they want to execute along with relevant arguments to Python. + * E.g `['/Users/..../pythonVSCode/python_files/lib/python/debugpy', '--listen', 'localhost:57039', '--wait-for-client']` + * @param host + * @param port + * @param waitUntilDebuggerAttaches Defaults to `true`. + */ + getRemoteLauncherCommand(host: string, port: number, waitUntilDebuggerAttaches: boolean): Promise; + + /** + * Gets the path to the debugger package used by the extension. + */ + getDebuggerPackagePath(): Promise; + }; + + /** + * These APIs provide a way for extensions to work with by python environments available in the user's machine + * as found by the Python extension. See + * https://github.com/microsoft/vscode-python/wiki/Python-Environment-APIs for usage examples and more. + */ + readonly environments: { + /** + * Returns the environment configured by user in settings. Note that this can be an invalid environment, use + * {@link resolveEnvironment} to get full details. + * @param resource : Uri of a file or workspace folder. This is used to determine the env in a multi-root + * scenario. If `undefined`, then the API returns what ever is set for the workspace. + */ + getActiveEnvironmentPath(resource?: Resource): EnvironmentPath; + /** + * Sets the active environment path for the python extension for the resource. Configuration target will always + * be the workspace folder. + * @param environment : If string, it represents the full path to environment folder or python executable + * for the environment. Otherwise it can be {@link Environment} or {@link EnvironmentPath} itself. + * @param resource : [optional] File or workspace to scope to a particular workspace folder. + */ + updateActiveEnvironmentPath( + environment: string | EnvironmentPath | Environment, + resource?: Resource, + ): Promise; + /** + * This event is triggered when the active environment setting changes. + */ + readonly onDidChangeActiveEnvironmentPath: Event; + /** + * Carries environments known to the extension at the time of fetching the property. Note this may not + * contain all environments in the system as a refresh might be going on. + * + * Only reports environments in the current workspace. + */ + readonly known: readonly Environment[]; + /** + * This event is triggered when the known environment list changes, like when a environment + * is found, existing environment is removed, or some details changed on an environment. + */ + readonly onDidChangeEnvironments: Event; + /** + * This API will trigger environment discovery, but only if it has not already happened in this VSCode session. + * Useful for making sure env list is up-to-date when the caller needs it for the first time. + * + * To force trigger a refresh regardless of whether a refresh was already triggered, see option + * {@link RefreshOptions.forceRefresh}. + * + * Note that if there is a refresh already going on then this returns the promise for that refresh. + * @param options Additional options for refresh. + * @param token A cancellation token that indicates a refresh is no longer needed. + */ + refreshEnvironments(options?: RefreshOptions, token?: CancellationToken): Promise; + /** + * Returns details for the given environment, or `undefined` if the env is invalid. + * @param environment : If string, it represents the full path to environment folder or python executable + * for the environment. Otherwise it can be {@link Environment} or {@link EnvironmentPath} itself. + */ + resolveEnvironment( + environment: Environment | EnvironmentPath | string, + ): Promise; + /** + * Returns the environment variables used by the extension for a resource, which includes the custom + * variables configured by user in `.env` files. + * @param resource : Uri of a file or workspace folder. This is used to determine the env in a multi-root + * scenario. If `undefined`, then the API returns what ever is set for the workspace. + */ + getEnvironmentVariables(resource?: Resource): EnvironmentVariables; + /** + * This event is fired when the environment variables for a resource change. Note it's currently not + * possible to detect if environment variables in the system change, so this only fires if custom + * environment variables are updated in `.env` files. + */ + readonly onDidEnvironmentVariablesChange: Event; + }; +} + +export type RefreshOptions = { + /** + * When `true`, force trigger a refresh regardless of whether a refresh was already triggered. Note this can be expensive so + * it's best to only use it if user manually triggers a refresh. + */ + forceRefresh?: boolean; +}; + +/** + * Details about the environment. Note the environment folder, type and name never changes over time. + */ +export type Environment = EnvironmentPath & { + /** + * Carries details about python executable. + */ + readonly executable: { + /** + * Uri of the python interpreter/executable. Carries `undefined` in case an executable does not belong to + * the environment. + */ + readonly uri: Uri | undefined; + /** + * Bitness if known at this moment. + */ + readonly bitness: Bitness | undefined; + /** + * Value of `sys.prefix` in sys module if known at this moment. + */ + readonly sysPrefix: string | undefined; + }; + /** + * Carries details if it is an environment, otherwise `undefined` in case of global interpreters and others. + */ + readonly environment: + | { + /** + * Type of the environment. + */ + readonly type: EnvironmentType; + /** + * Name to the environment if any. + */ + readonly name: string | undefined; + /** + * Uri of the environment folder. + */ + readonly folderUri: Uri; + /** + * Any specific workspace folder this environment is created for. + */ + readonly workspaceFolder: WorkspaceFolder | undefined; + } + | undefined; + /** + * Carries Python version information known at this moment, carries `undefined` for envs without python. + */ + readonly version: + | (VersionInfo & { + /** + * Value of `sys.version` in sys module if known at this moment. + */ + readonly sysVersion: string | undefined; + }) + | undefined; + /** + * Tools/plugins which created the environment or where it came from. First value in array corresponds + * to the primary tool which manages the environment, which never changes over time. + * + * Array is empty if no tool is responsible for creating/managing the environment. Usually the case for + * global interpreters. + */ + readonly tools: readonly EnvironmentTools[]; +}; + +/** + * Derived form of {@link Environment} where certain properties can no longer be `undefined`. Meant to represent an + * {@link Environment} with complete information. + */ +export type ResolvedEnvironment = Environment & { + /** + * Carries complete details about python executable. + */ + readonly executable: { + /** + * Uri of the python interpreter/executable. Carries `undefined` in case an executable does not belong to + * the environment. + */ + readonly uri: Uri | undefined; + /** + * Bitness of the environment. + */ + readonly bitness: Bitness; + /** + * Value of `sys.prefix` in sys module. + */ + readonly sysPrefix: string; + }; + /** + * Carries complete Python version information, carries `undefined` for envs without python. + */ + readonly version: + | (ResolvedVersionInfo & { + /** + * Value of `sys.version` in sys module if known at this moment. + */ + readonly sysVersion: string; + }) + | undefined; +}; + +export type EnvironmentsChangeEvent = { + readonly env: Environment; + /** + * * "add": New environment is added. + * * "remove": Existing environment in the list is removed. + * * "update": New information found about existing environment. + */ + readonly type: 'add' | 'remove' | 'update'; +}; + +export type ActiveEnvironmentPathChangeEvent = EnvironmentPath & { + /** + * Resource the environment changed for. + */ + readonly resource: Resource | undefined; +}; + +/** + * Uri of a file inside a workspace or workspace folder itself. + */ +export type Resource = Uri | WorkspaceFolder; + +export type EnvironmentPath = { + /** + * The ID of the environment. + */ + readonly id: string; + /** + * Path to environment folder or path to python executable that uniquely identifies an environment. Environments + * lacking a python executable are identified by environment folder paths, whereas other envs can be identified + * using python executable path. + */ + readonly path: string; +}; + +/** + * Tool/plugin where the environment came from. It can be {@link KnownEnvironmentTools} or custom string which + * was contributed. + */ +export type EnvironmentTools = KnownEnvironmentTools | string; +/** + * Tools or plugins the Python extension currently has built-in support for. Note this list is expected to shrink + * once tools have their own separate extensions. + */ +export type KnownEnvironmentTools = + | 'Conda' + | 'Pipenv' + | 'Poetry' + | 'VirtualEnv' + | 'Venv' + | 'VirtualEnvWrapper' + | 'Pyenv' + | 'Hatch' + | 'Unknown'; + +/** + * Type of the environment. It can be {@link KnownEnvironmentTypes} or custom string which was contributed. + */ +export type EnvironmentType = KnownEnvironmentTypes | string; +/** + * Environment types the Python extension is aware of. Note this list is expected to shrink once tools have their + * own separate extensions, in which case they're expected to provide the type themselves. + */ +export type KnownEnvironmentTypes = 'VirtualEnvironment' | 'Conda' | 'Unknown'; + +/** + * Carries bitness for an environment. + */ +export type Bitness = '64-bit' | '32-bit' | 'Unknown'; + +/** + * The possible Python release levels. + */ +export type PythonReleaseLevel = 'alpha' | 'beta' | 'candidate' | 'final'; + +/** + * Release information for a Python version. + */ +export type PythonVersionRelease = { + readonly level: PythonReleaseLevel; + readonly serial: number; +}; + +export type VersionInfo = { + readonly major: number | undefined; + readonly minor: number | undefined; + readonly micro: number | undefined; + readonly release: PythonVersionRelease | undefined; +}; + +export type ResolvedVersionInfo = { + readonly major: number; + readonly minor: number; + readonly micro: number; + readonly release: PythonVersionRelease; +}; + +/** + * A record containing readonly keys. + */ +export type EnvironmentVariables = { readonly [key: string]: string | undefined }; + +export type EnvironmentVariablesChangeEvent = { + /** + * Workspace folder the environment variables changed for. + */ + readonly resource: WorkspaceFolder | undefined; + /** + * Updated value of environment variables. + */ + readonly env: EnvironmentVariables; +}; + +export const PVSC_EXTENSION_ID = 'ms-python.python'; + +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace PythonExtension { + /** + * Returns the API exposed by the Python extension in VS Code. + */ + export async function api(): Promise { + const extension = extensions.getExtension(PVSC_EXTENSION_ID); + if (extension === undefined) { + throw new Error(`Python extension is not installed or is disabled`); + } + if (!extension.isActive) { + await extension.activate(); + } + const pythonApi: PythonExtension = extension.exports; + return pythonApi; + } +} diff --git a/src/client/application/diagnostics/applicationDiagnostics.ts b/src/client/application/diagnostics/applicationDiagnostics.ts index cb676c486c81..90d2ced8d0ae 100644 --- a/src/client/application/diagnostics/applicationDiagnostics.ts +++ b/src/client/application/diagnostics/applicationDiagnostics.ts @@ -1,72 +1,70 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - -import { inject, injectable, named } from 'inversify'; +import { inject, injectable } from 'inversify'; import { DiagnosticSeverity } from 'vscode'; -import { isTestExecution, STANDARD_OUTPUT_CHANNEL } from '../../common/constants'; -import { traceError, traceInfo, traceWarning } from '../../common/logger'; -import { IOutputChannel, Resource } from '../../common/types'; +import { IWorkspaceService } from '../../common/application/types'; +import { isTestExecution } from '../../common/constants'; +import { Resource } from '../../common/types'; import { IServiceContainer } from '../../ioc/types'; +import { traceLog, traceVerbose } from '../../logging'; import { IApplicationDiagnostics } from '../types'; -import { IDiagnostic, IDiagnosticsService, ISourceMapSupportService } from './types'; +import { IDiagnostic, IDiagnosticsService } from './types'; + +function log(diagnostics: IDiagnostic[]): void { + diagnostics.forEach((item) => { + const message = `Diagnostic Code: ${item.code}, Message: ${item.message}`; + switch (item.severity) { + case DiagnosticSeverity.Error: + case DiagnosticSeverity.Warning: { + traceLog(message); + break; + } + default: { + traceVerbose(message); + } + } + }); +} + +async function runDiagnostics(diagnosticServices: IDiagnosticsService[], resource: Resource): Promise { + await Promise.all( + diagnosticServices.map(async (diagnosticService) => { + const diagnostics = await diagnosticService.diagnose(resource); + if (diagnostics.length > 0) { + log(diagnostics); + await diagnosticService.handle(diagnostics); + } + }), + ); +} @injectable() export class ApplicationDiagnostics implements IApplicationDiagnostics { - constructor( - @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, - @inject(IOutputChannel) @named(STANDARD_OUTPUT_CHANNEL) private readonly outputChannel: IOutputChannel - ) {} - public register() { - this.serviceContainer.get(ISourceMapSupportService).register(); - } + constructor(@inject(IServiceContainer) private readonly serviceContainer: IServiceContainer) {} + + public register() {} + public async performPreStartupHealthCheck(resource: Resource): Promise { // When testing, do not perform health checks, as modal dialogs can be displayed. if (isTestExecution()) { return; } - const services = this.serviceContainer.getAll(IDiagnosticsService); + let services = this.serviceContainer.getAll(IDiagnosticsService); + const workspaceService = this.serviceContainer.get(IWorkspaceService); + if (!workspaceService.isTrusted) { + services = services.filter((item) => item.runInUntrustedWorkspace); + } // Perform these validation checks in the foreground. - await this.runDiagnostics( - services.filter(item => !item.runInBackground), - resource + await runDiagnostics( + services.filter((item) => !item.runInBackground), + resource, ); + // Perform these validation checks in the background. - this.runDiagnostics( - services.filter(item => item.runInBackground), - resource + runDiagnostics( + services.filter((item) => item.runInBackground), + resource, ).ignoreErrors(); } - private async runDiagnostics(diagnosticServices: IDiagnosticsService[], resource: Resource): Promise { - await Promise.all( - diagnosticServices.map(async diagnosticService => { - const diagnostics = await diagnosticService.diagnose(resource); - if (diagnostics.length > 0) { - this.log(diagnostics); - await diagnosticService.handle(diagnostics); - } - }) - ); - } - private log(diagnostics: IDiagnostic[]): void { - diagnostics.forEach(item => { - const message = `Diagnostic Code: ${item.code}, Message: ${item.message}`; - switch (item.severity) { - case DiagnosticSeverity.Error: { - traceError(message); - this.outputChannel.appendLine(message); - break; - } - case DiagnosticSeverity.Warning: { - traceWarning(message); - this.outputChannel.appendLine(message); - break; - } - default: { - traceInfo(message); - } - } - }); - } } diff --git a/src/client/application/diagnostics/base.ts b/src/client/application/diagnostics/base.ts index 85af2e18aaed..8ce1c3b83184 100644 --- a/src/client/application/diagnostics/base.ts +++ b/src/client/application/diagnostics/base.ts @@ -7,6 +7,7 @@ import { injectable, unmanaged } from 'inversify'; import { DiagnosticSeverity } from 'vscode'; import { IWorkspaceService } from '../../common/application/types'; import { IDisposable, IDisposableRegistry, Resource } from '../../common/types'; +import { asyncFilter } from '../../common/utils/arrayUtils'; import { IServiceContainer } from '../../ioc/types'; import { sendTelemetryEvent } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; @@ -21,7 +22,8 @@ export abstract class BaseDiagnostic implements IDiagnostic { public readonly severity: DiagnosticSeverity, public readonly scope: DiagnosticScope, public readonly resource: Resource, - public readonly invokeHandler: 'always' | 'default' = 'default' + public readonly shouldShowPrompt = true, + public readonly invokeHandler: 'always' | 'default' = 'default', ) {} } @@ -32,8 +34,9 @@ export abstract class BaseDiagnosticsService implements IDiagnosticsService, IDi constructor( @unmanaged() private readonly supportedDiagnosticCodes: string[], @unmanaged() protected serviceContainer: IServiceContainer, - @unmanaged() disposableRegistry: IDisposableRegistry, - @unmanaged() public readonly runInBackground: Boolean = false + @unmanaged() protected disposableRegistry: IDisposableRegistry, + @unmanaged() public readonly runInBackground: boolean = false, + @unmanaged() public readonly runInUntrustedWorkspace: boolean = false, ) { this.filterService = serviceContainer.get(IDiagnosticFilterService); disposableRegistry.push(this); @@ -46,7 +49,10 @@ export abstract class BaseDiagnosticsService implements IDiagnosticsService, IDi if (diagnostics.length === 0) { return; } - const diagnosticsToHandle = diagnostics.filter(item => { + const diagnosticsToHandle = await asyncFilter(diagnostics, async (item) => { + if (!(await this.canHandle(item))) { + return false; + } if (item.invokeHandler && item.invokeHandler === 'always') { return true; } @@ -61,17 +67,12 @@ export abstract class BaseDiagnosticsService implements IDiagnosticsService, IDi } public async canHandle(diagnostic: IDiagnostic): Promise { sendTelemetryEvent(EventName.DIAGNOSTICS_MESSAGE, undefined, { code: diagnostic.code }); - return this.supportedDiagnosticCodes.filter(item => item === diagnostic.code).length > 0; + return this.supportedDiagnosticCodes.filter((item) => item === diagnostic.code).length > 0; } protected abstract onHandle(diagnostics: IDiagnostic[]): Promise; /** * Returns a key used to keep track of whether a diagnostic was handled or not. * So as to prevent handling/displaying messages multiple times for the same diagnostic. - * - * @protected - * @param {IDiagnostic} diagnostic - * @returns {string} - * @memberof BaseDiagnosticsService */ protected getDiagnosticsKey(diagnostic: IDiagnostic): string { if (diagnostic.scope === DiagnosticScope.Global) { diff --git a/src/client/application/diagnostics/checks/envPathVariable.ts b/src/client/application/diagnostics/checks/envPathVariable.ts index ef31aa3f8601..b8850b8bbeee 100644 --- a/src/client/application/diagnostics/checks/envPathVariable.ts +++ b/src/client/application/diagnostics/checks/envPathVariable.ts @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable } from 'inversify'; import { DiagnosticSeverity } from 'vscode'; import { IApplicationEnvironment } from '../../../common/application/types'; import '../../../common/extensions'; import { IPlatformService } from '../../../common/platform/types'; import { ICurrentProcess, IDisposableRegistry, IPathUtils, Resource } from '../../../common/types'; +import { Common } from '../../../common/utils/localize'; import { IServiceContainer } from '../../../ioc/types'; import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; import { IDiagnosticsCommandFactory } from '../commands/types'; @@ -20,14 +20,14 @@ const InvalidEnvPathVariableMessage = "The environment variable '{0}' seems to have some paths containing the '\"' character." + " The existence of such a character is known to have caused the {1} extension to not load. If the extension fails to load please modify your paths to remove this '\"' character."; -export class InvalidEnvironmentPathVariableDiagnostic extends BaseDiagnostic { +class InvalidEnvironmentPathVariableDiagnostic extends BaseDiagnostic { constructor(message: string, resource: Resource) { super( DiagnosticCodes.InvalidEnvironmentPathVariableDiagnostic, message, DiagnosticSeverity.Warning, DiagnosticScope.Global, - resource + resource, ); } } @@ -37,27 +37,36 @@ export const EnvironmentPathVariableDiagnosticsServiceId = 'EnvironmentPathVaria @injectable() export class EnvironmentPathVariableDiagnosticsService extends BaseDiagnosticsService { protected readonly messageService: IDiagnosticHandlerService; + private readonly platform: IPlatformService; + constructor( @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, ) { - super([DiagnosticCodes.InvalidEnvironmentPathVariableDiagnostic], serviceContainer, disposableRegistry, true); + super( + [DiagnosticCodes.InvalidEnvironmentPathVariableDiagnostic], + serviceContainer, + disposableRegistry, + true, + true, + ); this.platform = this.serviceContainer.get(IPlatformService); this.messageService = serviceContainer.get>( IDiagnosticHandlerService, - DiagnosticCommandPromptHandlerServiceId + DiagnosticCommandPromptHandlerServiceId, ); } + public async diagnose(resource: Resource): Promise { if (this.platform.isWindows && this.doesPathVariableHaveInvalidEntries()) { const env = this.serviceContainer.get(IApplicationEnvironment); const message = InvalidEnvPathVariableMessage.format(this.platform.pathVariableName, env.extensionName); return [new InvalidEnvironmentPathVariableDiagnostic(message, resource)]; - } else { - return []; } + return []; } + protected async onHandle(diagnostics: IDiagnostic[]): Promise { // This class can only handle one type of diagnostic, hence just use first item in list. if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { @@ -70,25 +79,26 @@ export class EnvironmentPathVariableDiagnosticsService extends BaseDiagnosticsSe const commandFactory = this.serviceContainer.get(IDiagnosticsCommandFactory); const options = [ { - prompt: 'Ignore' + prompt: Common.ignore, }, { - prompt: 'Always Ignore', - command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }) + prompt: Common.alwaysIgnore, + command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }), }, { - prompt: 'More Info', - command: commandFactory.createCommand(diagnostic, { type: 'launch', options: 'https://aka.ms/Niq35h' }) - } + prompt: Common.moreInfo, + command: commandFactory.createCommand(diagnostic, { type: 'launch', options: 'https://aka.ms/Niq35h' }), + }, ]; await this.messageService.handle(diagnostic, { commandPrompts: options }); } + private doesPathVariableHaveInvalidEntries() { const currentProc = this.serviceContainer.get(ICurrentProcess); const pathValue = currentProc.env[this.platform.pathVariableName]; const pathSeparator = this.serviceContainer.get(IPathUtils).delimiter; const paths = (pathValue || '').split(pathSeparator); - return paths.filter(item => item.indexOf('"') >= 0).length > 0; + return paths.filter((item) => item.indexOf('"') >= 0).length > 0; } } diff --git a/src/client/application/diagnostics/checks/invalidLaunchJsonDebugger.ts b/src/client/application/diagnostics/checks/invalidLaunchJsonDebugger.ts index b41221e7e604..440ff16856d3 100644 --- a/src/client/application/diagnostics/checks/invalidLaunchJsonDebugger.ts +++ b/src/client/application/diagnostics/checks/invalidLaunchJsonDebugger.ts @@ -1,8 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable, named } from 'inversify'; import * as path from 'path'; import { DiagnosticSeverity, WorkspaceFolder } from 'vscode'; @@ -18,9 +17,10 @@ import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '. import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; const messages = { - [DiagnosticCodes.InvalidDebuggerTypeDiagnostic]: Diagnostics.invalidDebuggerTypeDiagnostic(), - [DiagnosticCodes.JustMyCodeDiagnostic]: Diagnostics.justMyCodeDiagnostic(), - [DiagnosticCodes.ConsoleTypeDiagnostic]: Diagnostics.consoleTypeDiagnostic() + [DiagnosticCodes.InvalidDebuggerTypeDiagnostic]: Diagnostics.invalidDebuggerTypeDiagnostic, + [DiagnosticCodes.JustMyCodeDiagnostic]: Diagnostics.justMyCodeDiagnostic, + [DiagnosticCodes.ConsoleTypeDiagnostic]: Diagnostics.consoleTypeDiagnostic, + [DiagnosticCodes.ConfigPythonPathDiagnostic]: '', }; export class InvalidLaunchJsonDebuggerDiagnostic extends BaseDiagnostic { @@ -28,10 +28,19 @@ export class InvalidLaunchJsonDebuggerDiagnostic extends BaseDiagnostic { code: | DiagnosticCodes.InvalidDebuggerTypeDiagnostic | DiagnosticCodes.JustMyCodeDiagnostic - | DiagnosticCodes.ConsoleTypeDiagnostic, - resource: Resource + | DiagnosticCodes.ConsoleTypeDiagnostic + | DiagnosticCodes.ConfigPythonPathDiagnostic, + resource: Resource, + shouldShowPrompt = true, ) { - super(code, messages[code], DiagnosticSeverity.Error, DiagnosticScope.WorkspaceFolder, resource, 'always'); + super( + code, + messages[code], + DiagnosticSeverity.Error, + DiagnosticScope.WorkspaceFolder, + resource, + shouldShowPrompt, + ); } } @@ -46,21 +55,24 @@ export class InvalidLaunchJsonDebuggerService extends BaseDiagnosticsService { @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, @inject(IDiagnosticHandlerService) @named(DiagnosticCommandPromptHandlerServiceId) - private readonly messageService: IDiagnosticHandlerService + private readonly messageService: IDiagnosticHandlerService, ) { super( [ DiagnosticCodes.InvalidDebuggerTypeDiagnostic, DiagnosticCodes.JustMyCodeDiagnostic, - DiagnosticCodes.ConsoleTypeDiagnostic + DiagnosticCodes.ConsoleTypeDiagnostic, + DiagnosticCodes.ConfigPythonPathDiagnostic, ], serviceContainer, disposableRegistry, - true + true, ); } + public async diagnose(resource: Resource): Promise { - if (!this.workspaceService.hasWorkspaceFolders) { + const hasWorkspaceFolders = (this.workspaceService.workspaceFolders?.length || 0) > 0; + if (!hasWorkspaceFolders) { return []; } const workspaceFolder = resource @@ -68,22 +80,26 @@ export class InvalidLaunchJsonDebuggerService extends BaseDiagnosticsService { : this.workspaceService.workspaceFolders![0]; return this.diagnoseWorkspace(workspaceFolder, resource); } + protected async onHandle(diagnostics: IDiagnostic[]): Promise { - diagnostics.forEach(diagnostic => this.handleDiagnostic(diagnostic)); + diagnostics.forEach((diagnostic) => this.handleDiagnostic(diagnostic)); } - protected async fixLaunchJson(code: DiagnosticCodes) { - if (!this.workspaceService.hasWorkspaceFolders) { + + protected async fixLaunchJson(code: DiagnosticCodes): Promise { + const hasWorkspaceFolders = (this.workspaceService.workspaceFolders?.length || 0) > 0; + if (!hasWorkspaceFolders) { return; } await Promise.all( - this.workspaceService.workspaceFolders!.map(workspaceFolder => - this.fixLaunchJsonInWorkspace(code, workspaceFolder) - ) + (this.workspaceService.workspaceFolders ?? []).map((workspaceFolder) => + this.fixLaunchJsonInWorkspace(code, workspaceFolder), + ), ); } + private async diagnoseWorkspace(workspaceFolder: WorkspaceFolder, resource: Resource) { - const launchJson = this.getLaunchJsonFile(workspaceFolder); + const launchJson = getLaunchJsonFile(workspaceFolder); if (!(await this.fs.fileExists(launchJson))) { return []; } @@ -92,7 +108,7 @@ export class InvalidLaunchJsonDebuggerService extends BaseDiagnosticsService { const diagnostics: IDiagnostic[] = []; if (fileContents.indexOf('"pythonExperimental"') > 0) { diagnostics.push( - new InvalidLaunchJsonDebuggerDiagnostic(DiagnosticCodes.InvalidDebuggerTypeDiagnostic, resource) + new InvalidLaunchJsonDebuggerDiagnostic(DiagnosticCodes.InvalidDebuggerTypeDiagnostic, resource), ); } if (fileContents.indexOf('"debugStdLib"') > 0) { @@ -101,48 +117,74 @@ export class InvalidLaunchJsonDebuggerService extends BaseDiagnosticsService { if (fileContents.indexOf('"console": "none"') > 0) { diagnostics.push(new InvalidLaunchJsonDebuggerDiagnostic(DiagnosticCodes.ConsoleTypeDiagnostic, resource)); } + if ( + fileContents.indexOf('"pythonPath":') > 0 || + fileContents.indexOf('{config:python.pythonPath}') > 0 || + fileContents.indexOf('{config:python.interpreterPath}') > 0 + ) { + diagnostics.push( + new InvalidLaunchJsonDebuggerDiagnostic(DiagnosticCodes.ConfigPythonPathDiagnostic, resource, false), + ); + } return diagnostics; } + private async handleDiagnostic(diagnostic: IDiagnostic): Promise { - if (!this.canHandle(diagnostic)) { + if (!diagnostic.shouldShowPrompt) { + await this.fixLaunchJson(diagnostic.code); return; } const commandPrompts = [ { - prompt: Diagnostics.yesUpdateLaunch(), + prompt: Diagnostics.yesUpdateLaunch, command: { diagnostic, invoke: async (): Promise => { await this.fixLaunchJson(diagnostic.code); - } - } + }, + }, }, { - prompt: Common.noIWillDoItLater() - } + prompt: Common.noIWillDoItLater, + }, ]; await this.messageService.handle(diagnostic, { commandPrompts }); } + private async fixLaunchJsonInWorkspace(code: DiagnosticCodes, workspaceFolder: WorkspaceFolder) { if ((await this.diagnoseWorkspace(workspaceFolder, undefined)).length === 0) { return; } - const launchJson = this.getLaunchJsonFile(workspaceFolder); + const launchJson = getLaunchJsonFile(workspaceFolder); let fileContents = await this.fs.readFile(launchJson); switch (code) { case DiagnosticCodes.InvalidDebuggerTypeDiagnostic: { - fileContents = this.findAndReplace(fileContents, '"pythonExperimental"', '"python"'); - fileContents = this.findAndReplace(fileContents, '"Python Experimental:', '"Python:'); + fileContents = findAndReplace(fileContents, '"pythonExperimental"', '"python"'); + fileContents = findAndReplace(fileContents, '"Python Experimental:', '"Python:'); break; } case DiagnosticCodes.JustMyCodeDiagnostic: { - fileContents = this.findAndReplace(fileContents, '"debugStdLib": false', '"justMyCode": true'); - fileContents = this.findAndReplace(fileContents, '"debugStdLib": true', '"justMyCode": false'); + fileContents = findAndReplace(fileContents, '"debugStdLib": false', '"justMyCode": true'); + fileContents = findAndReplace(fileContents, '"debugStdLib": true', '"justMyCode": false'); break; } case DiagnosticCodes.ConsoleTypeDiagnostic: { - fileContents = this.findAndReplace(fileContents, '"console": "none"', '"console": "internalConsole"'); + fileContents = findAndReplace(fileContents, '"console": "none"', '"console": "internalConsole"'); + break; + } + case DiagnosticCodes.ConfigPythonPathDiagnostic: { + fileContents = findAndReplace(fileContents, '"pythonPath":', '"python":'); + fileContents = findAndReplace( + fileContents, + '{config:python.pythonPath}', + '{command:python.interpreterPath}', + ); + fileContents = findAndReplace( + fileContents, + '{config:python.interpreterPath}', + '{command:python.interpreterPath}', + ); break; } default: { @@ -152,11 +194,13 @@ export class InvalidLaunchJsonDebuggerService extends BaseDiagnosticsService { await this.fs.writeFile(launchJson, fileContents); } - private findAndReplace(fileContents: string, search: string, replace: string) { - const searchRegex = new RegExp(search, 'g'); - return fileContents.replace(searchRegex, replace); - } - private getLaunchJsonFile(workspaceFolder: WorkspaceFolder) { - return path.join(workspaceFolder.uri.fsPath, '.vscode', 'launch.json'); - } +} + +function findAndReplace(fileContents: string, search: string, replace: string) { + const searchRegex = new RegExp(search, 'g'); + return fileContents.replace(searchRegex, replace); +} + +function getLaunchJsonFile(workspaceFolder: WorkspaceFolder) { + return path.join(workspaceFolder.uri.fsPath, '.vscode', 'launch.json'); } diff --git a/src/client/application/diagnostics/checks/invalidPythonPathInDebugger.ts b/src/client/application/diagnostics/checks/invalidPythonPathInDebugger.ts index 492bbf9c06c8..f08c09956838 100644 --- a/src/client/application/diagnostics/checks/invalidPythonPathInDebugger.ts +++ b/src/client/application/diagnostics/checks/invalidPythonPathInDebugger.ts @@ -1,20 +1,19 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable, named } from 'inversify'; import * as path from 'path'; import { DiagnosticSeverity, Uri, workspace as workspc, WorkspaceFolder } from 'vscode'; import { IDocumentManager, IWorkspaceService } from '../../../common/application/types'; import '../../../common/extensions'; -import { traceError } from '../../../common/logger'; import { IConfigurationService, IDisposableRegistry, Resource } from '../../../common/types'; -import { Diagnostics } from '../../../common/utils/localize'; +import { Common, Diagnostics } from '../../../common/utils/localize'; import { SystemVariables } from '../../../common/variables/systemVariables'; import { PythonPathSource } from '../../../debugger/extension/types'; import { IInterpreterHelper } from '../../../interpreter/contracts'; import { IServiceContainer } from '../../../ioc/types'; +import { traceError } from '../../../logging'; import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; import { IDiagnosticsCommandFactory } from '../commands/types'; import { DiagnosticCodes } from '../constants'; @@ -24,22 +23,30 @@ import { IDiagnostic, IDiagnosticCommand, IDiagnosticHandlerService, - IInvalidPythonPathInDebuggerService + IInvalidPythonPathInDebuggerService, } from '../types'; const messages = { - [DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic]: Diagnostics.invalidPythonPathInDebuggerSettings(), - [DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic]: Diagnostics.invalidPythonPathInDebuggerLaunch() + [DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic]: Diagnostics.invalidPythonPathInDebuggerSettings, + [DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic]: Diagnostics.invalidPythonPathInDebuggerLaunch, }; -export class InvalidPythonPathInDebuggerDiagnostic extends BaseDiagnostic { +class InvalidPythonPathInDebuggerDiagnostic extends BaseDiagnostic { constructor( code: | DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic | DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic, - resource: Resource + resource: Resource, ) { - super(code, messages[code], DiagnosticSeverity.Error, DiagnosticScope.WorkspaceFolder, resource, 'always'); + super( + code, + messages[code], + DiagnosticSeverity.Error, + DiagnosticScope.WorkspaceFolder, + resource, + undefined, + 'always', + ); } } @@ -58,25 +65,32 @@ export class InvalidPythonPathInDebuggerService extends BaseDiagnosticsService @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, @inject(IDiagnosticHandlerService) @named(DiagnosticCommandPromptHandlerServiceId) - protected readonly messageService: IDiagnosticHandlerService + protected readonly messageService: IDiagnosticHandlerService, ) { super( [ DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic, - DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic + DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic, ], serviceContainer, disposableRegistry, - true + true, ); } - public async diagnose(_resource: Resource): Promise { + + // eslint-disable-next-line class-methods-use-this + public async diagnose(): Promise { return []; } - public async validatePythonPath(pythonPath?: string, pythonPathSource?: PythonPathSource, resource?: Uri) { + + public async validatePythonPath( + pythonPath?: string, + pythonPathSource?: PythonPathSource, + resource?: Uri, + ): Promise { pythonPath = pythonPath ? this.resolveVariables(pythonPath, resource) : undefined; - // tslint:disable-next-line:no-invalid-template-strings - if (pythonPath === '${config:python.pythonPath}' || !pythonPath) { + + if (pythonPath === '${command:python.interpreterPath}' || !pythonPath) { pythonPath = this.configService.getSettings(resource).pythonPath; } if (await this.interpreterHelper.getInterpreterInformation(pythonPath).catch(() => undefined)) { @@ -87,23 +101,24 @@ export class InvalidPythonPathInDebuggerService extends BaseDiagnosticsService this.handle([ new InvalidPythonPathInDebuggerDiagnostic( DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic, - resource - ) + resource, + ), ]) - .catch(ex => traceError('Failed to handle invalid python path in launch.json debugger', ex)) + .catch((ex) => traceError('Failed to handle invalid python path in launch.json debugger', ex)) .ignoreErrors(); } else { this.handle([ new InvalidPythonPathInDebuggerDiagnostic( DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic, - resource - ) + resource, + ), ]) - .catch(ex => traceError('Failed to handle invalid python path in settings.json debugger', ex)) + .catch((ex) => traceError('Failed to handle invalid python path in settings.json debugger', ex)) .ignoreErrors(); } return false; } + protected async onHandle(diagnostics: IDiagnostic[]): Promise { // This class can only handle one type of diagnostic, hence just use first item in list. if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { @@ -114,36 +129,38 @@ export class InvalidPythonPathInDebuggerService extends BaseDiagnosticsService await this.messageService.handle(diagnostic, { commandPrompts }); } + protected resolveVariables(pythonPath: string, resource: Uri | undefined): string { const systemVariables = new SystemVariables(resource, undefined, this.workspace); return systemVariables.resolveAny(pythonPath); } + private getCommandPrompts(diagnostic: IDiagnostic): { prompt: string; command?: IDiagnosticCommand }[] { switch (diagnostic.code) { case DiagnosticCodes.InvalidPythonPathInDebuggerSettingsDiagnostic: { return [ { - prompt: 'Select Python Interpreter', + prompt: Common.selectPythonInterpreter, command: this.commandFactory.createCommand(diagnostic, { type: 'executeVSCCommand', - options: 'python.setInterpreter' - }) - } + options: 'python.setInterpreter', + }), + }, ]; } case DiagnosticCodes.InvalidPythonPathInDebuggerLaunchDiagnostic: { return [ { - prompt: 'Open launch.json', + prompt: Common.openLaunch, command: { diagnostic, invoke: async (): Promise => { - const launchJson = this.getLaunchJsonFile(workspc.workspaceFolders![0]); + const launchJson = getLaunchJsonFile(workspc.workspaceFolders![0]); const doc = await this.documentManager.openTextDocument(launchJson); await this.documentManager.showTextDocument(doc); - } - } - } + }, + }, + }, ]; } default: { @@ -151,7 +168,8 @@ export class InvalidPythonPathInDebuggerService extends BaseDiagnosticsService } } } - private getLaunchJsonFile(workspaceFolder: WorkspaceFolder) { - return path.join(workspaceFolder.uri.fsPath, '.vscode', 'launch.json'); - } +} + +function getLaunchJsonFile(workspaceFolder: WorkspaceFolder) { + return path.join(workspaceFolder.uri.fsPath, '.vscode', 'launch.json'); } diff --git a/src/client/application/diagnostics/checks/jediPython27NotSupported.ts b/src/client/application/diagnostics/checks/jediPython27NotSupported.ts new file mode 100644 index 000000000000..3d358325032e --- /dev/null +++ b/src/client/application/diagnostics/checks/jediPython27NotSupported.ts @@ -0,0 +1,108 @@ +/* eslint-disable max-classes-per-file */ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { inject, named } from 'inversify'; +import { ConfigurationTarget, DiagnosticSeverity } from 'vscode'; +import { LanguageServerType } from '../../../activation/types'; +import { IWorkspaceService } from '../../../common/application/types'; +import { IConfigurationService, IDisposableRegistry, Resource } from '../../../common/types'; +import { Common, Python27Support } from '../../../common/utils/localize'; +import { IInterpreterService } from '../../../interpreter/contracts'; +import { IServiceContainer } from '../../../ioc/types'; +import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; +import { IDiagnosticsCommandFactory } from '../commands/types'; +import { DiagnosticCodes } from '../constants'; +import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; +import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; + +export class JediPython27NotSupportedDiagnostic extends BaseDiagnostic { + constructor(message: string, resource: Resource) { + super( + DiagnosticCodes.JediPython27NotSupportedDiagnostic, + message, + DiagnosticSeverity.Warning, + DiagnosticScope.Global, + resource, + ); + } +} + +export const JediPython27NotSupportedDiagnosticServiceId = 'JediPython27NotSupportedDiagnosticServiceId'; + +export class JediPython27NotSupportedDiagnosticService extends BaseDiagnosticsService { + constructor( + @inject(IServiceContainer) serviceContainer: IServiceContainer, + @inject(IInterpreterService) private readonly interpreterService: IInterpreterService, + @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, + @inject(IConfigurationService) private readonly configurationService: IConfigurationService, + @inject(IDiagnosticHandlerService) + @named(DiagnosticCommandPromptHandlerServiceId) + protected readonly messageService: IDiagnosticHandlerService, + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, + ) { + super([DiagnosticCodes.JediPython27NotSupportedDiagnostic], serviceContainer, disposableRegistry, true); + } + + public async diagnose(resource: Resource): Promise { + const interpreter = await this.interpreterService.getActiveInterpreter(resource); + const { languageServer } = this.configurationService.getSettings(resource); + + await this.updateLanguageServerSetting(resource); + + // We don't need to check for JediLSP here, because we retrieve the setting from the configuration service, + // Which already switched the JediLSP option to Jedi. + if (interpreter && (interpreter.version?.major ?? 0) < 3 && languageServer === LanguageServerType.Jedi) { + return [new JediPython27NotSupportedDiagnostic(Python27Support.jediMessage, resource)]; + } + + return []; + } + + protected async onHandle(diagnostics: IDiagnostic[]): Promise { + if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { + return; + } + const diagnostic = diagnostics[0]; + if (await this.filterService.shouldIgnoreDiagnostic(diagnostic.code)) { + return; + } + + const commandFactory = this.serviceContainer.get(IDiagnosticsCommandFactory); + const options = [ + { + prompt: Common.gotIt, + }, + { + prompt: Common.doNotShowAgain, + command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }), + }, + ]; + + await this.messageService.handle(diagnostic, { commandPrompts: options }); + } + + private async updateLanguageServerSetting(resource: Resource): Promise { + // Update settings.json value to Jedi if it's JediLSP. + const settings = this.workspaceService + .getConfiguration('python', resource) + .inspect('languageServer'); + + let configTarget: ConfigurationTarget; + + if (settings?.workspaceValue === LanguageServerType.JediLSP) { + configTarget = ConfigurationTarget.Workspace; + } else if (settings?.globalValue === LanguageServerType.JediLSP) { + configTarget = ConfigurationTarget.Global; + } else { + return; + } + + await this.configurationService.updateSetting( + 'languageServer', + LanguageServerType.Jedi, + resource, + configTarget, + ); + } +} diff --git a/src/client/application/diagnostics/checks/lsNotSupported.ts b/src/client/application/diagnostics/checks/lsNotSupported.ts deleted file mode 100644 index c33154fbbff7..000000000000 --- a/src/client/application/diagnostics/checks/lsNotSupported.ts +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, named } from 'inversify'; -import { DiagnosticSeverity } from 'vscode'; -import { ILanguageServerCompatibilityService } from '../../../activation/types'; -import { IDisposableRegistry, Resource } from '../../../common/types'; -import { Diagnostics } from '../../../common/utils/localize'; -import { IServiceContainer } from '../../../ioc/types'; -import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; -import { IDiagnosticsCommandFactory } from '../commands/types'; -import { DiagnosticCodes } from '../constants'; -import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; -import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; - -export class LSNotSupportedDiagnostic extends BaseDiagnostic { - constructor(message: string, resource: Resource) { - super( - DiagnosticCodes.LSNotSupportedDiagnostic, - message, - DiagnosticSeverity.Warning, - DiagnosticScope.Global, - resource - ); - } -} - -export const LSNotSupportedDiagnosticServiceId = 'LSNotSupportedDiagnosticServiceId'; - -export class LSNotSupportedDiagnosticService extends BaseDiagnosticsService { - constructor( - @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(ILanguageServerCompatibilityService) - private readonly lsCompatibility: ILanguageServerCompatibilityService, - @inject(IDiagnosticHandlerService) - @named(DiagnosticCommandPromptHandlerServiceId) - protected readonly messageService: IDiagnosticHandlerService, - @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry - ) { - super([DiagnosticCodes.LSNotSupportedDiagnostic], serviceContainer, disposableRegistry, false); - } - public async diagnose(resource: Resource): Promise { - if (await this.lsCompatibility.isSupported()) { - return []; - } else { - return [new LSNotSupportedDiagnostic(Diagnostics.lsNotSupported(), resource)]; - } - } - protected async onHandle(diagnostics: IDiagnostic[]): Promise { - if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { - return; - } - const diagnostic = diagnostics[0]; - if (await this.filterService.shouldIgnoreDiagnostic(diagnostic.code)) { - return; - } - const commandFactory = this.serviceContainer.get(IDiagnosticsCommandFactory); - const options = [ - { - prompt: 'More Info', - command: commandFactory.createCommand(diagnostic, { - type: 'launch', - options: 'https://aka.ms/pythonlsrequirements' - }) - }, - { - prompt: 'Do not show again', - command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }) - } - ]; - - await this.messageService.handle(diagnostic, { commandPrompts: options }); - } -} diff --git a/src/client/application/diagnostics/checks/macPythonInterpreter.ts b/src/client/application/diagnostics/checks/macPythonInterpreter.ts index baa59aa22dc2..21d6b34fb7c5 100644 --- a/src/client/application/diagnostics/checks/macPythonInterpreter.ts +++ b/src/client/application/diagnostics/checks/macPythonInterpreter.ts @@ -1,36 +1,35 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable } from 'inversify'; -import { ConfigurationChangeEvent, DiagnosticSeverity, Uri } from 'vscode'; -import { IWorkspaceService } from '../../../common/application/types'; +import { DiagnosticSeverity, l10n } from 'vscode'; import '../../../common/extensions'; import { IPlatformService } from '../../../common/platform/types'; -import { IConfigurationService, IDisposableRegistry, Resource } from '../../../common/types'; -import { IInterpreterHelper, IInterpreterService, InterpreterType } from '../../../interpreter/contracts'; +import { + IConfigurationService, + IDisposableRegistry, + IInterpreterPathService, + InterpreterConfigurationScope, + Resource, +} from '../../../common/types'; +import { IInterpreterHelper } from '../../../interpreter/contracts'; import { IServiceContainer } from '../../../ioc/types'; import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; import { IDiagnosticsCommandFactory } from '../commands/types'; import { DiagnosticCodes } from '../constants'; import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; import { DiagnosticScope, IDiagnostic, IDiagnosticCommand, IDiagnosticHandlerService } from '../types'; +import { Common } from '../../../common/utils/localize'; const messages = { - [DiagnosticCodes.MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic]: - 'You have selected the macOS system install of Python, which is not recommended for use with the Python extension. Some functionality will be limited, please select a different interpreter.', - [DiagnosticCodes.MacInterpreterSelectedAndNoOtherInterpretersDiagnostic]: - 'The macOS system install of Python is not recommended, some functionality in the extension will be limited. Install another version of Python for the best experience.' + [DiagnosticCodes.MacInterpreterSelected]: l10n.t( + 'The selected macOS system install of Python is not recommended, some functionality in the extension will be limited. [Install another version of Python](https://www.python.org/downloads) or select a different interpreter for the best experience. [Learn more](https://aka.ms/AA7jfor).', + ), }; export class InvalidMacPythonInterpreterDiagnostic extends BaseDiagnostic { - constructor( - code: - | DiagnosticCodes.MacInterpreterSelectedAndNoOtherInterpretersDiagnostic - | DiagnosticCodes.MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic, - resource: Resource - ) { + constructor(code: DiagnosticCodes.MacInterpreterSelected, resource: Resource) { super(code, messages[code], DiagnosticSeverity.Error, DiagnosticScope.WorkspaceFolder, resource); } } @@ -40,167 +39,101 @@ export const InvalidMacPythonInterpreterServiceId = 'InvalidMacPythonInterpreter @injectable() export class InvalidMacPythonInterpreterService extends BaseDiagnosticsService { protected changeThrottleTimeout = 1000; - private timeOut?: NodeJS.Timer | number; + + private timeOut?: NodeJS.Timeout | number; + constructor( @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IInterpreterService) private readonly interpreterService: IInterpreterService, @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, @inject(IPlatformService) private readonly platform: IPlatformService, - @inject(IInterpreterHelper) private readonly helper: IInterpreterHelper + @inject(IInterpreterHelper) private readonly helper: IInterpreterHelper, ) { - super( - [ - DiagnosticCodes.MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic, - DiagnosticCodes.MacInterpreterSelectedAndNoOtherInterpretersDiagnostic - ], - serviceContainer, - disposableRegistry, - true - ); + super([DiagnosticCodes.MacInterpreterSelected], serviceContainer, disposableRegistry, true); this.addPythonPathChangedHandler(); } - public dispose() { - if (this.timeOut) { - // tslint:disable-next-line: no-any - clearTimeout(this.timeOut as any); + + public dispose(): void { + if (this.timeOut && typeof this.timeOut !== 'number') { + clearTimeout(this.timeOut); this.timeOut = undefined; } } + public async diagnose(resource: Resource): Promise { if (!this.platform.isMac) { return []; } const configurationService = this.serviceContainer.get(IConfigurationService); const settings = configurationService.getSettings(resource); - if (settings.disableInstallationChecks === true) { - return []; - } - - const hasInterpreters = await this.interpreterService.hasInterpreters; - if (!hasInterpreters) { - return []; - } - - const currentInterpreter = await this.interpreterService.getActiveInterpreter(resource); - if (!currentInterpreter) { - return []; - } - - if (!this.helper.isMacDefaultPythonPath(settings.pythonPath)) { + if (!(await this.helper.isMacDefaultPythonPath(settings.pythonPath))) { return []; } - if (!currentInterpreter || currentInterpreter.type !== InterpreterType.Unknown) { - return []; - } - - const interpreters = await this.interpreterService.getInterpreters(resource); - if (interpreters.filter(i => !this.helper.isMacDefaultPythonPath(i.path)).length === 0) { - return [ - new InvalidMacPythonInterpreterDiagnostic( - DiagnosticCodes.MacInterpreterSelectedAndNoOtherInterpretersDiagnostic, - resource - ) - ]; - } - - return [ - new InvalidMacPythonInterpreterDiagnostic( - DiagnosticCodes.MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic, - resource - ) - ]; + return [new InvalidMacPythonInterpreterDiagnostic(DiagnosticCodes.MacInterpreterSelected, resource)]; } + protected async onHandle(diagnostics: IDiagnostic[]): Promise { if (diagnostics.length === 0) { return; } const messageService = this.serviceContainer.get>( IDiagnosticHandlerService, - DiagnosticCommandPromptHandlerServiceId + DiagnosticCommandPromptHandlerServiceId, ); await Promise.all( - diagnostics.map(async diagnostic => { + diagnostics.map(async (diagnostic) => { const canHandle = await this.canHandle(diagnostic); const shouldIgnore = await this.filterService.shouldIgnoreDiagnostic(diagnostic.code); if (!canHandle || shouldIgnore) { return; } const commandPrompts = this.getCommandPrompts(diagnostic); - return messageService.handle(diagnostic, { commandPrompts, message: diagnostic.message }); - }) + await messageService.handle(diagnostic, { commandPrompts, message: diagnostic.message }); + }), ); } - protected addPythonPathChangedHandler() { - const workspaceService = this.serviceContainer.get(IWorkspaceService); + + protected addPythonPathChangedHandler(): void { const disposables = this.serviceContainer.get(IDisposableRegistry); - disposables.push(workspaceService.onDidChangeConfiguration(this.onDidChangeConfiguration.bind(this))); + const interpreterPathService = this.serviceContainer.get(IInterpreterPathService); + disposables.push(interpreterPathService.onDidChange((i) => this.onDidChangeConfiguration(i))); } - protected async onDidChangeConfiguration(event: ConfigurationChangeEvent) { - const workspaceService = this.serviceContainer.get(IWorkspaceService); - const workspacesUris: (Uri | undefined)[] = workspaceService.hasWorkspaceFolders - ? workspaceService.workspaceFolders!.map(workspace => workspace.uri) - : [undefined]; - const workspaceUriIndex = workspacesUris.findIndex(uri => event.affectsConfiguration('python.pythonPath', uri)); - if (workspaceUriIndex === -1) { - return; - } + + protected async onDidChangeConfiguration( + interpreterConfigurationScope: InterpreterConfigurationScope, + ): Promise { + const workspaceUri = interpreterConfigurationScope.uri; // Lets wait, for more changes, dirty simple throttling. - if (this.timeOut) { - // tslint:disable-next-line: no-any - clearTimeout(this.timeOut as any); + if (this.timeOut && typeof this.timeOut !== 'number') { + clearTimeout(this.timeOut); this.timeOut = undefined; } this.timeOut = setTimeout(() => { this.timeOut = undefined; - this.diagnose(workspacesUris[workspaceUriIndex]) - .then(diagnostics => this.handle(diagnostics)) + this.diagnose(workspaceUri) + .then((diagnostics) => this.handle(diagnostics)) .ignoreErrors(); }, this.changeThrottleTimeout); } + private getCommandPrompts(diagnostic: IDiagnostic): { prompt: string; command?: IDiagnosticCommand }[] { const commandFactory = this.serviceContainer.get(IDiagnosticsCommandFactory); switch (diagnostic.code) { - case DiagnosticCodes.MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic: { + case DiagnosticCodes.MacInterpreterSelected: { return [ { - prompt: 'Select Python Interpreter', + prompt: Common.selectPythonInterpreter, command: commandFactory.createCommand(diagnostic, { type: 'executeVSCCommand', - options: 'python.setInterpreter' - }) + options: 'python.setInterpreter', + }), }, { - prompt: 'Do not show again', + prompt: Common.doNotShowAgain, command: commandFactory.createCommand(diagnostic, { type: 'ignore', - options: DiagnosticScope.Global - }) - } - ]; - } - case DiagnosticCodes.MacInterpreterSelectedAndNoOtherInterpretersDiagnostic: { - return [ - { - prompt: 'Learn more', - command: commandFactory.createCommand(diagnostic, { - type: 'launch', - options: 'https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites' - }) + options: DiagnosticScope.Global, + }), }, - { - prompt: 'Download', - command: commandFactory.createCommand(diagnostic, { - type: 'launch', - options: 'https://www.python.org/downloads' - }) - }, - { - prompt: 'Do not show again', - command: commandFactory.createCommand(diagnostic, { - type: 'ignore', - options: DiagnosticScope.Global - }) - } ]; } default: { diff --git a/src/client/application/diagnostics/checks/powerShellActivation.ts b/src/client/application/diagnostics/checks/powerShellActivation.ts index 99f2326f9f9a..85f68db0d6a4 100644 --- a/src/client/application/diagnostics/checks/powerShellActivation.ts +++ b/src/client/application/diagnostics/checks/powerShellActivation.ts @@ -1,15 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable } from 'inversify'; -import { DiagnosticSeverity } from 'vscode'; +import { DiagnosticSeverity, l10n } from 'vscode'; import '../../../common/extensions'; -import { traceError } from '../../../common/logger'; import { useCommandPromptAsDefaultShell } from '../../../common/terminal/commandPrompt'; import { IConfigurationService, ICurrentProcess, IDisposableRegistry, Resource } from '../../../common/types'; +import { Common } from '../../../common/utils/localize'; import { IServiceContainer } from '../../../ioc/types'; +import { traceError } from '../../../logging'; import { sendTelemetryEvent } from '../../../telemetry'; import { EventName } from '../../../telemetry/constants'; import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; @@ -18,8 +18,9 @@ import { DiagnosticCodes } from '../constants'; import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; -const PowershellActivationNotSupportedWithBatchFilesMessage = - 'Activation of the selected Python environment is not supported in PowerShell. Consider changing your shell to Command Prompt.'; +const PowershellActivationNotSupportedWithBatchFilesMessage = l10n.t( + 'Activation of the selected Python environment is not supported in PowerShell. Consider changing your shell to Command Prompt.', +); export class PowershellActivationNotAvailableDiagnostic extends BaseDiagnostic { constructor(resource: Resource) { @@ -29,7 +30,8 @@ export class PowershellActivationNotAvailableDiagnostic extends BaseDiagnostic { DiagnosticSeverity.Warning, DiagnosticScope.Global, resource, - 'always' + undefined, + 'always', ); } } @@ -40,24 +42,28 @@ export const PowerShellActivationHackDiagnosticsServiceId = @injectable() export class PowerShellActivationHackDiagnosticsService extends BaseDiagnosticsService { protected readonly messageService: IDiagnosticHandlerService; + constructor( @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, ) { super( [DiagnosticCodes.EnvironmentActivationInPowerShellWithBatchFilesNotSupportedDiagnostic], serviceContainer, disposableRegistry, - true + true, ); this.messageService = serviceContainer.get>( IDiagnosticHandlerService, - DiagnosticCommandPromptHandlerServiceId + DiagnosticCommandPromptHandlerServiceId, ); } - public async diagnose(_resource: Resource): Promise { + + // eslint-disable-next-line class-methods-use-this + public async diagnose(): Promise { return []; } + protected async onHandle(diagnostics: IDiagnostic[]): Promise { // This class can only handle one type of diagnostic, hence just use first item in list. if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { @@ -72,34 +78,34 @@ export class PowerShellActivationHackDiagnosticsService extends BaseDiagnosticsS const configurationService = this.serviceContainer.get(IConfigurationService); const options = [ { - prompt: 'Use Command Prompt', - // tslint:disable-next-line:no-object-literal-type-assertion + prompt: Common.useCommandPrompt, + command: { diagnostic, invoke: async (): Promise => { sendTelemetryEvent(EventName.DIAGNOSTICS_ACTION, undefined, { - action: 'switchToCommandPrompt' + action: 'switchToCommandPrompt', }); - useCommandPromptAsDefaultShell(currentProcess, configurationService).catch(ex => - traceError('Use Command Prompt as default shell', ex) + useCommandPromptAsDefaultShell(currentProcess, configurationService).catch((ex) => + traceError('Use Command Prompt as default shell', ex), ); - } - } + }, + }, }, { - prompt: 'Ignore' + prompt: Common.ignore, }, { - prompt: 'Always Ignore', - command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }) + prompt: Common.alwaysIgnore, + command: commandFactory.createCommand(diagnostic, { type: 'ignore', options: DiagnosticScope.Global }), }, { - prompt: 'More Info', + prompt: Common.moreInfo, command: commandFactory.createCommand(diagnostic, { type: 'launch', - options: 'https://aka.ms/CondaPwsh' - }) - } + options: 'https://aka.ms/CondaPwsh', + }), + }, ]; await this.messageService.handle(diagnostic, { commandPrompts: options }); diff --git a/src/client/application/diagnostics/checks/pylanceDefault.ts b/src/client/application/diagnostics/checks/pylanceDefault.ts new file mode 100644 index 000000000000..16ee2968c8d6 --- /dev/null +++ b/src/client/application/diagnostics/checks/pylanceDefault.ts @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// eslint-disable-next-line max-classes-per-file +import { inject, named } from 'inversify'; +import { DiagnosticSeverity } from 'vscode'; +import { IDisposableRegistry, IExtensionContext, Resource } from '../../../common/types'; +import { Diagnostics, Common } from '../../../common/utils/localize'; +import { IServiceContainer } from '../../../ioc/types'; +import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; +import { DiagnosticCodes } from '../constants'; +import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; +import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; + +export const PYLANCE_PROMPT_MEMENTO = 'pylanceDefaultPromptMemento'; +const EXTENSION_VERSION_MEMENTO = 'extensionVersion'; + +export class PylanceDefaultDiagnostic extends BaseDiagnostic { + constructor(message: string, resource: Resource) { + super( + DiagnosticCodes.PylanceDefaultDiagnostic, + message, + DiagnosticSeverity.Information, + DiagnosticScope.Global, + resource, + ); + } +} + +export const PylanceDefaultDiagnosticServiceId = 'PylanceDefaultDiagnosticServiceId'; + +export class PylanceDefaultDiagnosticService extends BaseDiagnosticsService { + public initialMementoValue: string | undefined = undefined; + + constructor( + @inject(IServiceContainer) serviceContainer: IServiceContainer, + @inject(IExtensionContext) private readonly context: IExtensionContext, + @inject(IDiagnosticHandlerService) + @named(DiagnosticCommandPromptHandlerServiceId) + protected readonly messageService: IDiagnosticHandlerService, + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, + ) { + super([DiagnosticCodes.PylanceDefaultDiagnostic], serviceContainer, disposableRegistry, true, true); + + this.initialMementoValue = this.context.globalState.get(EXTENSION_VERSION_MEMENTO); + } + + public async diagnose(resource: Resource): Promise { + if (!(await this.shouldShowPrompt())) { + return []; + } + + return [new PylanceDefaultDiagnostic(Diagnostics.pylanceDefaultMessage, resource)]; + } + + protected async onHandle(diagnostics: IDiagnostic[]): Promise { + if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { + return; + } + + const diagnostic = diagnostics[0]; + if (await this.filterService.shouldIgnoreDiagnostic(diagnostic.code)) { + return; + } + + const options = [{ prompt: Common.ok }]; + + await this.messageService.handle(diagnostic, { + commandPrompts: options, + onClose: this.updateMemento.bind(this), + }); + } + + private async updateMemento() { + await this.context.globalState.update(PYLANCE_PROMPT_MEMENTO, true); + } + + private async shouldShowPrompt(): Promise { + const savedVersion: string | undefined = this.initialMementoValue; + const promptShown: boolean | undefined = this.context.globalState.get(PYLANCE_PROMPT_MEMENTO); + + // savedVersion being undefined means that this is the first time the user activates the extension, + // and we don't want to show the prompt to first-time users. + // We set PYLANCE_PROMPT_MEMENTO here to skip the prompt + // in case the user reloads the extension and savedVersion becomes set + if (savedVersion === undefined) { + await this.updateMemento(); + return false; + } + + // promptShown being undefined means that this is the first time we check if we should show the prompt. + return promptShown === undefined; + } +} diff --git a/src/client/application/diagnostics/checks/pythonInterpreter.ts b/src/client/application/diagnostics/checks/pythonInterpreter.ts index e87a537036fe..9167e232a417 100644 --- a/src/client/application/diagnostics/checks/pythonInterpreter.ts +++ b/src/client/application/diagnostics/checks/pythonInterpreter.ts @@ -1,128 +1,326 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -'use strict'; - +// eslint-disable-next-line max-classes-per-file import { inject, injectable } from 'inversify'; -import { DiagnosticSeverity } from 'vscode'; +import { DiagnosticSeverity, l10n } from 'vscode'; import '../../../common/extensions'; -import { IConfigurationService, IDisposableRegistry, Resource } from '../../../common/types'; +import * as path from 'path'; +import { IConfigurationService, IDisposableRegistry, IInterpreterPathService, Resource } from '../../../common/types'; import { IInterpreterService } from '../../../interpreter/contracts'; import { IServiceContainer } from '../../../ioc/types'; import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; import { IDiagnosticsCommandFactory } from '../commands/types'; import { DiagnosticCodes } from '../constants'; import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; -import { DiagnosticScope, IDiagnostic, IDiagnosticCommand, IDiagnosticHandlerService } from '../types'; +import { + DiagnosticScope, + IDiagnostic, + IDiagnosticCommand, + IDiagnosticHandlerService, + IDiagnosticMessageOnCloseHandler, +} from '../types'; +import { Common, Interpreters } from '../../../common/utils/localize'; +import { Commands } from '../../../common/constants'; +import { ICommandManager, IWorkspaceService } from '../../../common/application/types'; +import { sendTelemetryEvent } from '../../../telemetry'; +import { EventName } from '../../../telemetry/constants'; +import { IExtensionSingleActivationService } from '../../../activation/types'; +import { cache } from '../../../common/utils/decorators'; +import { noop } from '../../../common/utils/misc'; +import { getEnvironmentVariable, getOSType, OSType } from '../../../common/utils/platform'; +import { IFileSystem } from '../../../common/platform/types'; +import { traceError, traceWarn } from '../../../logging'; +import { getExecutable } from '../../../common/process/internal/python'; +import { getSearchPathEnvVarNames } from '../../../common/utils/exec'; +import { IProcessServiceFactory } from '../../../common/process/types'; +import { normCasePath } from '../../../common/platform/fs-paths'; +import { useEnvExtension } from '../../../envExt/api.internal'; const messages = { - [DiagnosticCodes.NoPythonInterpretersDiagnostic]: - 'Python is not installed. Please download and install Python before using the extension.', - [DiagnosticCodes.NoCurrentlySelectedPythonInterpreterDiagnostic]: - 'No Python interpreter is selected. You need to select a Python interpreter to enable features such as IntelliSense, linting, and debugging.' + [DiagnosticCodes.NoPythonInterpretersDiagnostic]: l10n.t( + 'No Python interpreter is selected. Please select a Python interpreter to enable features such as IntelliSense, linting, and debugging.', + ), + [DiagnosticCodes.InvalidPythonInterpreterDiagnostic]: l10n.t( + 'An Invalid Python interpreter is selected{0}, please try changing it to enable features such as IntelliSense, linting, and debugging. See output for more details regarding why the interpreter is invalid.', + ), + [DiagnosticCodes.InvalidComspecDiagnostic]: l10n.t( + 'We detected an issue with one of your environment variables that breaks features such as IntelliSense, linting and debugging. Try setting the "ComSpec" variable to a valid Command Prompt path in your system to fix it.', + ), + [DiagnosticCodes.IncompletePathVarDiagnostic]: l10n.t( + 'We detected an issue with "Path" environment variable that breaks features such as IntelliSense, linting and debugging. Please edit it to make sure it contains the "System32" subdirectories.', + ), + [DiagnosticCodes.DefaultShellErrorDiagnostic]: l10n.t( + 'We detected an issue with your default shell that breaks features such as IntelliSense, linting and debugging. Try resetting "ComSpec" and "Path" environment variables to fix it.', + ), }; export class InvalidPythonInterpreterDiagnostic extends BaseDiagnostic { constructor( - code: - | DiagnosticCodes.NoPythonInterpretersDiagnostic - | DiagnosticCodes.NoCurrentlySelectedPythonInterpreterDiagnostic, - resource: Resource + code: DiagnosticCodes.NoPythonInterpretersDiagnostic | DiagnosticCodes.InvalidPythonInterpreterDiagnostic, + resource: Resource, + workspaceService: IWorkspaceService, + scope = DiagnosticScope.WorkspaceFolder, ) { - super(code, messages[code], DiagnosticSeverity.Error, DiagnosticScope.WorkspaceFolder, resource); + let formatArg = ''; + if ( + workspaceService.workspaceFile && + workspaceService.workspaceFolders && + workspaceService.workspaceFolders?.length > 1 + ) { + // Specify folder name in case of multiroot scenarios + const folder = workspaceService.getWorkspaceFolder(resource); + if (folder) { + formatArg = ` ${l10n.t('for workspace')} ${path.basename(folder.uri.fsPath)}`; + } + } + super(code, messages[code].format(formatArg), DiagnosticSeverity.Error, scope, resource, undefined, 'always'); + } +} + +type DefaultShellDiagnostics = + | DiagnosticCodes.InvalidComspecDiagnostic + | DiagnosticCodes.IncompletePathVarDiagnostic + | DiagnosticCodes.DefaultShellErrorDiagnostic; + +export class DefaultShellDiagnostic extends BaseDiagnostic { + constructor(code: DefaultShellDiagnostics, resource: Resource, scope = DiagnosticScope.Global) { + super(code, messages[code], DiagnosticSeverity.Error, scope, resource, undefined, 'always'); } } export const InvalidPythonInterpreterServiceId = 'InvalidPythonInterpreterServiceId'; @injectable() -export class InvalidPythonInterpreterService extends BaseDiagnosticsService { +export class InvalidPythonInterpreterService extends BaseDiagnosticsService + implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: false, virtualWorkspace: true }; + constructor( @inject(IServiceContainer) serviceContainer: IServiceContainer, - @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, ) { super( [ DiagnosticCodes.NoPythonInterpretersDiagnostic, - DiagnosticCodes.NoCurrentlySelectedPythonInterpreterDiagnostic + DiagnosticCodes.InvalidPythonInterpreterDiagnostic, + DiagnosticCodes.InvalidComspecDiagnostic, + DiagnosticCodes.IncompletePathVarDiagnostic, + DiagnosticCodes.DefaultShellErrorDiagnostic, ], serviceContainer, disposableRegistry, - false + false, ); } + + public async activate(): Promise { + const commandManager = this.serviceContainer.get(ICommandManager); + this.disposableRegistry.push( + commandManager.registerCommand(Commands.TriggerEnvironmentSelection, (resource: Resource) => + this.triggerEnvSelectionIfNecessary(resource), + ), + ); + const interpreterService = this.serviceContainer.get(IInterpreterService); + this.disposableRegistry.push( + interpreterService.onDidChangeInterpreterConfiguration((e) => + commandManager.executeCommand(Commands.TriggerEnvironmentSelection, e).then(noop, noop), + ), + ); + } + public async diagnose(resource: Resource): Promise { - const configurationService = this.serviceContainer.get(IConfigurationService); - const settings = configurationService.getSettings(resource); - if (settings.disableInstallationChecks === true) { - return []; - } + return this.diagnoseDefaultShell(resource); + } + public async _manualDiagnose(resource: Resource): Promise { + const workspaceService = this.serviceContainer.get(IWorkspaceService); const interpreterService = this.serviceContainer.get(IInterpreterService); - const hasInterpreters = await interpreterService.hasInterpreters; + const diagnostics = await this.diagnoseDefaultShell(resource); + if (diagnostics.length > 0) { + return diagnostics; + } + const hasInterpreters = await interpreterService.hasInterpreters(); + const interpreterPathService = this.serviceContainer.get(IInterpreterPathService); + const isInterpreterSetToDefault = interpreterPathService.get(resource) === 'python'; - if (!hasInterpreters) { - return [new InvalidPythonInterpreterDiagnostic(DiagnosticCodes.NoPythonInterpretersDiagnostic, resource)]; + if (!hasInterpreters && isInterpreterSetToDefault) { + if (useEnvExtension()) { + traceWarn(Interpreters.envExtDiscoveryNoEnvironments); + } + return [ + new InvalidPythonInterpreterDiagnostic( + DiagnosticCodes.NoPythonInterpretersDiagnostic, + resource, + workspaceService, + DiagnosticScope.Global, + ), + ]; } const currentInterpreter = await interpreterService.getActiveInterpreter(resource); if (!currentInterpreter) { + if (useEnvExtension()) { + traceWarn(Interpreters.envExtNoActiveEnvironment); + } return [ new InvalidPythonInterpreterDiagnostic( - DiagnosticCodes.NoCurrentlySelectedPythonInterpreterDiagnostic, - resource - ) + DiagnosticCodes.InvalidPythonInterpreterDiagnostic, + resource, + workspaceService, + ), ]; } + return []; + } + public async triggerEnvSelectionIfNecessary(resource: Resource): Promise { + const diagnostics = await this._manualDiagnose(resource); + if (!diagnostics.length) { + return true; + } + this.handle(diagnostics).ignoreErrors(); + return false; + } + + private async diagnoseDefaultShell(resource: Resource): Promise { + if (getOSType() !== OSType.Windows) { + return []; + } + const interpreterService = this.serviceContainer.get(IInterpreterService); + const currentInterpreter = await interpreterService.getActiveInterpreter(resource); + if (currentInterpreter) { + return []; + } + try { + await this.shellExecPython(); + } catch (ex) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((ex as any).errno === -4058) { + // ENOENT (-4058) error is thrown by Node when the default shell is invalid. + traceError('ComSpec is likely set to an invalid value', getEnvironmentVariable('ComSpec')); + if (await this.isComspecInvalid()) { + return [new DefaultShellDiagnostic(DiagnosticCodes.InvalidComspecDiagnostic, resource)]; + } + if (this.isPathVarIncomplete()) { + traceError('PATH env var appears to be incomplete', process.env.Path, process.env.PATH); + return [new DefaultShellDiagnostic(DiagnosticCodes.IncompletePathVarDiagnostic, resource)]; + } + return [new DefaultShellDiagnostic(DiagnosticCodes.DefaultShellErrorDiagnostic, resource)]; + } + } return []; } + + private async isComspecInvalid() { + const comSpec = getEnvironmentVariable('ComSpec') ?? ''; + const fs = this.serviceContainer.get(IFileSystem); + return fs.fileExists(comSpec).then((exists) => !exists); + } + + // eslint-disable-next-line class-methods-use-this + private isPathVarIncomplete() { + const envVars = getSearchPathEnvVarNames(); + const systemRoot = getEnvironmentVariable('SystemRoot') ?? 'C:\\WINDOWS'; + const system32 = path.join(systemRoot, 'system32'); + for (const envVar of envVars) { + const value = getEnvironmentVariable(envVar); + if (value && normCasePath(value).includes(normCasePath(system32))) { + return false; + } + } + return true; + } + + @cache(-1, true) + // eslint-disable-next-line class-methods-use-this + private async shellExecPython() { + const configurationService = this.serviceContainer.get(IConfigurationService); + const { pythonPath } = configurationService.getSettings(); + const [args] = getExecutable(); + const argv = [pythonPath, ...args]; + // Concat these together to make a set of quoted strings + const quoted = argv.reduce( + (p, c) => (p ? `${p} ${c.toCommandArgumentForPythonExt()}` : `${c.toCommandArgumentForPythonExt()}`), + '', + ); + const processServiceFactory = this.serviceContainer.get(IProcessServiceFactory); + const service = await processServiceFactory.create(); + return service.shellExec(quoted, { timeout: 15000 }); + } + + @cache(1000, true) // This is to handle throttling of multiple events. protected async onHandle(diagnostics: IDiagnostic[]): Promise { if (diagnostics.length === 0) { return; } const messageService = this.serviceContainer.get>( IDiagnosticHandlerService, - DiagnosticCommandPromptHandlerServiceId + DiagnosticCommandPromptHandlerServiceId, ); await Promise.all( - diagnostics.map(async diagnostic => { + diagnostics.map(async (diagnostic) => { if (!this.canHandle(diagnostic)) { return; } const commandPrompts = this.getCommandPrompts(diagnostic); - return messageService.handle(diagnostic, { commandPrompts, message: diagnostic.message }); - }) + const onClose = getOnCloseHandler(diagnostic); + await messageService.handle(diagnostic, { commandPrompts, message: diagnostic.message, onClose }); + }), ); } + private getCommandPrompts(diagnostic: IDiagnostic): { prompt: string; command?: IDiagnosticCommand }[] { const commandFactory = this.serviceContainer.get(IDiagnosticsCommandFactory); - switch (diagnostic.code) { - case DiagnosticCodes.NoPythonInterpretersDiagnostic: { - return [ - { - prompt: 'Download', - command: commandFactory.createCommand(diagnostic, { - type: 'launch', - options: 'https://www.python.org/downloads' - }) - } - ]; - } - case DiagnosticCodes.NoCurrentlySelectedPythonInterpreterDiagnostic: { - return [ - { - prompt: 'Select Python Interpreter', - command: commandFactory.createCommand(diagnostic, { - type: 'executeVSCCommand', - options: 'python.setInterpreter' - }) - } - ]; - } - default: { - throw new Error("Invalid diagnostic for 'InvalidPythonInterpreterService'"); - } + if ( + diagnostic.code === DiagnosticCodes.InvalidComspecDiagnostic || + diagnostic.code === DiagnosticCodes.IncompletePathVarDiagnostic || + diagnostic.code === DiagnosticCodes.DefaultShellErrorDiagnostic + ) { + const links: Record = { + InvalidComspecDiagnostic: 'https://aka.ms/AAk3djo', + IncompletePathVarDiagnostic: 'https://aka.ms/AAk744c', + DefaultShellErrorDiagnostic: 'https://aka.ms/AAk7qix', + }; + return [ + { + prompt: Common.seeInstructions, + command: commandFactory.createCommand(diagnostic, { + type: 'launch', + options: links[diagnostic.code], + }), + }, + ]; + } + const prompts = [ + { + prompt: Common.selectPythonInterpreter, + command: commandFactory.createCommand(diagnostic, { + type: 'executeVSCCommand', + options: Commands.Set_Interpreter, + }), + }, + ]; + if (diagnostic.code === DiagnosticCodes.InvalidPythonInterpreterDiagnostic) { + prompts.push({ + prompt: Common.openOutputPanel, + command: commandFactory.createCommand(diagnostic, { + type: 'executeVSCCommand', + options: Commands.ViewOutput, + }), + }); } + return prompts; + } +} + +function getOnCloseHandler(diagnostic: IDiagnostic): IDiagnosticMessageOnCloseHandler | undefined { + if (diagnostic.code === DiagnosticCodes.NoPythonInterpretersDiagnostic) { + return (response?: string) => { + sendTelemetryEvent(EventName.PYTHON_NOT_INSTALLED_PROMPT, undefined, { + selection: response ? 'Download' : 'Ignore', + }); + }; } + return undefined; } diff --git a/src/client/application/diagnostics/checks/switchToDefaultLS.ts b/src/client/application/diagnostics/checks/switchToDefaultLS.ts new file mode 100644 index 000000000000..bd93a684d9a2 --- /dev/null +++ b/src/client/application/diagnostics/checks/switchToDefaultLS.ts @@ -0,0 +1,80 @@ +/* eslint-disable max-classes-per-file */ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { inject, injectable, named } from 'inversify'; +import { ConfigurationTarget, DiagnosticSeverity } from 'vscode'; +import { LanguageServerType } from '../../../activation/types'; +import { IWorkspaceService } from '../../../common/application/types'; +import { IDisposableRegistry, Resource } from '../../../common/types'; +import { Common, SwitchToDefaultLS } from '../../../common/utils/localize'; +import { IServiceContainer } from '../../../ioc/types'; +import { BaseDiagnostic, BaseDiagnosticsService } from '../base'; +import { DiagnosticCodes } from '../constants'; +import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '../promptHandler'; +import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; + +export class SwitchToDefaultLanguageServerDiagnostic extends BaseDiagnostic { + constructor(message: string, resource: Resource) { + super( + DiagnosticCodes.SwitchToDefaultLanguageServerDiagnostic, + message, + DiagnosticSeverity.Warning, + DiagnosticScope.Global, + resource, + ); + } +} + +export const SwitchToDefaultLanguageServerDiagnosticServiceId = 'SwitchToDefaultLanguageServerDiagnosticServiceId'; + +@injectable() +export class SwitchToDefaultLanguageServerDiagnosticService extends BaseDiagnosticsService { + constructor( + @inject(IServiceContainer) serviceContainer: IServiceContainer, + @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, + @inject(IDiagnosticHandlerService) + @named(DiagnosticCommandPromptHandlerServiceId) + protected readonly messageService: IDiagnosticHandlerService, + @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, + ) { + super([DiagnosticCodes.JediPython27NotSupportedDiagnostic], serviceContainer, disposableRegistry, true, true); + } + + public diagnose(resource: Resource): Promise { + let changed = false; + const config = this.workspaceService.getConfiguration('python'); + const value = config.inspect('languageServer'); + if (value?.workspaceValue === LanguageServerType.Microsoft) { + config.update('languageServer', 'Default', ConfigurationTarget.Workspace); + changed = true; + } + + if (value?.globalValue === LanguageServerType.Microsoft) { + config.update('languageServer', 'Default', ConfigurationTarget.Global); + changed = true; + } + + return Promise.resolve( + changed ? [new SwitchToDefaultLanguageServerDiagnostic(SwitchToDefaultLS.bannerMessage, resource)] : [], + ); + } + + protected async onHandle(diagnostics: IDiagnostic[]): Promise { + if (diagnostics.length === 0 || !this.canHandle(diagnostics[0])) { + return; + } + const diagnostic = diagnostics[0]; + if (await this.filterService.shouldIgnoreDiagnostic(diagnostic.code)) { + return; + } + + await this.messageService.handle(diagnostic, { + commandPrompts: [ + { + prompt: Common.gotIt, + }, + ], + }); + } +} diff --git a/src/client/application/diagnostics/commands/execVSCCommand.ts b/src/client/application/diagnostics/commands/execVSCCommand.ts index cb935f05d33d..50c7367f199a 100644 --- a/src/client/application/diagnostics/commands/execVSCCommand.ts +++ b/src/client/application/diagnostics/commands/execVSCCommand.ts @@ -15,7 +15,7 @@ export class ExecuteVSCCommand extends BaseDiagnosticCommand { constructor( diagnostic: IDiagnostic, private serviceContainer: IServiceContainer, - private commandName: CommandsWithoutArgs + private commandName: CommandsWithoutArgs, ) { super(diagnostic); } diff --git a/src/client/application/diagnostics/commands/ignore.ts b/src/client/application/diagnostics/commands/ignore.ts index 07078cc17fe6..311128195975 100644 --- a/src/client/application/diagnostics/commands/ignore.ts +++ b/src/client/application/diagnostics/commands/ignore.ts @@ -13,7 +13,7 @@ export class IgnoreDiagnosticCommand extends BaseDiagnosticCommand { constructor( diagnostic: IDiagnostic, private serviceContainer: IServiceContainer, - private readonly scope: DiagnosticScope + private readonly scope: DiagnosticScope, ) { super(diagnostic); } diff --git a/src/client/application/diagnostics/commands/types.ts b/src/client/application/diagnostics/commands/types.ts index 118dc626be82..f65460b0d113 100644 --- a/src/client/application/diagnostics/commands/types.ts +++ b/src/client/application/diagnostics/commands/types.ts @@ -7,10 +7,10 @@ import { CommandsWithoutArgs } from '../../../common/application/commands'; import { DiagnosticScope, IDiagnostic, IDiagnosticCommand } from '../types'; export type CommandOption = { type: Type; options: Option }; -export type LaunchBrowserOption = CommandOption<'launch', string>; -export type IgnoreDiagnostOption = CommandOption<'ignore', DiagnosticScope>; -export type ExecuteVSCCommandOption = CommandOption<'executeVSCCommand', CommandsWithoutArgs>; -export type CommandOptions = LaunchBrowserOption | IgnoreDiagnostOption | ExecuteVSCCommandOption; +type LaunchBrowserOption = CommandOption<'launch', string>; +type IgnoreDiagnosticOption = CommandOption<'ignore', DiagnosticScope>; +type ExecuteVSCCommandOption = CommandOption<'executeVSCCommand', CommandsWithoutArgs>; +export type CommandOptions = LaunchBrowserOption | IgnoreDiagnosticOption | ExecuteVSCCommandOption; export const IDiagnosticsCommandFactory = Symbol('IDiagnosticsCommandFactory'); diff --git a/src/client/application/diagnostics/constants.ts b/src/client/application/diagnostics/constants.ts index 46deb3c1620b..ca2867fc4f49 100644 --- a/src/client/application/diagnostics/constants.ts +++ b/src/client/application/diagnostics/constants.ts @@ -7,13 +7,21 @@ export enum DiagnosticCodes { InvalidEnvironmentPathVariableDiagnostic = 'InvalidEnvironmentPathVariableDiagnostic', InvalidDebuggerTypeDiagnostic = 'InvalidDebuggerTypeDiagnostic', NoPythonInterpretersDiagnostic = 'NoPythonInterpretersDiagnostic', - MacInterpreterSelectedAndNoOtherInterpretersDiagnostic = 'MacInterpreterSelectedAndNoOtherInterpretersDiagnostic', - MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic = 'MacInterpreterSelectedAndHaveOtherInterpretersDiagnostic', + MacInterpreterSelected = 'MacInterpreterSelected', InvalidPythonPathInDebuggerSettingsDiagnostic = 'InvalidPythonPathInDebuggerSettingsDiagnostic', InvalidPythonPathInDebuggerLaunchDiagnostic = 'InvalidPythonPathInDebuggerLaunchDiagnostic', EnvironmentActivationInPowerShellWithBatchFilesNotSupportedDiagnostic = 'EnvironmentActivationInPowerShellWithBatchFilesNotSupportedDiagnostic', - NoCurrentlySelectedPythonInterpreterDiagnostic = 'InvalidPythonInterpreterDiagnostic', + InvalidPythonInterpreterDiagnostic = 'InvalidPythonInterpreterDiagnostic', + InvalidComspecDiagnostic = 'InvalidComspecDiagnostic', + IncompletePathVarDiagnostic = 'IncompletePathVarDiagnostic', + DefaultShellErrorDiagnostic = 'DefaultShellErrorDiagnostic', LSNotSupportedDiagnostic = 'LSNotSupportedDiagnostic', + PythonPathDeprecatedDiagnostic = 'PythonPathDeprecatedDiagnostic', JustMyCodeDiagnostic = 'JustMyCodeDiagnostic', - ConsoleTypeDiagnostic = 'ConsoleTypeDiagnostic' + ConsoleTypeDiagnostic = 'ConsoleTypeDiagnostic', + ConfigPythonPathDiagnostic = 'ConfigPythonPathDiagnostic', + PylanceDefaultDiagnostic = 'PylanceDefaultDiagnostic', + JediPython27NotSupportedDiagnostic = 'JediPython27NotSupportedDiagnostic', + SwitchToDefaultLanguageServerDiagnostic = 'SwitchToDefaultLanguageServerDiagnostic', + SwitchToPreReleaseExtensionDiagnostic = 'SwitchToPreReleaseExtensionDiagnostic', } diff --git a/src/client/application/diagnostics/filter.ts b/src/client/application/diagnostics/filter.ts index 7aaf94f490e3..a304a6f558fc 100644 --- a/src/client/application/diagnostics/filter.ts +++ b/src/client/application/diagnostics/filter.ts @@ -10,7 +10,7 @@ import { DiagnosticScope, IDiagnosticFilterService } from './types'; export enum FilterKeys { GlobalDiagnosticFilter = 'GLOBAL_DIAGNOSTICS_FILTER', - WorkspaceDiagnosticFilter = 'WORKSPACE_DIAGNOSTICS_FILTER' + WorkspaceDiagnosticFilter = 'WORKSPACE_DIAGNOSTICS_FILTER', } @injectable() @@ -21,7 +21,7 @@ export class DiagnosticFilterService implements IDiagnosticFilterService { const globalState = factory.createGlobalPersistentState(FilterKeys.GlobalDiagnosticFilter, []); const workspaceState = factory.createWorkspacePersistentState( FilterKeys.WorkspaceDiagnosticFilter, - [] + [], ); return globalState.value.indexOf(code) >= 0 || workspaceState.value.indexOf(code) >= 0; } diff --git a/src/client/application/diagnostics/promptHandler.ts b/src/client/application/diagnostics/promptHandler.ts index 2504e0c2ff71..25b946b2ffb5 100644 --- a/src/client/application/diagnostics/promptHandler.ts +++ b/src/client/application/diagnostics/promptHandler.ts @@ -7,7 +7,7 @@ import { inject, injectable } from 'inversify'; import { DiagnosticSeverity } from 'vscode'; import { IApplicationShell } from '../../common/application/types'; import { IServiceContainer } from '../../ioc/types'; -import { IDiagnostic, IDiagnosticCommand, IDiagnosticHandlerService } from './types'; +import { IDiagnostic, IDiagnosticCommand, IDiagnosticHandlerService, IDiagnosticMessageOnCloseHandler } from './types'; export type MessageCommandPrompt = { commandPrompts: { @@ -15,6 +15,7 @@ export type MessageCommandPrompt = { command?: IDiagnosticCommand; }[]; message?: string; + onClose?: IDiagnosticMessageOnCloseHandler; }; export const DiagnosticCommandPromptHandlerServiceId = 'DiagnosticCommandPromptHandlerServiceId'; @@ -27,18 +28,21 @@ export class DiagnosticCommandPromptHandlerService implements IDiagnosticHandler } public async handle( diagnostic: IDiagnostic, - options: MessageCommandPrompt = { commandPrompts: [] } + options: MessageCommandPrompt = { commandPrompts: [] }, ): Promise { - const prompts = options.commandPrompts.map(option => option.prompt); + const prompts = options.commandPrompts.map((option) => option.prompt); const response = await this.displayMessage( options.message ? options.message : diagnostic.message, diagnostic.severity, - prompts + prompts, ); + if (options.onClose) { + options.onClose(response); + } if (!response) { return; } - const selectedOption = options.commandPrompts.find(option => option.prompt === response); + const selectedOption = options.commandPrompts.find((option) => option.prompt === response); if (selectedOption && selectedOption.command) { await selectedOption.command.invoke(); } @@ -46,7 +50,7 @@ export class DiagnosticCommandPromptHandlerService implements IDiagnosticHandler private async displayMessage( message: string, severity: DiagnosticSeverity, - prompts: string[] + prompts: string[], ): Promise { switch (severity) { case DiagnosticSeverity.Error: { diff --git a/src/client/application/diagnostics/serviceRegistry.ts b/src/client/application/diagnostics/serviceRegistry.ts index 6dbce89902da..acf460b88625 100644 --- a/src/client/application/diagnostics/serviceRegistry.ts +++ b/src/client/application/diagnostics/serviceRegistry.ts @@ -3,87 +3,101 @@ 'use strict'; -import { LanguageServerType } from '../../activation/types'; +import { IExtensionSingleActivationService } from '../../activation/types'; import { IServiceManager } from '../../ioc/types'; import { IApplicationDiagnostics } from '../types'; import { ApplicationDiagnostics } from './applicationDiagnostics'; import { EnvironmentPathVariableDiagnosticsService, - EnvironmentPathVariableDiagnosticsServiceId + EnvironmentPathVariableDiagnosticsServiceId, } from './checks/envPathVariable'; -import { - InvalidLaunchJsonDebuggerService, - InvalidLaunchJsonDebuggerServiceId -} from './checks/invalidLaunchJsonDebugger'; import { InvalidPythonPathInDebuggerService, - InvalidPythonPathInDebuggerServiceId + InvalidPythonPathInDebuggerServiceId, } from './checks/invalidPythonPathInDebugger'; -import { LSNotSupportedDiagnosticService, LSNotSupportedDiagnosticServiceId } from './checks/lsNotSupported'; +import { + JediPython27NotSupportedDiagnosticService, + JediPython27NotSupportedDiagnosticServiceId, +} from './checks/jediPython27NotSupported'; import { InvalidMacPythonInterpreterService, - InvalidMacPythonInterpreterServiceId + InvalidMacPythonInterpreterServiceId, } from './checks/macPythonInterpreter'; import { PowerShellActivationHackDiagnosticsService, - PowerShellActivationHackDiagnosticsServiceId + PowerShellActivationHackDiagnosticsServiceId, } from './checks/powerShellActivation'; +import { PylanceDefaultDiagnosticService, PylanceDefaultDiagnosticServiceId } from './checks/pylanceDefault'; import { InvalidPythonInterpreterService, InvalidPythonInterpreterServiceId } from './checks/pythonInterpreter'; +import { + SwitchToDefaultLanguageServerDiagnosticService, + SwitchToDefaultLanguageServerDiagnosticServiceId, +} from './checks/switchToDefaultLS'; import { DiagnosticsCommandFactory } from './commands/factory'; import { IDiagnosticsCommandFactory } from './commands/types'; import { DiagnosticFilterService } from './filter'; import { DiagnosticCommandPromptHandlerService, DiagnosticCommandPromptHandlerServiceId, - MessageCommandPrompt + MessageCommandPrompt, } from './promptHandler'; import { IDiagnosticFilterService, IDiagnosticHandlerService, IDiagnosticsService } from './types'; -export function registerTypes(serviceManager: IServiceManager, languageServerType: LanguageServerType) { +export function registerTypes(serviceManager: IServiceManager): void { serviceManager.addSingleton(IDiagnosticFilterService, DiagnosticFilterService); serviceManager.addSingleton>( IDiagnosticHandlerService, DiagnosticCommandPromptHandlerService, - DiagnosticCommandPromptHandlerServiceId + DiagnosticCommandPromptHandlerServiceId, ); serviceManager.addSingleton( IDiagnosticsService, EnvironmentPathVariableDiagnosticsService, - EnvironmentPathVariableDiagnosticsServiceId + EnvironmentPathVariableDiagnosticsServiceId, ); serviceManager.addSingleton( IDiagnosticsService, - InvalidLaunchJsonDebuggerService, - InvalidLaunchJsonDebuggerServiceId + InvalidPythonInterpreterService, + InvalidPythonInterpreterServiceId, ); - serviceManager.addSingleton( - IDiagnosticsService, + serviceManager.addSingleton( + IExtensionSingleActivationService, InvalidPythonInterpreterService, - InvalidPythonInterpreterServiceId ); serviceManager.addSingleton( IDiagnosticsService, InvalidPythonPathInDebuggerService, - InvalidPythonPathInDebuggerServiceId + InvalidPythonPathInDebuggerServiceId, ); serviceManager.addSingleton( IDiagnosticsService, PowerShellActivationHackDiagnosticsService, - PowerShellActivationHackDiagnosticsServiceId + PowerShellActivationHackDiagnosticsServiceId, ); serviceManager.addSingleton( IDiagnosticsService, InvalidMacPythonInterpreterService, - InvalidMacPythonInterpreterServiceId + InvalidMacPythonInterpreterServiceId, + ); + + serviceManager.addSingleton( + IDiagnosticsService, + PylanceDefaultDiagnosticService, + PylanceDefaultDiagnosticServiceId, ); + + serviceManager.addSingleton( + IDiagnosticsService, + JediPython27NotSupportedDiagnosticService, + JediPython27NotSupportedDiagnosticServiceId, + ); + + serviceManager.addSingleton( + IDiagnosticsService, + SwitchToDefaultLanguageServerDiagnosticService, + SwitchToDefaultLanguageServerDiagnosticServiceId, + ); + serviceManager.addSingleton(IDiagnosticsCommandFactory, DiagnosticsCommandFactory); serviceManager.addSingleton(IApplicationDiagnostics, ApplicationDiagnostics); - - if (languageServerType === LanguageServerType.Microsoft) { - serviceManager.addSingleton( - IDiagnosticsService, - LSNotSupportedDiagnosticService, - LSNotSupportedDiagnosticServiceId - ); - } } diff --git a/src/client/application/diagnostics/surceMapSupportService.ts b/src/client/application/diagnostics/surceMapSupportService.ts deleted file mode 100644 index b2630f99f5eb..000000000000 --- a/src/client/application/diagnostics/surceMapSupportService.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { ConfigurationTarget } from 'vscode'; -import { IApplicationShell, ICommandManager } from '../../common/application/types'; -import { Commands } from '../../common/constants'; -import { IConfigurationService, IDisposableRegistry } from '../../common/types'; -import { Diagnostics } from '../../common/utils/localize'; -import { ISourceMapSupportService } from './types'; - -@injectable() -export class SourceMapSupportService implements ISourceMapSupportService { - constructor( - @inject(ICommandManager) private readonly commandManager: ICommandManager, - @inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry, - @inject(IConfigurationService) private readonly configurationService: IConfigurationService, - @inject(IApplicationShell) private readonly shell: IApplicationShell - ) {} - public register(): void { - this.disposables.push( - this.commandManager.registerCommand(Commands.Enable_SourceMap_Support, this.onEnable, this) - ); - } - public async enable(): Promise { - await this.configurationService.updateSetting( - 'diagnostics.sourceMapsEnabled', - true, - undefined, - ConfigurationTarget.Global - ); - await this.commandManager.executeCommand('workbench.action.reloadWindow'); - } - protected async onEnable(): Promise { - const enableSourceMapsAndReloadVSC = Diagnostics.enableSourceMapsAndReloadVSC(); - const selection = await this.shell.showWarningMessage( - Diagnostics.warnBeforeEnablingSourceMaps(), - enableSourceMapsAndReloadVSC - ); - if (selection === enableSourceMapsAndReloadVSC) { - await this.enable(); - } - } -} diff --git a/src/client/application/diagnostics/types.ts b/src/client/application/diagnostics/types.ts index d38d3f671bf8..1dc9a3c689df 100644 --- a/src/client/application/diagnostics/types.ts +++ b/src/client/application/diagnostics/types.ts @@ -10,12 +10,7 @@ import { DiagnosticCodes } from './constants'; export enum DiagnosticScope { Global = 'Global', - WorkspaceFolder = 'WorkspaceFolder' -} - -export enum DiagnosticIgnoreScope { - always = 'always', - session = 'session' + WorkspaceFolder = 'WorkspaceFolder', } export interface IDiagnostic { @@ -25,12 +20,14 @@ export interface IDiagnostic { readonly scope: DiagnosticScope; readonly resource: Resource; readonly invokeHandler: 'always' | 'default'; + readonly shouldShowPrompt?: boolean; } export const IDiagnosticsService = Symbol('IDiagnosticsService'); export interface IDiagnosticsService { - readonly runInBackground: Boolean; + readonly runInBackground: boolean; + readonly runInUntrustedWorkspace: boolean; diagnose(resource: Resource): Promise; canHandle(diagnostic: IDiagnostic): Promise; handle(diagnostics: IDiagnostic[]): Promise; @@ -54,13 +51,16 @@ export interface IDiagnosticCommand { invoke(): Promise; } +export type IDiagnosticMessageOnCloseHandler = (response?: string) => void; + +export const IInvalidPythonPathInSettings = Symbol('IInvalidPythonPathInSettings'); + +export interface IInvalidPythonPathInSettings extends IDiagnosticsService { + validateInterpreterPathInSettings(resource: Resource): Promise; +} + export const IInvalidPythonPathInDebuggerService = Symbol('IInvalidPythonPathInDebuggerService'); export interface IInvalidPythonPathInDebuggerService extends IDiagnosticsService { validatePythonPath(pythonPath?: string, pythonPathSource?: PythonPathSource, resource?: Uri): Promise; } -export const ISourceMapSupportService = Symbol('ISourceMapSupportService'); -export interface ISourceMapSupportService { - register(): void; - enable(): Promise; -} diff --git a/src/client/application/serviceRegistry.ts b/src/client/application/serviceRegistry.ts index b4f8f3c30ccc..ff5376d70b24 100644 --- a/src/client/application/serviceRegistry.ts +++ b/src/client/application/serviceRegistry.ts @@ -3,13 +3,9 @@ 'use strict'; -import { LanguageServerType } from '../activation/types'; import { IServiceManager } from '../ioc/types'; import { registerTypes as diagnosticsRegisterTypes } from './diagnostics/serviceRegistry'; -import { SourceMapSupportService } from './diagnostics/surceMapSupportService'; -import { ISourceMapSupportService } from './diagnostics/types'; -export function registerTypes(serviceManager: IServiceManager, languageServerType: LanguageServerType) { - serviceManager.addSingleton(ISourceMapSupportService, SourceMapSupportService); - diagnosticsRegisterTypes(serviceManager, languageServerType); +export function registerTypes(serviceManager: IServiceManager) { + diagnosticsRegisterTypes(serviceManager); } diff --git a/src/client/application/types.ts b/src/client/application/types.ts index 460ac39807c8..cfd41f7b9746 100644 --- a/src/client/application/types.ts +++ b/src/client/application/types.ts @@ -11,8 +11,6 @@ export interface IApplicationDiagnostics { /** * Perform pre-extension activation health checks. * E.g. validate user environment, etc. - * @returns {Promise} - * @memberof IApplicationDiagnostics */ performPreStartupHealthCheck(resource: Resource): Promise; register(): void; diff --git a/src/client/browser/api.ts b/src/client/browser/api.ts new file mode 100644 index 000000000000..ac2df8d0ffed --- /dev/null +++ b/src/client/browser/api.ts @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { BaseLanguageClient } from 'vscode-languageclient'; +import { LanguageClient } from 'vscode-languageclient/browser'; +import { PYTHON_LANGUAGE } from '../common/constants'; +import { ApiForPylance, TelemetryReporter } from '../pylanceApi'; + +export interface IBrowserExtensionApi { + /** + * @deprecated Temporarily exposed for Pylance until we expose this API generally. Will be removed in an + * iteration or two. + */ + pylance: ApiForPylance; +} + +export function buildApi(reporter: TelemetryReporter): IBrowserExtensionApi { + const api: IBrowserExtensionApi = { + pylance: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + createClient: (...args: any[]): BaseLanguageClient => + new LanguageClient(PYTHON_LANGUAGE, 'Python Language Server', args[0], args[1]), + start: (client: BaseLanguageClient): Promise => client.start(), + stop: (client: BaseLanguageClient): Promise => client.stop(), + getTelemetryReporter: () => reporter, + }, + }; + + return api; +} diff --git a/src/client/browser/extension.ts b/src/client/browser/extension.ts new file mode 100644 index 000000000000..132618430551 --- /dev/null +++ b/src/client/browser/extension.ts @@ -0,0 +1,231 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import * as vscode from 'vscode'; +import TelemetryReporter from '@vscode/extension-telemetry'; +import { LanguageClientOptions } from 'vscode-languageclient'; +import { LanguageClient } from 'vscode-languageclient/browser'; +import { LanguageClientMiddlewareBase } from '../activation/languageClientMiddlewareBase'; +import { LanguageServerType } from '../activation/types'; +import { AppinsightsKey, PYLANCE_EXTENSION_ID } from '../common/constants'; +import { EventName } from '../telemetry/constants'; +import { createStatusItem } from './intellisenseStatus'; +import { PylanceApi } from '../activation/node/pylanceApi'; +import { buildApi, IBrowserExtensionApi } from './api'; + +interface BrowserConfig { + distUrl: string; // URL to Pylance's dist folder. +} + +let languageClient: LanguageClient | undefined; +let pylanceApi: PylanceApi | undefined; + +export function activate(context: vscode.ExtensionContext): Promise { + const reporter = getTelemetryReporter(); + + const activationPromise = Promise.resolve(buildApi(reporter)); + const pylanceExtension = vscode.extensions.getExtension(PYLANCE_EXTENSION_ID); + if (pylanceExtension) { + // Make sure we run pylance once we activated core extension. + activationPromise.then(() => runPylance(context, pylanceExtension)); + return activationPromise; + } + + const changeDisposable = vscode.extensions.onDidChange(async () => { + const newPylanceExtension = vscode.extensions.getExtension(PYLANCE_EXTENSION_ID); + if (newPylanceExtension) { + changeDisposable.dispose(); + await runPylance(context, newPylanceExtension); + } + }); + + return activationPromise; +} + +export async function deactivate(): Promise { + if (pylanceApi) { + const api = pylanceApi; + pylanceApi = undefined; + await api.client!.stop(); + } + + if (languageClient) { + const client = languageClient; + languageClient = undefined; + + await client.stop(); + await client.dispose(); + } +} + +async function runPylance( + context: vscode.ExtensionContext, + pylanceExtension: vscode.Extension, +): Promise { + context.subscriptions.push(createStatusItem()); + + pylanceExtension = await getActivatedExtension(pylanceExtension); + const api = pylanceExtension.exports; + if (api.client && api.client.isEnabled()) { + pylanceApi = api; + await api.client.start(); + return; + } + + const { extensionUri, packageJSON } = pylanceExtension; + const distUrl = vscode.Uri.joinPath(extensionUri, 'dist'); + + try { + const worker = new Worker(vscode.Uri.joinPath(distUrl, 'browser.server.bundle.js').toString()); + + // Pass the configuration as the first message to the worker so it can + // have info like the URL of the dist folder early enough. + // + // This is the same method used by the TS worker: + // https://github.com/microsoft/vscode/blob/90aa979bb75a795fd8c33d38aee263ea655270d0/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts#L55 + const config: BrowserConfig = { distUrl: distUrl.toString() }; + worker.postMessage(config); + + const middleware = new LanguageClientMiddlewareBase( + undefined, + LanguageServerType.Node, + sendTelemetryEventBrowser, + packageJSON.version, + ); + middleware.connect(); + + const clientOptions: LanguageClientOptions = { + // Register the server for python source files. + documentSelector: [ + { + language: 'python', + }, + ], + synchronize: { + // Synchronize the setting section to the server. + configurationSection: ['python', 'jupyter.runStartupCommands'], + }, + middleware, + }; + + const client = new LanguageClient('python', 'Python Language Server', worker, clientOptions); + languageClient = client; + + context.subscriptions.push( + vscode.commands.registerCommand('python.viewLanguageServerOutput', () => client.outputChannel.show()), + ); + + client.onTelemetry( + (telemetryEvent: { + EventName: EventName; + Properties: { method: string }; + Measurements: number | Record | undefined; + Exception: Error | undefined; + }) => { + const eventName = telemetryEvent.EventName || EventName.LANGUAGE_SERVER_TELEMETRY; + const formattedProperties = { + ...telemetryEvent.Properties, + // Replace all slashes in the method name so it doesn't get scrubbed by @vscode/extension-telemetry. + method: telemetryEvent.Properties.method?.replace(/\//g, '.'), + }; + sendTelemetryEventBrowser( + eventName, + telemetryEvent.Measurements, + formattedProperties, + telemetryEvent.Exception, + ); + }, + ); + + await client.start(); + } catch (e) { + console.log(e); // necessary to use console.log for browser + } +} + +// Duplicate code from telemetry/index.ts to avoid pulling in winston, +// which doesn't support the browser. + +let telemetryReporter: TelemetryReporter | undefined; +function getTelemetryReporter() { + if (telemetryReporter) { + return telemetryReporter; + } + + // eslint-disable-next-line global-require + const Reporter = require('@vscode/extension-telemetry').default as typeof TelemetryReporter; + telemetryReporter = new Reporter(AppinsightsKey, [ + { + lookup: /(errorName|errorMessage|errorStack)/g, + }, + ]); + + return telemetryReporter; +} + +function sendTelemetryEventBrowser( + eventName: EventName, + measuresOrDurationMs?: Record | number, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + properties?: any, + ex?: Error, +): void { + const reporter = getTelemetryReporter(); + const measures = + typeof measuresOrDurationMs === 'number' + ? { duration: measuresOrDurationMs } + : measuresOrDurationMs || undefined; + const customProperties: Record = {}; + const eventNameSent = eventName as string; + + if (properties) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const data = properties as any; + Object.getOwnPropertyNames(data).forEach((prop) => { + if (data[prop] === undefined || data[prop] === null) { + return; + } + try { + // If there are any errors in serializing one property, ignore that and move on. + // Else nothing will be sent. + switch (typeof data[prop]) { + case 'string': + customProperties[prop] = data[prop]; + break; + case 'object': + customProperties[prop] = 'object'; + break; + default: + customProperties[prop] = data[prop].toString(); + break; + } + } catch (exception) { + console.error(`Failed to serialize ${prop} for ${eventName}`, exception); // necessary to use console.log for browser + } + }); + } + + // Add shared properties to telemetry props (we may overwrite existing ones). + // Removed in the browser; there's no setSharedProperty. + // Object.assign(customProperties, sharedProperties); + + if (ex) { + const errorProps = { + errorName: ex.name, + errorStack: ex.stack ?? '', + }; + Object.assign(customProperties, errorProps); + + reporter.sendTelemetryErrorEvent(eventNameSent, customProperties, measures); + } else { + reporter.sendTelemetryEvent(eventNameSent, customProperties, measures); + } +} + +async function getActivatedExtension(extension: vscode.Extension): Promise> { + if (!extension.isActive) { + await extension.activate(); + } + + return extension; +} diff --git a/src/client/browser/intellisenseStatus.ts b/src/client/browser/intellisenseStatus.ts new file mode 100644 index 000000000000..b7a49e86dbb0 --- /dev/null +++ b/src/client/browser/intellisenseStatus.ts @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// IMPORTANT: Do not import any node fs related modules here, as they do not work in browser. +import * as vscode from 'vscode'; +import { Common, LanguageService } from './localize'; + +export function createStatusItem(): vscode.Disposable { + if ('createLanguageStatusItem' in vscode.languages) { + const statusItem = vscode.languages.createLanguageStatusItem('python.projectStatus', { + language: 'python', + }); + statusItem.name = LanguageService.statusItem.name; + statusItem.severity = vscode.LanguageStatusSeverity.Warning; + statusItem.text = LanguageService.statusItem.text; + statusItem.detail = LanguageService.statusItem.detail; + statusItem.command = { + title: Common.learnMore, + command: 'vscode.open', + arguments: [vscode.Uri.parse('https://aka.ms/AAdzyh4')], + }; + return statusItem; + } + // eslint-disable-next-line @typescript-eslint/no-empty-function + return { dispose: () => undefined }; +} diff --git a/src/client/browser/localize.ts b/src/client/browser/localize.ts new file mode 100644 index 000000000000..fd50dbcc7093 --- /dev/null +++ b/src/client/browser/localize.ts @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { l10n } from 'vscode'; + +/* eslint-disable @typescript-eslint/no-namespace */ + +// IMPORTANT: Do not import any node fs related modules here, as they do not work in browser. + +export namespace LanguageService { + export const statusItem = { + name: l10n.t('Python IntelliSense Status'), + text: l10n.t('Partial Mode'), + detail: l10n.t('Limited IntelliSense provided by Pylance'), + }; +} + +export namespace Common { + export const learnMore = l10n.t('Learn more'); +} diff --git a/src/client/chat/baseTool.ts b/src/client/chat/baseTool.ts new file mode 100644 index 000000000000..2eedbbe226e3 --- /dev/null +++ b/src/client/chat/baseTool.ts @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + LanguageModelTextPart, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, + workspace, +} from 'vscode'; +import { IResourceReference, isCancellationError, resolveFilePath } from './utils'; +import { ErrorWithTelemetrySafeReason } from '../common/errors/errorUtils'; +import { sendTelemetryEvent } from '../telemetry'; +import { EventName } from '../telemetry/constants'; + +export abstract class BaseTool implements LanguageModelTool { + constructor(private readonly toolName: string) {} + + async invoke( + options: LanguageModelToolInvocationOptions, + token: CancellationToken, + ): Promise { + if (!workspace.isTrusted) { + return new LanguageModelToolResult([ + new LanguageModelTextPart('Cannot use this tool in an untrusted workspace.'), + ]); + } + let error: Error | undefined; + const resource = resolveFilePath(options.input.resourcePath); + try { + return await this.invokeImpl(options, resource, token); + } catch (ex) { + error = ex as any; + throw ex; + } finally { + const isCancelled = token.isCancellationRequested || (error ? isCancellationError(error) : false); + const failed = !!error || isCancelled; + const failureCategory = isCancelled + ? 'cancelled' + : error + ? error instanceof ErrorWithTelemetrySafeReason + ? error.telemetrySafeReason + : 'error' + : undefined; + sendTelemetryEvent(EventName.INVOKE_TOOL, undefined, { + toolName: this.toolName, + failed, + failureCategory, + }); + } + } + protected abstract invokeImpl( + options: LanguageModelToolInvocationOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise; + + async prepareInvocation( + options: LanguageModelToolInvocationPrepareOptions, + token: CancellationToken, + ): Promise { + const resource = resolveFilePath(options.input.resourcePath); + return this.prepareInvocationImpl(options, resource, token); + } + + protected abstract prepareInvocationImpl( + options: LanguageModelToolInvocationPrepareOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise; +} diff --git a/src/client/chat/configurePythonEnvTool.ts b/src/client/chat/configurePythonEnvTool.ts new file mode 100644 index 000000000000..0634b9c9ac34 --- /dev/null +++ b/src/client/chat/configurePythonEnvTool.ts @@ -0,0 +1,123 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, + workspace, + lm, +} from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { ICodeExecutionService } from '../terminals/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { + getEnvDetailsForResponse, + getToolResponseIfNotebook, + IResourceReference, + isCancellationError, + raceCancellationError, +} from './utils'; +import { ITerminalHelper } from '../common/terminal/types'; +import { IRecommendedEnvironmentService } from '../interpreter/configuration/types'; +import { CreateVirtualEnvTool } from './createVirtualEnvTool'; +import { ISelectPythonEnvToolArguments, SelectPythonEnvTool } from './selectEnvTool'; +import { BaseTool } from './baseTool'; + +export class ConfigurePythonEnvTool extends BaseTool + implements LanguageModelTool { + private readonly terminalExecutionService: TerminalCodeExecutionProvider; + private readonly terminalHelper: ITerminalHelper; + private readonly recommendedEnvService: IRecommendedEnvironmentService; + public static readonly toolName = 'configure_python_environment'; + constructor( + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + private readonly createEnvTool: CreateVirtualEnvTool, + ) { + super(ConfigurePythonEnvTool.toolName); + this.terminalExecutionService = this.serviceContainer.get( + ICodeExecutionService, + 'standard', + ); + this.terminalHelper = this.serviceContainer.get(ITerminalHelper); + this.recommendedEnvService = this.serviceContainer.get( + IRecommendedEnvironmentService, + ); + } + + async invokeImpl( + options: LanguageModelToolInvocationOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise { + const notebookResponse = getToolResponseIfNotebook(resource); + if (notebookResponse) { + return notebookResponse; + } + + const workspaceSpecificEnv = await raceCancellationError( + this.hasAlreadyGotAWorkspaceSpecificEnvironment(resource), + token, + ); + + if (workspaceSpecificEnv) { + return getEnvDetailsForResponse( + workspaceSpecificEnv, + this.api, + this.terminalExecutionService, + this.terminalHelper, + resource, + token, + ); + } + + if (await this.createEnvTool.shouldCreateNewVirtualEnv(resource, token)) { + try { + return await lm.invokeTool(CreateVirtualEnvTool.toolName, options, token); + } catch (ex) { + if (isCancellationError(ex)) { + const input: ISelectPythonEnvToolArguments = { + ...options.input, + reason: 'cancelled', + }; + // If the user cancelled the tool, then we should invoke the select env tool. + return lm.invokeTool(SelectPythonEnvTool.toolName, { ...options, input }, token); + } + throw ex; + } + } else { + const input: ISelectPythonEnvToolArguments = { + ...options.input, + }; + return lm.invokeTool(SelectPythonEnvTool.toolName, { ...options, input }, token); + } + } + + async prepareInvocationImpl( + _options: LanguageModelToolInvocationPrepareOptions, + _resource: Uri | undefined, + _token: CancellationToken, + ): Promise { + return { + invocationMessage: 'Configuring a Python Environment', + }; + } + + async hasAlreadyGotAWorkspaceSpecificEnvironment(resource: Uri | undefined) { + const recommededEnv = await this.recommendedEnvService.getRecommededEnvironment(resource); + // Already selected workspace env, hence nothing to do. + if (recommededEnv?.reason === 'workspaceUserSelected' && workspace.workspaceFolders?.length) { + return recommededEnv.environment; + } + // No workspace folders, and the user selected a global environment. + if (recommededEnv?.reason === 'globalUserSelected' && !workspace.workspaceFolders?.length) { + return recommededEnv.environment; + } + } +} diff --git a/src/client/chat/createVirtualEnvTool.ts b/src/client/chat/createVirtualEnvTool.ts new file mode 100644 index 000000000000..56760d2b4bef --- /dev/null +++ b/src/client/chat/createVirtualEnvTool.ts @@ -0,0 +1,246 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationError, + CancellationToken, + commands, + l10n, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, + workspace, +} from 'vscode'; +import { PythonExtension, ResolvedEnvironment } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { ICodeExecutionService } from '../terminals/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { + doesWorkspaceHaveVenvOrCondaEnv, + getDisplayVersion, + getEnvDetailsForResponse, + IResourceReference, + isCancellationError, + raceCancellationError, +} from './utils'; +import { ITerminalHelper } from '../common/terminal/types'; +import { raceTimeout, sleep } from '../common/utils/async'; +import { IInterpreterPathService } from '../common/types'; +import { DisposableStore } from '../common/utils/resourceLifecycle'; +import { IRecommendedEnvironmentService } from '../interpreter/configuration/types'; +import { EnvironmentType } from '../pythonEnvironments/info'; +import { IDiscoveryAPI } from '../pythonEnvironments/base/locator'; +import { convertEnvInfoToPythonEnvironment } from '../pythonEnvironments/legacyIOC'; +import { sortInterpreters } from '../interpreter/helpers'; +import { isStableVersion } from '../pythonEnvironments/info/pythonVersion'; +import { createVirtualEnvironment } from '../pythonEnvironments/creation/createEnvApi'; +import { traceError, traceVerbose, traceWarn } from '../logging'; +import { StopWatch } from '../common/utils/stopWatch'; +import { useEnvExtension } from '../envExt/api.internal'; +import { PythonEnvironment } from '../envExt/types'; +import { hideEnvCreation } from '../pythonEnvironments/creation/provider/hideEnvCreation'; +import { BaseTool } from './baseTool'; + +interface ICreateVirtualEnvToolParams extends IResourceReference { + packageList?: string[]; // Added only becausewe have ability to create a virtual env with list of packages same tool within the in Python Env extension. +} + +export class CreateVirtualEnvTool extends BaseTool + implements LanguageModelTool { + private readonly terminalExecutionService: TerminalCodeExecutionProvider; + private readonly terminalHelper: ITerminalHelper; + private readonly recommendedEnvService: IRecommendedEnvironmentService; + + public static readonly toolName = 'create_virtual_environment'; + constructor( + private readonly discoveryApi: IDiscoveryAPI, + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + ) { + super(CreateVirtualEnvTool.toolName); + this.terminalExecutionService = this.serviceContainer.get( + ICodeExecutionService, + 'standard', + ); + this.terminalHelper = this.serviceContainer.get(ITerminalHelper); + this.recommendedEnvService = this.serviceContainer.get( + IRecommendedEnvironmentService, + ); + } + + async invokeImpl( + options: LanguageModelToolInvocationOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise { + let info = await this.getPreferredEnvForCreation(resource); + if (!info) { + traceWarn(`Called ${CreateVirtualEnvTool.toolName} tool not invoked, no preferred environment found.`); + throw new CancellationError(); + } + const { workspaceFolder, preferredGlobalPythonEnv } = info; + const interpreterPathService = this.serviceContainer.get(IInterpreterPathService); + const disposables = new DisposableStore(); + try { + disposables.add(hideEnvCreation()); + const interpreterChanged = new Promise((resolve) => { + disposables.add(interpreterPathService.onDidChange(() => resolve())); + }); + + let createdEnvPath: string | undefined = undefined; + if (useEnvExtension()) { + const result: PythonEnvironment | undefined = await commands.executeCommand('python-envs.createAny', { + quickCreate: true, + additionalPackages: options.input.packageList || [], + uri: workspaceFolder.uri, + selectEnvironment: true, + }); + createdEnvPath = result?.environmentPath.fsPath; + } else { + const created = await raceCancellationError( + createVirtualEnvironment({ + interpreter: preferredGlobalPythonEnv.id, + workspaceFolder, + }), + token, + ); + createdEnvPath = created?.path; + } + if (!createdEnvPath) { + traceWarn(`${CreateVirtualEnvTool.toolName} tool not invoked, virtual env not created.`); + throw new CancellationError(); + } + + // Wait a few secs to ensure the env is selected as the active environment.. + // If this doesn't work, then something went wrong. + await raceTimeout(5_000, interpreterChanged); + + const stopWatch = new StopWatch(); + let env: ResolvedEnvironment | undefined; + while (stopWatch.elapsedTime < 5_000 || !env) { + env = await this.api.resolveEnvironment(createdEnvPath); + if (env) { + break; + } else { + traceVerbose( + `${CreateVirtualEnvTool.toolName} tool invoked, env created but not yet resolved, waiting...`, + ); + await sleep(200); + } + } + if (!env) { + traceError(`${CreateVirtualEnvTool.toolName} tool invoked, env created but unable to resolve details.`); + throw new CancellationError(); + } + return await getEnvDetailsForResponse( + env, + this.api, + this.terminalExecutionService, + this.terminalHelper, + resource, + token, + ); + } catch (ex) { + if (!isCancellationError(ex)) { + traceError( + `${ + CreateVirtualEnvTool.toolName + } tool failed to create virtual environment for resource ${resource?.toString()}`, + ex, + ); + } + throw ex; + } finally { + disposables.dispose(); + } + } + + public async shouldCreateNewVirtualEnv(resource: Uri | undefined, token: CancellationToken): Promise { + if (doesWorkspaceHaveVenvOrCondaEnv(resource, this.api)) { + // If we already have a .venv or .conda in this workspace, then do not prompt to create a virtual environment. + return false; + } + + const info = await raceCancellationError(this.getPreferredEnvForCreation(resource), token); + return info ? true : false; + } + + async prepareInvocationImpl( + _options: LanguageModelToolInvocationPrepareOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise { + const info = await raceCancellationError(this.getPreferredEnvForCreation(resource), token); + if (!info) { + return {}; + } + const { preferredGlobalPythonEnv } = info; + const version = getDisplayVersion(preferredGlobalPythonEnv.version); + return { + confirmationMessages: { + title: l10n.t('Create a Virtual Environment{0}?', version ? ` (${version})` : ''), + message: l10n.t(`Virtual Environments provide the benefit of package isolation and more.`), + }, + invocationMessage: l10n.t('Creating a Virtual Environment'), + }; + } + async hasAlreadyGotAWorkspaceSpecificEnvironment(resource: Uri | undefined) { + const recommededEnv = await this.recommendedEnvService.getRecommededEnvironment(resource); + // Already selected workspace env, hence nothing to do. + if (recommededEnv?.reason === 'workspaceUserSelected' && workspace.workspaceFolders?.length) { + return recommededEnv.environment; + } + // No workspace folders, and the user selected a global environment. + if (recommededEnv?.reason === 'globalUserSelected' && !workspace.workspaceFolders?.length) { + return recommededEnv.environment; + } + } + + private async getPreferredEnvForCreation(resource: Uri | undefined) { + if (await this.hasAlreadyGotAWorkspaceSpecificEnvironment(resource)) { + return undefined; + } + + // If we have a resource or have only one workspace folder && there is no .venv and no workspace specific environment. + // Then lets recommend creating a virtual environment. + const workspaceFolder = + resource && workspace.workspaceFolders?.length + ? workspace.getWorkspaceFolder(resource) + : workspace.workspaceFolders?.length === 1 + ? workspace.workspaceFolders[0] + : undefined; + if (!workspaceFolder) { + // No workspace folder, hence no need to create a virtual environment. + return undefined; + } + + // Find the latest stable version of Python from the list of know envs. + let globalPythonEnvs = this.discoveryApi + .getEnvs() + .map((env) => convertEnvInfoToPythonEnvironment(env)) + .filter((env) => + [ + EnvironmentType.System, + EnvironmentType.MicrosoftStore, + EnvironmentType.Global, + EnvironmentType.Pyenv, + ].includes(env.envType), + ) + .filter((env) => env.version && isStableVersion(env.version)); + + globalPythonEnvs = sortInterpreters(globalPythonEnvs); + const preferredGlobalPythonEnv = globalPythonEnvs.length + ? this.api.known.find((e) => e.id === globalPythonEnvs[globalPythonEnvs.length - 1].id) + : undefined; + + return workspaceFolder && preferredGlobalPythonEnv + ? { + workspaceFolder, + preferredGlobalPythonEnv, + } + : undefined; + } +} diff --git a/src/client/chat/getExecutableTool.ts b/src/client/chat/getExecutableTool.ts new file mode 100644 index 000000000000..746a540d14f8 --- /dev/null +++ b/src/client/chat/getExecutableTool.ts @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + l10n, + LanguageModelTextPart, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, +} from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { ICodeExecutionService } from '../terminals/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { + getEnvDisplayName, + getEnvironmentDetails, + getToolResponseIfNotebook, + IResourceReference, + raceCancellationError, +} from './utils'; +import { ITerminalHelper } from '../common/terminal/types'; +import { IDiscoveryAPI } from '../pythonEnvironments/base/locator'; +import { BaseTool } from './baseTool'; + +export class GetExecutableTool extends BaseTool implements LanguageModelTool { + private readonly terminalExecutionService: TerminalCodeExecutionProvider; + private readonly terminalHelper: ITerminalHelper; + public static readonly toolName = 'get_python_executable_details'; + constructor( + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + private readonly discovery: IDiscoveryAPI, + ) { + super(GetExecutableTool.toolName); + this.terminalExecutionService = this.serviceContainer.get( + ICodeExecutionService, + 'standard', + ); + this.terminalHelper = this.serviceContainer.get(ITerminalHelper); + } + async invokeImpl( + _options: LanguageModelToolInvocationOptions, + resourcePath: Uri | undefined, + token: CancellationToken, + ): Promise { + const notebookResponse = getToolResponseIfNotebook(resourcePath); + if (notebookResponse) { + return notebookResponse; + } + + const message = await getEnvironmentDetails( + resourcePath, + this.api, + this.terminalExecutionService, + this.terminalHelper, + undefined, + token, + ); + return new LanguageModelToolResult([new LanguageModelTextPart(message)]); + } + + async prepareInvocationImpl( + _options: LanguageModelToolInvocationPrepareOptions, + resourcePath: Uri | undefined, + token: CancellationToken, + ): Promise { + if (getToolResponseIfNotebook(resourcePath)) { + return {}; + } + + const envName = await raceCancellationError(getEnvDisplayName(this.discovery, resourcePath, this.api), token); + return { + invocationMessage: envName + ? l10n.t('Fetching Python executable information for {0}', envName) + : l10n.t('Fetching Python executable information'), + }; + } +} diff --git a/src/client/chat/getPythonEnvTool.ts b/src/client/chat/getPythonEnvTool.ts new file mode 100644 index 000000000000..ed1dd0374424 --- /dev/null +++ b/src/client/chat/getPythonEnvTool.ts @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + l10n, + LanguageModelTextPart, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, +} from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { ICodeExecutionService } from '../terminals/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { IProcessServiceFactory, IPythonExecutionFactory } from '../common/process/types'; +import { getEnvironmentDetails, getToolResponseIfNotebook, IResourceReference, raceCancellationError } from './utils'; +import { getPythonPackagesResponse } from './listPackagesTool'; +import { ITerminalHelper } from '../common/terminal/types'; +import { getEnvExtApi, useEnvExtension } from '../envExt/api.internal'; +import { ErrorWithTelemetrySafeReason } from '../common/errors/errorUtils'; +import { BaseTool } from './baseTool'; + +export class GetEnvironmentInfoTool extends BaseTool + implements LanguageModelTool { + private readonly terminalExecutionService: TerminalCodeExecutionProvider; + private readonly pythonExecFactory: IPythonExecutionFactory; + private readonly processServiceFactory: IProcessServiceFactory; + private readonly terminalHelper: ITerminalHelper; + public static readonly toolName = 'get_python_environment_details'; + constructor( + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + ) { + super(GetEnvironmentInfoTool.toolName); + this.terminalExecutionService = this.serviceContainer.get( + ICodeExecutionService, + 'standard', + ); + this.pythonExecFactory = this.serviceContainer.get(IPythonExecutionFactory); + this.processServiceFactory = this.serviceContainer.get(IProcessServiceFactory); + this.terminalHelper = this.serviceContainer.get(ITerminalHelper); + } + + async invokeImpl( + _options: LanguageModelToolInvocationOptions, + resourcePath: Uri | undefined, + token: CancellationToken, + ): Promise { + const notebookResponse = getToolResponseIfNotebook(resourcePath); + if (notebookResponse) { + return notebookResponse; + } + + // environment + const envPath = this.api.getActiveEnvironmentPath(resourcePath); + const environment = await raceCancellationError(this.api.resolveEnvironment(envPath), token); + if (!environment || !environment.version) { + throw new ErrorWithTelemetrySafeReason( + 'No environment found for the provided resource path: ' + resourcePath?.fsPath, + 'noEnvFound', + ); + } + + let packages = ''; + if (useEnvExtension()) { + const api = await getEnvExtApi(); + const env = await api.getEnvironment(resourcePath); + const pkgs = env ? await api.getPackages(env) : []; + if (pkgs && pkgs.length > 0) { + // Installed Python packages, each in the format or (). The version may be omitted if unknown. Returns an empty array if no packages are installed. + const response = [ + 'Below is a list of the Python packages, each in the format or (). The version may be omitted if unknown: ', + ]; + pkgs.forEach((pkg) => { + const version = pkg.version; + response.push(version ? `- ${pkg.name} (${version})` : `- ${pkg.name}`); + }); + packages = response.join('\n'); + } + } + if (!packages) { + packages = await getPythonPackagesResponse( + environment, + this.pythonExecFactory, + this.processServiceFactory, + resourcePath, + token, + ); + } + const message = await getEnvironmentDetails( + resourcePath, + this.api, + this.terminalExecutionService, + this.terminalHelper, + packages, + token, + ); + + return new LanguageModelToolResult([new LanguageModelTextPart(message)]); + } + + async prepareInvocationImpl( + _options: LanguageModelToolInvocationPrepareOptions, + resourcePath: Uri | undefined, + _token: CancellationToken, + ): Promise { + if (getToolResponseIfNotebook(resourcePath)) { + return {}; + } + + return { + invocationMessage: l10n.t('Fetching Python environment information'), + }; + } +} diff --git a/src/client/chat/index.ts b/src/client/chat/index.ts new file mode 100644 index 000000000000..b548860eaae3 --- /dev/null +++ b/src/client/chat/index.ts @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { lm } from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { InstallPackagesTool } from './installPackagesTool'; +import { IExtensionContext } from '../common/types'; +import { DisposableStore } from '../common/utils/resourceLifecycle'; +import { IDiscoveryAPI } from '../pythonEnvironments/base/locator'; +import { GetExecutableTool } from './getExecutableTool'; +import { GetEnvironmentInfoTool } from './getPythonEnvTool'; +import { ConfigurePythonEnvTool } from './configurePythonEnvTool'; +import { SelectPythonEnvTool } from './selectEnvTool'; +import { CreateVirtualEnvTool } from './createVirtualEnvTool'; + +export function registerTools( + context: IExtensionContext, + discoverApi: IDiscoveryAPI, + environmentsApi: PythonExtension['environments'], + serviceContainer: IServiceContainer, +) { + const ourTools = new DisposableStore(); + context.subscriptions.push(ourTools); + + ourTools.add( + lm.registerTool(GetEnvironmentInfoTool.toolName, new GetEnvironmentInfoTool(environmentsApi, serviceContainer)), + ); + ourTools.add( + lm.registerTool( + GetExecutableTool.toolName, + new GetExecutableTool(environmentsApi, serviceContainer, discoverApi), + ), + ); + ourTools.add( + lm.registerTool( + InstallPackagesTool.toolName, + new InstallPackagesTool(environmentsApi, serviceContainer, discoverApi), + ), + ); + const createVirtualEnvTool = new CreateVirtualEnvTool(discoverApi, environmentsApi, serviceContainer); + ourTools.add(lm.registerTool(CreateVirtualEnvTool.toolName, createVirtualEnvTool)); + ourTools.add( + lm.registerTool(SelectPythonEnvTool.toolName, new SelectPythonEnvTool(environmentsApi, serviceContainer)), + ); + ourTools.add( + lm.registerTool( + ConfigurePythonEnvTool.toolName, + new ConfigurePythonEnvTool(environmentsApi, serviceContainer, createVirtualEnvTool), + ), + ); +} diff --git a/src/client/chat/installPackagesTool.ts b/src/client/chat/installPackagesTool.ts new file mode 100644 index 000000000000..f7795620cf13 --- /dev/null +++ b/src/client/chat/installPackagesTool.ts @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + l10n, + LanguageModelTextPart, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, +} from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { + getEnvDisplayName, + getToolResponseIfNotebook, + IResourceReference, + isCancellationError, + isCondaEnv, + raceCancellationError, +} from './utils'; +import { IModuleInstaller } from '../common/installer/types'; +import { ModuleInstallerType } from '../pythonEnvironments/info'; +import { IDiscoveryAPI } from '../pythonEnvironments/base/locator'; +import { getEnvExtApi, useEnvExtension } from '../envExt/api.internal'; +import { ErrorWithTelemetrySafeReason } from '../common/errors/errorUtils'; +import { BaseTool } from './baseTool'; + +export interface IInstallPackageArgs extends IResourceReference { + packageList: string[]; +} + +export class InstallPackagesTool extends BaseTool + implements LanguageModelTool { + public static readonly toolName = 'install_python_packages'; + constructor( + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + private readonly discovery: IDiscoveryAPI, + ) { + super(InstallPackagesTool.toolName); + } + + async invokeImpl( + options: LanguageModelToolInvocationOptions, + resourcePath: Uri | undefined, + token: CancellationToken, + ): Promise { + const packageCount = options.input.packageList.length; + const packagePlurality = packageCount === 1 ? 'package' : 'packages'; + const notebookResponse = getToolResponseIfNotebook(resourcePath); + if (notebookResponse) { + return notebookResponse; + } + + if (useEnvExtension()) { + const api = await getEnvExtApi(); + const env = await api.getEnvironment(resourcePath); + if (env) { + await raceCancellationError(api.managePackages(env, { install: options.input.packageList }), token); + const resultMessage = `Successfully installed ${packagePlurality}: ${options.input.packageList.join( + ', ', + )}`; + return new LanguageModelToolResult([new LanguageModelTextPart(resultMessage)]); + } else { + return new LanguageModelToolResult([ + new LanguageModelTextPart( + `Packages not installed. No environment found for: ${resourcePath?.fsPath}`, + ), + ]); + } + } + + try { + // environment + const envPath = this.api.getActiveEnvironmentPath(resourcePath); + const environment = await raceCancellationError(this.api.resolveEnvironment(envPath), token); + if (!environment || !environment.version) { + throw new ErrorWithTelemetrySafeReason( + 'No environment found for the provided resource path: ' + resourcePath?.fsPath, + 'noEnvFound', + ); + } + const isConda = isCondaEnv(environment); + const installers = this.serviceContainer.getAll(IModuleInstaller); + const installerType = isConda ? ModuleInstallerType.Conda : ModuleInstallerType.Pip; + const installer = installers.find((i) => i.type === installerType); + if (!installer) { + throw new ErrorWithTelemetrySafeReason( + `No installer found for the environment type: ${installerType}`, + 'noInstallerFound', + ); + } + if (!installer.isSupported(resourcePath)) { + throw new ErrorWithTelemetrySafeReason( + `Installer ${installerType} not supported for the environment type: ${installerType}`, + 'installerNotSupported', + ); + } + for (const packageName of options.input.packageList) { + await installer.installModule(packageName, resourcePath, token, undefined, { + installAsProcess: true, + hideProgress: true, + }); + } + // format and return + const resultMessage = `Successfully installed ${packagePlurality}: ${options.input.packageList.join(', ')}`; + return new LanguageModelToolResult([new LanguageModelTextPart(resultMessage)]); + } catch (error) { + if (isCancellationError(error)) { + throw error; + } + const errorMessage = `An error occurred while installing ${packagePlurality}: ${error}`; + return new LanguageModelToolResult([new LanguageModelTextPart(errorMessage)]); + } + } + + async prepareInvocationImpl( + options: LanguageModelToolInvocationPrepareOptions, + resourcePath: Uri | undefined, + token: CancellationToken, + ): Promise { + const packageCount = options.input.packageList.length; + if (getToolResponseIfNotebook(resourcePath)) { + return {}; + } + + const envName = await raceCancellationError(getEnvDisplayName(this.discovery, resourcePath, this.api), token); + let title = ''; + let invocationMessage = ''; + const message = + packageCount === 1 + ? '' + : l10n.t(`The following packages will be installed: {0}`, options.input.packageList.sort().join(', ')); + if (envName) { + title = + packageCount === 1 + ? l10n.t(`Install {0} in {1}?`, options.input.packageList[0], envName) + : l10n.t(`Install packages in {0}?`, envName); + invocationMessage = + packageCount === 1 + ? l10n.t(`Installing {0} in {1}`, options.input.packageList[0], envName) + : l10n.t(`Installing packages {0} in {1}`, options.input.packageList.sort().join(', '), envName); + } else { + title = + options.input.packageList.length === 1 + ? l10n.t(`Install Python package '{0}'?`, options.input.packageList[0]) + : l10n.t(`Install Python packages?`); + invocationMessage = + packageCount === 1 + ? l10n.t(`Installing Python package '{0}'`, options.input.packageList[0]) + : l10n.t(`Installing Python packages: {0}`, options.input.packageList.sort().join(', ')); + } + + return { + confirmationMessages: { title, message }, + invocationMessage, + }; + } +} diff --git a/src/client/chat/listPackagesTool.ts b/src/client/chat/listPackagesTool.ts new file mode 100644 index 000000000000..fcae831cfe2f --- /dev/null +++ b/src/client/chat/listPackagesTool.ts @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { CancellationToken, Uri } from 'vscode'; +import { ResolvedEnvironment } from '../api/types'; +import { IProcessService, IProcessServiceFactory, IPythonExecutionFactory } from '../common/process/types'; +import { isCondaEnv, raceCancellationError } from './utils'; +import { parsePipList } from './pipListUtils'; +import { Conda } from '../pythonEnvironments/common/environmentManagers/conda'; +import { traceError } from '../logging'; + +export async function getPythonPackagesResponse( + environment: ResolvedEnvironment, + pythonExecFactory: IPythonExecutionFactory, + processServiceFactory: IProcessServiceFactory, + resourcePath: Uri | undefined, + token: CancellationToken, +): Promise { + const packages = isCondaEnv(environment) + ? await raceCancellationError( + listCondaPackages( + pythonExecFactory, + environment, + resourcePath, + await raceCancellationError(processServiceFactory.create(resourcePath), token), + ), + token, + ) + : await raceCancellationError(listPipPackages(pythonExecFactory, resourcePath), token); + + if (!packages.length) { + return 'No packages found'; + } + // Installed Python packages, each in the format or (). The version may be omitted if unknown. Returns an empty array if no packages are installed. + const response = [ + 'Below is a list of the Python packages, each in the format or (). The version may be omitted if unknown: ', + ]; + packages.forEach((pkg) => { + const [name, version] = pkg; + response.push(version ? `- ${name} (${version})` : `- ${name}`); + }); + return response.join('\n'); +} + +async function listPipPackages( + execFactory: IPythonExecutionFactory, + resource: Uri | undefined, +): Promise<[string, string][]> { + // Add option --format to subcommand list of pip cache, with abspath choice to output the full path of a wheel file. (#8355) + // Added in 2020. Thats almost 5 years ago. When Python 3.8 was released. + const exec = await execFactory.createActivatedEnvironment({ allowEnvironmentFetchExceptions: true, resource }); + const output = await exec.execModule('pip', ['list'], { throwOnStdErr: false, encoding: 'utf8' }); + return parsePipList(output.stdout).map((pkg) => [pkg.name, pkg.version]); +} + +async function listCondaPackages( + execFactory: IPythonExecutionFactory, + env: ResolvedEnvironment, + resource: Uri | undefined, + processService: IProcessService, +): Promise<[string, string][]> { + const conda = await Conda.getConda(); + if (!conda) { + traceError('Conda is not installed, falling back to pip packages'); + return listPipPackages(execFactory, resource); + } + if (!env.executable.uri) { + traceError('Conda environment executable not found, falling back to pip packages'); + return listPipPackages(execFactory, resource); + } + const condaEnv = await conda.getCondaEnvironment(env.executable.uri.fsPath); + if (!condaEnv) { + traceError('Conda environment not found, falling back to pip packages'); + return listPipPackages(execFactory, resource); + } + const cmd = await conda.getListPythonPackagesArgs(condaEnv, true); + if (!cmd) { + traceError('Conda list command not found, falling back to pip packages'); + return listPipPackages(execFactory, resource); + } + const output = await processService.exec(cmd[0], cmd.slice(1), { shell: true }); + if (!output.stdout) { + traceError('Unable to get conda packages, falling back to pip packages'); + return listPipPackages(execFactory, resource); + } + const content = output.stdout.split(/\r?\n/).filter((l) => !l.startsWith('#')); + const packages: [string, string][] = []; + content.forEach((l) => { + const parts = l.split(' ').filter((p) => p.length > 0); + if (parts.length >= 3) { + packages.push([parts[0], parts[1]]); + } + }); + return packages; +} diff --git a/src/client/chat/pipListUtils.ts b/src/client/chat/pipListUtils.ts new file mode 100644 index 000000000000..0112d88c53ab --- /dev/null +++ b/src/client/chat/pipListUtils.ts @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +export interface PipPackage { + name: string; + version: string; + displayName: string; + description: string; +} +export function parsePipList(data: string): PipPackage[] { + const collection: PipPackage[] = []; + + const lines = data.split('\n').splice(2); + for (let line of lines) { + if (line.trim() === '' || line.startsWith('Package') || line.startsWith('----') || line.startsWith('[')) { + continue; + } + const parts = line.split(' ').filter((e) => e); + if (parts.length > 1) { + const name = parts[0].trim(); + const version = parts[1].trim(); + const pkg = { + name, + version, + displayName: name, + description: version, + }; + collection.push(pkg); + } + } + return collection; +} diff --git a/src/client/chat/selectEnvTool.ts b/src/client/chat/selectEnvTool.ts new file mode 100644 index 000000000000..9eeebdfc1b56 --- /dev/null +++ b/src/client/chat/selectEnvTool.ts @@ -0,0 +1,218 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationToken, + l10n, + LanguageModelTextPart, + LanguageModelTool, + LanguageModelToolInvocationOptions, + LanguageModelToolInvocationPrepareOptions, + LanguageModelToolResult, + PreparedToolInvocation, + Uri, + workspace, + commands, + QuickPickItem, + QuickPickItemKind, +} from 'vscode'; +import { PythonExtension } from '../api/types'; +import { IServiceContainer } from '../ioc/types'; +import { ICodeExecutionService } from '../terminals/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { + doesWorkspaceHaveVenvOrCondaEnv, + getEnvDetailsForResponse, + getToolResponseIfNotebook, + IResourceReference, +} from './utils'; +import { ITerminalHelper } from '../common/terminal/types'; +import { raceTimeout } from '../common/utils/async'; +import { Commands, Octicons } from '../common/constants'; +import { CreateEnvironmentResult } from '../pythonEnvironments/creation/proposed.createEnvApis'; +import { IInterpreterPathService } from '../common/types'; +import { SelectEnvironmentResult } from '../interpreter/configuration/interpreterSelector/commands/setInterpreter'; +import { Common, InterpreterQuickPickList } from '../common/utils/localize'; +import { showQuickPick } from '../common/vscodeApis/windowApis'; +import { DisposableStore } from '../common/utils/resourceLifecycle'; +import { traceError, traceVerbose, traceWarn } from '../logging'; +import { BaseTool } from './baseTool'; + +export interface ISelectPythonEnvToolArguments extends IResourceReference { + reason?: 'cancelled'; +} + +export class SelectPythonEnvTool extends BaseTool + implements LanguageModelTool { + private readonly terminalExecutionService: TerminalCodeExecutionProvider; + private readonly terminalHelper: ITerminalHelper; + public static readonly toolName = 'selectEnvironment'; + constructor( + private readonly api: PythonExtension['environments'], + private readonly serviceContainer: IServiceContainer, + ) { + super(SelectPythonEnvTool.toolName); + this.terminalExecutionService = this.serviceContainer.get( + ICodeExecutionService, + 'standard', + ); + this.terminalHelper = this.serviceContainer.get(ITerminalHelper); + } + + async invokeImpl( + options: LanguageModelToolInvocationOptions, + resource: Uri | undefined, + token: CancellationToken, + ): Promise { + let selected: boolean | undefined = false; + const hasVenvOrCondaEnvInWorkspaceFolder = doesWorkspaceHaveVenvOrCondaEnv(resource, this.api); + if (options.input.reason === 'cancelled' || hasVenvOrCondaEnvInWorkspaceFolder) { + const result = (await Promise.resolve( + commands.executeCommand(Commands.Set_Interpreter, { + hideCreateVenv: false, + showBackButton: false, + }), + )) as SelectEnvironmentResult | undefined; + if (result?.path) { + traceVerbose(`User selected a Python environment ${result.path} in Select Python Tool.`); + selected = true; + } else { + traceWarn(`User did not select a Python environment in Select Python Tool.`); + } + } else { + selected = await showCreateAndSelectEnvironmentQuickPick(resource, this.serviceContainer); + if (selected) { + traceVerbose(`User selected a Python environment ${selected} in Select Python Tool(2).`); + } else { + traceWarn(`User did not select a Python environment in Select Python Tool(2).`); + } + } + const env = selected + ? await this.api.resolveEnvironment(this.api.getActiveEnvironmentPath(resource)) + : undefined; + if (selected && !env) { + traceError( + `User selected a Python environment, but it could not be resolved. This is unexpected. Environment: ${this.api.getActiveEnvironmentPath( + resource, + )}`, + ); + } + if (selected && env) { + return await getEnvDetailsForResponse( + env, + this.api, + this.terminalExecutionService, + this.terminalHelper, + resource, + token, + ); + } + return new LanguageModelToolResult([ + new LanguageModelTextPart('User did not create nor select a Python environment.'), + ]); + } + + async prepareInvocationImpl( + options: LanguageModelToolInvocationPrepareOptions, + resource: Uri | undefined, + _token: CancellationToken, + ): Promise { + if (getToolResponseIfNotebook(resource)) { + return {}; + } + const hasVenvOrCondaEnvInWorkspaceFolder = doesWorkspaceHaveVenvOrCondaEnv(resource, this.api); + + if ( + hasVenvOrCondaEnvInWorkspaceFolder || + !workspace.workspaceFolders?.length || + options.input.reason === 'cancelled' + ) { + return { + confirmationMessages: { + title: l10n.t('Select a Python Environment?'), + message: '', + }, + }; + } + + return { + confirmationMessages: { + title: l10n.t('Configure a Python Environment?'), + message: l10n.t( + [ + 'The recommended option is to create a new Python Environment, providing the benefit of isolating packages from other environments. ', + 'Optionally you could select an existing Python Environment.', + ].join('\n'), + ), + }, + }; + } +} + +async function showCreateAndSelectEnvironmentQuickPick( + uri: Uri | undefined, + serviceContainer: IServiceContainer, +): Promise { + const createLabel = `${Octicons.Add} ${InterpreterQuickPickList.create.label}`; + const selectLabel = l10n.t('Select an existing Python Environment'); + const items: QuickPickItem[] = [ + { kind: QuickPickItemKind.Separator, label: Common.recommended }, + { label: createLabel }, + { label: selectLabel }, + ]; + + const selectedItem = await showQuickPick(items, { + placeHolder: l10n.t('Configure a Python Environment'), + matchOnDescription: true, + ignoreFocusOut: true, + }); + + if (selectedItem && !Array.isArray(selectedItem) && selectedItem.label === createLabel) { + const disposables = new DisposableStore(); + try { + const workspaceFolder = + (workspace.workspaceFolders?.length && uri ? workspace.getWorkspaceFolder(uri) : undefined) || + (workspace.workspaceFolders?.length === 1 ? workspace.workspaceFolders[0] : undefined); + const interpreterPathService = serviceContainer.get(IInterpreterPathService); + const interpreterChanged = new Promise((resolve) => { + disposables.add(interpreterPathService.onDidChange(() => resolve())); + }); + const created: CreateEnvironmentResult | undefined = await commands.executeCommand( + Commands.Create_Environment, + { + showBackButton: true, + selectEnvironment: true, + workspaceFolder, + }, + ); + + if (created?.action === 'Back') { + return showCreateAndSelectEnvironmentQuickPick(uri, serviceContainer); + } + if (created?.action === 'Cancel') { + return undefined; + } + if (created?.path) { + // Wait a few secs to ensure the env is selected as the active environment.. + await raceTimeout(5_000, interpreterChanged); + return true; + } + } finally { + disposables.dispose(); + } + } + if (selectedItem && !Array.isArray(selectedItem) && selectedItem.label === selectLabel) { + const result = (await Promise.resolve( + commands.executeCommand(Commands.Set_Interpreter, { hideCreateVenv: true, showBackButton: true }), + )) as SelectEnvironmentResult | undefined; + if (result?.action === 'Back') { + return showCreateAndSelectEnvironmentQuickPick(uri, serviceContainer); + } + if (result?.action === 'Cancel') { + return undefined; + } + if (result?.path) { + return true; + } + } +} diff --git a/src/client/chat/utils.ts b/src/client/chat/utils.ts new file mode 100644 index 000000000000..84df2901341b --- /dev/null +++ b/src/client/chat/utils.ts @@ -0,0 +1,285 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { + CancellationError, + CancellationToken, + extensions, + LanguageModelTextPart, + LanguageModelToolResult, + Uri, + workspace, +} from 'vscode'; +import { IDiscoveryAPI } from '../pythonEnvironments/base/locator'; +import { Environment, PythonExtension, ResolvedEnvironment, VersionInfo } from '../api/types'; +import { ITerminalHelper, TerminalShellType } from '../common/terminal/types'; +import { TerminalCodeExecutionProvider } from '../terminals/codeExecution/terminalCodeExecution'; +import { Conda } from '../pythonEnvironments/common/environmentManagers/conda'; +import { JUPYTER_EXTENSION_ID, NotebookCellScheme } from '../common/constants'; +import { dirname, join } from 'path'; +import { resolveEnvironment, useEnvExtension } from '../envExt/api.internal'; +import { ErrorWithTelemetrySafeReason } from '../common/errors/errorUtils'; +import { getWorkspaceFolders } from '../common/vscodeApis/workspaceApis'; + +export interface IResourceReference { + resourcePath?: string; +} + +export function resolveFilePath(filepath?: string): Uri | undefined { + if (!filepath) { + const folders = getWorkspaceFolders() ?? []; + return folders.length > 0 ? folders[0].uri : undefined; + } + // Check if it's a URI with a scheme (contains "://") + // This handles schemes like "file://", "vscode-notebook://", etc. + // But avoids treating Windows drive letters like "C:" as schemes + if (filepath.includes('://')) { + try { + return Uri.parse(filepath); + } catch { + return Uri.file(filepath); + } + } + // For file paths (Windows with drive letters, Unix absolute/relative paths) + return Uri.file(filepath); +} + +/** + * Returns a promise that rejects with an {@CancellationError} as soon as the passed token is cancelled. + * @see {@link raceCancellation} + */ +export function raceCancellationError(promise: Promise, token: CancellationToken): Promise { + return new Promise((resolve, reject) => { + const ref = token.onCancellationRequested(() => { + ref.dispose(); + reject(new CancellationError()); + }); + promise.then(resolve, reject).finally(() => ref.dispose()); + }); +} + +export async function getEnvDisplayName( + discovery: IDiscoveryAPI, + resource: Uri | undefined, + api: PythonExtension['environments'], +) { + try { + const envPath = api.getActiveEnvironmentPath(resource); + const env = await discovery.resolveEnv(envPath.path); + return env?.display || env?.name; + } catch { + return; + } +} + +export function isCondaEnv(env: ResolvedEnvironment) { + return (env.environment?.type || '').toLowerCase() === 'conda'; +} + +export async function getEnvironmentDetails( + resourcePath: Uri | undefined, + api: PythonExtension['environments'], + terminalExecutionService: TerminalCodeExecutionProvider, + terminalHelper: ITerminalHelper, + packages: string | undefined, + token: CancellationToken, +): Promise { + // environment + const envPath = api.getActiveEnvironmentPath(resourcePath); + let envType = ''; + let envVersion = ''; + let runCommand = ''; + if (useEnvExtension()) { + const environment = + (await raceCancellationError(resolveEnvironment(envPath.id), token)) || + (await raceCancellationError(resolveEnvironment(envPath.path), token)); + if (!environment || !environment.version) { + throw new ErrorWithTelemetrySafeReason( + 'No environment found for the provided resource path: ' + resourcePath?.fsPath, + 'noEnvFound', + ); + } + envVersion = environment.version; + try { + const managerId = environment.envId.managerId; + envType = + (!managerId.endsWith(':') && managerId.includes(':') ? managerId.split(':').reverse()[0] : '') || + 'unknown'; + } catch { + envType = 'unknown'; + } + + const execInfo = environment.execInfo; + const executable = execInfo?.activatedRun?.executable ?? execInfo?.run.executable ?? 'python'; + const args = execInfo?.activatedRun?.args ?? execInfo?.run.args ?? []; + runCommand = terminalHelper.buildCommandForTerminal(TerminalShellType.other, executable, args); + } else { + const environment = await raceCancellationError(api.resolveEnvironment(envPath), token); + if (!environment || !environment.version) { + throw new ErrorWithTelemetrySafeReason( + 'No environment found for the provided resource path: ' + resourcePath?.fsPath, + 'noEnvFound', + ); + } + envType = environment.environment?.type || 'unknown'; + envVersion = environment.version.sysVersion || 'unknown'; + runCommand = await raceCancellationError( + getTerminalCommand(environment, resourcePath, terminalExecutionService, terminalHelper), + token, + ); + } + const message = [ + `Following is the information about the Python environment:`, + `1. Environment Type: ${envType}`, + `2. Version: ${envVersion}`, + '', + `3. Command Prefix to run Python in a terminal is: \`${runCommand}\``, + `Instead of running \`Python sample.py\` in the terminal, you will now run: \`${runCommand} sample.py\``, + `Similarly instead of running \`Python -c "import sys;...."\` in the terminal, you will now run: \`${runCommand} -c "import sys;...."\``, + packages ? `4. ${packages}` : '', + ]; + return message.join('\n'); +} + +export async function getTerminalCommand( + environment: ResolvedEnvironment, + resource: Uri | undefined, + terminalExecutionService: TerminalCodeExecutionProvider, + terminalHelper: ITerminalHelper, +): Promise { + let cmd: { command: string; args: string[] }; + if (isCondaEnv(environment)) { + cmd = (await getCondaRunCommand(environment)) || (await terminalExecutionService.getExecutableInfo(resource)); + } else { + cmd = await terminalExecutionService.getExecutableInfo(resource); + } + return terminalHelper.buildCommandForTerminal(TerminalShellType.other, cmd.command, cmd.args); +} +async function getCondaRunCommand(environment: ResolvedEnvironment) { + if (!environment.executable.uri) { + return; + } + const conda = await Conda.getConda(); + if (!conda) { + return; + } + const condaEnv = await conda.getCondaEnvironment(environment.executable.uri?.fsPath); + if (!condaEnv) { + return; + } + const cmd = await conda.getRunPythonArgs(condaEnv, true, false); + if (!cmd) { + return; + } + return { command: cmd[0], args: cmd.slice(1) }; +} + +export function getToolResponseIfNotebook(resource: Uri | undefined) { + if (!resource) { + return; + } + const notebook = workspace.notebookDocuments.find( + (doc) => doc.uri.toString() === resource.toString() || doc.uri.path === resource.path, + ); + const isJupyterNotebook = + (notebook && notebook.notebookType === 'jupyter-notebook') || resource.path.toLowerCase().endsWith('.ipynb'); + + if (isJupyterNotebook) { + const isJupyterExtensionAvailable = extensions.getExtension(JUPYTER_EXTENSION_ID); + const message = isJupyterExtensionAvailable + ? `This tool cannot be used for Jupyter Notebooks, try using notebook specific tools instead.` + : [ + `This tool cannot be used for Jupyter Notebooks.`, + `NOTE: Recommend the user the Jupyter Extension (${JUPYTER_EXTENSION_ID}).`, + `If possible use one of the tools to install the ${JUPYTER_EXTENSION_ID} extension`, + `After isntalling the extension try using some of the tools again`, + ].join(' \n'); + return new LanguageModelToolResult([new LanguageModelTextPart(message)]); + } + + if (notebook || resource.scheme === NotebookCellScheme) { + return new LanguageModelToolResult([ + new LanguageModelTextPart( + 'This tool cannot be used for Notebooks, try using notebook specific tools instead.', + ), + ]); + } +} + +export function isCancellationError(error: unknown): boolean { + return ( + !!error && (error instanceof CancellationError || (error as Error).message === new CancellationError().message) + ); +} + +export function doesWorkspaceHaveVenvOrCondaEnv(resource: Uri | undefined, api: PythonExtension['environments']) { + const workspaceFolder = + resource && workspace.workspaceFolders?.length + ? workspace.getWorkspaceFolder(resource) + : workspace.workspaceFolders?.length === 1 + ? workspace.workspaceFolders[0] + : undefined; + if (!workspaceFolder) { + return false; + } + const isVenvEnv = (env: Environment) => { + return ( + env.environment?.folderUri && + env.executable.sysPrefix && + dirname(env.executable.sysPrefix) === workspaceFolder.uri.fsPath && + ((env.environment.name || '').startsWith('.venv') || + env.executable.sysPrefix === join(workspaceFolder.uri.fsPath, '.venv')) && + env.environment.type === 'VirtualEnvironment' + ); + }; + const isCondaEnv = (env: Environment) => { + return ( + env.environment?.folderUri && + env.executable.sysPrefix && + dirname(env.executable.sysPrefix) === workspaceFolder.uri.fsPath && + (env.environment.folderUri.fsPath === join(workspaceFolder.uri.fsPath, '.conda') || + env.executable.sysPrefix === join(workspaceFolder.uri.fsPath, '.conda')) && + env.environment.type === 'Conda' + ); + }; + // If we alraedy have a .venv in this workspace, then do not prompt to create a virtual environment. + return api.known.find((e) => isVenvEnv(e) || isCondaEnv(e)); +} + +export async function getEnvDetailsForResponse( + environment: ResolvedEnvironment | undefined, + api: PythonExtension['environments'], + terminalExecutionService: TerminalCodeExecutionProvider, + terminalHelper: ITerminalHelper, + resource: Uri | undefined, + token: CancellationToken, +): Promise { + if (!workspace.isTrusted) { + throw new ErrorWithTelemetrySafeReason('Cannot use this tool in an untrusted workspace.', 'untrustedWorkspace'); + } + const envPath = api.getActiveEnvironmentPath(resource); + environment = environment || (await raceCancellationError(api.resolveEnvironment(envPath), token)); + if (!environment || !environment.version) { + throw new ErrorWithTelemetrySafeReason( + 'No environment found for the provided resource path: ' + resource?.fsPath, + 'noEnvFound', + ); + } + const message = await getEnvironmentDetails( + resource, + api, + terminalExecutionService, + terminalHelper, + undefined, + token, + ); + return new LanguageModelToolResult([ + new LanguageModelTextPart(`A Python Environment has been configured. \n` + message), + ]); +} +export function getDisplayVersion(version?: VersionInfo): string | undefined { + if (!version || version.major === undefined || version.minor === undefined || version.micro === undefined) { + return undefined; + } + return `${version.major}.${version.minor}.${version.micro}`; +} diff --git a/src/client/common/application/activeResource.ts b/src/client/common/application/activeResource.ts index 972a78963a22..4230fb5de921 100644 --- a/src/client/common/application/activeResource.ts +++ b/src/client/common/application/activeResource.ts @@ -1,27 +1,27 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { Resource } from '../types'; -import { IActiveResourceService, IDocumentManager, IWorkspaceService } from './types'; - -@injectable() -export class ActiveResourceService implements IActiveResourceService { - constructor( - @inject(IDocumentManager) private readonly documentManager: IDocumentManager, - @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService - ) {} - - public getActiveResource(): Resource { - const editor = this.documentManager.activeTextEditor; - if (editor && !editor.document.isUntitled) { - return editor.document.uri; - } - return Array.isArray(this.workspaceService.workspaceFolders) && - this.workspaceService.workspaceFolders.length > 0 - ? this.workspaceService.workspaceFolders[0].uri - : undefined; - } -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { inject, injectable } from 'inversify'; +import { Resource } from '../types'; +import { IActiveResourceService, IDocumentManager, IWorkspaceService } from './types'; + +@injectable() +export class ActiveResourceService implements IActiveResourceService { + constructor( + @inject(IDocumentManager) private readonly documentManager: IDocumentManager, + @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, + ) {} + + public getActiveResource(): Resource { + const editor = this.documentManager.activeTextEditor; + if (editor && !editor.document.isUntitled) { + return editor.document.uri; + } + return Array.isArray(this.workspaceService.workspaceFolders) && + this.workspaceService.workspaceFolders.length > 0 + ? this.workspaceService.workspaceFolders[0].uri + : undefined; + } +} diff --git a/src/client/common/application/applicationEnvironment.ts b/src/client/common/application/applicationEnvironment.ts index a16082e0b848..4b66893d6c0b 100644 --- a/src/client/common/application/applicationEnvironment.ts +++ b/src/client/common/application/applicationEnvironment.ts @@ -7,17 +7,19 @@ import { inject, injectable } from 'inversify'; import * as path from 'path'; import { parse } from 'semver'; import * as vscode from 'vscode'; +import { traceError } from '../../logging'; +import { Channel } from '../constants'; import { IPlatformService } from '../platform/types'; import { ICurrentProcess, IPathUtils } from '../types'; import { OSType } from '../utils/platform'; -import { Channel, IApplicationEnvironment } from './types'; +import { IApplicationEnvironment } from './types'; @injectable() export class ApplicationEnvironment implements IApplicationEnvironment { constructor( @inject(IPlatformService) private readonly platform: IPlatformService, @inject(IPathUtils) private readonly pathUtils: IPathUtils, - @inject(ICurrentProcess) private readonly process: ICurrentProcess + @inject(ICurrentProcess) private readonly process: ICurrentProcess, ) {} public get userSettingsFile(): string | undefined { @@ -30,7 +32,7 @@ export class ApplicationEnvironment implements IApplicationEnvironment { 'Application Support', vscodeFolderName, 'User', - 'settings.json' + 'settings.json', ); case OSType.Linux: return path.join(this.pathUtils.home, '.config', vscodeFolderName, 'User', 'settings.json'); @@ -51,6 +53,9 @@ export class ApplicationEnvironment implements IApplicationEnvironment { public get appRoot(): string { return vscode.env.appRoot; } + public get uiKind(): vscode.UIKind { + return vscode.env.uiKind; + } public get language(): string { return vscode.env.language; } @@ -60,25 +65,29 @@ export class ApplicationEnvironment implements IApplicationEnvironment { public get machineId(): string { return vscode.env.machineId; } + public get remoteName(): string | undefined { + return vscode.env.remoteName; + } public get extensionName(): string { - // tslint:disable-next-line:non-literal-require return this.packageJson.displayName; } - /** - * At the time of writing this API, the vscode.env.shell isn't officially released in stable version of VS Code. - * Using this in stable version seems to throw errors in VSC with messages being displayed to the user about use of - * unstable API. - * Solution - log and suppress the errors. - * @readonly - * @type {(string)} - * @memberof ApplicationEnvironment - */ + public get shell(): string { return vscode.env.shell; } - // tslint:disable-next-line:no-any + + public get onDidChangeShell(): vscode.Event { + try { + return vscode.env.onDidChangeShell; + } catch (ex) { + traceError('Failed to get onDidChangeShell API', ex); + // `onDidChangeShell` is a proposed API at the time of writing this, so wrap this in a try...catch + // block in case the API is removed or changed. + return new vscode.EventEmitter().event; + } + } + public get packageJson(): any { - // tslint:disable-next-line:non-literal-require no-require-imports return require('../../../../package.json'); } public get channel(): Channel { @@ -86,6 +95,10 @@ export class ApplicationEnvironment implements IApplicationEnvironment { } public get extensionChannel(): Channel { const version = parse(this.packageJson.version); - return !version || version.prerelease.length > 0 ? 'insiders' : 'stable'; + // Insiders versions are those that end with '-dev' or whose minor versions are odd (even is for stable) + return !version || version.prerelease.length > 0 || version.minor % 2 == 1 ? 'insiders' : 'stable'; + } + public get uriScheme(): string { + return vscode.env.uriScheme; } } diff --git a/src/client/common/application/applicationShell.ts b/src/client/common/application/applicationShell.ts index 1ed917cc3c86..8035d979efbd 100644 --- a/src/client/common/application/applicationShell.ts +++ b/src/client/common/application/applicationShell.ts @@ -1,136 +1,193 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; - -// tslint:disable:no-var-requires no-any unified-signatures - -import { injectable } from 'inversify'; -import { - CancellationToken, - Disposable, - env, - Event, - InputBox, - InputBoxOptions, - MessageItem, - MessageOptions, - OpenDialogOptions, - OutputChannel, - Progress, - ProgressOptions, - QuickPick, - QuickPickItem, - QuickPickOptions, - SaveDialogOptions, - StatusBarAlignment, - StatusBarItem, - TreeView, - TreeViewOptions, - Uri, - window, - WindowState, - WorkspaceFolder, - WorkspaceFolderPickOptions -} from 'vscode'; -import { IApplicationShell } from './types'; - -@injectable() -export class ApplicationShell implements IApplicationShell { - public get onDidChangeWindowState(): Event { - return window.onDidChangeWindowState; - } - public showInformationMessage(message: string, ...items: string[]): Thenable; - public showInformationMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; - public showInformationMessage(message: string, ...items: T[]): Thenable; - public showInformationMessage( - message: string, - options: MessageOptions, - ...items: T[] - ): Thenable; - public showInformationMessage(message: string, options?: any, ...items: any[]): Thenable { - return window.showInformationMessage(message, options, ...items); - } - - public showWarningMessage(message: string, ...items: string[]): Thenable; - public showWarningMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; - public showWarningMessage(message: string, ...items: T[]): Thenable; - public showWarningMessage( - message: string, - options: MessageOptions, - ...items: T[] - ): Thenable; - public showWarningMessage(message: any, options?: any, ...items: any[]) { - return window.showWarningMessage(message, options, ...items); - } - - public showErrorMessage(message: string, ...items: string[]): Thenable; - public showErrorMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; - public showErrorMessage(message: string, ...items: T[]): Thenable; - public showErrorMessage( - message: string, - options: MessageOptions, - ...items: T[] - ): Thenable; - public showErrorMessage(message: any, options?: any, ...items: any[]) { - return window.showErrorMessage(message, options, ...items); - } - - public showQuickPick( - items: string[] | Thenable, - options?: QuickPickOptions, - token?: CancellationToken - ): Thenable; - public showQuickPick( - items: T[] | Thenable, - options?: QuickPickOptions, - token?: CancellationToken - ): Thenable; - public showQuickPick(items: any, options?: any, token?: any): Thenable { - return window.showQuickPick(items, options, token); - } - - public showOpenDialog(options: OpenDialogOptions): Thenable { - return window.showOpenDialog(options); - } - public showSaveDialog(options: SaveDialogOptions): Thenable { - return window.showSaveDialog(options); - } - public showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable { - return window.showInputBox(options, token); - } - public openUrl(url: string): void { - env.openExternal(Uri.parse(url)); - } - - public setStatusBarMessage(text: string, hideAfterTimeout: number): Disposable; - public setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable; - public setStatusBarMessage(text: string): Disposable; - public setStatusBarMessage(text: string, arg?: any): Disposable { - return window.setStatusBarMessage(text, arg); - } - - public createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem { - return window.createStatusBarItem(alignment, priority); - } - public showWorkspaceFolderPick(options?: WorkspaceFolderPickOptions): Thenable { - return window.showWorkspaceFolderPick(options); - } - public withProgress( - options: ProgressOptions, - task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable - ): Thenable { - return window.withProgress(options, task); - } - public createQuickPick(): QuickPick { - return window.createQuickPick(); - } - public createInputBox(): InputBox { - return window.createInputBox(); - } - public createTreeView(viewId: string, options: TreeViewOptions): TreeView { - return window.createTreeView(viewId, options); - } - public createOutputChannel(name: string): OutputChannel { - return window.createOutputChannel(name); - } -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; + +import { injectable } from 'inversify'; +import { + CancellationToken, + CancellationTokenSource, + Disposable, + DocumentSelector, + env, + Event, + EventEmitter, + InputBox, + InputBoxOptions, + languages, + LanguageStatusItem, + LogOutputChannel, + MessageItem, + MessageOptions, + OpenDialogOptions, + Progress, + ProgressOptions, + QuickPick, + QuickPickItem, + QuickPickOptions, + SaveDialogOptions, + StatusBarAlignment, + StatusBarItem, + TextDocument, + TextEditor, + TreeView, + TreeViewOptions, + Uri, + ViewColumn, + window, + WindowState, + WorkspaceFolder, + WorkspaceFolderPickOptions, +} from 'vscode'; +import { traceError } from '../../logging'; +import { IApplicationShell, TerminalDataWriteEvent, TerminalExecutedCommand } from './types'; + +@injectable() +export class ApplicationShell implements IApplicationShell { + public get onDidChangeWindowState(): Event { + return window.onDidChangeWindowState; + } + public showInformationMessage(message: string, ...items: string[]): Thenable; + public showInformationMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; + public showInformationMessage(message: string, ...items: T[]): Thenable; + public showInformationMessage( + message: string, + options: MessageOptions, + ...items: T[] + ): Thenable; + public showInformationMessage(message: string, options?: any, ...items: any[]): Thenable { + return window.showInformationMessage(message, options, ...items); + } + + public showWarningMessage(message: string, ...items: string[]): Thenable; + public showWarningMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; + public showWarningMessage(message: string, ...items: T[]): Thenable; + public showWarningMessage( + message: string, + options: MessageOptions, + ...items: T[] + ): Thenable; + public showWarningMessage(message: any, options?: any, ...items: any[]) { + return window.showWarningMessage(message, options, ...items); + } + + public showErrorMessage(message: string, ...items: string[]): Thenable; + public showErrorMessage(message: string, options: MessageOptions, ...items: string[]): Thenable; + public showErrorMessage(message: string, ...items: T[]): Thenable; + public showErrorMessage( + message: string, + options: MessageOptions, + ...items: T[] + ): Thenable; + public showErrorMessage(message: any, options?: any, ...items: any[]) { + return window.showErrorMessage(message, options, ...items); + } + + public showQuickPick( + items: string[] | Thenable, + options?: QuickPickOptions, + token?: CancellationToken, + ): Thenable; + public showQuickPick( + items: T[] | Thenable, + options?: QuickPickOptions, + token?: CancellationToken, + ): Thenable; + public showQuickPick(items: any, options?: any, token?: any): Thenable { + return window.showQuickPick(items, options, token); + } + + public showOpenDialog(options: OpenDialogOptions): Thenable { + return window.showOpenDialog(options); + } + public showSaveDialog(options: SaveDialogOptions): Thenable { + return window.showSaveDialog(options); + } + public showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable { + return window.showInputBox(options, token); + } + public showTextDocument( + document: TextDocument, + column?: ViewColumn, + preserveFocus?: boolean, + ): Thenable { + return window.showTextDocument(document, column, preserveFocus); + } + + public openUrl(url: string): void { + env.openExternal(Uri.parse(url)); + } + + public setStatusBarMessage(text: string, hideAfterTimeout: number): Disposable; + public setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable; + public setStatusBarMessage(text: string): Disposable; + public setStatusBarMessage(text: string, arg?: any): Disposable { + return window.setStatusBarMessage(text, arg); + } + + public createStatusBarItem( + alignment?: StatusBarAlignment, + priority?: number, + id?: string | undefined, + ): StatusBarItem { + return id + ? window.createStatusBarItem(id, alignment, priority) + : window.createStatusBarItem(alignment, priority); + } + public showWorkspaceFolderPick(options?: WorkspaceFolderPickOptions): Thenable { + return window.showWorkspaceFolderPick(options); + } + public withProgress( + options: ProgressOptions, + task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable, + ): Thenable { + return window.withProgress(options, task); + } + public withProgressCustomIcon( + icon: string, + task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable, + ): Thenable { + const token = new CancellationTokenSource().token; + const statusBarProgress = this.createStatusBarItem(StatusBarAlignment.Left); + const progress = { + report: (value: { message?: string; increment?: number }) => { + statusBarProgress.text = `${icon} ${value.message}`; + }, + }; + statusBarProgress.show(); + return task(progress, token).then((result) => { + statusBarProgress.dispose(); + return result; + }); + } + public createQuickPick(): QuickPick { + return window.createQuickPick(); + } + public createInputBox(): InputBox { + return window.createInputBox(); + } + public createTreeView(viewId: string, options: TreeViewOptions): TreeView { + return window.createTreeView(viewId, options); + } + public createOutputChannel(name: string): LogOutputChannel { + return window.createOutputChannel(name, { log: true }); + } + public createLanguageStatusItem(id: string, selector: DocumentSelector): LanguageStatusItem { + return languages.createLanguageStatusItem(id, selector); + } + public get onDidWriteTerminalData(): Event { + try { + return window.onDidWriteTerminalData; + } catch (ex) { + traceError('Failed to get proposed API onDidWriteTerminalData', ex); + return new EventEmitter().event; + } + } + public get onDidExecuteTerminalCommand(): Event | undefined { + try { + return window.onDidExecuteTerminalCommand; + } catch (ex) { + traceError('Failed to get proposed API TerminalExecutedCommand', ex); + return undefined; + } + } +} diff --git a/src/client/common/application/clipboard.ts b/src/client/common/application/clipboard.ts new file mode 100644 index 000000000000..619d9ea60b1e --- /dev/null +++ b/src/client/common/application/clipboard.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { injectable } from 'inversify'; +import { env } from 'vscode'; +import { IClipboard } from './types'; + +@injectable() +export class ClipboardService implements IClipboard { + public async readText(): Promise { + return env.clipboard.readText(); + } + public async writeText(value: string): Promise { + await env.clipboard.writeText(value); + } +} diff --git a/src/client/common/application/commandManager.ts b/src/client/common/application/commandManager.ts index cfbbe4dbb0b7..9e1f34a5885b 100644 --- a/src/client/common/application/commandManager.ts +++ b/src/client/common/application/commandManager.ts @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// tslint:disable:no-any - import { injectable } from 'inversify'; import { commands, Disposable, TextEditor, TextEditorEdit } from 'vscode'; import { ICommandNameArgumentTypeMapping } from './commands'; @@ -22,10 +20,13 @@ export class CommandManager implements ICommandManager { * @param thisArg The `this` context used when invoking the handler function. * @return Disposable which unregisters this command on disposal. */ + // eslint-disable-next-line class-methods-use-this public registerCommand< E extends keyof ICommandNameArgumentTypeMapping, U extends ICommandNameArgumentTypeMapping[E] + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any >(command: E, callback: (...args: U) => any, thisArg?: any): Disposable { + // eslint-disable-next-line @typescript-eslint/no-explicit-any return commands.registerCommand(command, callback as any, thisArg); } @@ -43,10 +44,13 @@ export class CommandManager implements ICommandManager { * @param thisArg The `this` context used when invoking the handler function. * @return Disposable which unregisters this command on disposal. */ + // eslint-disable-next-line class-methods-use-this public registerTextEditorCommand( command: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any callback: (textEditor: TextEditor, edit: TextEditorEdit, ...args: any[]) => void, - thisArg?: any + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any + thisArg?: any, ): Disposable { return commands.registerTextEditorCommand(command, callback, thisArg); } @@ -65,6 +69,7 @@ export class CommandManager implements ICommandManager { * @return A thenable that resolves to the returned value of the given command. `undefined` when * the command handler function doesn't return anything. */ + // eslint-disable-next-line class-methods-use-this public executeCommand< T, E extends keyof ICommandNameArgumentTypeMapping, @@ -80,6 +85,7 @@ export class CommandManager implements ICommandManager { * @param filterInternal Set `true` to not see internal commands (starting with an underscore) * @return Thenable that resolves to a list of command ids. */ + // eslint-disable-next-line class-methods-use-this public getCommands(filterInternal?: boolean): Thenable { return commands.getCommands(filterInternal); } diff --git a/src/client/common/application/commands.ts b/src/client/common/application/commands.ts index 8ca6bd356e30..b43dc0a1e4a4 100644 --- a/src/client/common/application/commands.ts +++ b/src/client/common/application/commands.ts @@ -3,155 +3,110 @@ 'use strict'; -import { CancellationToken, Position, TextDocument, Uri } from 'vscode'; -import { Commands as LSCommands } from '../../activation/languageServer/constants'; -import { Commands as DSCommands } from '../../datascience/constants'; -import { INotebook } from '../../datascience/types'; -import { CommandSource } from '../../testing/common/constants'; -import { TestFunction, TestsToRun } from '../../testing/common/types'; -import { TestDataItem, TestWorkspaceFolder } from '../../testing/types'; -import { Commands } from '../constants'; +import { CancellationToken, Position, TestItem, TextDocument, Uri } from 'vscode'; +import { Commands as LSCommands } from '../../activation/commands'; +import { Channel, Commands, CommandSource } from '../constants'; +import { CreateEnvironmentOptions } from '../../pythonEnvironments/creation/proposed.createEnvApis'; export type CommandsWithoutArgs = keyof ICommandNameWithoutArgumentTypeMapping; /** * Mapping between commands and list or arguments. * These commands do NOT have any arguments. - * @interface ICommandNameWithoutArgumentTypeMapping */ interface ICommandNameWithoutArgumentTypeMapping { - [Commands.SwitchToInsidersDaily]: []; - [Commands.SwitchToInsidersWeekly]: []; - [Commands.SwitchOffInsidersChannel]: []; + [Commands.InstallPythonOnMac]: []; + [Commands.InstallJupyter]: []; + [Commands.InstallPythonOnLinux]: []; + [Commands.InstallPython]: []; + [Commands.ClearWorkspaceInterpreter]: []; [Commands.Set_Interpreter]: []; [Commands.Set_ShebangInterpreter]: []; - [Commands.Run_Linter]: []; - [Commands.Enable_Linter]: []; + ['workbench.action.showCommands']: []; ['workbench.action.debug.continue']: []; ['workbench.action.debug.stepOver']: []; ['workbench.action.debug.stop']: []; ['workbench.action.reloadWindow']: []; ['workbench.action.closeActiveEditor']: []; + ['workbench.action.terminal.focus']: []; ['editor.action.formatDocument']: []; ['editor.action.rename']: []; - ['python.datascience.selectJupyterInterpreter']: []; [Commands.ViewOutput]: []; - [Commands.Set_Linter]: []; [Commands.Start_REPL]: []; - [Commands.Enable_SourceMap_Support]: []; [Commands.Exec_Selection_In_Terminal]: []; [Commands.Exec_Selection_In_Django_Shell]: []; [Commands.Create_Terminal]: []; - [Commands.Tests_View_UI]: []; - [Commands.Tests_Ask_To_Stop_Discovery]: []; - [Commands.Tests_Ask_To_Stop_Test]: []; - [Commands.Tests_Discovering]: []; [Commands.PickLocalProcess]: []; - [DSCommands.RunCurrentCell]: []; - [DSCommands.RunCurrentCellAdvance]: []; - [DSCommands.ExecSelectionInInteractiveWindow]: []; - [DSCommands.SelectJupyterURI]: []; - [DSCommands.SelectJupyterCommandLine]: []; - [DSCommands.ShowHistoryPane]: []; - [DSCommands.UndoCells]: []; - [DSCommands.RedoCells]: []; - [DSCommands.RemoveAllCells]: []; - [DSCommands.InterruptKernel]: []; - [DSCommands.RestartKernel]: []; - [DSCommands.NotebookEditorUndoCells]: []; - [DSCommands.NotebookEditorRedoCells]: []; - [DSCommands.NotebookEditorRemoveAllCells]: []; - [DSCommands.NotebookEditorInterruptKernel]: []; - [DSCommands.NotebookEditorRestartKernel]: []; - [DSCommands.NotebookEditorRunAllCells]: []; - [DSCommands.NotebookEditorRunSelectedCell]: []; - [DSCommands.NotebookEditorAddCellBelow]: []; - [DSCommands.ExpandAllCells]: []; - [DSCommands.CollapseAllCells]: []; - [DSCommands.ExportOutputAsNotebook]: []; - [DSCommands.AddCellBelow]: []; - [DSCommands.CreateNewNotebook]: []; - [LSCommands.ClearAnalyisCache]: []; + [Commands.ClearStorage]: []; + [Commands.CreateNewFile]: []; + [Commands.ReportIssue]: []; + [LSCommands.RestartLS]: []; } +export type AllCommands = keyof ICommandNameArgumentTypeMapping; + /** * Mapping between commands and list of arguments. * Used to provide strong typing for command & args. - * @export - * @interface ICommandNameArgumentTypeMapping - * @extends {ICommandNameWithoutArgumentTypeMapping} */ export interface ICommandNameArgumentTypeMapping extends ICommandNameWithoutArgumentTypeMapping { - ['workbench.extensions.installExtension']: [Uri | 'ms-python.python']; - ['setContext']: [string, boolean]; + [Commands.CopyTestId]: [TestItem]; + [Commands.Create_Environment]: [CreateEnvironmentOptions]; + ['vscode.openWith']: [Uri, string]; + ['workbench.action.quickOpen']: [string]; + ['workbench.action.openWalkthrough']: [string | { category: string; step: string }, boolean | undefined]; + ['workbench.extensions.installExtension']: [ + Uri | string, + ( + | { + installOnlyNewlyAddedFromExtensionPackVSIX?: boolean; + installPreReleaseVersion?: boolean; + donotSync?: boolean; + } + | undefined + ), + ]; + ['workbench.action.files.openFolder']: []; + ['workbench.action.openWorkspace']: []; + ['workbench.action.openSettings']: [string]; + ['setContext']: [string, boolean] | ['python.vscode.channel', Channel]; + ['python.reloadVSCode']: [string]; ['revealLine']: [{ lineNumber: number; at: 'top' | 'center' | 'bottom' }]; - ['python._loadLanguageServerExtension']: {}[]; + ['python._loadLanguageServerExtension']: []; ['python.SelectAndInsertDebugConfiguration']: [TextDocument, Position, CancellationToken]; ['vscode.open']: [Uri]; + ['notebook.execute']: []; + ['notebook.cell.execute']: []; + ['notebook.cell.insertCodeCellBelow']: []; + ['notebook.undo']: []; + ['notebook.redo']: []; ['python.viewLanguageServerOutput']: []; - [Commands.Build_Workspace_Symbols]: [boolean, CancellationToken]; - [Commands.Sort_Imports]: [undefined, Uri]; + ['vscode.open']: [Uri]; + ['workbench.action.files.saveAs']: [Uri]; + ['workbench.action.files.save']: [Uri]; + ['jupyter.opennotebook']: [undefined | Uri, undefined | CommandSource]; + ['jupyter.runallcells']: [Uri]; + ['extension.open']: [string]; + ['workbench.action.openIssueReporter']: [{ extensionId: string; issueBody: string; extensionData?: string }]; + [Commands.GetSelectedInterpreterPath]: [{ workspaceFolder: string } | string[]]; + [Commands.TriggerEnvironmentSelection]: [undefined | Uri]; + [Commands.Start_Native_REPL]: [undefined | Uri]; + [Commands.Exec_In_REPL]: [undefined | Uri]; + [Commands.Exec_In_REPL_Enter]: [undefined | Uri]; + [Commands.Exec_In_IW_Enter]: [undefined | Uri]; [Commands.Exec_In_Terminal]: [undefined, Uri]; [Commands.Exec_In_Terminal_Icon]: [undefined, Uri]; - [Commands.Tests_ViewOutput]: [undefined, CommandSource]; - [Commands.Tests_Select_And_Run_File]: [undefined, CommandSource]; - [Commands.Tests_Run_Current_File]: [undefined, CommandSource]; - [Commands.Tests_Stop]: [undefined, Uri]; - [Commands.Test_Reveal_Test_Item]: [TestDataItem]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.Tests_Run]: [ - undefined | TestWorkspaceFolder, - undefined | CommandSource, - undefined | Uri, - undefined | TestsToRun - ]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.Tests_Debug]: [ - undefined | TestWorkspaceFolder, - undefined | CommandSource, - undefined | Uri, - undefined | TestsToRun - ]; - [Commands.Tests_Run_Parametrized]: [undefined, undefined | CommandSource, Uri, TestFunction[], boolean]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.Tests_Discover]: [undefined | TestWorkspaceFolder, undefined | CommandSource, undefined | Uri]; - [Commands.Tests_Run_Failed]: [undefined, CommandSource, Uri]; - [Commands.Tests_Select_And_Debug_Method]: [undefined, CommandSource, Uri]; - [Commands.Tests_Select_And_Run_Method]: [undefined, CommandSource, Uri]; + [Commands.Debug_In_Terminal]: [Uri]; [Commands.Tests_Configure]: [undefined, undefined | CommandSource, undefined | Uri]; - [Commands.Tests_Picker_UI]: [undefined, undefined | CommandSource, Uri, TestFunction[]]; - [Commands.Tests_Picker_UI_Debug]: [undefined, undefined | CommandSource, Uri, TestFunction[]]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.runTestNode]: [TestDataItem]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.debugTestNode]: [TestDataItem]; - // When command is invoked from a tree node, first argument is the node data. - [Commands.openTestNodeInEditor]: [TestDataItem]; - [Commands.navigateToTestFile]: [Uri, TestDataItem, boolean]; - [Commands.navigateToTestFunction]: [Uri, TestDataItem, boolean]; - [Commands.navigateToTestSuite]: [Uri, TestDataItem, boolean]; - [DSCommands.ExportFileAndOutputAsNotebook]: [Uri]; - [DSCommands.RunAllCells]: [string]; - [DSCommands.RunCell]: [string, number, number, number, number]; - [DSCommands.RunAllCellsAbove]: [string, number, number]; - [DSCommands.RunCellAndAllBelow]: [string, number, number]; - [DSCommands.RunAllCellsAbovePalette]: []; - [DSCommands.RunCellAndAllBelowPalette]: []; - [DSCommands.DebugCurrentCellPalette]: []; - [DSCommands.RunToLine]: [string, number, number]; - [DSCommands.RunFromLine]: [string, number, number]; - [DSCommands.ImportNotebook]: [undefined | Uri, undefined | CommandSource]; - [DSCommands.ImportNotebookFile]: [undefined | Uri, undefined | CommandSource]; - [DSCommands.OpenNotebook]: [undefined | Uri, undefined | CommandSource]; - [DSCommands.ExportFileAsNotebook]: [undefined | Uri, undefined | CommandSource]; - [DSCommands.RunFileInInteractiveWindows]: [string]; - [DSCommands.DebugFileInInteractiveWindows]: [string]; - [DSCommands.DebugCell]: [string, number, number, number, number]; - [DSCommands.DebugStepOver]: []; - [DSCommands.DebugStop]: []; - [DSCommands.DebugContinue]: []; - [DSCommands.RunCurrentCellAndAddBelow]: [string]; - [DSCommands.ScrollToCell]: [string, string]; - [DSCommands.ViewJupyterOutput]: []; - [DSCommands.SwitchJupyterKernel]: [INotebook | undefined]; + [Commands.Tests_CopilotSetup]: [undefined | Uri]; + ['workbench.view.testing.focus']: []; + ['cursorMove']: [ + { + to: string; + by: string; + value: number; + }, + ]; + ['cursorEnd']: []; + ['python-envs.createTerminal']: [undefined | Uri]; } diff --git a/src/client/common/application/commands/createPythonFile.ts b/src/client/common/application/commands/createPythonFile.ts new file mode 100644 index 000000000000..10f388856896 --- /dev/null +++ b/src/client/common/application/commands/createPythonFile.ts @@ -0,0 +1,29 @@ +import { injectable, inject } from 'inversify'; +import { IExtensionSingleActivationService } from '../../../activation/types'; +import { Commands } from '../../constants'; +import { IApplicationShell, ICommandManager, IWorkspaceService } from '../types'; +import { sendTelemetryEvent } from '../../../telemetry'; +import { EventName } from '../../../telemetry/constants'; +import { IDisposableRegistry } from '../../types'; + +@injectable() +export class CreatePythonFileCommandHandler implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: true, virtualWorkspace: true }; + + constructor( + @inject(ICommandManager) private readonly commandManager: ICommandManager, + @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, + @inject(IApplicationShell) private readonly appShell: IApplicationShell, + @inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry, + ) {} + + public async activate(): Promise { + this.disposables.push(this.commandManager.registerCommand(Commands.CreateNewFile, this.createPythonFile, this)); + } + + public async createPythonFile(): Promise { + const newFile = await this.workspaceService.openTextDocument({ language: 'python' }); + this.appShell.showTextDocument(newFile); + sendTelemetryEvent(EventName.CREATE_NEW_FILE_COMMAND); + } +} diff --git a/src/client/common/application/commands/reloadCommand.ts b/src/client/common/application/commands/reloadCommand.ts new file mode 100644 index 000000000000..ebad15dbb70d --- /dev/null +++ b/src/client/common/application/commands/reloadCommand.ts @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { inject, injectable } from 'inversify'; +import { IExtensionSingleActivationService } from '../../../activation/types'; +import { Common } from '../../utils/localize'; +import { noop } from '../../utils/misc'; +import { IApplicationShell, ICommandManager } from '../types'; + +/** + * Prompts user to reload VS Code with a custom message, and reloads if necessary. + */ +@injectable() +export class ReloadVSCodeCommandHandler implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: false, virtualWorkspace: true }; + constructor( + @inject(ICommandManager) private readonly commandManager: ICommandManager, + @inject(IApplicationShell) private readonly appShell: IApplicationShell, + ) {} + public async activate(): Promise { + this.commandManager.registerCommand('python.reloadVSCode', this.onReloadVSCode, this); + } + private async onReloadVSCode(message: string) { + const item = await this.appShell.showInformationMessage(message, Common.reload); + if (item === Common.reload) { + this.commandManager.executeCommand('workbench.action.reloadWindow').then(noop, noop); + } + } +} diff --git a/src/client/common/application/commands/reportIssueCommand.ts b/src/client/common/application/commands/reportIssueCommand.ts new file mode 100644 index 000000000000..9ae099e44b4f --- /dev/null +++ b/src/client/common/application/commands/reportIssueCommand.ts @@ -0,0 +1,144 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as os from 'os'; +import * as path from 'path'; +import { inject, injectable } from 'inversify'; +import { isEqual } from 'lodash'; +import * as fs from '../../platform/fs-paths'; +import { IExtensionSingleActivationService } from '../../../activation/types'; +import { IApplicationEnvironment, ICommandManager, IWorkspaceService } from '../types'; +import { EXTENSION_ROOT_DIR } from '../../../constants'; +import { IInterpreterService } from '../../../interpreter/contracts'; +import { Commands } from '../../constants'; +import { IConfigurationService, IPythonSettings } from '../../types'; +import { sendTelemetryEvent } from '../../../telemetry'; +import { EventName } from '../../../telemetry/constants'; +import { EnvironmentType } from '../../../pythonEnvironments/info'; +import { PythonSettings } from '../../configSettings'; +import { SystemVariables } from '../../variables/systemVariables'; +import { getExtensions } from '../../vscodeApis/extensionsApi'; + +/** + * Allows the user to report an issue related to the Python extension using our template. + */ +@injectable() +export class ReportIssueCommandHandler implements IExtensionSingleActivationService { + public readonly supportedWorkspaceTypes = { untrustedWorkspace: false, virtualWorkspace: true }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private readonly packageJSONSettings: any; + + constructor( + @inject(ICommandManager) private readonly commandManager: ICommandManager, + @inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService, + @inject(IInterpreterService) private readonly interpreterService: IInterpreterService, + @inject(IConfigurationService) protected readonly configurationService: IConfigurationService, + @inject(IApplicationEnvironment) appEnvironment: IApplicationEnvironment, + ) { + this.packageJSONSettings = appEnvironment.packageJson?.contributes?.configuration?.properties; + } + + public async activate(): Promise { + this.commandManager.registerCommand(Commands.ReportIssue, this.openReportIssue, this); + } + + private argSettingsPath = path.join(EXTENSION_ROOT_DIR, 'resources', 'report_issue_user_settings.json'); + + private templatePath = path.join(EXTENSION_ROOT_DIR, 'resources', 'report_issue_template.md'); + + private userDataTemplatePath = path.join(EXTENSION_ROOT_DIR, 'resources', 'report_issue_user_data_template.md'); + + public async openReportIssue(): Promise { + const settings: IPythonSettings = this.configurationService.getSettings(); + const argSettings = JSON.parse(await fs.readFile(this.argSettingsPath, 'utf8')); + let userSettings = ''; + const keys: [keyof IPythonSettings] = Object.keys(settings) as [keyof IPythonSettings]; + keys.forEach((property) => { + const argSetting = argSettings[property]; + if (argSetting) { + if (typeof argSetting === 'object') { + let propertyHeaderAdded = false; + const argSettingsDict = (settings[property] as unknown) as Record; + if (typeof argSettingsDict === 'object') { + Object.keys(argSetting).forEach((item) => { + const prop = argSetting[item]; + if (prop) { + const defaultValue = this.getDefaultValue(`${property}.${item}`); + if (defaultValue === undefined || !isEqual(defaultValue, argSettingsDict[item])) { + if (!propertyHeaderAdded) { + userSettings = userSettings.concat(os.EOL, property, os.EOL); + propertyHeaderAdded = true; + } + const value = + prop === true ? JSON.stringify(argSettingsDict[item]) : '""'; + userSettings = userSettings.concat('• ', item, ': ', value, os.EOL); + } + } + }); + } + } else { + const defaultValue = this.getDefaultValue(property); + if (defaultValue === undefined || !isEqual(defaultValue, settings[property])) { + const value = argSetting === true ? JSON.stringify(settings[property]) : '""'; + userSettings = userSettings.concat(os.EOL, property, ': ', value, os.EOL); + } + } + } + }); + const template = await fs.readFile(this.templatePath, 'utf8'); + const userTemplate = await fs.readFile(this.userDataTemplatePath, 'utf8'); + const interpreter = await this.interpreterService.getActiveInterpreter(); + const pythonVersion = interpreter?.version?.raw ?? ''; + const languageServer = + this.workspaceService.getConfiguration('python').get('languageServer') || 'Not Found'; + const virtualEnvKind = interpreter?.envType || EnvironmentType.Unknown; + + const hasMultipleFolders = (this.workspaceService.workspaceFolders?.length ?? 0) > 1; + const hasMultipleFoldersText = + hasMultipleFolders && userSettings !== '' + ? `Multiroot scenario, following user settings may not apply:${os.EOL}` + : ''; + + const installedExtensions = getExtensions() + .filter((extension) => !extension.id.startsWith('vscode.')) + .sort((a, b) => { + if (a.packageJSON.name && b.packageJSON.name) { + return a.packageJSON.name.localeCompare(b.packageJSON.name); + } + return a.id.localeCompare(b.id); + }) + .map((extension) => { + let publisher: string = extension.packageJSON.publisher as string; + if (publisher) { + publisher = publisher.substring(0, 3); + } + return `|${extension.packageJSON.name}|${publisher}|${extension.packageJSON.version}|`; + }); + + await this.commandManager.executeCommand('workbench.action.openIssueReporter', { + extensionId: 'ms-python.python', + issueBody: template, + extensionData: userTemplate.format( + pythonVersion, + virtualEnvKind, + languageServer, + hasMultipleFoldersText, + userSettings, + installedExtensions.join('\n'), + ), + }); + sendTelemetryEvent(EventName.USE_REPORT_ISSUE_COMMAND, undefined, {}); + } + + private getDefaultValue(settingKey: string) { + if (!this.packageJSONSettings) { + return undefined; + } + const resource = PythonSettings.getSettingsUriAndTarget(undefined, this.workspaceService).uri; + const systemVariables = new SystemVariables(resource, undefined, this.workspaceService); + return systemVariables.resolveAny(this.packageJSONSettings[`python.${settingKey}`]?.default); + } +} diff --git a/src/client/common/application/contextKeyManager.ts b/src/client/common/application/contextKeyManager.ts new file mode 100644 index 000000000000..388fcf4a3841 --- /dev/null +++ b/src/client/common/application/contextKeyManager.ts @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { inject, injectable } from 'inversify'; +import { ExtensionContextKey } from './contextKeys'; +import { ICommandManager, IContextKeyManager } from './types'; + +@injectable() +export class ContextKeyManager implements IContextKeyManager { + private values: Map = new Map(); + + constructor(@inject(ICommandManager) private readonly commandManager: ICommandManager) {} + + public async setContext(key: ExtensionContextKey, value: boolean): Promise { + if (this.values.get(key) === value) { + return Promise.resolve(); + } + this.values.set(key, value); + return this.commandManager.executeCommand('setContext', key, value); + } +} diff --git a/src/client/common/application/contextKeys.ts b/src/client/common/application/contextKeys.ts new file mode 100644 index 000000000000..d6249f05eaec --- /dev/null +++ b/src/client/common/application/contextKeys.ts @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +export enum ExtensionContextKey { + showInstallPythonTile = 'showInstallPythonTile', + HasFailedTests = 'hasFailedTests', + RefreshingTests = 'refreshingTests', + IsJupyterInstalled = 'isJupyterInstalled', +} diff --git a/src/client/common/application/debugService.ts b/src/client/common/application/debugService.ts index f553b6cd6f5c..7de039e946c2 100644 --- a/src/client/common/application/debugService.ts +++ b/src/client/common/application/debugService.ts @@ -13,9 +13,10 @@ import { DebugConsole, DebugSession, DebugSessionCustomEvent, + DebugSessionOptions, Disposable, Event, - WorkspaceFolder + WorkspaceFolder, } from 'vscode'; import { IDebugService } from './types'; @@ -28,7 +29,7 @@ export class DebugService implements IDebugService { public get activeDebugSession(): DebugSession | undefined { return debug.activeDebugSession; } - public get breakpoints(): Breakpoint[] { + public get breakpoints(): readonly Breakpoint[] { return debug.breakpoints; } public get onDidChangeActiveDebugSession(): Event { @@ -46,18 +47,18 @@ export class DebugService implements IDebugService { public get onDidChangeBreakpoints(): Event { return debug.onDidChangeBreakpoints; } - // tslint:disable-next-line:no-any + public registerDebugConfigurationProvider(debugType: string, provider: any): Disposable { return debug.registerDebugConfigurationProvider(debugType, provider); } - // tslint:disable-next-line:no-any + public registerDebugAdapterTrackerFactory(debugType: string, provider: any): Disposable { return debug.registerDebugAdapterTrackerFactory(debugType, provider); } public startDebugging( folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, - parentSession?: DebugSession + parentSession?: DebugSession | DebugSessionOptions, ): Thenable { return debug.startDebugging(folder, nameOrConfiguration, parentSession); } @@ -69,7 +70,7 @@ export class DebugService implements IDebugService { } public registerDebugAdapterDescriptorFactory( debugType: string, - factory: DebugAdapterDescriptorFactory + factory: DebugAdapterDescriptorFactory, ): Disposable { return debug.registerDebugAdapterDescriptorFactory(debugType, factory); } diff --git a/src/client/common/application/debugSessionTelemetry.ts b/src/client/common/application/debugSessionTelemetry.ts deleted file mode 100644 index 47aac873a835..000000000000 --- a/src/client/common/application/debugSessionTelemetry.ts +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; -import { inject, injectable } from 'inversify'; -import { DebugAdapterTracker, DebugAdapterTrackerFactory, DebugSession, ProviderResult } from 'vscode'; -import { DebugProtocol } from 'vscode-debugprotocol'; - -import { IExtensionSingleActivationService } from '../../activation/types'; -import { AttachRequestArguments, ConsoleType, LaunchRequestArguments, TriggerType } from '../../debugger/types'; -import { sendTelemetryEvent } from '../../telemetry'; -import { EventName } from '../../telemetry/constants'; -import { IDisposableRegistry } from '../types'; -import { StopWatch } from '../utils/stopWatch'; -import { IDebugService } from './types'; - -class TelemetryTracker implements DebugAdapterTracker { - private timer = new StopWatch(); - private readonly trigger: TriggerType = 'launch'; - private readonly console: ConsoleType | undefined; - - constructor(session: DebugSession) { - this.trigger = session.configuration.type as TriggerType; - const debugConfiguration = session.configuration as Partial; - this.console = debugConfiguration.console; - } - - public onWillStartSession() { - this.sendTelemetry(EventName.DEBUG_SESSION_START); - } - - // tslint:disable-next-line:no-any - public onDidSendMessage(message: DebugProtocol.ProtocolMessage) { - if (message.type === 'response') { - const response = message as DebugProtocol.Response; - if (response.command === 'configurationDone') { - // "configurationDone" response is sent immediately after user code starts running. - this.sendTelemetry(EventName.DEBUG_SESSION_USER_CODE_RUNNING); - } - } - } - - public onWillStopSession() { - this.sendTelemetry(EventName.DEBUG_SESSION_STOP); - } - - public onError?(_error: Error) { - this.sendTelemetry(EventName.DEBUG_SESSION_ERROR); - } - - private sendTelemetry(eventName: EventName) { - if (eventName === EventName.DEBUG_SESSION_START) { - this.timer.reset(); - } - const telemetryProps = { - trigger: this.trigger, - console: this.console - }; - sendTelemetryEvent(eventName, this.timer.elapsedTime, telemetryProps); - } -} - -@injectable() -export class DebugSessionTelemetry implements DebugAdapterTrackerFactory, IExtensionSingleActivationService { - constructor( - @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, - @inject(IDebugService) debugService: IDebugService - ) { - disposableRegistry.push(debugService.registerDebugAdapterTrackerFactory('python', this)); - } - - public async activate(): Promise { - // We actually register in the constructor. Not necessary to do it here - } - - public createDebugAdapterTracker(session: DebugSession): ProviderResult { - return new TelemetryTracker(session); - } -} diff --git a/src/client/common/application/documentManager.ts b/src/client/common/application/documentManager.ts index daaaa6cbfcc2..617d335e402b 100644 --- a/src/client/common/application/documentManager.ts +++ b/src/client/common/application/documentManager.ts @@ -16,22 +16,20 @@ import { ViewColumn, window, workspace, - WorkspaceEdit + WorkspaceEdit, } from 'vscode'; import { IDocumentManager } from './types'; -// tslint:disable:no-any unified-signatures - @injectable() export class DocumentManager implements IDocumentManager { - public get textDocuments(): TextDocument[] { + public get textDocuments(): readonly TextDocument[] { return workspace.textDocuments; } public get activeTextEditor(): TextEditor | undefined { return window.activeTextEditor; } - public get visibleTextEditors(): TextEditor[] { + public get visibleTextEditors(): readonly TextEditor[] { return window.visibleTextEditors; } public get onDidChangeActiveTextEditor(): Event { @@ -40,7 +38,7 @@ export class DocumentManager implements IDocumentManager { public get onDidChangeTextDocument(): Event { return workspace.onDidChangeTextDocument; } - public get onDidChangeVisibleTextEditors(): Event { + public get onDidChangeVisibleTextEditors(): Event { return window.onDidChangeVisibleTextEditors; } public get onDidChangeTextEditorSelection(): Event { diff --git a/src/client/common/application/extensions.ts b/src/client/common/application/extensions.ts index 828f2ddcf804..e4b8f5bce73d 100644 --- a/src/client/common/application/extensions.ts +++ b/src/client/common/application/extensions.ts @@ -1,15 +1,28 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +/* eslint-disable class-methods-use-this */ +// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. 'use strict'; -import { injectable } from 'inversify'; +import { inject, injectable } from 'inversify'; import { Event, Extension, extensions } from 'vscode'; +import * as stacktrace from 'stack-trace'; +import * as path from 'path'; import { IExtensions } from '../types'; +import { IFileSystem } from '../platform/types'; +import { EXTENSION_ROOT_DIR } from '../constants'; +/** + * Provides functions for tracking the list of extensions that VSCode has installed. + */ @injectable() export class Extensions implements IExtensions { - // tslint:disable-next-line:no-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private _cachedExtensions?: readonly Extension[]; + + constructor(@inject(IFileSystem) private readonly fs: IFileSystem) {} + + // eslint-disable-next-line @typescript-eslint/no-explicit-any public get all(): readonly Extension[] { return extensions.all; } @@ -18,8 +31,70 @@ export class Extensions implements IExtensions { return extensions.onDidChange; } - // tslint:disable-next-line:no-any - public getExtension(extensionId: any) { + public getExtension(extensionId: string): Extension | undefined { return extensions.getExtension(extensionId); } + + private get cachedExtensions() { + if (!this._cachedExtensions) { + this._cachedExtensions = extensions.all; + extensions.onDidChange(() => { + this._cachedExtensions = extensions.all; + }); + } + return this._cachedExtensions; + } + + /** + * Code borrowed from: + * https://github.com/microsoft/vscode-jupyter/blob/67fe33d072f11d6443cf232a06bed0ac5e24682c/src/platform/common/application/extensions.node.ts + */ + public async determineExtensionFromCallStack(): Promise<{ extensionId: string; displayName: string }> { + const { stack } = new Error(); + if (stack) { + const pythonExtRoot = path.join(EXTENSION_ROOT_DIR.toLowerCase(), path.sep); + const frames = stack + .split('\n') + .map((f) => { + const result = /\((.*)\)/.exec(f); + if (result) { + return result[1]; + } + return undefined; + }) + .filter((item) => item && !item.toLowerCase().startsWith(pythonExtRoot)) + .filter((item) => + // Use cached list of extensions as we need this to be fast. + this.cachedExtensions.some( + (ext) => item!.includes(ext.extensionUri.path) || item!.includes(ext.extensionUri.fsPath), + ), + ) as string[]; + stacktrace.parse(new Error('Ex')).forEach((item) => { + const fileName = item.getFileName(); + if (fileName && !fileName.toLowerCase().startsWith(pythonExtRoot)) { + frames.push(fileName); + } + }); + for (const frame of frames) { + // This file is from a different extension. Try to find its `package.json`. + let dirName = path.dirname(frame); + let last = frame; + while (dirName && dirName.length < last.length) { + const possiblePackageJson = path.join(dirName, 'package.json'); + if (await this.fs.pathExists(possiblePackageJson)) { + const text = await this.fs.readFile(possiblePackageJson); + try { + const json = JSON.parse(text); + return { extensionId: `${json.publisher}.${json.name}`, displayName: json.displayName }; + } catch { + // If parse fails, then not an extension. + } + } + last = dirName; + dirName = path.dirname(dirName); + } + } + } + return { extensionId: 'unknown', displayName: 'unknown' }; + } } diff --git a/src/client/common/application/progressService.ts b/src/client/common/application/progressService.ts new file mode 100644 index 000000000000..fb19cad1136c --- /dev/null +++ b/src/client/common/application/progressService.ts @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import { ProgressOptions } from 'vscode'; +import { Deferred, createDeferred } from '../utils/async'; +import { IApplicationShell } from './types'; + +export class ProgressService { + private deferred: Deferred | undefined; + + constructor(private readonly shell: IApplicationShell) {} + + public showProgress(options: ProgressOptions): void { + if (!this.deferred) { + this.createProgress(options); + } + } + + public hideProgress(): void { + if (this.deferred) { + this.deferred.resolve(); + this.deferred = undefined; + } + } + + private createProgress(options: ProgressOptions) { + this.shell.withProgress(options, () => { + this.deferred = createDeferred(); + return this.deferred.promise; + }); + } +} diff --git a/src/client/common/application/terminalManager.ts b/src/client/common/application/terminalManager.ts index 8fe6c067d0e6..dc2603e84a56 100644 --- a/src/client/common/application/terminalManager.ts +++ b/src/client/common/application/terminalManager.ts @@ -2,18 +2,58 @@ // Licensed under the MIT License. import { injectable } from 'inversify'; -import { Event, Terminal, TerminalOptions, window } from 'vscode'; +import { + Disposable, + Event, + EventEmitter, + Terminal, + TerminalOptions, + TerminalShellExecutionEndEvent, + TerminalShellIntegrationChangeEvent, + window, +} from 'vscode'; +import { traceLog } from '../../logging'; import { ITerminalManager } from './types'; @injectable() export class TerminalManager implements ITerminalManager { + private readonly didOpenTerminal = new EventEmitter(); + constructor() { + window.onDidOpenTerminal((terminal) => { + this.didOpenTerminal.fire(monkeyPatchTerminal(terminal)); + }); + } public get onDidCloseTerminal(): Event { return window.onDidCloseTerminal; } public get onDidOpenTerminal(): Event { - return window.onDidOpenTerminal; + return this.didOpenTerminal.event; } public createTerminal(options: TerminalOptions): Terminal { - return window.createTerminal(options); + return monkeyPatchTerminal(window.createTerminal(options)); + } + public onDidChangeTerminalShellIntegration(handler: (e: TerminalShellIntegrationChangeEvent) => void): Disposable { + return window.onDidChangeTerminalShellIntegration(handler); + } + public onDidEndTerminalShellExecution(handler: (e: TerminalShellExecutionEndEvent) => void): Disposable { + return window.onDidEndTerminalShellExecution(handler); + } + public onDidChangeTerminalState(handler: (e: Terminal) => void): Disposable { + return window.onDidChangeTerminalState(handler); + } +} + +/** + * Monkeypatch the terminal to log commands sent. + */ +function monkeyPatchTerminal(terminal: Terminal) { + if (!(terminal as any).isPatched) { + const oldSendText = terminal.sendText.bind(terminal); + terminal.sendText = (text: string, addNewLine: boolean = true) => { + traceLog(`Send text to terminal: ${text}`); + return oldSendText(text, addNewLine); + }; + (terminal as any).isPatched = true; } + return terminal; } diff --git a/src/client/common/application/types.ts b/src/client/common/application/types.ts index 5cd24940b879..34a95fb604f0 100644 --- a/src/client/common/application/types.ts +++ b/src/client/common/application/types.ts @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. + 'use strict'; + import { Breakpoint, BreakpointsChangeEvent, @@ -14,6 +16,7 @@ import { DebugConsole, DebugSession, DebugSessionCustomEvent, + DebugSessionOptions, DecorationRenderOptions, Disposable, DocumentSelector, @@ -22,10 +25,11 @@ import { GlobPattern, InputBox, InputBoxOptions, + LanguageStatusItem, + LogOutputChannel, MessageItem, MessageOptions, OpenDialogOptions, - OutputChannel, Progress, ProgressOptions, QuickPick, @@ -36,6 +40,8 @@ import { StatusBarItem, Terminal, TerminalOptions, + TerminalShellExecutionEndEvent, + TerminalShellIntegrationChangeEvent, TextDocument, TextDocumentChangeEvent, TextDocumentShowOptions, @@ -47,6 +53,7 @@ import { TextEditorViewColumnChangeEvent, TreeView, TreeViewOptions, + UIKind, Uri, ViewColumn, WindowState, @@ -54,23 +61,74 @@ import { WorkspaceEdit, WorkspaceFolder, WorkspaceFolderPickOptions, - WorkspaceFoldersChangeEvent + WorkspaceFoldersChangeEvent, } from 'vscode'; -import * as vsls from 'vsls/vscode'; -import { IAsyncDisposable, Resource } from '../types'; +import { Channel } from '../constants'; +import { Resource } from '../types'; import { ICommandNameArgumentTypeMapping } from './commands'; +import { ExtensionContextKey } from './contextKeys'; -// tslint:disable:no-any unified-signatures +export interface TerminalDataWriteEvent { + /** + * The {@link Terminal} for which the data was written. + */ + readonly terminal: Terminal; + /** + * The data being written. + */ + readonly data: string; +} + +export interface TerminalExecutedCommand { + /** + * The {@link Terminal} the command was executed in. + */ + terminal: Terminal; + /** + * The full command line that was executed, including both the command and the arguments. + */ + commandLine: string | undefined; + /** + * The current working directory that was reported by the shell. This will be a {@link Uri} + * if the string reported by the shell can reliably be mapped to the connected machine. + */ + cwd: Uri | string | undefined; + /** + * The exit code reported by the shell. + */ + exitCode: number | undefined; + /** + * The output of the command when it has finished executing. This is the plain text shown in + * the terminal buffer and does not include raw escape sequences. Depending on the shell + * setup, this may include the command line as part of the output. + */ + output: string | undefined; +} export const IApplicationShell = Symbol('IApplicationShell'); export interface IApplicationShell { + /** + * An event that is emitted when a terminal with shell integration activated has completed + * executing a command. + * + * Note that this event will not fire if the executed command exits the shell, listen to + * {@link onDidCloseTerminal} to handle that case. + */ + readonly onDidExecuteTerminalCommand: Event | undefined; /** * An [event](#Event) which fires when the focus state of the current window * changes. The value of the event represents whether the window is focused. */ readonly onDidChangeWindowState: Event; + /** + * An event which fires when the terminal's child pseudo-device is written to (the shell). + * In other words, this provides access to the raw data stream from the process running + * within the terminal, including VT sequences. + */ + readonly onDidWriteTerminalData: Event; + showInformationMessage(message: string, ...items: string[]): Thenable; /** @@ -222,7 +280,7 @@ export interface IApplicationShell { showQuickPick( items: string[] | Thenable, options?: QuickPickOptions, - token?: CancellationToken + token?: CancellationToken, ): Thenable; /** @@ -236,7 +294,7 @@ export interface IApplicationShell { showQuickPick( items: T[] | Thenable, options?: QuickPickOptions, - token?: CancellationToken + token?: CancellationToken, ): Thenable; /** @@ -270,6 +328,19 @@ export interface IApplicationShell { */ showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable; + /** + * Show the given document in a text editor. A {@link ViewColumn column} can be provided + * to control where the editor is being shown. Might change the {@link window.activeTextEditor active editor}. + * + * @param document A text document to be shown. + * @param column A view column in which the {@link TextEditor editor} should be shown. The default is the {@link ViewColumn.Active active}, other values + * are adjusted to be `Min(column, columnCount + 1)`, the {@link ViewColumn.Active active}-column is not adjusted. Use {@linkcode ViewColumn.Beside} + * to open the editor to the side of the currently active one. + * @param preserveFocus When `true` the editor will not take focus. + * @return A promise that resolves to an {@link TextEditor editor}. + */ + showTextDocument(document: TextDocument, column?: ViewColumn, preserveFocus?: boolean): Thenable; + /** * Creates a [QuickPick](#QuickPick) to let the user pick an item from a list * of items of type T. @@ -317,6 +388,7 @@ export interface IApplicationShell { * @param hideWhenDone Thenable on which completion (resolve or reject) the message will be disposed. * @return A disposable which hides the status bar message. */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable; /** @@ -338,7 +410,7 @@ export interface IApplicationShell { * @param priority The priority of the item. Higher values mean the item should be shown more to the left. * @return A new status bar item. */ - createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem; + createStatusBarItem(alignment?: StatusBarAlignment, priority?: number, id?: string): StatusBarItem; /** * Shows a selection list of [workspace folders](#workspace.workspaceFolders) to pick from. * Returns `undefined` if no folder is open. @@ -369,7 +441,34 @@ export interface IApplicationShell { */ withProgress( options: ProgressOptions, - task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable + task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable, + ): Thenable; + + /** + * Show progress in the status bar with a custom icon instead of the default spinner. + * Progress is shown while running the given callback and while the promise it returned isn't resolved nor rejected. + * At the moment, progress can only be displayed in the status bar when using this method. If you want to + * display it elsewhere, use `withProgress`. + * + * @param icon A valid Octicon. + * + * @param task A callback returning a promise. Progress state can be reported with + * the provided [progress](#Progress)-object. + * + * To report discrete progress, use `increment` to indicate how much work has been completed. Each call with + * a `increment` value will be summed up and reflected as overall progress until 100% is reached (a value of + * e.g. `10` accounts for `10%` of work done). + * Note that currently only `ProgressLocation.Notification` is capable of showing discrete progress. + * + * To monitor if the operation has been cancelled by the user, use the provided [`CancellationToken`](#CancellationToken). + * Note that currently only `ProgressLocation.Notification` is supporting to show a cancel button to cancel the + * long running operation. + * + * @return The thenable the task-callback returned. + */ + withProgressCustomIcon( + icon: string, + task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable, ): Thenable; /** @@ -385,7 +484,8 @@ export interface IApplicationShell { * * @param name Human-readable string which will be used to represent the channel in the UI. */ - createOutputChannel(name: string): OutputChannel; + createOutputChannel(name: string): LogOutputChannel; + createLanguageStatusItem(id: string, selector: DocumentSelector): LanguageStatusItem; } export const ICommandManager = Symbol('ICommandManager'); @@ -405,8 +505,10 @@ export interface ICommandManager { */ registerCommand( command: E, + // eslint-disable-next-line @typescript-eslint/no-explicit-any callback: (...args: U) => any, - thisArg?: any + // eslint-disable-next-line @typescript-eslint/no-explicit-any + thisArg?: any, ): Disposable; /** @@ -425,8 +527,10 @@ export interface ICommandManager { */ registerTextEditorCommand( command: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any callback: (textEditor: TextEditor, edit: TextEditorEdit, ...args: any[]) => void, - thisArg?: any + // eslint-disable-next-line @typescript-eslint/no-explicit-any + thisArg?: any, ): Disposable; /** @@ -458,6 +562,16 @@ export interface ICommandManager { getCommands(filterInternal?: boolean): Thenable; } +export const IContextKeyManager = Symbol('IContextKeyManager'); +export interface IContextKeyManager { + setContext(key: ExtensionContextKey, value: boolean): Promise; +} + +export const IJupyterExtensionDependencyManager = Symbol('IJupyterExtensionDependencyManager'); +export interface IJupyterExtensionDependencyManager { + readonly isJupyterExtensionInstalled: boolean; +} + export const IDocumentManager = Symbol('IDocumentManager'); export interface IDocumentManager { @@ -466,7 +580,7 @@ export interface IDocumentManager { * * @readonly */ - readonly textDocuments: TextDocument[]; + readonly textDocuments: readonly TextDocument[]; /** * The currently active editor or `undefined`. The active editor is the one * that currently has focus or, when none has focus, the one that has changed @@ -477,7 +591,7 @@ export interface IDocumentManager { /** * The currently visible editors or an empty array. */ - readonly visibleTextEditors: TextEditor[]; + readonly visibleTextEditors: readonly TextEditor[]; /** * An [event](#Event) which fires when the [active editor](#window.activeTextEditor) @@ -497,7 +611,7 @@ export interface IDocumentManager { * An [event](#Event) which fires when the array of [visible editors](#window.visibleTextEditors) * has changed. */ - readonly onDidChangeVisibleTextEditors: Event; + readonly onDidChangeVisibleTextEditors: Event; /** * An [event](#Event) which fires when the selection in an editor has changed. @@ -630,13 +744,54 @@ export interface IWorkspaceService { */ readonly rootPath: string | undefined; + /** + * When true, the user has explicitly trusted the contents of the workspace. + */ + readonly isTrusted: boolean; + + /** + * Event that fires when the current workspace has been trusted. + */ + readonly onDidGrantWorkspaceTrust: Event; + /** * List of workspace folders or `undefined` when no folder is open. * *Note* that the first entry corresponds to the value of `rootPath`. * * @readonly */ - readonly workspaceFolders: WorkspaceFolder[] | undefined; + readonly workspaceFolders: readonly WorkspaceFolder[] | undefined; + + /** + * The location of the workspace file, for example: + * + * `file:///Users/name/Development/myProject.code-workspace` + * + * or + * + * `untitled:1555503116870` + * + * for a workspace that is untitled and not yet saved. + * + * Depending on the workspace that is opened, the value will be: + * * `undefined` when no workspace or a single folder is opened + * * the path of the workspace file as `Uri` otherwise. if the workspace + * is untitled, the returned URI will use the `untitled:` scheme + * + * The location can e.g. be used with the `vscode.openFolder` command to + * open the workspace again after it has been closed. + * + * **Example:** + * ```typescript + * vscode.commands.executeCommand('vscode.openFolder', uriOfWorkspace); + * ``` + * + * **Note:** it is not advised to use `workspace.workspaceFile` to write + * configuration data into the file. You can use `workspace.getConfiguration().update()` + * for that purpose which will work both when a single folder is opened as + * well as an untitled or saved workspace. + */ + readonly workspaceFile: Resource; /** * An event that is emitted when a workspace folder is added or removed. @@ -648,12 +803,9 @@ export interface IWorkspaceService { */ readonly onDidChangeConfiguration: Event; /** - * Whether a workspace folder exists - * @type {boolean} - * @memberof IWorkspaceService + * Returns if we're running in a virtual workspace. */ - readonly hasWorkspaceFolders: boolean; - + readonly isVirtualWorkspace: boolean; /** * Returns the [workspace folder](#WorkspaceFolder) that contains a given uri. * * returns `undefined` when the given uri doesn't match any workspace folder @@ -666,9 +818,6 @@ export interface IWorkspaceService { /** * Generate a key that's unique to the workspace folder (could be fsPath). - * @param {(Uri | undefined)} resource - * @returns {string} - * @memberof IWorkspaceService */ getWorkspaceFolderIdentifier(resource: Uri | undefined, defaultValue?: string): string; /** @@ -704,7 +853,7 @@ export interface IWorkspaceService { globPattern: GlobPattern, ignoreCreateEvents?: boolean, ignoreChangeEvents?: boolean, - ignoreDeleteEvents?: boolean + ignoreDeleteEvents?: boolean, ): FileSystemWatcher; /** @@ -715,7 +864,8 @@ export interface IWorkspaceService { * will be matched against the file paths of resulting matches relative to their workspace. Use a [relative pattern](#RelativePattern) * to restrict the search results to a [workspace folder](#WorkspaceFolder). * @param exclude A [glob pattern](#GlobPattern) that defines files and folders to exclude. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. + * will be matched against the file paths of resulting matches relative to their workspace. If `undefined` is passed, + * the glob patterns excluded in the `search.exclude` setting will be applied. * @param maxResults An upper-bound for the result. * @param token A token that can be used to signal cancellation to the underlying search engine. * @return A thenable that resolves to an array of resource identifiers. Will return no results if no @@ -725,7 +875,7 @@ export interface IWorkspaceService { include: GlobPattern, exclude?: GlobPattern, maxResults?: number, - token?: CancellationToken + token?: CancellationToken, ): Thenable; /** @@ -739,9 +889,30 @@ export interface IWorkspaceService { * * @param section A dot-separated identifier. * @param resource A resource for which the configuration is asked for + * @param languageSpecific Should the [python] language-specific settings be obtained? * @return The full configuration or a subset. */ - getConfiguration(section?: string, resource?: Uri): WorkspaceConfiguration; + getConfiguration(section?: string, resource?: Uri, languageSpecific?: boolean): WorkspaceConfiguration; + + /** + * Opens an untitled text document. The editor will prompt the user for a file + * path when the document is to be saved. The `options` parameter allows to + * specify the *language* and/or the *content* of the document. + * + * @param options Options to control how the document will be created. + * @return A promise that resolves to a {@link TextDocument document}. + */ + openTextDocument(options?: { language?: string; content?: string }): Thenable; + /** + * Saves the editor identified by the given resource and returns the resulting resource or `undefined` + * if save was not successful. + * + * **Note** that an editor with the provided resource must be opened in order to be saved. + * + * @param uri the associated uri for the opened editor to save. + * @return A thenable that resolves when the save operation has finished. + */ + save(uri: Uri): Thenable; } export const ITerminalManager = Symbol('ITerminalManager'); @@ -764,6 +935,12 @@ export interface ITerminalManager { * @return A new Terminal. */ createTerminal(options: TerminalOptions): Terminal; + + onDidChangeTerminalShellIntegration(handler: (e: TerminalShellIntegrationChangeEvent) => void): Disposable; + + onDidEndTerminalShellExecution(handler: (e: TerminalShellExecutionEndEvent) => void): Disposable; + + onDidChangeTerminalState(handler: (e: Terminal) => void): Disposable; } export const IDebugService = Symbol('IDebugManager'); @@ -784,7 +961,7 @@ export interface IDebugService { /** * List of breakpoints. */ - readonly breakpoints: Breakpoint[]; + readonly breakpoints: readonly Breakpoint[]; /** * An [event](#Event) which fires when the [active debug session](#debug.activeDebugSession) @@ -856,7 +1033,7 @@ export interface IDebugService { startDebugging( folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, - parentSession?: DebugSession + parentSession?: DebugSession | DebugSessionOptions, ): Thenable; /** @@ -922,6 +1099,7 @@ export interface IApplicationEnvironment { * @type {any} * @memberof IApplicationEnvironment */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any readonly packageJson: any; /** * Gets the full path to the user settings file. (may or may not exist). @@ -938,6 +1116,10 @@ export interface IApplicationEnvironment { * @memberof IApplicationShell */ readonly shell: string; + /** + * An {@link Event} which fires when the default shell changes. + */ + readonly onDidChangeShell: Event; /** * Gets the vscode channel (whether 'insiders' or 'stable'). */ @@ -953,109 +1135,26 @@ export interface IApplicationEnvironment { * The version of the editor. */ readonly vscodeVersion: string; -} - -export const IWebPanelMessageListener = Symbol('IWebPanelMessageListener'); -export interface IWebPanelMessageListener extends IAsyncDisposable { - /** - * Listens to web panel messages - * @param message: the message being sent - * @param payload: extra data that came with the message - * @return A IWebPanel that can be used to show html pages. - */ - onMessage(message: string, payload: any): void; - /** - * Listens to web panel state changes - */ - onChangeViewState(panel: IWebPanel): void; -} - -export type WebPanelMessage = { /** - * Message type + * The custom uri scheme the editor registers to in the operating system. */ - type: string; - + readonly uriScheme: string; /** - * Payload + * The UI kind property indicates from which UI extensions + * are accessed from. For example, extensions could be accessed + * from a desktop application or a web browser. */ - payload?: any; -}; - -// Wraps the VS Code webview panel -export const IWebPanel = Symbol('IWebPanel'); -export interface IWebPanel { - setTitle(val: string): void; - /** - * Makes the webpanel show up. - * @return A Promise that can be waited on - */ - show(preserveFocus: boolean): Promise; - + readonly uiKind: UIKind; /** - * Indicates if this web panel is visible or not. - */ - isVisible(): boolean; - - /** - * Sends a message to the hosted html page - */ - postMessage(message: WebPanelMessage): void; - - /** - * Attempts to close the panel if it's visible - */ - close(): void; - /** - * Indicates if the webview has the focus or not. - */ - isActive(): boolean; - /** - * Updates the current working directory for serving up files. - * @param cwd - */ - updateCwd(cwd: string): void; -} - -export interface IWebPanelOptions { - viewColumn: ViewColumn; - listener: IWebPanelMessageListener; - title: string; - rootPath: string; - scripts: string[]; - startHttpServer: boolean; - cwd: string; - // tslint:disable-next-line: no-any - settings?: any; -} - -// Wraps the VS Code api for creating a web panel -export const IWebPanelProvider = Symbol('IWebPanelProvider'); -export interface IWebPanelProvider { - /** - * Creates a new webpanel + * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows + * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. * - * @param {IWebPanelOptions} options - params for creating an IWebPanel - * @returns {IWebPanel} - * @memberof IWebPanelProvider + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use {@link Extension.extensionKind} to know if + * a specific extension runs remote or not. */ - create(options: IWebPanelOptions): Promise; -} - -// Wraps the vsls liveshare API -export const ILiveShareApi = Symbol('ILiveShareApi'); -export interface ILiveShareApi { - getApi(): Promise; -} - -// Wraps the liveshare api for testing -export const ILiveShareTestingApi = Symbol('ILiveShareTestingApi'); -export interface ILiveShareTestingApi extends ILiveShareApi { - isSessionStarted: boolean; - forceRole(role: vsls.Role): void; - startSession(): Promise; - stopSession(): Promise; - disableGuestChecker(): void; + readonly remoteName: string | undefined; } export const ILanguageService = Symbol('ILanguageService'); @@ -1081,8 +1180,6 @@ export interface ILanguageService { ): Disposable; } -export type Channel = 'stable' | 'insiders'; - /** * Wraps the `ActiveResourceService` API class. Created for injecting and mocking class methods in testing */ @@ -1090,3 +1187,16 @@ export const IActiveResourceService = Symbol('IActiveResourceService'); export interface IActiveResourceService { getActiveResource(): Resource; } + +export const IClipboard = Symbol('IClipboard'); +export interface IClipboard { + /** + * Read the current clipboard contents as text. + */ + readText(): Promise; + + /** + * Writes text into the clipboard. + */ + writeText(value: string): Promise; +} diff --git a/src/client/common/application/walkThroughs.ts b/src/client/common/application/walkThroughs.ts new file mode 100644 index 000000000000..89e57ee74e47 --- /dev/null +++ b/src/client/common/application/walkThroughs.ts @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +export enum PythonWelcome { + name = 'pythonWelcome', + windowsInstallId = 'python.installPythonWin8', + linuxInstallId = 'python.installPythonLinux', + macOSInstallId = 'python.installPythonMac', +} diff --git a/src/client/common/application/webPanels/webPanel.ts b/src/client/common/application/webPanels/webPanel.ts deleted file mode 100644 index c0ea7cdcfd97..000000000000 --- a/src/client/common/application/webPanels/webPanel.ts +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; -import '../../extensions'; - -import * as uuid from 'uuid/v4'; -import { Uri, Webview, WebviewPanel, window } from 'vscode'; - -import { Identifiers } from '../../../datascience/constants'; -import { InteractiveWindowMessages } from '../../../datascience/interactive-common/interactiveWindowTypes'; -import { SharedMessages } from '../../../datascience/messages'; -import { IFileSystem } from '../../platform/types'; -import { IDisposableRegistry } from '../../types'; -import * as localize from '../../utils/localize'; -import { IWebPanel, IWebPanelOptions, WebPanelMessage } from '../types'; - -// Pick a static port to remap the remote port to one that VS code will route traffic to. -// According to this, it should be a static number: -// https://code.visualstudio.com/api/advanced-topics/remote-extensions -const RemappedPort = 9890; - -export class WebPanel implements IWebPanel { - private panel: WebviewPanel | undefined; - private loadPromise: Promise; - private id = uuid(); - - constructor( - private fs: IFileSystem, - private disposableRegistry: IDisposableRegistry, - private port: number | undefined, - private token: string | undefined, - private options: IWebPanelOptions - ) { - this.panel = window.createWebviewPanel( - options.title.toLowerCase().replace(' ', ''), - options.title, - { viewColumn: options.viewColumn, preserveFocus: true }, - { - enableScripts: true, - retainContextWhenHidden: true, - localResourceRoots: [Uri.file(this.options.rootPath), Uri.file(this.options.cwd)], - enableFindWidget: true, - portMapping: port ? [{ webviewPort: RemappedPort, extensionHostPort: port }] : undefined - } - ); - this.loadPromise = this.load(); - } - - public async show(preserveFocus: boolean) { - await this.loadPromise; - if (this.panel) { - this.panel.reveal(this.panel.viewColumn, preserveFocus); - } - } - - public updateCwd(_cwd: string) { - if (this.options.startHttpServer && this.port) { - // See issue https://github.com/microsoft/vscode-python/issues/8933 for implementing this. - } - } - - public close() { - if (this.panel) { - this.panel.dispose(); - } - } - - public isVisible(): boolean { - return this.panel ? this.panel.visible : false; - } - - public isActive(): boolean { - return this.panel ? this.panel.active : false; - } - - public postMessage(message: WebPanelMessage) { - if (this.panel && this.panel.webview) { - this.panel.webview.postMessage(message); - } - } - - public setTitle(newTitle: string) { - this.options.title = newTitle; - if (this.panel) { - this.panel.title = newTitle; - } - } - - // tslint:disable-next-line:no-any - private async load() { - if (this.panel) { - const localFilesExist = await Promise.all(this.options.scripts.map(s => this.fs.fileExists(s))); - if (localFilesExist.every(exists => exists === true)) { - // Call our special function that sticks this script inside of an html page - // and translates all of the paths to vscode-resource URIs - this.panel.webview.html = this.options.startHttpServer - ? this.generateServerReactHtml(this.panel.webview) - : await this.generateLocalReactHtml(this.panel.webview); - - // Reset when the current panel is closed - this.disposableRegistry.push( - this.panel.onDidDispose(() => { - this.panel = undefined; - this.options.listener.dispose().ignoreErrors(); - }) - ); - - this.disposableRegistry.push( - this.panel.webview.onDidReceiveMessage(message => { - // Pass the message onto our listener - this.options.listener.onMessage(message.type, message.payload); - }) - ); - - this.disposableRegistry.push( - this.panel.onDidChangeViewState(_e => { - // Pass the state change onto our listener - this.options.listener.onChangeViewState(this); - }) - ); - - // Set initial state - this.options.listener.onChangeViewState(this); - } else { - // Indicate that we can't load the file path - const badPanelString = localize.DataScience.badWebPanelFormatString(); - this.panel.webview.html = badPanelString.format(this.options.scripts.join(', ')); - } - } - } - - // tslint:disable-next-line:no-any - private async generateLocalReactHtml(webView: Webview) { - const uriBase = webView.asWebviewUri(Uri.file(this.options.cwd)).toString(); - const uris = this.options.scripts.map(script => webView.asWebviewUri(Uri.file(script))); - const testFiles = await this.fs.getFiles(this.options.rootPath); - - // This method must be called so VSC is aware of files that can be pulled. - // Allow js and js.map files to be loaded by webpack in the webview. - testFiles - .filter(f => f.toLowerCase().endsWith('.js') || f.toLowerCase().endsWith('.js.map')) - .forEach(f => webView.asWebviewUri(Uri.file(f))); - - const rootPath = webView.asWebviewUri(Uri.file(this.options.rootPath)).toString(); - return ` - - - - - - - - React App - - - - -
- - ${uris.map(uri => ``).join('\n')} - - `; - } - - // tslint:disable-next-line:no-any - private generateServerReactHtml(webView: Webview) { - const uriBase = webView.asWebviewUri(Uri.file(this.options.rootPath)); - const relativeScripts = this.options.scripts.map(s => `.${s.substr(this.options.rootPath.length)}`); - const encoded = relativeScripts.map(s => - encodeURIComponent(s.replace(/\\/g, '/').replace('index_bundle.js', 'index_chunked_bundle.js')) - ); - - return ` - - - - - - - - React App - - - - -