From 6064f9a11e5f54a614ee9c82b1b3facb323fa398 Mon Sep 17 00:00:00 2001 From: Jon Gallant <2163001+jongio@users.noreply.github.com> Date: Mon, 15 May 2023 15:31:35 -0700 Subject: [PATCH] Init --- .devcontainer/Dockerfile | 10 + .devcontainer/devcontainer.json | 59 + .gitattributes | 2 + .github/workflows/azure-dev.yml | 64 + .gitignore | 166 +++ .vscode/launch.json | 20 + .vscode/settings.json | 182 +++ .well-known/ai-plugin.json | 18 + Dockerfile | 7 + LICENSE | 21 + README.md | 96 ++ assets/imgs/logo.png | Bin 0 -> 42873 bytes azure.yaml | 10 + data/products.json | 443 ++++++ infra/abbreviations.json | 135 ++ infra/app/api.bicep | 48 + infra/core/host/container-app-upsert.bicep | 50 + infra/core/host/container-app.bicep | 93 ++ .../host/container-apps-environment.bicep | 27 + infra/core/host/container-apps.bicep | 31 + infra/core/host/container-registry.bicep | 67 + .../applicationinsights-dashboard.bicep | 1235 +++++++++++++++++ infra/core/monitor/applicationinsights.bicep | 30 + infra/core/monitor/loganalytics.bicep | 21 + infra/core/monitor/monitoring.bicep | 31 + infra/core/security/registry-access.bicep | 18 + infra/main.bicep | 87 ++ infra/main.parameters.json | 18 + main.py | 23 + requirements.txt | 5 + routers/__init__.py | 0 routers/wellknown.py | 24 + scripts/load_env.sh | 17 + scripts/prompts.txt | 9 + 34 files changed, 3067 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .gitattributes create mode 100644 .github/workflows/azure-dev.yml create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .well-known/ai-plugin.json create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/imgs/logo.png create mode 100644 azure.yaml create mode 100644 data/products.json create mode 100644 infra/abbreviations.json create mode 100644 infra/app/api.bicep create mode 100644 infra/core/host/container-app-upsert.bicep create mode 100644 infra/core/host/container-app.bicep create mode 100644 infra/core/host/container-apps-environment.bicep create mode 100644 infra/core/host/container-apps.bicep create mode 100644 infra/core/host/container-registry.bicep create mode 100644 infra/core/monitor/applicationinsights-dashboard.bicep create mode 100644 infra/core/monitor/applicationinsights.bicep create mode 100644 infra/core/monitor/loganalytics.bicep create mode 100644 infra/core/monitor/monitoring.bicep create mode 100644 infra/core/security/registry-access.bicep create mode 100644 infra/main.bicep create mode 100644 infra/main.parameters.json create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 routers/__init__.py create mode 100644 routers/wellknown.py create mode 100644 scripts/load_env.sh create mode 100644 scripts/prompts.txt diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b70efb4 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,10 @@ +ARG VARIANT=bullseye +ARG VERSION=3.10 +FROM --platform=amd64 mcr.microsoft.com/devcontainers/python:${VERSION}-${VARIANT} + +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get install -y xdg-utils \ + && curl -fsSL https://aka.ms/install-azd.sh | bash \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..79f8e0c --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,59 @@ +{ + "name": "Azure Developer CLI", + "build": { + "dockerfile": "Dockerfile", + "args": { + "VARIANT": "bullseye", + "VERSION": "3.10" + } + }, + "features": { + "ghcr.io/devcontainers/features/azure-cli:1": { + "version": "2.48.1" + }, + "ghcr.io/devcontainers/features/docker-from-docker:1": { + "version": "20.10" + }, + "ghcr.io/devcontainers/features/github-cli:1": { + "version": "2" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "ms-azuretools.azure-dev", + "ms-azuretools.vscode-bicep", + "ms-azuretools.vscode-docker", + "ms-vscode.vscode-node-azure-pack", + "ms-vscode.js-debug", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "ms-azuretools.vscode-azurefunctions", + "github.vscode-github-actions", + "GitHub.copilot-nightly", + "ms-python.black-formatter" + ] + }, + "codespaces": { + "openFiles": [ + "main.py" + ] + } + }, + "forwardPorts": [ + 6379, + 8000 + ], + "postAttachCommand": "", + "postCreateCommand": "pip3 install --user -r requirements.txt", + "remoteUser": "vscode", + "hostRequirements": { + "memory": "8gb", + "cpus": 8 + }, + "portsAttributes": { + "8000": { + "label": "FastAPI Server" + } + } +} \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/workflows/azure-dev.yml b/.github/workflows/azure-dev.yml new file mode 100644 index 0000000..bc04b02 --- /dev/null +++ b/.github/workflows/azure-dev.yml @@ -0,0 +1,64 @@ +on: + workflow_dispatch: + push: + branches: + - main + - just-the-basics + +# https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure?tabs=azure-portal%2Clinux#set-up-azure-login-with-openid-connect-authentication +permissions: + id-token: write + contents: read + +jobs: + build: + runs-on: ubuntu-latest + container: + image: mcr.microsoft.com/azure-dev-cli-apps:latest + env: + AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }} + AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }} + AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }} + AZURE_LOCATION: ${{ vars.AZURE_LOCATION }} + AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} + AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Log in with Azure (Federated Credentials) + if: ${{ env.AZURE_CLIENT_ID != '' }} + run: | + azd auth login ` + --client-id "$Env:AZURE_CLIENT_ID" ` + --federated-credential-provider "github" ` + --tenant-id "$Env:AZURE_TENANT_ID" + shell: pwsh + + - name: Log in with Azure (Client Credentials) + if: ${{ env.AZURE_CREDENTIALS != '' }} + run: | + $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable; + Write-Host "::add-mask::$($info.clientSecret)" + + azd auth login ` + --client-id "$($info.clientId)" ` + --client-secret "$($info.clientSecret)" ` + --tenant-id "$($info.tenantId)" + shell: pwsh + env: + AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }} + + - name: Provision Azure Resources - Azure Container Apps, Container Registry, Azure Monitor, Log Analytics + run: azd provision --no-prompt + env: + AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }} + AZURE_LOCATION: ${{ vars.AZURE_LOCATION }} + AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} + + - name: Deploy changes to Azure Container Apps + run: azd deploy --no-prompt + env: + AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }} + AZURE_LOCATION: ${{ vars.AZURE_LOCATION }} + AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be98434 --- /dev/null +++ b/.gitignore @@ -0,0 +1,166 @@ +# environment name +demoplugin/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + + +.azure \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..99cd994 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: FastAPI", + "type": "python", + "request": "launch", + "module": "uvicorn", + "args": [ + "main:app", + "--reload" + ], + "jinja": true, + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ae262f9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,182 @@ +{ + "python.testing.pytestArgs": ["."], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "json.schemas": [ + { + "fileMatch": ["ai-plugin.json"], + "schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "schema_version": { + "type": "string", + "description": "Manifest schema version", + "examples": ["v1"] + }, + "name_for_model": { + "type": "string", + "maxLength": 50, + "pattern": "^[a-zA-Z0-9]*$", + "title": "Name for model", + "description": "Name the model will use to target the plugin (no spaces allowed, only letters and numbers). 50 character max." + }, + "name_for_human": { + "type": "string", + "maxLength": 20, + "description": "Human-readable name, such as the full company name. 20 character max." + }, + "description_for_model": { + "type": "string", + "maxLength": 8000, + "description": "Description better tailored to the model, such as token context length considerations or keyword usage for improved plugin prompting. 8,000 character max." + }, + "description_for_human": { + "type": "string", + "maxLength": 100, + "description": "Human-readable description of the plugin. 100 character max." + }, + "auth": { + "type": "object", + "description": "Authentication schema", + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["none"] + } + }, + "required": ["type"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["service_http"] + }, + "authorization_type": { + "type": "string", + "enum": ["bearer", "basic"] + }, + "verification_tokens": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "type", + "authorization_type", + "verification_tokens" + ] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["user_http"] + }, + "authorization_type": { + "type": "string", + "enum": ["bearer", "basic"] + } + }, + "required": ["type", "authorization_type"] + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["oauth"] + }, + "client_url": { + "type": "string", + "format": "uri" + }, + "scope": { + "type": "string" + }, + "authorization_url": { + "type": "string", + "format": "uri" + }, + "authorization_content_type": { + "type": "string" + }, + "verification_tokens": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "type", + "client_url", + "scope", + "authorization_url", + "authorization_content_type", + "verification_tokens" + ] + } + ] + }, + "api": { + "type": "object", + "description": "API specification", + "properties": { + "type": { + "type": "string", + "enum": ["openapi"], + "description": "API specification type" + }, + "is_user_authenticated": { + "type": "boolean", + "description": "Indicates whether the user is authenticated" + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL of the API specification" + } + }, + "required": ["type", "is_user_authenticated", "url"] + }, + "logo_url": { + "type": "string", + "format": "uri", + "description": "URL used to fetch the logo. Suggested size: 512 x 512. Transparent backgrounds are supported." + }, + "contact_email": { + "type": "string", + "format": "email", + "description": "Email contact for safety/moderation, support, and deactivation" + }, + "legal_info_url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "schema_version", + "name_for_model", + "name_for_human", + "description_for_model", + "description_for_human", + "auth", + "api", + "logo_url", + "contact_email", + "legal_info_url" + ] + } + } + ] + } + \ No newline at end of file diff --git a/.well-known/ai-plugin.json b/.well-known/ai-plugin.json new file mode 100644 index 0000000..eb21367 --- /dev/null +++ b/.well-known/ai-plugin.json @@ -0,0 +1,18 @@ +{ + "schema_version": "v1", + "name_for_model": "contosoproducts", + "name_for_human": "Contoso Product Search", + "description_for_model": "Plugin for searching through my shop offering various outdoor and sports products. Use it whenever a user asks anything about outdoor, climbing, hiking or sports products.", + "description_for_human": "Contoso Outdoor and Sports Products Search.", + "auth": { + "type": "none" + }, + "api": { + "type": "openapi", + "is_user_authenticated": "false", + "url": "$host/openapi.json" + }, + "logo_url": "$host/assets/imgs/logo.png", + "contact_email": "noreply@microsoft.com", + "legal_info_url": "https://www.microsoft.com/en-us/legal/" +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9d06c2c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.10 + +COPY . . + +RUN pip install --no-cache-dir --upgrade -r requirements.txt + +CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT:-${WEBSITES_PORT:-8080}}"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9ed1403 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright 2023 (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 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..32111b6 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# AI Plugin Quickstart (Python 🐍) + +This is a quickstart for creating an AI plugin, from writing a simple API server to running it in ChatGPT. + + +[![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=lightgrey&logo=github)](https://codespaces.new/azure-samples/openai-plugin-fastapi) +[![Open in Dev Container](https://img.shields.io/static/v1?style=for-the-badge&label=Dev+Container&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/openai-plugin-fastapi) + +## Getting started + +1. **📤 One-click setup**: [Open a new Codespace](https://codespaces.new/azure-samples/openai-plugin-fastapi), giving you a fully configured cloud developer environment. +2. **🪄 Make an API**: Add routes in `main.py`, done in a few minutes even without [FastAPI](https://fastapi.tiangolo.com/lo/tutorial/) experience, thanks to [GitHub Copilot](https://github.com/features/copilot/). +3. **▶️ Run, one-click again**: Use VS Code's built-in *Run* command and open the forwarded port *8000* in your browser. +4. **💬 Test in ChatGPT**: Copy the URL (make sure its public) and paste it in ChatGPT's [Develop your own plugin](https://platform.openai.com/docs/plugins/getting-started/debugging) flow. +5. **🔄 Iterate quickly:** Codespaces updates the server on each save, and VS Code's debugger lets you dig into the code execution. + + + +## Run + +### Run in Codespaces +1. Click here to open in GitHub Codespaces + + [![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=lightgrey&logo=github)](https://codespaces.new/azure-samples/openai-plugin-fastapi) + +1. Open Codespaces Ports tab, right click 8000, and make it public. +1. Copy the Codesapces address for port 8000 +1. Open Chat GPT and add the plugin with the Codespaces address +1. Run a query for 'hiking boots' + +### Run in Dev Container + +1. Click here to open in Dev Container + + [![Open in Dev Container](https://img.shields.io/static/v1?style=for-the-badge&label=Dev+Container&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/openai-plugin-fastapi) + +1. Hit F5 to start the API +1. Open Chat GPT and add the plugin with `localhost:8000` +1. Run a query for 'hiking boots' + + +### Run Locally + +1. Clone the repo to your local machine `git clone https://github.com/azure-samples/openai-plugin-fastapi` +1. Open repo in VS Code +1. Create a new Python virtual environment and activate it +1. Hit F5 to start the API +1. Open Chat GPT and add the plugin with `localhost:8000` +1. Run a query for 'hiking boots' + +## Deploy to Azure + +> NOTE: If you are running locally, then you first need to [install the Azure Developer CLI](https://aka.ms/azd/install) + +### Deploy with Azure Developer CLI + +1. Open a terminal +1. Run `azd auth login` +1. Run `azd up` +1. Copy the endpoint printed to the terminal +1. Open Chat GPT and add the plugin with that endpoint +1. Run a query for 'hiking boots' + +### Deploy with GitHub Actions + +1. Fork this repo to your own account +1. Open your fork in Codespaces, Dev Container or Local +1. Open a terminal +1. Run `azd auth login` +1. Run `azd pipeline config` +1. Click on the printed actions link. Scroll to the bottom of the logs to find the endpoint. +1. Open Chat GPT and add the plugin with that endpoint +1. Run a query for 'hiking boots' + + +## Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a +Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. + +When you submit a pull request, a CLA bot will automatically determine whether you need to provide +a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions +provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. \ No newline at end of file diff --git a/assets/imgs/logo.png b/assets/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d57e9cdeb1612714b143ea888923642ac0fbbc72 GIT binary patch literal 42873 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

yD+gRO-paO{wUrqOImoH6Kup$*+? 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