From a95403f5947b9ef6207ac2e8cef64bf9a6aaac59 Mon Sep 17 00:00:00 2001 From: Dmitry Afanasyev <71835315+Balshgit@users.noreply.github.com> Date: Sat, 16 Sep 2023 20:09:40 +0300 Subject: [PATCH] Feat/fix start (#1) format code --- Makefile | 2 +- app/api/system/controllers.py | 5 +- .../.github/workflows/docker-build-push.yml | 33 + .../.github/workflows/sync-hugging.yml | 19 + app/chat-gpt/Caddyfile | 11 + app/chat-gpt/Dockerfile | 18 + app/chat-gpt/README.md | 190 ++++ app/chat-gpt/__init__.py | 0 app/chat-gpt/babel.cfg | 2 + app/chat-gpt/client/css/button.css | 26 + app/chat-gpt/client/css/buttons.css | 4 + app/chat-gpt/client/css/checkbox.css | 55 ++ app/chat-gpt/client/css/conversation.css | 158 ++++ app/chat-gpt/client/css/dropdown.css | 10 + app/chat-gpt/client/css/field.css | 11 + app/chat-gpt/client/css/global.css | 70 ++ app/chat-gpt/client/css/hljs.css | 68 ++ app/chat-gpt/client/css/label.css | 16 + app/chat-gpt/client/css/main.css | 14 + app/chat-gpt/client/css/message-input.css | 27 + app/chat-gpt/client/css/message.css | 65 ++ app/chat-gpt/client/css/options.css | 10 + app/chat-gpt/client/css/select.css | 35 + app/chat-gpt/client/css/settings.css | 44 + app/chat-gpt/client/css/sidebar.css | 197 ++++ app/chat-gpt/client/css/stop-generating.css | 38 + app/chat-gpt/client/css/style.css | 18 + app/chat-gpt/client/css/typing.css | 15 + app/chat-gpt/client/html/index.html | 135 +++ .../client/img/android-chrome-192x192.png | Bin 0 -> 9473 bytes .../client/img/android-chrome-512x512.png | Bin 0 -> 35427 bytes app/chat-gpt/client/img/apple-touch-icon.png | Bin 0 -> 8850 bytes app/chat-gpt/client/img/favicon-16x16.png | Bin 0 -> 536 bytes app/chat-gpt/client/img/favicon-32x32.png | Bin 0 -> 1227 bytes app/chat-gpt/client/img/favicon.ico | Bin 0 -> 9662 bytes app/chat-gpt/client/img/gpt.png | Bin 0 -> 2040 bytes app/chat-gpt/client/img/site.webmanifest | 19 + app/chat-gpt/client/img/user.png | Bin 0 -> 1081 bytes app/chat-gpt/client/js/change-language.js | 47 + app/chat-gpt/client/js/chat.js | 508 ++++++++++ app/chat-gpt/client/js/highlight.min.js | 1 + .../client/js/highlightjs-copy.min.js | 1 + app/chat-gpt/client/js/icons.js | 1 + app/chat-gpt/client/js/sidebar-toggler.js | 34 + app/chat-gpt/client/js/theme-toggler.js | 22 + app/chat-gpt/config.json | 8 + app/chat-gpt/docker-compose.yml | 38 + app/chat-gpt/g4f/Provider/Provider.py | 20 + .../g4f/Provider/Providers/AiService.py | 42 + app/chat-gpt/g4f/Provider/Providers/Aichat.py | 47 + app/chat-gpt/g4f/Provider/Providers/Ails.py | 96 ++ app/chat-gpt/g4f/Provider/Providers/Bard.py | 88 ++ app/chat-gpt/g4f/Provider/Providers/Better.py | 64 ++ app/chat-gpt/g4f/Provider/Providers/Bing.py | 356 +++++++ .../g4f/Provider/Providers/ChatFree.py | 59 ++ .../g4f/Provider/Providers/ChatgptAi.py | 61 ++ .../g4f/Provider/Providers/ChatgptLogin.py | 114 +++ app/chat-gpt/g4f/Provider/Providers/DeepAi.py | 49 + .../g4f/Provider/Providers/Easychat.py | 67 ++ app/chat-gpt/g4f/Provider/Providers/Ezcht.py | 47 + .../g4f/Provider/Providers/Fakeopen.py | 59 ++ .../g4f/Provider/Providers/Forefront.py | 42 + app/chat-gpt/g4f/Provider/Providers/GetGpt.py | 69 ++ .../g4f/Provider/Providers/Gravityengine.py | 33 + app/chat-gpt/g4f/Provider/Providers/H2o.py | 115 +++ .../g4f/Provider/Providers/Liaobots.py | 61 ++ .../g4f/Provider/Providers/Lockchat.py | 51 + .../g4f/Provider/Providers/Mishalsgpt.py | 27 + app/chat-gpt/g4f/Provider/Providers/Phind.py | 38 + app/chat-gpt/g4f/Provider/Providers/Theb.py | 30 + app/chat-gpt/g4f/Provider/Providers/Vercel.py | 515 ++++++++++ .../g4f/Provider/Providers/Weuseing.py | 40 + .../g4f/Provider/Providers/Wewordle.py | 73 ++ app/chat-gpt/g4f/Provider/Providers/Xiaor.py | 47 + app/chat-gpt/g4f/Provider/Providers/You.py | 20 + .../g4f/Provider/Providers/Yqcloud.py | 46 + app/chat-gpt/g4f/Provider/Providers/Zeabur.py | 64 ++ .../g4f/Provider/Providers/__init__.py | 0 .../Provider/Providers/helpers/__init__.py | 0 .../Provider/Providers/helpers/gpt4love.py | 53 ++ .../g4f/Provider/Providers/helpers/phind.py | 81 ++ .../g4f/Provider/Providers/helpers/theb.py | 53 ++ .../g4f/Provider/Providers/helpers/you.py | 82 ++ app/chat-gpt/g4f/Provider/Providers/hteyun.py | 45 + app/chat-gpt/g4f/Provider/__init__.py | 35 + app/chat-gpt/g4f/README.md | 5 + app/chat-gpt/g4f/__init__.py | 57 ++ app/chat-gpt/g4f/active_providers.py | 128 +++ app/chat-gpt/g4f/models.py | 223 +++++ app/chat-gpt/g4f/typing.py | 3 + app/chat-gpt/g4f/utils.py | 49 + app/chat-gpt/get_working_providers.py | 7 + app/chat-gpt/run.py | 47 + app/chat-gpt/server/__init__.py | 0 app/chat-gpt/server/babel.py | 47 + app/chat-gpt/server/backend.py | 178 ++++ app/chat-gpt/server/bp.py | 9 + app/chat-gpt/server/config.py | 23 + app/chat-gpt/server/website.py | 51 + app/chat-gpt/translations/README.md | 67 ++ .../ar_SA/LC_MESSAGES/messages.po | 75 ++ .../cs_CZ/LC_MESSAGES/messages.po | 74 ++ .../da_DK/LC_MESSAGES/messages.po | 74 ++ .../de_DE/LC_MESSAGES/messages.po | 74 ++ .../el_GR/LC_MESSAGES/messages.po | 74 ++ .../en_US/LC_MESSAGES/messages.po | 74 ++ .../es_ES/LC_MESSAGES/messages.po | 74 ++ .../es_MX/LC_MESSAGES/messages.po | 74 ++ .../fi_FI/LC_MESSAGES/messages.po | 74 ++ .../fr_FR/LC_MESSAGES/messages.po | 74 ++ .../he_IL/LC_MESSAGES/messages.po | 74 ++ .../hi_IN/LC_MESSAGES/messages.po | 74 ++ .../hu_HU/LC_MESSAGES/messages.po | 74 ++ .../id_ID/LC_MESSAGES/messages.po | 74 ++ .../it_IT/LC_MESSAGES/messages.po | 74 ++ .../ja_JP/LC_MESSAGES/messages.po | 74 ++ .../ko_KR/LC_MESSAGES/messages.po | 74 ++ .../nb_NO/LC_MESSAGES/messages.po | 74 ++ .../nl_NL/LC_MESSAGES/messages.po | 74 ++ .../pl_PL/LC_MESSAGES/messages.po | 75 ++ .../pt_BR/LC_MESSAGES/messages.po | 73 ++ .../ro_RO/LC_MESSAGES/messages.po | 75 ++ .../ru_RU/LC_MESSAGES/messages.po | 75 ++ .../sk_SK/LC_MESSAGES/messages.po | 74 ++ .../sv_SE/LC_MESSAGES/messages.po | 74 ++ .../th_TH/LC_MESSAGES/messages.po | 74 ++ .../tr_TR/LC_MESSAGES/messages.po | 74 ++ .../uk_UA/LC_MESSAGES/messages.po | 75 ++ .../vi_VN/LC_MESSAGES/messages.po | 74 ++ .../zh_Hans_CN/LC_MESSAGES/messages.po | 74 ++ .../zh_Hant_TW/LC_MESSAGES/messages.po | 74 ++ app/constants.py | 2 +- app/core/bot.py | 15 +- app/main.py | 28 +- app/routers.py | 2 +- deploy/Dockerfile | 4 +- docker-compose.yml | 19 +- poetry.lock | 887 ++++++++---------- pyproject.toml | 82 +- settings/.env.template | 2 +- settings/config.py | 20 +- setup.cfg | 54 -- tests/integration/factories/bot.py | 51 + tests/integration/factories/models.py | 18 + 144 files changed, 8545 insertions(+), 595 deletions(-) create mode 100644 app/chat-gpt/.github/workflows/docker-build-push.yml create mode 100644 app/chat-gpt/.github/workflows/sync-hugging.yml create mode 100644 app/chat-gpt/Caddyfile create mode 100644 app/chat-gpt/Dockerfile create mode 100644 app/chat-gpt/README.md create mode 100644 app/chat-gpt/__init__.py create mode 100644 app/chat-gpt/babel.cfg create mode 100644 app/chat-gpt/client/css/button.css create mode 100644 app/chat-gpt/client/css/buttons.css create mode 100644 app/chat-gpt/client/css/checkbox.css create mode 100644 app/chat-gpt/client/css/conversation.css create mode 100644 app/chat-gpt/client/css/dropdown.css create mode 100644 app/chat-gpt/client/css/field.css create mode 100644 app/chat-gpt/client/css/global.css create mode 100644 app/chat-gpt/client/css/hljs.css create mode 100644 app/chat-gpt/client/css/label.css create mode 100644 app/chat-gpt/client/css/main.css create mode 100644 app/chat-gpt/client/css/message-input.css create mode 100644 app/chat-gpt/client/css/message.css create mode 100644 app/chat-gpt/client/css/options.css create mode 100644 app/chat-gpt/client/css/select.css create mode 100644 app/chat-gpt/client/css/settings.css create mode 100644 app/chat-gpt/client/css/sidebar.css create mode 100644 app/chat-gpt/client/css/stop-generating.css create mode 100644 app/chat-gpt/client/css/style.css create mode 100644 app/chat-gpt/client/css/typing.css create mode 100644 app/chat-gpt/client/html/index.html create mode 100644 app/chat-gpt/client/img/android-chrome-192x192.png create mode 100644 app/chat-gpt/client/img/android-chrome-512x512.png create mode 100644 app/chat-gpt/client/img/apple-touch-icon.png create mode 100644 app/chat-gpt/client/img/favicon-16x16.png create mode 100644 app/chat-gpt/client/img/favicon-32x32.png create mode 100644 app/chat-gpt/client/img/favicon.ico create mode 100644 app/chat-gpt/client/img/gpt.png create mode 100644 app/chat-gpt/client/img/site.webmanifest create mode 100644 app/chat-gpt/client/img/user.png create mode 100644 app/chat-gpt/client/js/change-language.js create mode 100644 app/chat-gpt/client/js/chat.js create mode 100644 app/chat-gpt/client/js/highlight.min.js create mode 100644 app/chat-gpt/client/js/highlightjs-copy.min.js create mode 100644 app/chat-gpt/client/js/icons.js create mode 100644 app/chat-gpt/client/js/sidebar-toggler.js create mode 100644 app/chat-gpt/client/js/theme-toggler.js create mode 100644 app/chat-gpt/config.json create mode 100644 app/chat-gpt/docker-compose.yml create mode 100644 app/chat-gpt/g4f/Provider/Provider.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/AiService.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Aichat.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Ails.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Bard.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Better.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Bing.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/ChatFree.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/DeepAi.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Easychat.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Ezcht.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Fakeopen.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Forefront.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/GetGpt.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Gravityengine.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/H2o.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Liaobots.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Lockchat.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Mishalsgpt.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Phind.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Theb.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Vercel.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Weuseing.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Wewordle.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Xiaor.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/You.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Yqcloud.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/Zeabur.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/__init__.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/helpers/__init__.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/helpers/gpt4love.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/helpers/phind.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/helpers/theb.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/helpers/you.py create mode 100644 app/chat-gpt/g4f/Provider/Providers/hteyun.py create mode 100644 app/chat-gpt/g4f/Provider/__init__.py create mode 100644 app/chat-gpt/g4f/README.md create mode 100644 app/chat-gpt/g4f/__init__.py create mode 100644 app/chat-gpt/g4f/active_providers.py create mode 100644 app/chat-gpt/g4f/models.py create mode 100644 app/chat-gpt/g4f/typing.py create mode 100644 app/chat-gpt/g4f/utils.py create mode 100644 app/chat-gpt/get_working_providers.py create mode 100644 app/chat-gpt/run.py create mode 100644 app/chat-gpt/server/__init__.py create mode 100644 app/chat-gpt/server/babel.py create mode 100644 app/chat-gpt/server/backend.py create mode 100644 app/chat-gpt/server/bp.py create mode 100644 app/chat-gpt/server/config.py create mode 100644 app/chat-gpt/server/website.py create mode 100644 app/chat-gpt/translations/README.md create mode 100644 app/chat-gpt/translations/ar_SA/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/cs_CZ/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/da_DK/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/de_DE/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/el_GR/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/en_US/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/es_ES/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/es_MX/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/fi_FI/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/fr_FR/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/he_IL/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/hi_IN/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/hu_HU/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/id_ID/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/it_IT/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/ja_JP/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/ko_KR/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/nb_NO/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/nl_NL/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/pl_PL/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/pt_BR/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/ro_RO/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/ru_RU/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/sk_SK/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/sv_SE/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/th_TH/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/tr_TR/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/uk_UA/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/vi_VN/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/zh_Hans_CN/LC_MESSAGES/messages.po create mode 100644 app/chat-gpt/translations/zh_Hant_TW/LC_MESSAGES/messages.po delete mode 100644 setup.cfg create mode 100644 tests/integration/factories/bot.py create mode 100644 tests/integration/factories/models.py diff --git a/Makefile b/Makefile index f3f767d..74922ed 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ PORT=8000 ## Запустить приложение app: - poetry run uvicorn --host 0.0.0.0 --factory app.main:create_app --port $(PORT) --reload + poetry run uvicorn --host 0.0.0.0 --factory app.main:create_app --port $(PORT) --reload --reload-dir=app --reload-dir=settings ## Отформатировать код format: diff --git a/app/api/system/controllers.py b/app/api/system/controllers.py index 676d687..2e705b2 100644 --- a/app/api/system/controllers.py +++ b/app/api/system/controllers.py @@ -5,6 +5,7 @@ from starlette import status from settings.config import get_settings router = APIRouter() +settings = get_settings() @router.get( @@ -18,13 +19,11 @@ async def healthcheck() -> ORJSONResponse: @router.post( - f"/{get_settings().bot_webhook_url}", + f"/{settings.bot_webhook_url}", name="system:process_bot_updates", status_code=status.HTTP_202_ACCEPTED, summary="process bot updates", ) async def process_bot_updates(request: Request) -> ORJSONResponse: await request.app.state.queue.put_updates_on_queue(request) - data = await request.app.state.queue.get_updates_from_queue() - print(data) return ORJSONResponse(content=None, status_code=status.HTTP_202_ACCEPTED) diff --git a/app/chat-gpt/.github/workflows/docker-build-push.yml b/app/chat-gpt/.github/workflows/docker-build-push.yml new file mode 100644 index 0000000..8c62399 --- /dev/null +++ b/app/chat-gpt/.github/workflows/docker-build-push.yml @@ -0,0 +1,33 @@ +name: Docker Build and Push +on: + push: + branches: + - main +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up QEMU - Support for more platforms + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: . + file: Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/freegpt-webui:latest diff --git a/app/chat-gpt/.github/workflows/sync-hugging.yml b/app/chat-gpt/.github/workflows/sync-hugging.yml new file mode 100644 index 0000000..63967cc --- /dev/null +++ b/app/chat-gpt/.github/workflows/sync-hugging.yml @@ -0,0 +1,19 @@ +name: Sync with Hugging Face Hub + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Sync with Hugging Face + uses: ramonvc/huggingface-sync-action@v0.0.1 + with: + github_repo_id: ramonvc/freegpt-webui + huggingface_repo_id: monra/freegpt-webui + repo_type: space + space_sdk: docker + hf_token: ${{ secrets.HF_TOKEN }} \ No newline at end of file diff --git a/app/chat-gpt/Caddyfile b/app/chat-gpt/Caddyfile new file mode 100644 index 0000000..f337821 --- /dev/null +++ b/app/chat-gpt/Caddyfile @@ -0,0 +1,11 @@ +:8080 { + + # Serving dynamic requests: + reverse_proxy chat_gpt:1338 + + # Logs: + log { + output stdout + } + +} diff --git a/app/chat-gpt/Dockerfile b/app/chat-gpt/Dockerfile new file mode 100644 index 0000000..2b931be --- /dev/null +++ b/app/chat-gpt/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.11-slim + +WORKDIR /app + +COPY requirements.txt requirements.txt + +RUN python -m venv venv +ENV PATH="/app/venv/bin:$PATH" + +RUN apt-get update \ + && apt-get install -y --no-install-recommends build-essential libffi-dev cmake libcurl4-openssl-dev \ + && pip install --upgrade pip && pip3 install --no-cache-dir -r requirements.txt + +COPY . . + +RUN chmod -R 777 translations + +CMD ["python3", "./run.py"] diff --git a/app/chat-gpt/README.md b/app/chat-gpt/README.md new file mode 100644 index 0000000..600e25a --- /dev/null +++ b/app/chat-gpt/README.md @@ -0,0 +1,190 @@ +# FreeGPT WebUI + +## Build +```bash +docker build -t balsh_chat_gpt --network=host . +``` + + +## GPT 3.5/4 + +NOT REQUIRE ANY API KEY ❌🔑 + +This project features a WebUI utilizing the [G4F API](https://github.com/xtekky/gpt4free).
+Experience the power of ChatGPT with a user-friendly interface, enhanced jailbreaks, and completely free. + +## Known bugs 🚧 +- Stream mode not working properly. + +## News 📢 +I have created a new version of FreeGPT WebUI using the [ChimeraGPT API](https://chimeragpt.adventblocks.cc/). +
+
+This free API allows you to use various AI chat models, including GPT-4, GPT-4-32k, llama-2 and more.
+Check out the project here: [FreeGPT WebUI - Chimera Version](https://github.com/ramonvc/freegpt-webui/tree/chimeragpt-version). + +## Project Hosting and Demonstration 🌐🚀 +The project is hosted on multiple platforms to be tested and modified. +|Platform|Status|API Key|Free|Repo|Demo| +|--|--|--|--|--|--| +|[replit](https://replit.com/)|![Active](https://img.shields.io/badge/Active-brightgreen)|◼️|☑️|[FreeGPT WebUI](https://replit.com/@ramonvc/freegpt-webui)|[Chat](https://freegpt-webui.ramonvc.repl.co/chat/) +|[hugging face](https://huggingface.co)|![Active](https://img.shields.io/badge/Active-brightgreen)|◼️|☑️|[FreeGPT WebUI](https://huggingface.co/spaces/monra/freegpt-webui/tree/main)|[Chat](https://huggingface.co/spaces/monra/freegpt-webui) +|[replit](https://replit.com/)|![Active](https://img.shields.io/badge/Active-brightgreen)|☑️|☑️|[FreeGPT WebUI - Chimera Version](https://replit.com/@ramonvc/freegpt-webui-chimera)|[Chat](https://freegpt-webui-chimera.ramonvc.repl.co/chat/) +|[hugging face](https://huggingface.co)|![Active](https://img.shields.io/badge/Active-brightgreen)|☑️|☑️|[FreeGPT WebUI - Chimera Version](https://huggingface.co/spaces/monra/freegpt-webui-chimera/tree/main)|[Chat](https://huggingface.co/spaces/monra/freegpt-webui-chimera) + +## Note ℹ️ +

+ FreeGPT is a project that utilizes various free AI conversation API Providers. Each Provider is an API that provides responses generated by different AI models. The source code related to these services is available in G4F folder. + +It is important to note that, due to the extensive reach of this project, the free services registered here may receive a significant number of requests, which can result in temporary unavailability or access limitations. Therefore, it is common to encounter these services being offline or unstable. + +We recommend that you search for your own Providers and add them to your personal projects to avoid service instability and unavailability. Within the project, in the Providers folder, you will find several examples of Providers that have worked in the past or are still functioning. It is easy to follow the logic of these examples to find free GPT services and incorporate the requests into your specific FreeGPT project. + +Please note that the choice and integration of additional Providers are the user's responsibility and are not directly related to the FreeGPT project, as the project serves as an example of how to combine the G4F API with a web interface. +

+ +## Table of Contents +- [To-Do List](#to-do-list-%EF%B8%8F) +- [Getting Started](#getting-started-white_check_mark) + - [Cloning the Repository](#cloning-the-repository-inbox_tray) + - [Install Dependencies](#install-dependencies-wrench) +- [Running the Application](#running-the-application-rocket) +- [Docker](#docker-) + - [Prerequisites](#prerequisites) + - [Running the Docker](#running-the-docker) +- [Incorporated Projects](#incorporated-projects-busts_in_silhouette) + - [WebUI](#webui) + - [API FreeGPT](#api-g4f) +- [Star History](#star-history) +- [Legal Notice](#legal-notice) + +## + +## To-Do List ✔️ + +- [x] Integrate the free GPT API into the WebUI +- [x] Create Docker support +- [x] Improve the Jailbreak functionality +- [x] Add the GPT-4 model +- [x] Enhance the user interface +- [ ] Check status of API Providers (online/offline) +- [ ] Enable editing and creating Jailbreaks/Roles in the WebUI +- [ ] Refactor web client + +## Getting Started :white_check_mark: +To get started with this project, you'll need to clone the repository and have [Python](https://www.python.org/downloads/) installed on your system. + +### Cloning the Repository :inbox_tray: +Run the following command to clone the repository: + +``` +git clone https://github.com/ramonvc/freegpt-webui.git +``` + +### Install Dependencies :wrench: +Navigate to the project directory: +``` +cd freegpt-webui +``` + +Install the dependencies: +``` +pip install -r requirements.txt +``` +## Running the Application :rocket: +To run the application, run the following command: +``` +python run.py +``` + +Access the application in your browser using the URL: +``` +http://127.0.0.1:1338 +``` +or +``` +http://localhost:1338 +``` + + +## Docker 🐳 +### Prerequisites +Before you start, make sure you have installed [Docker](https://www.docker.com/get-started) on your machine. + +### Running the Docker +Pull the Docker image from Docker Hub: +``` +docker pull ramonvc/freegpt-webui +``` + +Run the application using Docker: +``` +docker run -p 1338:1338 ramonvc/freegpt-webui +``` + +Access the application in your browser using the URL: +``` +http://127.0.0.1:1338 +``` +or +``` +http://localhost:1338 +``` + +When you're done using the application, stop the Docker containers using the following command: +``` +docker stop +``` + +## Incorporated Projects :busts_in_silhouette: +I highly recommend visiting and supporting both projects. + +### WebUI +The application interface was incorporated from the [chatgpt-clone](https://github.com/xtekky/chatgpt-clone) repository. + +### API G4F +The free GPT-4 API was incorporated from the [GPT4Free](https://github.com/xtekky/gpt4free) repository. + +
+ +## Star History +[![Star History Chart](https://api.star-history.com/svg?repos=ramonvc/freegpt-webui&type=Timeline)](https://star-history.com/#ramonvc/freegpt-webui&Timeline) + +
+ +## Legal Notice +This repository is _not_ associated with or endorsed by providers of the APIs contained in this GitHub repository. This +project is intended **for educational purposes only**. This is just a little personal project. Sites may contact me to +improve their security or request the removal of their site from this repository. + +Please note the following: + +1. **Disclaimer**: The APIs, services, and trademarks mentioned in this repository belong to their respective owners. + This project is _not_ claiming any right over them nor is it affiliated with or endorsed by any of the providers + mentioned. + +2. **Responsibility**: The author of this repository is _not_ responsible for any consequences, damages, or losses + arising from the use or misuse of this repository or the content provided by the third-party APIs. Users are solely + responsible for their actions and any repercussions that may follow. We strongly recommend the users to follow the + TOS of the each Website. + +3. **Educational Purposes Only**: This repository and its content are provided strictly for educational purposes. By + using the information and code provided, users acknowledge that they are using the APIs and models at their own risk + and agree to comply with any applicable laws and regulations. + +4. **Copyright**: All content in this repository, including but not limited to code, images, and documentation, is the + intellectual property of the repository author, unless otherwise stated. Unauthorized copying, distribution, or use + of any content in this repository is strictly prohibited without the express written consent of the repository + author. + +5. **Indemnification**: Users agree to indemnify, defend, and hold harmless the author of this repository from and + against any and all claims, liabilities, damages, losses, or expenses, including legal fees and costs, arising out of + or in any way connected with their use or misuse of this repository, its content, or related third-party APIs. + +6. **Updates and Changes**: The author reserves the right to modify, update, or remove any content, information, or + features in this repository at any time without prior notice. Users are responsible for regularly reviewing the + content and any changes made to this repository. + +By using this repository or any code related to it, you agree to these terms. The author is not responsible for any +copies, forks, or reuploads made by other users. This is the author's only account and repository. To prevent +impersonation or irresponsible actions, you may comply with the GNU GPL license this Repository uses. diff --git a/app/chat-gpt/__init__.py b/app/chat-gpt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/chat-gpt/babel.cfg b/app/chat-gpt/babel.cfg new file mode 100644 index 0000000..9d1bdfa --- /dev/null +++ b/app/chat-gpt/babel.cfg @@ -0,0 +1,2 @@ +[python: **/server/.py] +[jinja2: **/client/html/**.html] diff --git a/app/chat-gpt/client/css/button.css b/app/chat-gpt/client/css/button.css new file mode 100644 index 0000000..5f604a8 --- /dev/null +++ b/app/chat-gpt/client/css/button.css @@ -0,0 +1,26 @@ +.button { + display: flex; + padding: 8px 12px; + align-items: center; + justify-content: center; + border: 1px solid var(--conversations); + border-radius: var(--border-radius-1); + width: 100%; + background: transparent; + cursor: pointer; +} + +.button span { + color: var(--colour-3); + font-size: 0.875rem; +} + +.button i::before { + margin-right: 8px; +} + +@media screen and (max-width: 990px) { + .button span { + font-size: 0.75rem; + } +} diff --git a/app/chat-gpt/client/css/buttons.css b/app/chat-gpt/client/css/buttons.css new file mode 100644 index 0000000..e13f52d --- /dev/null +++ b/app/chat-gpt/client/css/buttons.css @@ -0,0 +1,4 @@ +.buttons { + display: flex; + justify-content: left; +} diff --git a/app/chat-gpt/client/css/checkbox.css b/app/chat-gpt/client/css/checkbox.css new file mode 100644 index 0000000..94955b6 --- /dev/null +++ b/app/chat-gpt/client/css/checkbox.css @@ -0,0 +1,55 @@ +.checkbox input { + height: 0; + width: 0; + display: none; +} + +.checkbox span { + font-size: 0.875rem; + color: var(--colour-2); + margin-left: 4px; +} + +.checkbox label:after { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 5px; + width: 20px; + height: 20px; + background: var(--blur-border); + border-radius: 90px; + transition: 0.33s; +} + +.checkbox input + label:after, +.checkbox input:checked + label { + background: var(--colour-3); +} + +.checkbox input + label, +.checkbox input:checked + label:after { + background: var(--blur-border); +} + +.checkbox input:checked + label:after { + left: calc(100% - 5px - 20px); +} + +@media screen and (max-width: 990px) { + .checkbox label { + width: 25px; + height: 15px; + } + + .checkbox label:after { + left: 2px; + width: 10px; + height: 10px; + } + + .checkbox input:checked + label:after { + left: calc(100% - 2px - 10px); + } +} diff --git a/app/chat-gpt/client/css/conversation.css b/app/chat-gpt/client/css/conversation.css new file mode 100644 index 0000000..d20f178 --- /dev/null +++ b/app/chat-gpt/client/css/conversation.css @@ -0,0 +1,158 @@ +.conversation { + width: 60%; + margin: 0px 16px; + display: flex; + flex-direction: column; +} + +.conversation #messages { + width: 100%; + display: flex; + flex-direction: column; + overflow: auto; + overflow-wrap: break-word; + padding-bottom: 8px; +} + +.conversation .user-input { + max-height: 180px; + margin: 16px 0px; +} + +.conversation .user-input input { + font-size: 1rem; + background: none; + border: none; + outline: none; + color: var(--colour-3); +} + +.conversation .user-input input::placeholder { + color: var(--user-input); +} + +.conversation-title { + color: var(--colour-3); + font-size: 14px; +} + +.conversation .user-input textarea { + font-size: 1rem; + width: 100%; + height: 100%; + padding: 12px; + background: none; + border: none; + outline: none; + color: var(--colour-3); + resize: vertical; + max-height: 150px; + min-height: 80px; +} + +.box { + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + background-color: var(--blur-bg); + height: 100%; + width: 100%; + border-radius: var(--border-radius-1); + border: 1px solid var(--blur-border); +} + +.box.input-box { + position: relative; + align-items: center; + padding: 8px; + cursor: pointer; +} + +#send-button { + position: absolute; + bottom: 25%; + right: 10px; + z-index: 1; + padding: 16px; +} + +#cursor { + line-height: 17px; + margin-left: 3px; + -webkit-animation: blink 0.8s infinite; + animation: blink 0.8s infinite; + width: 7px; + height: 15px; +} + +@keyframes blink { + 0% { + background: #ffffff00; + } + + 50% { + background: white; + } + + 100% { + background: #ffffff00; + } +} + +@-webkit-keyframes blink { + 0% { + background: #ffffff00; + } + + 50% { + background: white; + } + + 100% { + background: #ffffff00; + } +} + +/* scrollbar */ +.conversation #messages::-webkit-scrollbar { + width: 4px; + padding: 8px 0px; +} + +.conversation #messages::-webkit-scrollbar-track { + background-color: #ffffff00; +} + +.conversation #messages::-webkit-scrollbar-thumb { + background-color: #555555; + border-radius: 10px; +} + +@media screen and (max-width: 990px) { + .conversation { + width: 100%; + height: 90%; + } +} + +@media screen and (max-height: 720px) { + .conversation.box { + height: 70%; + } + + .conversation .user-input textarea { + font-size: 0.875rem; + } +} + +@media screen and (max-width: 360px) { + .box { + border-radius: 0; + } + .conversation { + margin: 0; + margin-top: 48px; + } + .conversation .user-input { + margin: 2px 0 8px 0; + } +} diff --git a/app/chat-gpt/client/css/dropdown.css b/app/chat-gpt/client/css/dropdown.css new file mode 100644 index 0000000..302e911 --- /dev/null +++ b/app/chat-gpt/client/css/dropdown.css @@ -0,0 +1,10 @@ +.dropdown { + border: 1px solid var(--conversations); +} + +@media screen and (max-width: 990px) { + .dropdown { + padding: 4px 8px; + font-size: 0.75rem; + } +} diff --git a/app/chat-gpt/client/css/field.css b/app/chat-gpt/client/css/field.css new file mode 100644 index 0000000..914425a --- /dev/null +++ b/app/chat-gpt/client/css/field.css @@ -0,0 +1,11 @@ +.field { + display: flex; + align-items: center; + padding: 4px; +} + +@media screen and (max-width: 990px) { + .field { + flex-wrap: nowrap; + } +} diff --git a/app/chat-gpt/client/css/global.css b/app/chat-gpt/client/css/global.css new file mode 100644 index 0000000..8de755e --- /dev/null +++ b/app/chat-gpt/client/css/global.css @@ -0,0 +1,70 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); +* { + --font-1: "Inter", sans-serif; + --section-gap: 24px; + --border-radius-1: 8px; + margin: 0; + padding: 0; + box-sizing: border-box; + position: relative; + font-family: var(--font-1); +} + +.theme-light { + --colour-1: #f5f5f5; + --colour-2: #000000; + --colour-3: #474747; + --colour-4: #949494; + --colour-5: #ebebeb; + --colour-6: #dadada; + + --accent: #3a3a3a; + --blur-bg: #ffffff; + --blur-border: #dbdbdb; + --user-input: #282828; + --conversations: #666666; +} + +.theme-dark { + --colour-1: #181818; + --colour-2: #ccc; + --colour-3: #dadada; + --colour-4: #f0f0f0; + --colour-5: #181818; + --colour-6: #242424; + + --accent: #151718; + --blur-bg: #242627; + --blur-border: #242627; + --user-input: #f5f5f5; + --conversations: #555555; +} + +html, +body { + background: var(--colour-1); + color: var(--colour-3); +} + +ol, +ul { + padding-left: 20px; +} + +.shown { + display: flex !important; +} + +a:-webkit-any-link { + color: var(--accent); +} + +pre { + white-space: pre-wrap; +} + +@media screen and (max-height: 720px) { + :root { + --section-gap: 16px; + } +} diff --git a/app/chat-gpt/client/css/hljs.css b/app/chat-gpt/client/css/hljs.css new file mode 100644 index 0000000..1fcf16b --- /dev/null +++ b/app/chat-gpt/client/css/hljs.css @@ -0,0 +1,68 @@ +.hljs { + color: #e9e9f4; + background: #28293629; + border-radius: var(--border-radius-1); + border: 1px solid var(--blur-border); + font-size: 15px; + word-wrap: break-word; + white-space: pre-wrap; +} + +/* style for hljs copy */ +.hljs-copy-wrapper { + position: relative; + overflow: hidden; +} + +.hljs-copy-wrapper:hover .hljs-copy-button, +.hljs-copy-button:focus { + transform: translateX(0); +} + +.hljs-copy-button { + position: absolute; + transform: translateX(calc(100% + 1.125em)); + top: 1em; + right: 1em; + width: 2rem; + height: 2rem; + text-indent: -9999px; + color: #fff; + border-radius: 0.25rem; + border: 1px solid #ffffff22; + background-color: #2d2b57; + background-image: url('data:image/svg+xml;utf-8,'); + background-repeat: no-repeat; + background-position: center; + transition: background-color 200ms ease, transform 200ms ease-out; +} + +.hljs-copy-button:hover { + border-color: #ffffff44; +} + +.hljs-copy-button:active { + border-color: #ffffff66; +} + +.hljs-copy-button[data-copied="true"] { + text-indent: 0; + width: auto; + background-image: none; +} + +.hljs-copy-alert { + clip: rect(0 0 0 0); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + position: absolute; + white-space: nowrap; + width: 1px; +} + +@media (prefers-reduced-motion) { + .hljs-copy-button { + transition: none; + } +} diff --git a/app/chat-gpt/client/css/label.css b/app/chat-gpt/client/css/label.css new file mode 100644 index 0000000..d84873d --- /dev/null +++ b/app/chat-gpt/client/css/label.css @@ -0,0 +1,16 @@ +label { + cursor: pointer; + text-indent: -9999px; + width: 50px; + height: 30px; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + background-color: var(--blur-bg); + border-radius: var(--border-radius-1); + border: 1px solid var(--blur-border); + display: block; + border-radius: 100px; + position: relative; + overflow: hidden; + transition: 0.33s; +} diff --git a/app/chat-gpt/client/css/main.css b/app/chat-gpt/client/css/main.css new file mode 100644 index 0000000..ec1f1dd --- /dev/null +++ b/app/chat-gpt/client/css/main.css @@ -0,0 +1,14 @@ +.main-container { + display: flex; + padding: var(--section-gap); + height: 100vh; + justify-content: center; + box-sizing: border-box; +} + +@media screen and (max-width: 360px) { + .main-container { + padding: 0px; + height: 90vh; + } +} \ No newline at end of file diff --git a/app/chat-gpt/client/css/message-input.css b/app/chat-gpt/client/css/message-input.css new file mode 100644 index 0000000..de5f583 --- /dev/null +++ b/app/chat-gpt/client/css/message-input.css @@ -0,0 +1,27 @@ +#message-input { + margin-right: 30px; + height: 64px; +} + +#message-input::-webkit-scrollbar { + width: 5px; +} + +#message-input::-webkit-scrollbar-track { + background: #f1f1f1; +} + +#message-input::-webkit-scrollbar-thumb { + background: #c7a2ff; +} + +#message-input::-webkit-scrollbar-thumb:hover { + background: #8b3dff; +} + +@media screen and (max-width: 360px) { + #message-input { + margin: 0; + } +} + diff --git a/app/chat-gpt/client/css/message.css b/app/chat-gpt/client/css/message.css new file mode 100644 index 0000000..64e0414 --- /dev/null +++ b/app/chat-gpt/client/css/message.css @@ -0,0 +1,65 @@ +.message { + width: 100%; + overflow-wrap: break-word; + display: flex; + gap: var(--section-gap); + padding: var(--section-gap); + padding-bottom: 0; +} + +.message:last-child { + animation: 0.6s show_message; +} + +@keyframes show_message { + from { + transform: translateY(10px); + opacity: 0; + } +} + +.message .avatar-container img { + max-width: 48px; + max-height: 48px; + box-shadow: 0.4px 0.5px 0.7px -2px rgba(0, 0, 0, 0.08), 1.1px 1.3px 2px -2px rgba(0, 0, 0, 0.041), + 2.7px 3px 4.8px -2px rgba(0, 0, 0, 0.029), 9px 10px 16px -2px rgba(0, 0, 0, 0.022); +} + +.message .content { + display: flex; + flex-direction: column; + width: 90%; + gap: 18px; +} + +.message .content p, +.message .content li, +.message .content code { + font-size: 1rem; + line-height: 1.3; +} + +@media screen and (max-height: 720px) { + .message { + padding: 12px; + gap: 0; + } + + .message .content { + margin-left: 8px; + width: 80%; + } + + .message .avatar-container img { + max-width: 32px; + max-height: 32px; + } + + .message .content, + .message .content p, + .message .content li, + .message .content code { + font-size: 0.875rem; + line-height: 1.3; + } +} diff --git a/app/chat-gpt/client/css/options.css b/app/chat-gpt/client/css/options.css new file mode 100644 index 0000000..fb015a5 --- /dev/null +++ b/app/chat-gpt/client/css/options.css @@ -0,0 +1,10 @@ +.options-container { + display: flex; + flex-wrap: wrap; +} + +@media screen and (max-width: 990px) { + .options-container { + justify-content: space-between; + } +} diff --git a/app/chat-gpt/client/css/select.css b/app/chat-gpt/client/css/select.css new file mode 100644 index 0000000..7ec0159 --- /dev/null +++ b/app/chat-gpt/client/css/select.css @@ -0,0 +1,35 @@ +select { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + + -webkit-backdrop-filter: blur(20px); + backdrop-filter: blur(20px); + + cursor: pointer; + background-color: var(--blur-bg); + border: 1px solid var(--blur-border); + color: var(--colour-3); + display: block; + position: relative; + overflow: hidden; + outline: none; + padding: 8px 16px; + + appearance: none; +} + +/* scrollbar */ +select.dropdown::-webkit-scrollbar { + width: 4px; + padding: 8px 0px; +} + +select.dropdown::-webkit-scrollbar-track { + background-color: #ffffff00; +} + +select.dropdown::-webkit-scrollbar-thumb { + background-color: #555555; + border-radius: 10px; +} diff --git a/app/chat-gpt/client/css/settings.css b/app/chat-gpt/client/css/settings.css new file mode 100644 index 0000000..0a409f2 --- /dev/null +++ b/app/chat-gpt/client/css/settings.css @@ -0,0 +1,44 @@ +.settings-container { + color: var(--colour-2); + margin: 24px 0px 8px 0px; + justify-content: center; +} + +.settings-container span { + font-size: 0.875rem; + margin: 0; +} + +.settings-container label { + width: 24px; + height: 16px; +} + +.settings-container .field { + justify-content: space-between; +} + +.settings-container .checkbox input + label, +.settings-container .checkbox input:checked + label:after { + background: var(--colour-1); +} + +.settings-container .checkbox input + label:after, +.settings-container .checkbox input:checked + label { + background: var(--colour-3); +} + +.settings-container .checkbox label:after { + left: 2px; + width: 10px; + height: 10px; +} + +.settings-container .checkbox input:checked + label:after { + left: calc(100% - 2px - 10px); +} + +.settings-container .dropdown { + padding: 4px 8px; + font-size: 0.75rem; +} diff --git a/app/chat-gpt/client/css/sidebar.css b/app/chat-gpt/client/css/sidebar.css new file mode 100644 index 0000000..310887c --- /dev/null +++ b/app/chat-gpt/client/css/sidebar.css @@ -0,0 +1,197 @@ +.sidebar { + max-width: 260px; + padding: var(--section-gap); + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.sidebar .title { + font-size: 14px; + font-weight: 500; +} + +.sidebar .conversation-sidebar { + padding: 8px 12px; + display: flex; + gap: 18px; + align-items: center; + user-select: none; + justify-content: space-between; +} + +.sidebar .conversation-sidebar .left { + cursor: pointer; + display: flex; + align-items: center; + gap: 10px; +} + +.sidebar i { + color: var(--conversations); + cursor: pointer; +} + +.sidebar .top { + display: flex; + flex-direction: column; + overflow: hidden; + gap: 16px; + padding-right: 8px; +} + +.sidebar .top:hover { + overflow: auto; +} + +.sidebar .info { + padding: 8px 12px 0px 12px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + background: transparent; + width: 100%; + border: none; + text-decoration: none; +} + +.sidebar .info span { + color: var(--conversations); + line-height: 1.5; + font-size: 0.75rem; +} + +.sidebar .info i::before { + margin-right: 8px; +} + +.sidebar-footer { + width: 100%; + margin-top: 16px; + display: flex; + flex-direction: column; +} + +.sidebar-footer button { + cursor: pointer; + user-select: none; + background: transparent; +} + +.sidebar.shown { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; +} + +.sidebar.shown .box { + background-color: #16171a; + width: 80%; + height: 100%; + overflow-y: auto; +} + +@keyframes spinner { + to { + transform: rotate(360deg); + } +} + +/* scrollbar */ +.sidebar .top::-webkit-scrollbar { + width: 4px; + padding: 8px 0px; +} + +.sidebar .top::-webkit-scrollbar-track { + background-color: #ffffff00; +} + +.sidebar .top::-webkit-scrollbar-thumb { + background-color: #555555; + border-radius: 10px; +} + +.spinner:before { + content: ""; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 45%; + width: 20px; + height: 20px; + border-radius: 50%; + border: 1px solid var(--conversations); + border-top-color: white; + animation: spinner 0.6s linear infinite; +} + +.menu-button { + display: none !important; + position: absolute; + z-index: 100000; + top: 0; + left: 0; + margin: 10px; + font-size: 1rem; + cursor: pointer; + width: 30px; + height: 30px; + justify-content: center; + align-items: center; + transition: 0.33s; +} + +.menu-button i { + transition: 0.33s; +} + +.rotated { + transform: rotate(360deg); +} + +.menu-button.rotated { + position: fixed; + top: 10px; + left: 10px; + z-index: 1001; +} + +@media screen and (max-width: 990px) { + .sidebar { + display: none; + width: 100%; + max-width: none; + } + + .menu-button { + display: flex !important; + } +} + +@media (max-width: 990px) { + .sidebar .top { + padding-top: 48px; + } +} + +@media (min-width: 768px) { + .sidebar.shown { + position: static; + width: auto; + height: auto; + background-color: transparent; + } + + .sidebar.shown .box { + background-color: #16171a; + width: auto; + height: auto; + overflow-y: auto; + } +} diff --git a/app/chat-gpt/client/css/stop-generating.css b/app/chat-gpt/client/css/stop-generating.css new file mode 100644 index 0000000..3c2010d --- /dev/null +++ b/app/chat-gpt/client/css/stop-generating.css @@ -0,0 +1,38 @@ +.stop-generating { + position: absolute; + bottom: 128px; + left: 50%; + transform: translateX(-50%); + z-index: 1000000; +} + +.stop-generating button { + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + background-color: var(--blur-bg); + color: var(--colour-3); + cursor: pointer; + animation: show_popup 0.4s; +} + +@keyframes show_popup { + from { + opacity: 0; + transform: translateY(10px); + } +} + +@keyframes hide_popup { + to { + opacity: 0; + transform: translateY(10px); + } +} + +.stop-generating-hiding button { + animation: hide_popup 0.4s; +} + +.stop-generating-hidden button { + display: none; +} diff --git a/app/chat-gpt/client/css/style.css b/app/chat-gpt/client/css/style.css new file mode 100644 index 0000000..5eca9f5 --- /dev/null +++ b/app/chat-gpt/client/css/style.css @@ -0,0 +1,18 @@ +@import "global.css"; +@import "hljs.css"; +@import "main.css"; +@import "sidebar.css"; +@import "conversation.css"; +@import "message.css"; +@import "stop-generating.css"; +@import "typing.css"; +@import "checkbox.css"; +@import "label.css"; +@import "button.css"; +@import "buttons.css"; +@import "dropdown.css"; +@import "field.css"; +@import "select.css"; +@import "options.css"; +@import "settings.css"; +@import "message-input.css"; diff --git a/app/chat-gpt/client/css/typing.css b/app/chat-gpt/client/css/typing.css new file mode 100644 index 0000000..f998ebe --- /dev/null +++ b/app/chat-gpt/client/css/typing.css @@ -0,0 +1,15 @@ +.typing { + position: absolute; + top: -25px; + left: 0; + font-size: 14px; + animation: show_popup 0.4s; +} + +.typing-hiding { + animation: hide_popup 0.4s; +} + +.typing-hidden { + display: none; +} diff --git a/app/chat-gpt/client/html/index.html b/app/chat-gpt/client/html/index.html new file mode 100644 index 0000000..0b7bc5e --- /dev/null +++ b/app/chat-gpt/client/html/index.html @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + FreeGPT + + + +
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+
+ + + {{_('Web Access')}} +
+
+
+
+
+ + + + + + + + + + + + + + diff --git a/app/chat-gpt/client/img/android-chrome-192x192.png b/app/chat-gpt/client/img/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf095c7bfbbdebc08cbc5996f3078830964714d GIT binary patch literal 9473 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 VlJ+X^fh(2(h?J6Kjks~p{{V=68G--+ literal 0 HcmV?d00001 diff --git a/app/chat-gpt/client/img/android-chrome-512x512.png b/app/chat-gpt/client/img/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..e6832e50c185182c953d14f453f15a72816917f7 GIT binary patch literal 35427 zcmX6^bzIY18z0>;LO{Ahkdm&EN|#DVBO%ftB`KkV3J6jnC8Z#p(wzd*-Q7J#jQ8xm zf2jBFv;E@4^L*<>>S#S7!l%K9Kp;e_DoT0~2s-#rbOAe=zOjHRU0YvKWFJODqT^@={ev{+SQjej`r9#OdAL z-3fx`tB#lc^tS;=W**jQ)?S8bZfiE{p{S2stU@d)|5(aZ^&>u~#CdTco8fnVnk9$& zuT8X8-xS0D6nEcx`AI$9{IgIpd3`=Nw8>J8i5HTodZ0Ku*V)}wS17-}sreu%HJM;;o5i>VNBWK=XGpnzy{?m4OxSijY=rsY`mjXvs~_BvBev0asUA2mi5wS;>iD zKE<87}BPij3>CjrjyLWsTIWN$9@B%8%hCIoxz(bVFD<9Cr)&I$p(1=yT${d+FT-oS2 z3kTOM5^DRai}|=VA?^W|T!=X?vr?qq@&*@rfT@~FI66}+e;71dqrjD07nAHc7u0J%#lMmIO&SS?A+L9&5FsevObo`CwcmscVF6IWF zAgrLrw7dH|7xg!s%#odD5%{(%=Q6ms0=1_58 z68AMYn;Sxg1iw?tc~;Bv08LpJ!ghliB*Ow%Wj*xQzac7@1mN3cddpFnm}6>a1p^lb zpPIqsk@EkTr(?IsD#Um_i>o4Yi~7-J)<|(oAr`@J$TO|er{7UuizCDtw+(Dj2#2@_ z9i`2Em_!Ni;zY zq~O0#dNA)fqbZ^h(4aHzHvhLgl~V1$)DN1*nx~cEWD4yDHK4{#N#D>T@Hra63Yy^- z2L|{cOeGBAg_o9(9$SH&mGHbqeX0EMY2VsyozM_8_%#ys!UIB9amtj_PR_8jLNLi! zE-T>CaO0FWwy}~6apWfc8v);q9jt;044t2X!v8Ic9wCo&^nr(%IzPNZ{=3n`@xHUW zFvv4F>U9(7-r&&DBOiM*K#cBC4`zRy@dddf4N*g)9ziXdTY^Nc{YdPW55&EVktpl` zuf+W?Q{aB70OoKX9vFmd3JJa&<*!gVEve+R>*1FFJ{z-8I!cXx_8EWB5Awhic&><(ACVLg)SKPJqBEf$ zlr-ot{3QNS%L<=qK`rYzmvHs2-PncxRQv#W20@R;>T+8DE7PBX&r zZpI+gYJUAm8ls?tiC!jSJ1NUf=9?KL95#)vkU-mq24!JE-kfT~+eu)xB~4d-pYA{E3c5KP)o#qp z5Vrq9bz*Vg&*yRaEwflFQlL#?HZWfR794ZFGw#vPTk+A@cm3=9#y6J((J2dzJGbwi z6K;jYe|{M|mUaHR(PUQgWx|q+2*F>to=bWrM`Vo25lhP?do zO~%g)c_)Zws$%F$g@20Boj-h@#ASGScrrsP@_H>*)M*F26jjZ*zA=KpChO1L6Z{Zp zZa5fxN-_reqN^nHz-fY8@N(k>H%CLGNS}Luka$#%6@Nt!Vik$qr1nZfjbDBeIZ^xE zhN+N1sRs#5##!zT9lAqayTH3>U23V!d|DgNM${Mj_;a6d?a?o-f=~AvF`m%5g*i+V zr5O7kcb*;^;J<@TKL&Gn+7gBY^R|bD9My*H!#D+pR?c&gxXfEghE{kr%kOFb{P--{ zSLHZ8vPr4}#&;I{)%KjfqdSK2F#YWgH~*R2@rR0IDq&f3{4jDdL|RU(Q_cKDmGk^e zmHlYf@6tAWgnvZa-4on6vm6NSvdKM%^xD9obeVZ_ZRzE}yIXieCW+VzsfRSiGs;+g z*AZ3DI!)1OHbz;n5S6at(3$!u)khQ!<9^2E2F*IvAP57m>ypJdwx~?s=pNqN8qNxx z^%#-~*v@)@6Q&}j2T?Mznz$MJ`E>qhxqaSq(sa||To?09g_jQZ`tG{<&I4TI`|ey_ zg#qROEt9fb#2GV|Tmsgz(`SKfQW8F-v2$H#0AfAqd0^fXtL0@R^OIR9jd?-Xb=X8Ss1=G%feuY+ zDe^1a@7DBRdWZ7|+-AW0H2#R6$nlfW=sOIYKLPOh$xpOm#eG)<%u%7>n)jhMwKr}g zjDeTS2j5(p;^epl@v&~}51V#B;1kh`YDA?&l^-)h;_#qIlg%`b&%5J=2EF(prQf9J zsA}NG;$uBc2J?rB_zn4A^~+8fVV|5Qt&vp!tCF0Waq zc6!yG`~tt3N+12#wc&#!S=3^l%vGlJ|KIx5NMu zm?)@DFJBEdw;w^$dvVQFVYkAPray-%+A`9xRqvhg!cB+ue68<0cR_Q@K}bY?v(D#0 zB*O0Q`1-Kfd$l{p8+LmZe|L4*d{=w|Z;MizSgJZ@c*U&ogOdUsARAUJxtuSq9*lEM zFS|bW<}8UtGoUrxob=aMO}yxLs$G5`D9p#W9of8B-v8&1=kCT`MtGHD`^4Qq%A@(S z?a}$ojG%+2s~sNrg5M$HxZD5Jh(!>qLtpT743jtilnl z8b4@+FEq{ZN8ew<%{`wm9unhv4QiCbLPOo5FXQLY4=>>t=WS$7FpqwmOzV>$F|sFF z6l8lxlwo(ylm}&ax7ALwf9enZ@EqdBk})a$1vNu2+$hJ~|2W)X{MYj)Oy0lAOY&TT zaE5o`>^SHkYI=xH>d@D-u9c5|6fV9er#IDB}!vQ!Mh6AHnUW@mTw<|hwc!Y zjEv6PlO-8`NW^A9P&hA_nF+n*8`t?io~OGy1(2{to{Os6=5W|5gKHLD7VbR-Vr+af z%LDn#Meef(6=qU&xPTU&w)O*8+g4h zmcgrCY(J9H;|7^s7__f1l0xcd5V@`cCezljZ~x` zstF!i^cyp&l}^wi@iLS}9Q1_Zk=+Zoh4Z|R&n+OL_F zhV!)<;lqj~b>>00Beiko zy=I*PL?WICPszr+Gp#6qx1!iR>Q;h1}Af zKB#Zxk4Ci8pYhr;sUt}?S6>D0>@8UK^58HbXGSaKcjK}F%}K$g^P&@3)LBr+EC zzg*cl9QzsXea?D09&%ys?X9dFZh-#B`!HQQS^dwmN74JS?UtAqRF>!s7$4}plHtUl zgK<_x=CE9YIuP0R492_LjJ)d4MO*2WCS!yDd-eYEVUNf)zvbkeLrLStSFtbH596Nl zN-w+h2uH0de@%)tON9nnHZm2c^ z%1V=qTxSc{HN7uJM+oX-_#qZ8!DtIJ)g|#Q#A>!gb6{=DUei$6{g$EQuB4LPEvoQO z#>s(DFwPb}BQ{m^iA!>u>W`}56EVdu%C3Xo${h(yT zl>L6LCABXMzg&&EF6)qd9TmNAgP~3N8 zkD&8VU3fF9={#1TTgLc!nb?6%tMR0d=b(1=^V5dro@6~c#-O`f@5QA^;*jOT=vM;a z1pKti!QZ`RdTYjQDMJn#3y6IoN^4VDN;MVRqxto<@<*(DlSX#*@Rex(D~A23bE*v2 zw4mWk`GY>5k~g5JtJ=&ixd#VmyIagwJDF|{e!rzd-}fU0MJIxe7b=vPazq99dgOwk z`2Ol*f0wf+yqW)X%yTrRHL!s_7v;9c4a|R+Pe|IXaHh>F7^o`<+GPY(8@#W&!vf1R z&N7kl;Y$ghm4kl_3@h!i%#SN~mUtK}lVAb#2MwoM=IG+SC)Rj36m1KzrC<#I-F+g_ zsm!7cqlg^<^H@TEhZ7|Gu%WXYFznMg3)5y-WPI8me`g@o)_74Dak>b`;$Xtq<-GkJ z{wYN1tw4A(K3X64HnZGx=B-8oBj_mBrB$CLcevmkX!YOqsdl% z>DnY=cvcd|ssn&l`%2XUB!jWcivGP8C1#BYIYxOs7)&gdT_5i^G53~Qwwst3YQ*2) zy_x6GOjWs@B>Rl>8eUgI&Z+gLX5Q~fWKkbd^xc#`wYBz6tOXW z;mW|Hp^q}#G0v}QZ@Cdqt3CGRdwvX{@auxX3ey&T_aOPZ0AlvpiRNV*poIK*!r8dnblnU8&JyBK)mlv5P5fLz9G zt|gaLuAF+iBGTUP0nm{?B85vc0fQ+D|AWfmLgW19@v5oG)N&`LD~y3r=^siQcxJlEWkgk|#cCZgq1cT|_l5iwpDa{SWmD)Ty~4*{@tx z^gOg@|A{l(B0wcwceqvl%RH!kL&YEE>(aOViYpCQLQLMJ4=ur+IIL=jgF;RvnB&ER z+=nut#%0Uz1+9J(^IGlt6#ej`xr0o-77YWt=iFQoYGykfcrk6)^mG+af>SvEZnuJA z@N5%qGiT~Ds=+yfN^s%iPAlrTrT(}s@x^QIMJ61yp2-%%XjIMhmQXUf+Ro4LXUAl$ zbNzlAaP8;8stzANNU8c~=GJ-dbdf5zHCrpr@%%eal}lAXJXrl%I0?yBTzI{9$*x!mg=^zwk*g-r-RX4Op~RA0iM3ofBVZ~w8G>%yYWn%=xkM!x2UhM*hhPDYK1S#K%wR| zZe1u0K;3I1<1G~Z)rQ?xMq>~&yd8e}i><%;Eq?rX#Ho3}`FN9v$5g=g=U5Ob+4%j> z5*yStfMi{n#FpAP9l{>^{U~ilhtu0+2HhdeeDiYMv!1XzEh#U1{;;l=tDw%K7A`MN(I%T}wgBwg}zjQLhZsy{-W16Zrs_|=GhSzL;WJr8uoV|-2p z*e*U30P;jmV`Vze|B-FZF|GG%5+pVM@Nk{?5W|?ijX4~> z{DCph)xIN42BYRZG5yXx!8lDY3*qm7Kl0en2;zD~CaUILUUfBZpZ~q#`XAX{N3-jl z>Jckxd@G;Eet&k0n59bj^l>-i;Wz2HBO|S09S2lr__JH=vFLxQ`QTKIY&gLZ#lxu)k_I`x-Ud_$-yPqE326g3 zZmY4u0rqIgM_ekprO$~Bzt(OL z&!q^h{U)Zxx0?fs@kj1T?%IidSzgOhGv`;Dd zv;s3kP&=fqHg4PhF=7Nv0)y{fM)cb|Dsz9q41}q(Yfm;N)>pij{0&DT_1k&h{55@J zTloSvWNkmUr`V-$Ysn(k?h;NSca|AQH?~J|qYp)K=Sp0=TgA)LKCvg6jKD<=gKp13 z8QBJXIGIzvV4s`a=FOw)qjr);c7;bN1?q_!Xql$Jjbzt-N~a`m05EAPim5G~Kjob` zA?N2Py!%yH{HywDMghabT!K6qR&TsT1UbI%NN%Wf65F<3Kz2@xBap6q+7g@W&z|OK zxRo@VL;*D_A*g^}A+2+5tKHS?p*2>;C88EE zpewf`Tb{X_=y8g3*a$a6Hcrb@{38t<^jP?TVo2JKB-64z;Rh#; zXqCuqMdn~K4qThaQLO~Y-KK!+E9l@kJGq<;H|GtK&f&-=! zk{F9a*V;BF@ETDOr5P%<7OOZ1#EMjevz0todJJvC#qZkN_~LOhYR8BAK)8l^#zKh> z0`ZV%p&=4LIk$`@%34Uo<}tjBU1t}uR46ol z(P=xcx3rXNBlO9i`uhNcv1f*+jQGr29K3OWhHvLRg8@JE97xW$Qk*0BVvzR-hPMUU z1JUGfF^+f%=_SYZLA^hL^Pf*}~RS7F#QHV4eFMpGJ_ zKRgfriY@NV-x{@r{h=RwbNGXs^yxL*QAH#-`WvD-zr)6Wq#JshSi;PSo60^A+5^X2^}{|H z-N>aeMrTaAq^I)!j+^)RBA^XuTae}N@Y(CAz4jMEN)fVX&?HXCA!)h{_Q!`+V|sm9 zD%8FZA#{BK_DUfW#(leT!XGg^X-R>QuAe z)_%s0O*aSKP4(#_qzK_GbU;1l5s#zOYt@UwqnUf7F_s-~5c`j^Oyr%T<$?=k7>S$P zpR_8MMI_7($@`nM4u7x0vi&`xfebvUQ&EmbStsRbfFjVZe@v-4KO`-)8%oz=i*CZPE{-&`KEXKab_>l-^&jp4GcTz{-pcD41C;o5Eg zt4+HCoGFtKvuDxVp|dW{jr?{*LHuey#Rb`ARH!FKA@CZPInT$jVCuj zZdC^%j>n)R-p<7DZ!cOIDf{Ts9e!8oySAX=tcAa!2z@X~)C4LjC zVu0s_dctEu((>CDYuw2#ik=VpQKAr=JPturz7v z>0TM&U`m1dWyI9V&38yYrWHkeIl`%SVaF)}mnyd6gk2BQ4}+7pTxQtc>TK`%(#CD&FETGqxq{YPoOa(c7dDx zW}SG5&8c^F1;vqB9;1`qx2;+ue&|w{QuPIUm(1bIq@sAX<~Pw+uogGAkssSJhJj+k zWFLVQ&y?7aO0hsvoMuH?30zCg!u#vi^v7lo2ZKOIdV8p00uKc6fMihWu)zXsZUj`l z&M2>85tzNKjJAJ+?IpXBe4Bo;(ZxVOJ{~D0 zjMXx}vL(KW(>|=aheYNq)|~ZiCGGmNneHYFjbk&v{dK;^Grc5&f3*c=jVb|G`!$OP z7jquki$v}hd($>`+8$A{QY#UxH=DXi>h444e)}SxMIWQ(DCnb~Th-A4>&iEpg}Xna znO5sdThv?7H$#C*ux@^M6ETC)@)eszZV-!Zti&8vCbGi1o|T~VH%+2quV~OU?Jkr= z_Q+_jbC;=IJZWuFk}Q7A-+Ey=H5)VbUW% z_|=5nuYu!*SDg<81>aT=+=>Vo|L$-O-hu1#pIuphb#?sCp)+aXp;_8RbaV1@G`oJ!yfM1cY2Lp;Wny>9`m*)0L`*5?a)F0H%4b zyG6)JfUZ4$-CV}4%EtC#X%Tg+T3Qeg<_pR>)=OpObMI-U-34P1AGslcWypN~yX;sm zma(NmS=~kYNiOjr&JDHuBvk zz+mR?E3iC2De`7ODB%EXloqO$rNTV;&6J%KGpp zj`hhOt?!bElJ-zPHQ!G@vW`dNC}RjT+ue%=KNqoA!o_%s2c)h{%Peb(5f!0WQoGXZtVDhi_KM_m#~tsKo{x4!XczMp+`I-P{iYU7zWXj9_HJIPis@9Mz;w%VOvg(2Ke^VSxF zE??>|pKrE(ljn21=c^65LK~KNJ`VZELLx_s`{3a>P?*J!Ywucd828eF*>j^}YJ}{y zgwuNmX>B1q1qpu5O@!O6pq4S;8ptus8~4ihgbWH@T!pH^MeO8~_)Pr=(gr`-_Sy!l z)ja@dN5BJyJsefb{gLp?|o1c;GhbFusg^&JsV%O#3|PE;%(iftoCAo~eynMG5N zzamZ6AIoLkh5GQw4{-h37(kA|lx^Q{^nIgCA2yzwE2xxy&&gaXiZ1tnZ_G#Rz97z- zt&A^6n%U3T>lGW8IMf=_DX(|G3hDo_A0|-?2LwCIZ#y^1KaH`~Tx-{I!g&zuVD$#o z3~0q&GvQy>6&P)PK&H+CfBu6?9&F-hqzZG7!h>Z#vUE$3v**c0z5+9^Zu>WNov(gR z$ec2vL-Ets$fIW9+4c{%Y4G5}c#)utECiW47YEMOu(cmlj%p#NFOk=W{jwu{^CD7zxZAQL3>rHQU$F5OS-o9cAGpsVSNa#pFJt)k0Idhr)5aJ z4~;HV=d)*@V5b9*Zmnf_c6sauSglNnbtihmsU_dM;`j=&#mMYY!W$xRXd- zyEj#)rSyR!IJ`yJYc36CUPsds6ObdL&ZBDuqZ189-2&4?=e-x_=K&c(e1way&KaEr zPRry7Sp!^s+M7Ms&nv93V&+n}o){;F8RE9uWz+PQ<*y2wp~{wp7to8lkeMef|LmbP zK|qO3gSuI@;mK=TF}elL-9D3K!x{>E-eetK8p{a_E`>Os1MhDL#re+_VkT)kS(tWJ zk+=zd)Z7n%&J7)%^E=yG27dddp%@2A2bhtS-&jVsELx6>#zx?Z9BO)n^hhJRuzC(r z$EjiXqR;7HvHub(_ulb7Z%wWVi#}Zg^K<%0YAZ#@P&1Ze%c*SQg+m>erFH=L>i^FsZ+t6>qeWK&Qb0L9W{PC0FIS>{xg+Q~0~&{hx3ySCq8 zQOUABUSZBnQh!+W%$6cpp@$^%&6gVpro~Jc4DJb*;l(x6YidGeL_q{LH-tdNkQ|_n z`pK!)5S-7JvOe@6frV%YXH`l_ey%Ng0eri4Ky*kBv$e8^8jWu5;6Znr)l*gk@RNT2 z>&&S9FR-_0=zT;gdg4-iEci+hF`}(8u zc&OZ-FY+MooAXY(&kEk6X6zgWW;1u&@+La_yBwtiObRrL_ic-+QeGMMJQ__T+8Li8PL3Mp23JknX@wm7Bp@}6z+Oh zW6r8>Rc-Q52bi~{ybtzvH-2Vx-@^DU83sw2(vfWh{I$T+5n!Y=WK)c%+Hd;d?}jZP znR1Rh#HgYmej;W7xIoV#vlBv{l-hqsq)|B1F#*3V6T9h&s8d; z$ugr%Wx6&247Udd$XYC-kPO~aRCHu>&IIV(vNu(kZBjRWH$gXdYXoU;MpR`#a75q3 zFi9Z#!Z_R%;FrM|91`2%x9n03S|8tQpP@?ai8`wPZW(+ea5pU(2n)VO z!RW|a;H09A$)<*JtAB1U75soHc7j*Zf%qnDzw$b?^UlD`*CwN1&M-6xb^|Z(09x;M zzWT_=?mp~K;$MXypsfgm}En znqEOm6DP8#I~qqT2l+)Y;xOkcu5SZJVyI|ahPIpn^Li-Zcpq8y=LRYTHlV;1fplH_ ziA|_mnBxk5ZmdV{ul!fTrr$~O-gP}kS|>tR!`+PfPN+J8aB`oLZT#Qg-yq3^xM+04 z590NUK4tVjYBh^6N^zje^}9HHYNr13H!2?Z9psk~eIZ3>&{7>DOSBV=0v{$=3x~kt zpJQG*^fr$Lgfq2Wc>$g|d z-QfM{OL@+h>EJxk0bwTIVG!iFyOHL}oFi3eEe!of<|)>S5|tzOSnwV(4i~#Lp6gRl zvEBT;RBSUJOLS#noL`UlNxqr?x2P)P6M1y|=)W)44Wz7(eZ-^>d@8P1DQhph|FX&t z5+QI<=G1TJiYcXtXcJhQXa_Dg}zmx_=*k%TWkY86^Y7>?cS~S z#B$K4)a`&w?&}a6zn7LTe}0iutDkbEY8J<}I~;Amu~cll1vPMU^~UJTaoUfCSFQ8J=xUwWN_DVt5Cf{FZs&&F=@lYZgurM2U>CxeVwg6Z$^D zmhmwC^X3?VzHIWvcR#oGf_C!?QbdEF0E(JirqZFD z75jwLBH?7IH8g-hDUl4bz0`TYnh6%{%a+KfgS!|*)1dwU<0COQWIR}E4}@htk42R! z{s64C7^poXuHl@HZe@4Sn}p$Iv%D-4=gCT=$&0skAVD2Z+RJD6rdrdD2ge4|hCoXo zw30_fP?W#DqUKC|sbHXYg5lhJ>y>fLXf}ijvndm?e)x(31$77C;^nAJbm(N$XLMo= zvJV&Y-sYT2)UzJ7*C0lmRRs+{CF4yUR;fA&nNcx(yTE%yb7i6#f~tQ`mjo7wM) z{?fTfR`p&{S)yH?Pnus}{6@*K2WxCyXA_iWkJ`{(T7ZnPjS3Uq-MUNmJcKPJJk>g0 zfPC4bPLJ;#k?$vw!?Vc4L=gKxvdy%m&8gKSS%1jm%ZYrv|A=GclM^NS@tht{JQ=}< zuh##Xl72yj`c;b`?MgU=jD}%HLC7zrb}QLL#oX&GY~FpM5jjDitx?7?%DEd;x?|!u zN|~S>vW$oC6rkhNHk&LMDQ_M>1~?SG>Gr~y5j}#27em-yH$BW0VbX!Pk8WcVklO{g z(bDzsDrLU)@CimA(E<#ChRV0XA+|(MRel1uJVkNKc-IEC!+>ENV@s{;UDGC_wh7Zs zpAt8_(iF(90lx2ort?G~H(s|ZF=UxYay#xu?Q>|jSfBEJff&gB3&W8xtnvwAZs}(a zc04QmShK+!qjfx775`XJ@q9iAp;Mbr{r4^KDE#E*HXGRHZ`>G4^9ZHS$DS^ra~PqX z3-15{vOxzjvTHc8)=vV1FR3o@LHLJQHB(LFhmFo-I-FzReenFP)(}`8d}6W)(lVLa zdD&Pzw`1{KUs;iktiJKD%pDMD8u&Rcg59dtw-}a znVWhyXp{CDjzC_be)k+_q1cesJta*%RU`oq@nd|7i}p@L`q+hr`TI>t~(oosf$Wr&UyDb=0oIg$5-|`O=6<{mZxgXbY#H zD20L;cy8YeM;U{gY4pQtLxI<01?47(;&C{cWF{`PuYbJn;5mgvjD&Cd_#}kHuG4fl zc8(~8i{F9R#39c4vnQTrT!Bepl^}O>8N}Kv&O1)#gTD21s3j{?!?f*9xV0R~ElUpx zm**ifJ>-5BFNz(r)A265<>|`n^BfrH{=v+$ly$Qzvog6PBv!CMNm__xWC$+Nbz>S; z$0p8Nk-%XT2dh-Cp|Bbu0xgWI>2f7n=>g}LwiBTOVsW62&4IkhAaNxBnr6uEItlS7E=UNp9yTU6p(A@4E=u#HK|7X>)+&C%0HkFuQws6Pwx>0oA);HZ_SK*1$VDW&Fx{ z?;%(qS+d`}a&;NG`W)|dc3_IIKRu(`ny;^6d}7R7I2^`*o%kXEhy|A89fdl)MKl&W zV?PgoJbSKc#YRZ^nVxTbvwtE~hvgJYCnCA30t@4#L>J7skswa%EYXe<*^tfPjEUKV6%>@Wv>OfNvxe53)mEqY$BLEtrB<>+cacX)Q?P~~N2b^JET$Pmb50sZR;9Nz@v?$i=)LEb zKU~G8b!E{f4dc~c_bxK?${85DxCwUG!EDnEd&Q#>2)SMbQQLFB_YI$l zS{Cf5%X8au1W`3+x0iwa=6WJnIRdK_^Fdpac807hv36SX(WcwW(>+zk{n?rlMh^$( z;vmo1=;Sa_IiLD>Wg09;^7jonW9U9 z+$Ri=bRB<4PU1x}uHVU%SKK!MSRrl`Ma=>cHr`kvP+r#V z&uf#*v`5M`{rPyT;SRjy%yhT?^|cF?P*H3LO@K^-%< zfNf;<`@d>KpR;pqy(OkSRbuO-xT<@6Po`Y#zI!Hu?AGQ@OK#;}J%~DWdv1?(@;I-*42&VmPiXP(YfYVa}(-vg#7R-KBu3u`4l+p)y6()6-$6jPd=>Zo;B~Z58w@au~ zAE1re@-ol3D}fT2z_0xKSkFGTBiS&HaGBxCKj#L&W@FMkXn*yl)?D2wYBt1*lEV_M z56j*%nq4bbW9sUo#{?u1_6Tc>-W3(@Zz53r@qDDuoYBCMP zk6c>eSFtWGG}V{65F}N-*o7M~2;pjwb&EBej@yB-4@3Ytaz1`Prjuu+g%={{uz)hp zV^qit1JTtWUxm1=vcm%|#-YFP$ZO*0ZnZ{REko(B5~dVRkJIeBSe(NhM66C5wZy!6rQ_tu|~` z<=Y>6q(iCu2ww(WRpyZ;KyDOhd4eM<5go#P*!{|QOuDHD??7J7&FUU47aE8g_74$2 ztAOpt?xwj-E9RVr83MiE88!^UzX8)sKfHQL9@0GpxjT(3e05Fe;}?j^%Zi!eUE1C zeL>|PFI0Jyg;chDOa;t^?~so|!J5&5XTU@A%Zq5rhjRe>9G+sRx#c+3*4+yr+Zv;? zvx(-`f7$){{FY{qL7lWf0xTU%4BcIta}KLotgjG-h!K`K{p5r99~JV(1sOs>Rzp?C z@^-W}?y-Sedq4wl7#q5kd#edhPdsb^f^rlH4y#LC9B@4LOknx5{4p>Y|0t5kjDgnW zhV)Qp;=LCmSNr`GaNnKknb(Dew5Dz_P$ukP>IxHgZOm9q9iXT(_CL15t^t>5y$S+4 z&Kw|C;K8{t_>|Q>zdqM@)0Rc#l;lNy0}0<@9>eSn@ZOlM%^(%ldE)w+LFR=Z53^Or z3!?7nj;;;-qay88;a=_FIm-|9{(+EQhg`Dyjdb^*-mEqn&MZkS?H1GlAK*z8ngoZ- zfr)n1w=M5(1$8q2XRtyC?xVx|&WgF(dahkMSW44Ok5IVms~Va*Asbb2t$&*99V-7n z^j!B5;B0N!9Er+{$6SwIOcx1buz2O>++$vOXZIUeStz>i4g^!Luet*O8lX;6-M#I} z+>{mwW$Nz>o>yNW{|a^UYU^lk>yR_L1Lvvaa7DF&V{MvnB$lU9C}P{%L( zm+{CsRMGi-h{5skf<1+^Mh0 zVd(W^J~{51mwciq3d|s(^gFWfQ!cdE5+4?Si%THjI|}JMd}& zocu{tElfO3(0Zpq`Vr%RBs2sZvSub}K?f+3rW%}iG8DecPk-ANG|(4H-z^ijtHnly z0GOTd2!ZwnC%iWPbinE{X)QR3GT(H4uzQNJ=V`rse_143Nq4^#7``1|B-~YOML!-C zA^^OjLD>LQBGPo=koN(wV*c83<)@&SUeL!KPj{Wns@Ym=ZZsA=Ua{a(IdDG9Um5{U zi5}fztQ1k>id8LJy~jnMUGG)I43U%~(CxbpsAQ;}n-Cj@`PeHmap(d;U;$zfy-Oyh zX1}li4$x@IQ~`=J8NdFSYm(qvV7U!#CtwWJ!&aJ0*89xTvUd&Y+&_90b+8k`i-D9x zt}SB_i?{e;6)^Pl1v5AN8c>SBIKWc-^4A>d0f+&bBlYWWH;k^h%8`8S42`j3cWsr} zk2~qfou?ps{|BV_W{f4lS@PGtL^`C?Olg=A?ETgt-EdV0l2&yfvGHgTDOxQ3u2e{) zIT&SkWat73#GNA*Hx5It1cTz2_`!V%a+Kds7=Zv&02!?WvHDFzlT%>RMWYNrlbO~} zlMTM7Qzwx30C#_d%tRqU_E#%HxTQ|+U=VeNxgA~g?IDLo@=`vL&`Tx)Go=&mg7S!H zfQ+Qcm&e%vh=+W``rBmFpNM=pHp3cJf;wUgQUgD$-Rnp=(_9tSN(3Ey1q8yUnB&JH z+DGL7(d4KUQn^{BL-^W46No;8Qy$>pJ$D8pR7{#@?e7~9l$8PI-t#tFdlvsgN$&%? z{tmf=R&XwTeNx4)a}LZ5mFToJc~B>s^C9mUCKI7tfP31}(F(g|ECB=L zYLt8lb@yq3;5iSGuIb6B&>8Du%9Zf*;n* zjRe64KYFKQVB-UL?#s9D+N=e;eUqU>_n}Sci^$)1O6TAvIM%aWSksM0N9aYMP%qFk zdMdXxP|Nz)lKe9P=i(Qz9w>du%wajQUzW1!_+Lv`0TtEu^@kpi7(gkJPC-&6q(eGY zLg|oFQlw#oK|n<55TpbwkWfmxQ$SHbL^^zQC>`Iv{=c`D>*+Ae+&K4~eSWpkzMmyV zxDr^K{A_3*58YMW7)z^fLgh=X4Zswg)9kvfNY-R-?JdUOR9rFq*x_YffzcR&^Jk(` zDVA=3m?LVD_yXGhQXYNRH=P2GYAceI)C}gncSct)shXSC2TCbm#Xcg$QTAUJbt=4_ zV<528Mh#vPHLneU=6GcWyKTKO)ht855Ox+@W8Hn3`~&titK~_s*yI<}+02}ZoU_9U zLtGJiV?YtFCCou3=Yvontl<1A@KTEB+6fXdjRLtPYY#EIOLO03$JHHBSJZyAElAdp zH;1y;JZY3sYa)&&@|`-Ii->OW!nw=M(M*K&vx5H}9>eg;|8&3IHoJOL{$$T?ayf%0 zyISxC%Q|w_E_)%>y0>YG7P{45{^b$X?;z*%v3gNVBT9}K zTCEAE?R4(tbIS{e`%_56mEml|Op{{zN%50WIW-mC>PeTlUG*P zo|lO~+?Yme2-+W5THXbmAje6R0|FX17zFn{n=cD=B-{Ze_|>I> z3^(!<^|n-QB#{axv}I9~=1PwqkHRW@JYqPR3gb|n9qST@FTy%{*?uSC4_&H=N(}GA zC{k;)pC9Sya;`F3R5Ro&*9k|nU%W$Yn5`?Ag40V9I84WIn4x1YI}J9eQ8*gX-Fe>@ z3rB;>ZRZk^32is*At3*dQ)`k!cr*8BHg(H4Rq;|Bp`2?R%`20p@=&1ngm>o>^$&t5 z>uB4wZi=$0mJi;54NB6+k#|-DAnJNI)X19fu_ByVL4Xx@x->s!mi~%R=t8}0EB;NI zG+dPQZY9iBzTx56Bh*1WZ6KF|;=GbFm$o^@$ZJ!YoAC6rw$QC2$Ux_iHis_FW8ls3O`hHYT^vjd;7$GV;Z@}mYo&&+y z>8@73YUF6Agxl?(<;Hl#q|~~GUkI|V#p?pwUEZ~dl<%6?~Md$ zt6|HBenD!vpKvq=1f#NOvIOH9!F#Pf?U<}0*Ag4|CPe6Mw>d|$0?SyLB(+$~`k-n)2V(4_hPGb1fcDm8s#z13ie8CxWY%K;#lunbc$ z0Dkmo_*2#uu}v>cq<93U5`k;0lM?^&S*9Rf7d)T8KoWX`CJV)BE;?B4Y3JK{!M7S& zFrV31j-$ALlNvscBkWQvdwnkC5ggZJX*dxy<`Y$Gdx#7f)$?y{%>Olubml06=Ci4R^xwHehgLB z#eTqjW}&%8GL*@;I;%kcs5Gvs+vYNcgEV3H2?raFk3wq5=?wGV$vr5RBzR=uy4}JK zPQv^`tBEGOa(Qi2prr2Wv$_hM9V6Y$*^pV!+&hi#lMV6;iZyu3NyMIWH>j^9lT2BG zX&BFZ=yGNBdD@b&+L)RGus3P#0F$q#TS*Myjtpl49^Q+VbJJP zdUc1|)FJuiIFR>AY21$okrMx?`X?Z?DIe*Z0z^IHS+O(QV8h)j2l4`KLcyi^CeS{w zW6NTXkErC287vhR%pTVsOaFdz5ue!zhu78jOq`yLJaP_+DL~}S6QQTUR!c^2C$KGL zt)`UsHMtaWKrtsT$*DO#z=G_b%@LiG)3tBRJKGS+5Ns6%J2$Q9i=L*F=ZsC8+aG$N zP7pzoh-;E5D1?Nw6^arVe6n79)IQJ2c=|ML4e0;7x zfkWQs3`t+m3nxkD5PO_j`b`s!lsjnqg5O||;P!6u$7$(;O%u3Y=HCVlbo+ppptjyN zq5}t(ih^C%G@WL(V5^ESYv#sBBg=Y?Q~?ud<%&2b6_>WTw2q6cfja#pK=`iha17lQn)jc|#tJR)Zwv0S-pdSY+ayYod__*pEP?WtNg8)XHTXtT;;FXuDaue=4*cVYvUjG1hnh$ARuf{Vaid zNb?A4DU2ZMA@$zPOQL?;Vs|ams-9UD+_f*FsQ6LTO-hxZ5%PZ+zAW8M!*d-UO%O+m zWn%{C+Nos?c{}@RA6|mG5iZP;>SX&b_7T8>`pBW1B-`x*_h)@kSMX(>nZ~5#b zR6T|73uT>mWEq)#50NM4iP^}6kAa< zVi{N<)Db9s+Fyla97FcJ6M&YGX21{LMQ z0jfRlP}FBUKf%+Kpl)#~tQXzKL*ymv9!@FupO3T(hRD;n$eirW24`l|Xe8)6Y{t~s zSjfFx%j}*gg4iosXk)7M2nHYOj%nVfDP)xs7=Zw+6O4nvGf{B1pIQ> zNW4*jJ~?^j3vfK2M}%LQMQx2mZO>}ju*yMh$kHbsI)KnAL+HW^2J)Jk!`#ZWoJ?iqV7yt#=N8BuHmoOxEHn-y|TX6A6tzUw{ z@an3(sB7O`4FH9I^q_d6p*Yz4x!!htf7)imanH3>pKy@fgvak+3 zkk`&Kf9QodiBQhURxsXe~|0r2%&C$Jm4 zi1GRgP$O1e8fI1rkC}Jlj9ZpCOveUSw;+7M%P<_D4OwH`a=y<92|KiC+O}m!(`G*y zbGGE?dzC9Z%oinsD)U?T_0KR3i{~G@yW_KZ_bj3&S%d$40X6PJ7M4a=ibxc_;A$Y_ z_uj6FQeIvm?j|N7!?!*_L3~0$2P8Gc?I+D5(8KpV2lF*){gH|@is4#+%Fjo3IqH)Q z!NDd{JnXl;)4ZBHC=pT2FOOCVM5I6QT+d7JvhM3HDmKS(iL$q6U7M6MCzXjcE7uEj zVgl9l+7ZiNqCjHb8_Z@?fI7wFc`ytvt41lRUh5Ad^BUHUyILn=)w9(jcfT1TkT7#I z-OaG9g=czU=8F1rGObzX#xt6s)}om+Uk*|5u&PeDm72+cnZpGSf-3OT->8Ihk+FL+ zCbNa14w9^t`t26h(>($49zKAGoa?*{asl__E_;p-nWK5T$TEp!&kGcPG_oHc7&t!y z<8J|K5BKD&TPRhHwUds8F)hwJ6SQg;u5zUJEtAE>uM!B2H6x=%IMx{bY zThugDGuvEdP@f%5M;-G0*zyKfZqlO+zRfJ~^7jwaqfejm2?K00m-i^R zJ<7%K96T}BV}h}!Y&|NMv`Ow@mdw>>7=5z}!8K7(L(=jDU^&T;1^kyepkLyOI%rhGv%Z*(KHNQV>Tv{cv+ zY?&X7+MFDg@3dp_2y7X7)Q+-g6#sX~n>UveSExRu+(5x`BMq>XPCy5)RnAkSmefeRvNv z)Koy;4niqgg68_6l2d4!$r?e~PU#DV%AE2nD>6lYyMe1LM%t(+2kRHW`ZebJ9cFP3 zCs%18iRiga`(fl-T28rFd^dIjtOoIq+(*1-=d=X{HcE|XzSVd;P8z3{DY*x~ z*qtLm^f-v-cUMb^4#!*K4m{e9a`uQ`ro!u$#S#Kj>}oi>$|KdKld46BXzrA*RMg|Q z@OYyrWk0Pr)21im?FsqW%F^8E zv55K5Hfr^~zxGW7u+vSIDd@*tEm?&!eD{MeTGPx@YmWwB<3Oz}f^Yfshj;amH)a>4I`m;01tM@GKjWZ05RnLWVfvoO8emn-p6+paJRP5QxrMH zBKvsNI?-=lIm=`v|Ba9N3TkB5MXGNNCVd26%D>OhklbK$7B&WY8r{Tk06Qwqb-X6_ z-od1$lZJbKg`d6Tw-YdPVRTgIw;iv^GCC3^@p@5n%HI1WjqFlA&TmDf43nIn+AdMgX^ z-Pre_Ye%NLsdIM>n|v-syjdGesOAdFu&)g2!>#!mFG6eO?~N`kKk1 zWf|LO*6NQBuk;h1+EHzfd#pu6IueGu4;3}5SoB6yl%YX=D|wK6R?@{o8+1!g`=qR1mOkkL3Ao~bm8PL0?m(7@#1eGhwOH$dOg z&x@U98B}pbxUXsND~Ru8(nv=32EWiKmFXT5t~trecY7|WbP;a+H^QG)_rsx9WVJ{# z{a-%M&$}OVyLrh*h~?U;n;x~cCnq-xnWjNJOx`lsED=;+Y`Lc(6vZ8PLk>gNHFjuy zA$t3|vU=tzOuHH@8#5ErYmTN=^$eAhA%WaG(Ge{>A_I$n(lcdjMRjUDUaI@@D;h$?|M>i#S^>Rif=D7vs$-BqI@lJ_U_z(1oa&G;F%{*L7$05vm2 zs~{d?t*vl3PK*`g`H~>LO1HS^XoPBOX|d$NOBb`;3H(;-2&=?Po9o+3zSnL%B*Poq z5X%pbuQwy2B42;lCS6ELL#M&{@#@<5cd5HAgACmKF_WLDY$d?v4RlI9iDHy3)^Qmw zhp(sg%g}UL{sqAG&`kj^Ijz2xeu=sF{kb}pGRS^R0g_4Fz$4pzDtN|J@P#Xg+~gIo z1P?_&-tpwUDPcWK#lk_^26C0Ekkx{P zDJ>=QQ!nG5rv938UH?fijQTBv3(gC`Bh{*qFjlP_mWjNRoAUh-)*!kEKL(Fa^SrU zR!QLVCTO9H^XJr)`+H;kIaj}a0cc@4d0a-He`(kSz-c%7k%_ry#Iy8U>mlrq@dBee zEau|VMlLNicKZ9k;CiLe+TO?2L!9(#FX4i*(flRAs-wjWk#6rf>;h6tf zikYM8!&!1U+z5GZ)Eg&1MW%ELlQAE%*hN^#KhO>#%6A{rZoNu8V9s?GV|cYZFIzCq6Ox=?5|G@WUOU z2g*D+y@bb`8MWC`3KmCc+!&T20oAhx+xljnE2G`?#}pD& zwCwizd|W|UE69BijQm%tfl~-%TwPQSwA__qUgllsZdT9Cevk9Rn^{r7H0+{7yeJK> zeR{CE^y}r)58*rx^I#Pfp>034*wuaG;#+V2lsrN%6sSDJwnF}s^{6gOlo`Ba821dV zM`#ITSc_8JQi)Sf(f!dSTNK`Rnt~9~A(a|%6Y0+Rn|7a8O3VYHvG`1-O?yjv)0C2Is zR<#nsK7(DNtJC!)vpu1kub&&^+p!YAU&Rr|AZ@m77#=8jDNP;Aqk&}aQl0sD@8^|l zAUz_*Wgn$J0|e>)fKN_Y7cf2^1XhCK=3-GbBSuzZr7R16euUxyclS(If_IHJ;P z&SHt}B;UpllQyZx5Z7d#FSh><-C`9e5eXF{ClOq-vuNk{msZIgY7V#8*Er(oxTW0; z{3IdBn%4zJ09wS=7h$PxOtE`N?fLH|l*=w&GaXH2Z8}?u_$`XdI+#ut&6vL0MC<-J zlcO#VTBf5vo6mkORn@n*J6ZOSch`zITsLlvI=^M{`>c%DT-Ru?Ig)5y9C~=`8?e>X z%CSL7Ee}IeSA2R#zmh9Q#{sbmmaei|AjQWa`}KD@dY4&^jo%@r@h3pf*-mPKHwBgn zE?_zIMq`kWvS<6d{|)iRA4ksEXm%p{hbZ)wImEqQqt>Akr9F0X=a%TZXYYDBc(_f;aUB)Z8(xLmjgGv}tm5rtrLEp1*ixT+ z7ZKNQ)R3oIJV;0ACG#5FzzBOyLBa83<6-&<^@5O%^o>_xghU!7!R2Wiyr)FX18PSK zZlffBOs3aeXRKD?kzkj-3<+?Cb1Bkh)!;{Z*vm0(BT>CA1dQ~gpCjNYAfiqkv;43} z{Rc^gVI5U*6pz_XjX{x{m?QqOf8OkZ_hkNDDpJwuNF6}+8)U%R&DPuZ5be~ar( z*eN_7+s8Z`9bAT9cgeO8CokasbE=*Q)P?>aRX(m+cnEv)>myV-g=v!5nBlCxV%{H- z0h6VYY|Aa8NAkm9?EaTc_B_P)WIpMOJDq~^BRQSc*FYVa{8z>{!yB|7x;ITy1=Vm3 zOqN%^{IzakI!6*QEmF1tgDDMo;UBlX4O>(+wXInUy0%&k_s0HXwZ0e8O~q!#woHcQ zmnQ$O=Hy`cIMD9y2H0s{WUCqI356DRQ19e05tck-pU!4pQ5b&o(8#Yaf!UdYuN}uS z3~`&u$LFZw0SK@B1VjDP>uH+;D%qs5=I+*~+SS^rLKB=#`3*&Sm9u}#<*UU=egn? zu6anp8`Mh?1(WVxj`fmjfOR=wdC*hG_ zxP9!>+@~vT>pgW$$^*dwotV%+selUv=?63hK^P)^vhuM#W*+cOMZ~tiUqC7dXl*lMN zUdQ$PDIPOTW03tG4tB>myX5(|Ci62#GN#cC*{=1PNVkSsTj^`trsbJ)C@;IG zQZs1bJ>9`V=X)z=Z><_b5dC)hksYXMpB%w9x*1k%>V1N)#(~zXn22Q?vgZ0~Sogz0 zy#Bg_#70W#u>k!d6)`!(6j7-3ugOxQ_D&c&m%G~cuk+t%q3_PsETJ{_6FoOrv-$=0 z{Dg@-x?9AZ@C>IcRg{g?0mn-iPC`YgS_ktNHDwM6F50#fg+BexQxc-Q1X?12^Rh_P zvF0sZ%8NxmAwuOx?IDt)SAI#KBQrVX0txslKd1gJVD}EPG&$T^rKO5yPtu)I+hkdt zbOZJLZU^q%@W*2HJqf!aSx9DfU@h0d2g<}77^2QC#W5SKaWTnqqlbPMl@yfh!Nnm` zh3+PMsDfv$(uV!x4=eUb`ytmUkGyFW8+Lb;NyRp zyaHEvPC?&mb<`1wSa{1Zo>>%Hegw}gi&cEi-BTP|wJ2xa5+>m?Q+#t%1*g#?3+K^O z+ugiRfiw*!^Ffn+TfBvJkf%FW+$(6BwsQ-H>gE(goNcc2cKgh^Cq`sP9Mb*uZ&R~- z4IvRk9A^0sxSJppaQ+oxhmu=tuoyHx=%N+j{3bh1|2&8u5K2ob-+v|?;gPqhbD762(%JkJ(CT8?# z4=98Y1ZLunmD`@vOX3{v_XRrk0kY_u2(BK&X`{GQ;b}J)de4**la4_Zo56-opBLvJ z*0;neYKvnf&{n2fwMkqfwYt6{ed}Ju_kU{LMGO)(bTfFaR~HYReGg}oHdF@SO4pV? z^{r?eTPxD9<(Wi>4s#WxE^pyS)nR#M?*mbIAccter$bZPMX1GDA)d%oGHA~O=8f7L z^B!q=5H~zo>lJp`0A=)^jSBe=`;I$gYAQNlNo{C{V40zCe=!>pOOQYn-Mk9Uj}uq9 zC-af*`>Zfc2Zg=9KwwtBhllq8h`MUTzV+<6S*r8Tk)+dv!)=HZsqwObWI-Q9urEKZ z$ylgCzlGu=Bsn*P2dQ%(kCNWMo_6=xgMre%1~RN<-kc{Q?^x8lyW-g0O6qsEhG>3} zm}yZ`+}^1^EE9ylddA6;=J8|a8!kx6QbL$SK)23I9==gU-N+HFfv3UHlY~?j^dt|u z#NQ_~uEGLubW@R0G~kcZB!deC=y<{(vpXa8AVho*JDCtx@vm1thfP`&3O_b})5;V# zeF{mX0RuWUDPQgY2}-JB{^XYHP{PX)Q$ZF@U&ZmpJLevMZ5?K+@&<~z?)xcBt@FtZ zf_x}r`Hq_4e39Uq>QFk!h}Z{l8lRbxldGcT5MYjL2Y;6rAuIXK(WmG? zdCXXx(w<(%mCviCt(0r9$9nQvt5jwChhw%6Fn#VPfgC?^t(uSu>jNZaWbN|%+VN)! zC%+q0xdkq-tf~7eMgIU{&bGq9V-Fi$U`u#+Vew7LucBy;DA!hwf!khIbRtL{b;ASL ztV29Tp@rd0@)jiSbNil^+JiFDdh?I#NMW(9Vlp#fQc-_5ZU8iKEPqyhhz|vB!*`*X zAbz0RCvB2xvjKWn7(cKp({=tVUpZ=Dbbh;7!jEkKkhVIfbxBWu+C7!-uz;1y4fNdI zfm!z-*qfG`HK&_Tnu^dsT8!5q5G$n<`9Ggs90{?S`yk7#*xHX=6>NBM`D zdldU-bi-eH{(h->Rw!EC>(8RG7sDyZLl)MQer5A(1%$6J4dyZ6a z9%1cwq6@wViEFTF#>mWrI`4pxC3!WUb%)$Dq~nhzl3(*hC$20YgkV}JlR0;?&fojg zXSi7FI?Ab7Cp@p{17t0H0=RO7*Y?(R*7$o6xfhjFuKEneD^@jY$wWDZh-e}FuD7^u ztLJ7yscL}Y>rx*36okksi;R7YH=JL8r+gpb@ZlDB?hj}?G;W^wJ^jy6F-q8VRK}Y8 zBcy$w32lj(&W^tO5~KKdDmTw$2WbV7fF+1|i*kAA$)Bq7%WD{Y@zvEz2;!o;ncEmZ zR~*b%Iq*$Mmi}_v%(4-!;GC_!C%MRSQ$VKAuo==-s^KN8g?4z_^OR`6I1)Aow)>}h zvs4N~P!KBYOvZRe_su`156is>BvOJb9%*YheF|0)=jb^= zfUd>cAk0^}a5$P>3u&9QKHUhqXZyU7FjFbGF61%i6Fz^QjuMMY;?|2) zmc{SeAeQ(W#kxa4%M5!irI8Pg`m7v1&mDO(xhla2by!Li7GI(*J%YQ^%hjiwEid<% z4CShHZV=IU%3(n}@aeQ6YoCS}^Cs-pEup0>L~U$!Mz{VRjYQkgXGmzeir9O$N;E4P zzSsp~mqFHl=2nGE@+b>m2g?jnmJC8Nsx>IbZ%$Z&O@4W@u`x8H=4&<2gL|L;D{L5P z0Y!4&VqG6xpn_6Coij)tOOWPSE}MND#wi*^LH`TU@-?R1#9XNCfc)ndjf*&&qH$r@ zQvI~y&NRyjZE(}~*shy8^UOcF@tu(0rS>ih{n!o*&^r?|li=alQb^5ctc$~sGrDWW z@Yb`7J#tU=4OhTU#&QadjhNohEoC_Vomt0lMtK92yKTr?W=UF_ZDwZvoIfZQveiB; zk5#zJ_q#V(i1q}P75T@e5ouv%cj_o+jlX$b)q zwHPD0qC>dFknLW5@IA{!5N(7K!(O6(KYg$AM@K3#4Y;_YTW2}u$r4J{iaDAIEx!Gm*^Nq8J?FcCIn9Y${vJ9=O z)>B*-C2@Va$IPi2BxOq@{JpV3bQbr&AYl*`4S*0R-iYw&_xBBx4?dVX@2ghNbMyjC zt$MnFs>KFqHoH-;cpDwQDG)E}yg2{Ei?Hij1K_^@B5sV$J=@F6Z*+|yo5Lfua;vy$ z(faDc;vy<4tX9|Cmgfse7V9tULew#yL?o`tGpwAC7=K-&!kU`G#Z5yXX0dFpt3*QR z%goIdI>H1lZJx=uvJ_JyqA&b;F!^R4X@U?md4hPbc|?@1J>O%P<`NS-=w6nB8Zo%C zhA{MR+|TA18kIX2(WdK4{`!WXzzwX@^-1^;VJy13)XqHpf3tMw3IlmSjW5{N0Jt%p^ryMi~k057}~0(tb3N2c4a!WWRMBTV5?I`+6UBt zGw`rYe!PC?aC-7H6OU}#VaS;Cs~SZ83= z$coLz9ac%pu27g#EPp=(RAh39EoRrta%1A3J^9xc+iseZZQeR61dnrrj&-A6?xr8W zh4%?|3VS6LmU)$6ZW0aasljXGwt{dJ2!T?y5&TtJq8XOg7Po}IfEhdtij^4N*k0)7 zc7m2|3WBZg{l)%74*|CF3v@-FCpiVBIt0a^kn}cuVrbweH4D)pyWL9T0l+Z z9{6AxOD#EGf&{GTAH}%3m%90N{yyqFq0eK0FIO@(dP~qRyRC!dGCOz;>gb{eo>SE> zw5I&13o%|wn^M>0XnxkF-E*M&*@kL*i&r&bhJn6_b%Lpm(r8$<48-PnX%5O(Td>Xy z-EJ!A8Mocv`8ys`l0+IPzL6mE;;B6OW%~q_nP1n3+$TQJRIqG~UD*m0Kqm>yR%c_> zUhrwI#6bhJ^WzY;zl880uh1!ZQvyNy-ht2N^OheG$$md)JZzH4Olo*eVE-lO45W+N zYM*?RxH_M7eH^-J<&^6f-k8JVvuTl7(aCKkYYR^Q-sdA4sw0J2Y=p$@qt1xpB+O~p z#;Y&1mPsDmir-2txtzb+ruBvLd*-Ee5g4@KdRG}nw6Dm;TBa#kE&1ckt5!SWdxrEJ zK!*YQ?6dqfhFAUcsvE11{(FMe7E)$8vSj_sPc5Y#+EdAR zrohnPsK9&&YVg!JJ{mfCxLxZ(k)K8FI@;a}{v0#v>1`5b&jY(*dKe8>E&N?t)=q&r zx4~Ps4N#WcK|D@D)qo&xTDJ+$hg^R2xR#!9Sp%O}oOrIA+A#OU%|egY7-1H0+m>M1 zEOkzON#p+5mca?WCJhCjR2_EakcOtcx%{~7=)X<<*%wj~jr^WPFs`jua8We=s2*nT z<01SiFmyNEQoPL(%y!mkBE0ia!!e)xBV6dF^}4ueOum`z>GYR=&*lKQw%07TmZJEe z2hUdASwEQd4*kSl5GwuTWNbOd9K_X+ASr>qjif=}ar9IlwtnpPY4`y!Li^*;Z#pfs z`J3kX_)DrcfTOzE#My*mHt*~E^eVKWQsXGCHk;A|!SP+eYir3q_#g0gpX!=7V(w6ha{2)-fNi%HvQ@AZxUfb7Rlm@s5AU1 z+lQt1#NY&wYN$5D?Nc|>LE$9O2=(|`%|SOF8-Jpg0_meMJG0{(^_c-nZ}#Q-b`zUq zW#@h(aUWZIQKoP^=+ZpoF0Xw>j0vd%^-yXwgs~k3<~_iXTrs58=KMRT`xDZKYYj}B|9ULaa=0PARygYJt$5#h z<&~C;u7iZ?vMT*c4ubqo$S7pm5HU`Jp6s}Q;ti^nQ$&;z``&3Q@lkMhfZ>)Tz=jBF z>vF8h0asfsl3*7k3tKh#f5cv;esVAou*!L0%FmX<*_!EuvCl&J6E0xrHZFgw0jT{K zEVV`zrwr>q0s2*N(um53hB%M)_E0>|aqnFa01RYU)%p!H7|PCSwa+5%sAT-U$GqvW z!%bRjhra8_a3|ga@A@9X-`4<@9|+X^nujunc4QNYFAMcJG~vWXt=}OLlWw5bpWr}H zq2LiE%K1{GxQREz#+Yo+1hv>1Xpij`P)nNXGarSwCJFu zO5mg|RWem);2g^g`DBr;*ra)sQ4!M5mX|i+b@DY#;kViC=R-UVPek0<9WhoC%DXg%SbCMVb$)HJ({nW&i}!7BgHist-8uz!iJiXAt)HJ_b4l=XV?Qp4 z8(bMJ)IATd(bXzIoo@J_7Fc^evfGEi#fm_v$?Dn_f)DPeUaLMuA0Xwj?}5r*?-u>P zo`)3EZg+X&_$Bhsu#=%~65D&e#OT2ChGb;@YrMJ$o8ebg{rkaMb!6vIGxIS*pI$2j z?FYfu^6#vVXLgp;zYblFd}hGISP?76-)of*s1ApC-)GyZ0q1Ktk0u#m!s*W3 z7=x;2ndwu>m7D0$5*bMutq!Ckn6p6jun0ymUbe?j3bY%J&XwZ_8 zZZ*Oe3XE_Jp>)sq2<4Pn=OZwQOjn{WLp#8zh&G)3%LM-Ap2s(tc+4j>wq^l7T5BcZ zD#|7I_)^wSGve|yY_yIW=iD{j)Uuezglp56&xURdr!PJ}GNHr4Bre-HkT%O23I!{YYKHsKd&JYeH@`_BGq6xBAJ*A&!EL|5k5c}Y z;F0kIVD4`g2$g7Gb~YKiG;!VMn4x8o>iXl(*m`{#(Fc&<`gjT=S-w7j=F*RGW+#2J z|1kV@d^yVksv26vDS8zOs_hyYnj?-g$f0Q9#K)q2hGL&x>9n!Q>AZA^lVgD{vzxiB z=BFuKj3*b^|My`}+FLY3uKt&w7({V3IxNSt>qo~YLHzU+a+WdsMBPk`nW_apj!*2) zaXk7OKSS_RcYdl*T5!?jcy9OL!slK8HIvTHPokMr1_ZM z-|m39|LcEQG?{P;^Pv$k=1G-%M-l9Aw~54`Fri)W6yaB1K>W1-JF6%oRpcFEP1z76 z^z70uSkzJ}AJ64@&Axv5)C;NZs$^(i>L4gH>N!Mg+oF!TY^W*F2S5WNEgx!t0h%KU zy?2e}O#C@GnRuEOPLFgU4HBhtFoPU3cuBxummfBqcnOQZqdJ3oRyXp;huy@cR;=)Cm_q9Qvlcy+N`QkQ0HZp3&Yj}aqV zCb`s|K8BH6Uw285DMd+}7Q$poI*i^_YsIseM#wSVrwo~%q|VEPHD8q&tx!n!?gXC2 zUm$E>LAuB6f=pnq=ix?Eu2=9!q(`#*Y84=Z7r;7>*m92s*1MMIku0C|$U3BX%{PRa zUV~X|H~S@d(kDl@m4?m&q`%N75GmCFZ1%Hr-;j{&cLXAQ#C1v0u_%tR?{!lvQu{%C z;V-cI8I@0cg<>$XBw2*l<#G&aGv z-r(M+SXX+^|KvwWdCx^Rxb8kkRBBi#G>|uxwTg;Bh6;BSKc00@6KIbSqwS*n(T2+U z1w`vUr-`fBl(+so^b|=!`h%Zcjr7c3gMMTMM~(N^uctI%B-G&p9MI2>5lk!OXj6R` z;#T|}tN|a9x5pZZKm#F3?}fgj^^63JTfW_?-kx1rsWqjfbc-$3X&_=gDd|)%b%)7y z;;s7NHub+gb9!jQAQ(Z0k8r(YXCn4N+cFNt!FnqZ4pY4s1hn>vBe|e0_6q>K{~gle z-chx%{bqcB9jE~X!xEsq+z|IdSk^NnjKLMaGx|S4MF8-h_~7d4%hw{1h)?CHTg}vA zRj79?t}I+1BQzA?qGKvrW;TMpot0xRhsN9Ns>OpF%p^(#7{WwvRwk)`FUVY{GqaC>G)$7yLW=wj^F~(ab(E!#GMXL7MABAQbhhi zb!{X2G@=o{mR+@b+Z}BkuSWOAqlW-_LF>hrWU)ZuGykJzv)xZDy1!}8PcdI!$RE@jXSq+D&E+pD+G>X*6}jOo0zjr;Pj%Z;$kxaE(Tl#lwWH$tc=+l3?FDm1;db2+NcU|n0Pq|JRPcu4CxrC7m z8-H)%VlTbtwxT6+WE>y*z8^&T`=kEJn1a(4zfo_OPnUL$nL zv>}V#L2@XAeX0xV|6acH)Cx0AbtWIBxW>vneVGsWR1JYDlb$6a+lR`iN6L7}Wx1H{ z_&L-^u#^OK@fTU`{CgrVVdUF6ymYRNL^1KB4ARZ~vi{u#CexgvQ)QPT_&ln=K0PGJ zwMihJ4$ZiYc1a>I(7+JtFUm8|A>U0cxxKn0DeUqN6?azS-Bh6-@{yi~({!a1p>BdV z&`qz8T8jm&qL7csd&S|qYJ7g0s$vVpki3n*L3r5{UdBZ|CX-a(GpW91be0Hu6d|7w zZ#4aw>nPWW45dMe{3=Io%Q?e6m0~Xx*_$An%bc%0kYD5@erXXOp>XylTqXKywKb;S z$RQbmC{vC8#Na*=s!OM+NO$Gmy(|+E8Gq$-@5AxpHA8RITTXPCw>Rsjx%b5Xj(D5k zVW_3U$gi#_b37C`2^k#18P$lGu6ZjBE_ST4A7`>1nS=r|wqLW@&(V3JL!;UWFg%MC zPFaV8o!#e=XGc+OO-7z~PraHU8h%!|MPbC9L#PCwG*4OX5mOzZ(6)w$zMg*G9;DQ@By2hkZm9XN&Z`nsG;jt7PdvO6jvi>$avv zMs5-%rgr(H_0D(9*2H$MC!&kK^n5-t*>N4ve(>4+melpAtBK+8ZX~whsG0j=@|J literal 0 HcmV?d00001 diff --git a/app/chat-gpt/client/img/apple-touch-icon.png b/app/chat-gpt/client/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0a35a4d4290e11079898534cdbd2bd4b19d13e54 GIT binary patch literal 8850 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 Q_6rG|w77y;m53qae?CY(K>z>% literal 0 HcmV?d00001 diff --git a/app/chat-gpt/client/img/favicon-16x16.png b/app/chat-gpt/client/img/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3430eadd5419b00ace9c42fbb3a248a5587aa8 GIT binary patch literal 536 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 Hv$6X>u1RtK literal 0 HcmV?d00001 diff --git a/app/chat-gpt/client/img/gpt.png b/app/chat-gpt/client/img/gpt.png new file mode 100644 index 0000000000000000000000000000000000000000..ec489ea08f55c7947f07e872505b39bd1f83c919 GIT binary patch literal 2040 zcmV^VHkQk%0V*IVDpeYp2}uHJhb@GjWi!`}Psv%bC8@U5*)xk!r^E#mBU zdjdbk{QUVdn16|zO?fWFqN?9>JI8}DV@_37RVC|{)wXThl=AZO9MiWtbm$Q3=jWG( z`PDBs%f>*GTeof<=Bj_B&1UgYy0RcblCfMy&E(iL>+Whp2iA2LPwvCX^t%s)s<~o;`c2 zy?ghn7cX9@ii!&L=+Ps!d-rY?85yaXKx~SWR)wC@qimcGv$SPB5;R$h*dj;6}WN>TXy`SUb#eZB#ltj;;KbQV*-@eiC;lsTJP+|!{ zt5&UuLzpPjt5+}6IYWmIb=qajefaR9oRs4{rUrEI;6a)5`0-;TC~pA#X9+;}?%m~s zOsq`DyLRnLXU?246fZ3;rNxUEi?U|(nWWL%w{K;>H>Y43K#v|hw{QP{HJ9lmk5UHuDvgZ8x^BW%k$9^XO^XAPn6o2yM35_2=UK9)q z3!~%5j}s?LV_b*XJ9q9-|Ni~u{f-?w8crS;7uWCr;8>F;O`@YmkJ8nvSEV@ufZ0IK zo;@oL&QzDyu3bwXK726z;LxE%6doQfIRHMPfuR4~xpVT&Nzki}^aubP^8Wq%WG1cv zcJ10llP6Cm&dN@^4T0$(Y2jp$8<5Bx$AA3zK?4R1XjlM<4taTb@*y1Yh7B8N%9JUF z!ma?`y?bZuI6x#MB+#^J(?oeK*REZosHiA;uV24@k}ot6%)|N(24LmNmBzwdx^!{t z0~!G2{rmS~J}@IaAJ1#ntdX#*0WyCQT7mJIGiMqgb)v&J%%YW70J5^OWI^nr<6^E+ zNCUWa>y|jKyY)adZr;3UfGsI0q2}H*P4tx{znKbH%o*nC~l&G>UnRVk(Uw zU{qi1D{eoAU1XZAIIk#AgtN5#GCfh8Biv8qh09bOj>kJJMTZvf7C5pdXb&DdFvh^| z$BY?MV+|B6+1c5~JmeJgYZeNItA07AL?o;UCr8z$+&giRM*z@JQEl0>MZy~d^}voD zJBY6&<)h$3h~+x603?*^)29zzxNyNxT#vf~K+@xr6drZ&-aY9_it2Ib`B$opWZb?L(E{p%F~@Oub$ z6$u9lEnK*eIAR#e!UyyT!H!WvVjkwBO4DPYDXuZQ6)=Krv8e z*KsgWoQ_sp{|+2D&~&{{ojMuirj^?{38UWL%;AzsS6j)+$rK+SPoqbVrp=o-OD%wY z_`<$@`-Im+5IW7)f^R@jAA75OHGm>ZSBv27C;=TqrT)Es{kpN^g9i^b=E2Ez0n@&H zd&w7iBT#Q!1W;`GZWI|7RTYXD6h0{_DPrfYp%6v91_*OOL9e3~`k8B4Qob6%E3Xro zl{ReHFk)&h05lMo4O8WMtqTC$Y=~pOsU{HSQ;Ho|m6eqVC9kjGdK~}?89;>cL1FXH z=Vt#~`Ka*5KeO}yh*Oo13UB_Oif_pR`5{j=vLiP_%VlcsFG!e-{mvlDlv3mi4bID! z<9wUItTBpzo;7pD(XzR=j#g%ZBjJMN4{m=k6|MkbYX+?f|A}FJ()l@&8E=52&i@0G WusNbR&Ux4X0000%ghV_ literal 0 HcmV?d00001 diff --git a/app/chat-gpt/client/img/site.webmanifest b/app/chat-gpt/client/img/site.webmanifest new file mode 100644 index 0000000..f8eab4d --- /dev/null +++ b/app/chat-gpt/client/img/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/assets/img/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/assets/img/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/app/chat-gpt/client/img/user.png b/app/chat-gpt/client/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ada6311285bc0aa088d0640518af26916b837f GIT binary patch literal 1081 zcmV-91jhS`P)PAW6$w3oXj*L2fTM!`?6GLm5OL%F5mkii)E8QXh&wBte!` zTI4HHGo?){L(8|jiRrE{3^liVwl!2T_0FU_;16c!-kme>zlSsD+?k_5Hw*?tkRS-5 zCX-3crd}9avg5n3U7(DoFdB^} z$PfWCWk`5uSPW9ZFdsDj9}I(pROtgHcapy50&o>9N4oBZf-7+ z3duZP@U;XBS8qjqeIw%T-$Z$C3iKb-aQpH}D3v3zWc?20eky=eNRm~`%5@0VY{#{; zQCJ)p@K>A6?DyDr__TRZZZ6IcizFVubn6Zx)~@VPG%?3-1~zHbICADHq(HRCTUuH% zMHPbl^mq)nwfU!QLsJv{Lo~=vh=HA*9mF8o;{{)eFnOYPuc8U1y*->AMnm_l8e)+k zR22QP9z9BlM&^03h!*bZ;)K!)U7zjCDs}L59|N(77CwgMW>;q?B&KHcYMYRl3MU5# zxVc(MRylPj5>e-_La(pt(Z*O;kAo*JAu4h=q(Bnk^Zk7h8nO_pw(UiJVNsVdPh~$d zM~emO2y9rr0*itIAO(_cYoElwLiB~}@Njp9&-AHiYx{{0p9@jn(1<;oH3(<9UMeIJ z-gz_C(%OoQw_22$A6OG6d3#~nlu1yIw1J%YowBRwm}Jh!#6L7-|DHim_= zL(M9t&mYlbqguM&vM6zg5?)+dfu)+A*t;VFs@cB1+LO%|wxDIpMeK1 z;cwpMVLr*c zHqW~oP{WpbpO!Y_V7C%WD0whFu}Y;frSpYfd@p2O+I { + const option = document.createElement('option'); + option.value = lang; + option.textContent = lang; + languageSelect.appendChild(option); + }); + + const savedLanguage = localStorage.getItem("language") || currentLanguage; + setLanguageOnPageLoad(savedLanguage); + } catch (error) { + console.error("Failed to fetch languages or current language"); + } +} + +function setLanguageOnPageLoad(language) { + document.getElementById("language").value = language; +} + +function changeLanguage(lang) { + fetch(`${url_prefix}/change-language`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ language: lang }), + }).then((response) => { + if (response.ok) { + localStorage.setItem("language", lang); + location.reload(); + } else { + console.error("Failed to change language"); + } + }); +} diff --git a/app/chat-gpt/client/js/chat.js b/app/chat-gpt/client/js/chat.js new file mode 100644 index 0000000..8a4449e --- /dev/null +++ b/app/chat-gpt/client/js/chat.js @@ -0,0 +1,508 @@ +const query = (obj) => + Object.keys(obj) + .map((k) => encodeURIComponent(k) + "=" + encodeURIComponent(obj[k])) + .join("&"); +const url_prefix = document.querySelector("body").getAttribute("data-urlprefix"); +const markdown = window.markdownit(); +const message_box = document.getElementById(`messages`); +const message_input = document.getElementById(`message-input`); +const box_conversations = document.querySelector(`.top`); +const spinner = box_conversations.querySelector(".spinner"); +const stop_generating = document.querySelector(`.stop-generating`); +const send_button = document.querySelector(`#send-button`); +const user_image = `User Avatar`; +const gpt_image = `GPT Avatar`; +let prompt_lock = false; + +hljs.addPlugin(new CopyButtonPlugin()); + +message_input.addEventListener("blur", () => { + window.scrollTo(0, 0); +}); + +message_input.addEventListener("focus", () => { + document.documentElement.scrollTop = document.documentElement.scrollHeight; +}); + +const delete_conversations = async () => { + localStorage.clear(); + await new_conversation(); +}; + +const handle_ask = async () => { + message_input.style.height = `80px`; + window.scrollTo(0, 0); + let message = message_input.value; + + if (message.length > 0) { + message_input.value = ``; + message_input.dispatchEvent(new Event("input")); + await ask_gpt(message); + } +}; + +const remove_cancel_button = async () => { + stop_generating.classList.add(`stop-generating-hiding`); + + setTimeout(() => { + stop_generating.classList.remove(`stop-generating-hiding`); + stop_generating.classList.add(`stop-generating-hidden`); + }, 300); +}; + +const ask_gpt = async (message) => { + try { + message_input.value = ``; + message_input.innerHTML = ``; + message_input.innerText = ``; + + add_conversation(window.conversation_id, message.substr(0, 16)); + window.scrollTo(0, 0); + window.controller = new AbortController(); + + jailbreak = document.getElementById("jailbreak"); + model = document.getElementById("model"); + prompt_lock = true; + window.text = ``; + window.token = message_id(); + + stop_generating.classList.remove(`stop-generating-hidden`); + + add_user_message_box(message); + + message_box.scrollTop = message_box.scrollHeight; + window.scrollTo(0, 0); + await new Promise((r) => setTimeout(r, 500)); + window.scrollTo(0, 0); + + message_box.innerHTML += ` +
+
+ ${gpt_image} +
+
+
+
+
+ `; + + message_box.scrollTop = message_box.scrollHeight; + window.scrollTo(0, 0); + await new Promise((r) => setTimeout(r, 1000)); + window.scrollTo(0, 0); + + const response = await fetch(`${url_prefix}/backend-api/v2/conversation`, { + method: `POST`, + signal: window.controller.signal, + headers: { + "content-type": `application/json`, + accept: `text/event-stream`, + }, + body: JSON.stringify({ + conversation_id: window.conversation_id, + action: `_ask`, + model: model.options[model.selectedIndex].value, + jailbreak: jailbreak.options[jailbreak.selectedIndex].value, + meta: { + id: window.token, + content: { + conversation: await get_conversation(window.conversation_id), + internet_access: document.getElementById("switch").checked, + content_type: "text", + parts: [ + { + content: message, + role: "user", + }, + ], + }, + }, + }), + }); + + const reader = response.body.getReader(); + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + chunk = decodeUnicode(new TextDecoder().decode(value)); + + if ( + chunk.includes(`
{ + const messageDiv = createElement("div", { classNames: ["message"] }); + const avatarContainer = createElement("div", { classNames: ["avatar-container"], innerHTML: user_image }); + const contentDiv = createElement("div", { + classNames: ["content"], + id: `user_${token}`, + textContent: message, + }); + + messageDiv.append(avatarContainer, contentDiv); + message_box.appendChild(messageDiv); +}; + +const decodeUnicode = (str) => { + return str.replace(/\\u([a-fA-F0-9]{4})/g, function (match, grp) { + return String.fromCharCode(parseInt(grp, 16)); + }); +}; + +const clear_conversations = async () => { + const elements = box_conversations.childNodes; + let index = elements.length; + + if (index > 0) { + while (index--) { + const element = elements[index]; + if (element.nodeType === Node.ELEMENT_NODE && element.tagName.toLowerCase() !== `button`) { + box_conversations.removeChild(element); + } + } + } +}; + +const clear_conversation = async () => { + let messages = message_box.getElementsByTagName(`div`); + + while (messages.length > 0) { + message_box.removeChild(messages[0]); + } +}; + +const delete_conversation = async (conversation_id) => { + localStorage.removeItem(`conversation:${conversation_id}`); + + if (window.conversation_id == conversation_id) { + await new_conversation(); + } + + await load_conversations(20, 0, true); +}; + +const set_conversation = async (conversation_id) => { + history.pushState({}, null, `${url_prefix}/chat/${conversation_id}`); + window.conversation_id = conversation_id; + + await clear_conversation(); + await load_conversation(conversation_id); + await load_conversations(20, 0, true); +}; + +const new_conversation = async () => { + history.pushState({}, null, `${url_prefix}/chat/`); + window.conversation_id = uuid(); + + await clear_conversation(); + await load_conversations(20, 0, true); +}; + +const load_conversation = async (conversation_id) => { + let conversation = await JSON.parse(localStorage.getItem(`conversation:${conversation_id}`)); + console.log(conversation, conversation_id); + + for (item of conversation.items) { + if (is_assistant(item.role)) { + message_box.innerHTML += load_gpt_message_box(item.content); + } else { + message_box.innerHTML += load_user_message_box(item.content); + } + } + + document.querySelectorAll(`code`).forEach((el) => { + hljs.highlightElement(el); + }); + + message_box.scrollTo({ top: message_box.scrollHeight, behavior: "smooth" }); + + setTimeout(() => { + message_box.scrollTop = message_box.scrollHeight; + }, 500); +}; + +const load_user_message_box = (content) => { + const messageDiv = createElement("div", { classNames: ["message"] }); + const avatarContainer = createElement("div", { classNames: ["avatar-container"], innerHTML: user_image }); + const contentDiv = createElement("div", { classNames: ["content"] }); + const preElement = document.createElement("pre"); + preElement.textContent = content; + contentDiv.appendChild(preElement); + + messageDiv.append(avatarContainer, contentDiv); + + return messageDiv.outerHTML; +}; + +const load_gpt_message_box = (content) => { + return ` +
+
+ ${gpt_image} +
+
+ ${markdown.render(content)} +
+
+ `; +}; + +const is_assistant = (role) => { + return role == "assistant"; +}; + +const get_conversation = async (conversation_id) => { + let conversation = await JSON.parse(localStorage.getItem(`conversation:${conversation_id}`)); + return conversation.items; +}; + +const add_conversation = async (conversation_id, title) => { + if (localStorage.getItem(`conversation:${conversation_id}`) == null) { + localStorage.setItem( + `conversation:${conversation_id}`, + JSON.stringify({ + id: conversation_id, + title: title, + items: [], + }) + ); + } +}; + +const add_message = async (conversation_id, role, content) => { + before_adding = JSON.parse(localStorage.getItem(`conversation:${conversation_id}`)); + + before_adding.items.push({ + role: role, + content: content, + }); + + localStorage.setItem(`conversation:${conversation_id}`, JSON.stringify(before_adding)); // update conversation +}; + +const load_conversations = async (limit, offset, loader) => { + //console.log(loader); + //if (loader === undefined) box_conversations.appendChild(spinner); + + let conversations = []; + for (let i = 0; i < localStorage.length; i++) { + if (localStorage.key(i).startsWith("conversation:")) { + let conversation = localStorage.getItem(localStorage.key(i)); + conversations.push(JSON.parse(conversation)); + } + } + + //if (loader === undefined) spinner.parentNode.removeChild(spinner) + await clear_conversations(); + + for (conversation of conversations) { + box_conversations.innerHTML += ` +
+
+ + ${conversation.title} +
+ +
+ `; + } + + document.querySelectorAll(`code`).forEach((el) => { + hljs.highlightElement(el); + }); +}; + +document.getElementById(`cancelButton`).addEventListener(`click`, async () => { + window.controller.abort(); + console.log(`aborted ${window.conversation_id}`); +}); + +function h2a(str1) { + var hex = str1.toString(); + var str = ""; + + for (var n = 0; n < hex.length; n += 2) { + str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); + } + + return str; +} + +const uuid = () => { + return `xxxxxxxx-xxxx-4xxx-yxxx-${Date.now().toString(16)}`.replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +}; + +const message_id = () => { + random_bytes = (Math.floor(Math.random() * 1338377565) + 2956589730).toString(2); + unix = Math.floor(Date.now() / 1000).toString(2); + + return BigInt(`0b${unix}${random_bytes}`).toString(); +}; + +window.onload = async () => { + load_settings_localstorage(); + + conversations = 0; + for (let i = 0; i < localStorage.length; i++) { + if (localStorage.key(i).startsWith("conversation:")) { + conversations += 1; + } + } + + if (conversations == 0) localStorage.clear(); + + await setTimeout(() => { + load_conversations(20, 0); + }, 1); + + if (!window.location.href.endsWith(`#`)) { + if (/\/chat\/.+/.test(window.location.href.slice(url_prefix.length))) { + await load_conversation(window.conversation_id); + } + } + + message_input.addEventListener("keydown", async (evt) => { + if (prompt_lock) return; + + if (evt.key === "Enter" && !evt.shiftKey) { + evt.preventDefault(); + await handle_ask(); + } + }); + + send_button.addEventListener("click", async (event) => { + event.preventDefault(); + if (prompt_lock) return; + message_input.blur(); + await handle_ask(); + }); + + register_settings_localstorage(); +}; + +const register_settings_localstorage = async () => { + settings_ids = ["switch", "model", "jailbreak"]; + settings_elements = settings_ids.map((id) => document.getElementById(id)); + settings_elements.map((element) => + element.addEventListener(`change`, async (event) => { + switch (event.target.type) { + case "checkbox": + localStorage.setItem(event.target.id, event.target.checked); + break; + case "select-one": + localStorage.setItem(event.target.id, event.target.selectedIndex); + break; + default: + console.warn("Unresolved element type"); + } + }) + ); +}; + +const load_settings_localstorage = async () => { + settings_ids = ["switch", "model", "jailbreak"]; + settings_elements = settings_ids.map((id) => document.getElementById(id)); + settings_elements.map((element) => { + if (localStorage.getItem(element.id)) { + switch (element.type) { + case "checkbox": + element.checked = localStorage.getItem(element.id) === "true"; + break; + case "select-one": + element.selectedIndex = parseInt(localStorage.getItem(element.id)); + break; + default: + console.warn("Unresolved element type"); + } + } + }); +}; + +function clearTextarea(textarea) { + textarea.style.removeProperty("height"); + textarea.style.height = `${textarea.scrollHeight + 4}px`; + if (textarea.value.trim() === "" && textarea.value.includes("\n")) { + textarea.value = ""; + } +} + +function createElement(tag, { classNames, id, innerHTML, textContent } = {}) { + const el = document.createElement(tag); + if (classNames) { + el.classList.add(...classNames); + } + if (id) { + el.id = id; + } + if (innerHTML) { + el.innerHTML = innerHTML; + } + if (textContent) { + const preElement = document.createElement("pre"); + preElement.textContent = textContent; + el.appendChild(preElement); + } + return el; +} diff --git a/app/chat-gpt/client/js/highlight.min.js b/app/chat-gpt/client/js/highlight.min.js new file mode 100644 index 0000000..d410b45 --- /dev/null +++ b/app/chat-gpt/client/js/highlight.min.js @@ -0,0 +1 @@ +var hljs=function(){"use strict";var e={exports:{}};function n(e){return e instanceof Map?e.clear=e.delete=e.set=()=>{throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{throw Error("set is read-only")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{var a=e[t];"object"!=typeof a||Object.isFrozen(a)||n(a)}),e}e.exports=n,e.exports.default=n;class t{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function a(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function i(e,...n){let t=Object.create(null);for(let a in e)t[a]=e[a];return n.forEach(e=>{for(let n in e)t[n]=e[n]}),t}let r=e=>!!e.scope||e.sublanguage&&e.language;class s{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=a(e)}openNode(e){if(!r(e))return;let n="";n=e.sublanguage?"language-"+e.language:((e,{prefix:n})=>{if(e.includes(".")){let t=e.split(".");return[`${n}${t.shift()}`,...t.map((e,n)=>`${e}${"_".repeat(n+1)}`),].join(" ")}return`${n}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(n)}closeNode(e){r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){this.buffer+=``}}let l=(e={})=>{let n={children:[]};return Object.assign(n,e),n};class o{constructor(){this.rootNode=l(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let n=l({scope:e});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{o._collapse(e)}))}}class c extends o{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){let t=e.root;t.sublanguage=!0,t.language=n,this.add(t)}toHTML(){return new s(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}function g(e){return m("(?=",e,")")}function u(e){return m("(?:",e,")*")}function b(e){return m("(?:",e,")?")}function m(...e){return e.map(e=>d(e)).join("")}function p(...e){let n=(e=>{let n=e[e.length-1];return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{}})(e);return"("+(n.capture?"":"?:")+e.map(e=>d(e)).join("|")+")"}function h(e){return RegExp(e.toString()+"|").exec("").length-1}let f=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function E(e,{joinWith:n}){let t=0;return e.map(e=>{t+=1;let n=t,a=d(e),i="";for(;a.length>0;){let r=f.exec(a);if(!r){i+=a;break}i+=a.substring(0,r.index),a=a.substring(r.index+r[0].length),"\\"===r[0][0]&&r[1]?i+="\\"+(Number(r[1])+n):(i+=r[0],"("===r[0]&&t++)}return i}).map(e=>`(${e})`).join(n)}let $="[a-zA-Z]\\w*",y="[a-zA-Z_]\\w*",N="\\b\\d+(\\.\\d+)?",w="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",x={begin:"\\\\[\\s\\S]",relevance:0},k=(e,n,t={})=>{let a=i({scope:"comment",begin:e,end:n,contains:[]},t);a.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let r=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return a.contains.push({begin:m(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a},M=k("//","$"),O=k("/\\*","\\*/"),S=k("#","$");var A=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:$,UNDERSCORE_IDENT_RE:y,NUMBER_RE:N,C_NUMBER_RE:w,BINARY_NUMBER_RE:v,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG(e={}){let n=/^#![ ]*\//;return e.binary&&(e.begin=m(n,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:n,end:/$/,relevance:0,"on:begin"(e,n){0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:x,APOS_STRING_MODE:{scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[x]},QUOTE_STRING_MODE:{scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[x]},PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT:k,C_LINE_COMMENT_MODE:M,C_BLOCK_COMMENT_MODE:O,HASH_COMMENT_MODE:S,NUMBER_MODE:{scope:"number",begin:N,relevance:0},C_NUMBER_MODE:{scope:"number",begin:w,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[x,{begin:/\[/,end:/\]/,relevance:0,contains:[x]},]},]},TITLE_MODE:{scope:"title",begin:$,relevance:0},UNDERSCORE_TITLE_MODE:{scope:"title",begin:y,relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{"on:begin"(e,n){n.data._beginMatch=e[1]},"on:end"(e,n){n.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function C(e,n){"."===e.input[e.index-1]&&n.ignoreMatch()}function T(e,n){void 0!==e.className&&(e.scope=e.className,delete e.className)}function R(e,n){n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=C,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,void 0===e.relevance&&(e.relevance=0))}function D(e,n){Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function I(e,n){if(e.match){if(e.begin||e.end)throw Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function L(e,n){void 0===e.relevance&&(e.relevance=1)}let B=(e,n)=>{if(!e.beforeMatch)return;if(e.starts)throw Error("beforeMatch cannot be used with starts");let t=Object.assign({},e);Object.keys(e).forEach(n=>{delete e[n]}),e.keywords=t.keywords,e.begin=m(t.beforeMatch,g(t.begin)),e.starts={relevance:0,contains:[Object.assign(t,{endsParent:!0})]},e.relevance=0,delete t.beforeMatch},_=["of","and","for","in","not","or","if","then","parent","list","value",],z={},F=e=>{console.error(e)},U=(e,...n)=>{},P=(e,n)=>{z[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),z[`${e}/${n}`]=!0)},j=Error();function K(e,n,{key:t}){let a=0,i=e[t],r={},s={};for(let l=1;l<=n.length;l++)s[l+a]=i[l],r[l+a]=!0,a+=h(n[l-1]);e[t]=s,e[t]._emit=r,e[t]._multi=!0}function q(e){var n;(n=e).scope&&"object"==typeof n.scope&&null!==n.scope&&(n.beginScope=n.scope,delete n.scope),"string"==typeof e.beginScope&&(e.beginScope={_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope}),(e=>{if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw F("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),j;if("object"!=typeof e.beginScope||null===e.beginScope)throw F("beginScope must be object"),j;K(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw F("skip, excludeEnd, returnEnd not compatible with endScope: {}"),j;if("object"!=typeof e.endScope||null===e.endScope)throw F("endScope must be object"),j;K(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}class H extends Error{constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}}let Z=a,G=i,W=Symbol("nomatch");var Q=(n=>{let a=Object.create(null),r=Object.create(null),s=[],l=!0,o="Could not find the language '{}', did you forget to load/include a language module?",f={disableAutodetect:!0,name:"Plain text",contains:[]},$={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:c};function y(e){return $.noHighlightRe.test(e)}function N(e,n,t){let a="",i="";"object"==typeof n?(a=e,t=n.ignoreIllegals,i=n.language):(P("10.7.0","highlight(lang, code, ...args) has been deprecated."),P("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),i=e,a=n),void 0===t&&(t=!0);let r={code:a,language:i};z("before:highlight",r);let s=r.result?r.result:w(r.language,r.code,t);return s.code=r.code,z("after:highlight",s),s}function w(e,n,r,s){let c=Object.create(null);function g(){var e;if(!M.keywords)return void A.addText(C);let n=0;M.keywordPatternRe.lastIndex=0;let t=M.keywordPatternRe.exec(C),a="";for(;t;){a+=C.substring(n,t.index);let i=N.case_insensitive?t[0].toLowerCase():t[0],r=(e=i,M.keywords[e]);if(r){let[s,l]=r;if(A.addText(a),a="",c[i]=(c[i]||0)+1,c[i]<=7&&(z+=l),s.startsWith("_"))a+=t[0];else{let o=N.classNameAliases[s]||s;A.addKeyword(t[0],o)}}else a+=t[0];n=M.keywordPatternRe.lastIndex,t=M.keywordPatternRe.exec(C)}a+=C.substring(n),A.addText(a)}function u(){null!=M.subLanguage?(()=>{if(""===C)return;let e=null;if("string"==typeof M.subLanguage){if(!a[M.subLanguage])return void A.addText(C);e=w(M.subLanguage,C,!0,S[M.subLanguage]),S[M.subLanguage]=e._top}else e=v(C,M.subLanguage.length?M.subLanguage:null);M.relevance>0&&(z+=e.relevance),A.addSublanguage(e._emitter,e.language)})():g(),C=""}function b(e,n){let t=1,a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue}let i=N.classNameAliases[e[t]]||e[t],r=n[t];i?A.addKeyword(r,i):(C=r,g(),C=""),t++}}function m(e,n){return e.scope&&"string"==typeof e.scope&&A.openNode(N.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(A.addKeyword(C,N.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),C=""):e.beginScope._multi&&(b(e.beginScope,n),C="")),M=Object.create(e,{parent:{value:M}})}function p(e){return 0===M.matcher.regexIndex?(C+=e[0],1):(j=!0,0)}let f={};function y(a,i){let s=i&&i[0];if(C+=a,null==s)return u(),0;if("begin"===f.type&&"end"===i.type&&f.index===i.index&&""===s){if(C+=n.slice(i.index,i.index+1),!l){let o=Error(`0 width match regex (${e})`);throw o.languageName=e,o.badRule=f.rule,o}return 1}if(f=i,"begin"===i.type)return(e=>{let n=e[0],a=e.rule,i=new t(a),r=[a.__beforeBegin,a["on:begin"]];for(let s of r)if(s&&(s(e,i),i.isMatchIgnored))return p(n);return a.skip?C+=n:(a.excludeBegin&&(C+=n),u(),a.returnBegin||a.excludeBegin||(C=n)),m(a,e),a.returnBegin?0:n.length})(i);if("illegal"===i.type&&!r){let c=Error('Illegal lexeme "'+s+'" for mode "'+(M.scope||"")+'"');throw c.mode=M,c}if("end"===i.type){let d=function e(a){let i=a[0],r=n.substring(a.index),s=function e(n,a,i){let r=((e,n)=>{let t=e&&e.exec(n);return t&&0===t.index})(n.endRe,i);if(r){if(n["on:end"]){let s=new t(n);n["on:end"](a,s),s.isMatchIgnored&&(r=!1)}if(r){for(;n.endsParent&&n.parent;)n=n.parent;return n}}if(n.endsWithParent)return e(n.parent,a,i)}(M,a,r);if(!s)return W;let l=M;M.endScope&&M.endScope._wrap?(u(),A.addKeyword(i,M.endScope._wrap)):M.endScope&&M.endScope._multi?(u(),b(M.endScope,a)):l.skip?C+=i:(l.returnEnd||l.excludeEnd||(C+=i),u(),l.excludeEnd&&(C=i));do M.scope&&A.closeNode(),M.skip||M.subLanguage||(z+=M.relevance),M=M.parent;while(M!==s.parent);return s.starts&&m(s.starts,a),l.returnEnd?0:i.length}(i);if(d!==W)return d}if("illegal"===i.type&&""===s)return 1;if(P>1e5&&P>3*i.index)throw Error("potential infinite loop, way more iterations than matches");return C+=s,s.length}let N=O(e);if(!N)throw F(o.replace("{}",e)),Error('Unknown language: "'+e+'"');let x=function e(n){function t(e,t){return RegExp(d(e),"m"+(n.case_insensitive?"i":"")+(n.unicodeRegex?"u":"")+(t?"g":""))}class a{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=h(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(E(e,{joinWith:"|"}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let n=this.matcherRe.exec(e);if(!n)return null;let t=n.findIndex((e,n)=>n>0&&void 0!==e),a=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,a)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let n=new a;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){let n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;let t=n.exec(e);if(this.resumingScanAtSamePosition()){if(t&&t.index===this.lastIndex);else{let a=this.getMatcher(0);a.lastIndex=this.lastIndex+1,t=a.exec(e)}}return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&this.considerAll()),t}}if(n.compilerExtensions||(n.compilerExtensions=[]),n.contains&&n.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return n.classNameAliases=i(n.classNameAliases||{}),function e(a,s){let l=a;if(a.isCompiled)return l;[T,I,q,B].forEach(e=>e(a,s)),n.compilerExtensions.forEach(e=>e(a,s)),a.__beforeBegin=null,[R,D,L].forEach(e=>e(a,s)),a.isCompiled=!0;let o=null;return"object"==typeof a.keywords&&a.keywords.$pattern&&(a.keywords=Object.assign({},a.keywords),o=a.keywords.$pattern,delete a.keywords.$pattern),o=o||/\w+/,a.keywords&&(a.keywords=function e(n,t,a="keyword"){let i=Object.create(null);return"string"==typeof n?r(a,n.split(" ")):Array.isArray(n)?r(a,n):Object.keys(n).forEach(a=>{Object.assign(i,e(n[a],t,a))}),i;function r(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(n=>{var t,a,r;let s=n.split("|");i[s[0]]=[e,(t=s[0],a=s[1],a?Number(a):(r=t,_.includes(r.toLowerCase()))?0:1)]})}}(a.keywords,n.case_insensitive)),l.keywordPatternRe=t(o,!0),s&&(a.begin||(a.begin=/\B|\b/),l.beginRe=t(l.begin),a.end||a.endsWithParent||(a.end=/\B|\b/),a.end&&(l.endRe=t(l.end)),l.terminatorEnd=d(l.end)||"",a.endsWithParent&&s.terminatorEnd&&(l.terminatorEnd+=(a.end?"|":"")+s.terminatorEnd)),a.illegal&&(l.illegalRe=t(a.illegal)),a.contains||(a.contains=[]),a.contains=[].concat(...a.contains.map(e=>{var n;return(n="self"===e?a:e).variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(e=>i(n,{variants:null},e))),n.cachedVariants?n.cachedVariants:!function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(n)?Object.isFrozen(n)?i(n):n:i(n,{starts:n.starts?i(n.starts):null})})),a.contains.forEach(n=>{e(n,l)}),a.starts&&e(a.starts,s),l.matcher=(e=>{let n=new r;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(l),l}(n)}(N),k="",M=s||x,S={},A=new $.__emitter($);(()=>{let e=[];for(let n=M;n!==N;n=n.parent)n.scope&&e.unshift(n.scope);e.forEach(e=>A.openNode(e))})();let C="",z=0,U=0,P=0,j=!1;try{for(M.matcher.considerAll();;){P++,j?j=!1:M.matcher.considerAll(),M.matcher.lastIndex=U;let K=M.matcher.exec(n);if(!K)break;let H=y(n.substring(U,K.index),K);U=K.index+H}return y(n.substring(U)),A.closeAllNodes(),A.finalize(),k=A.toHTML(),{language:e,value:k,relevance:z,illegal:!1,_emitter:A,_top:M}}catch(G){if(G.message&&G.message.includes("Illegal"))return{language:e,value:Z(n),illegal:!0,relevance:0,_illegalBy:{message:G.message,index:U,context:n.slice(U-100,U+100),mode:G.mode,resultSoFar:k},_emitter:A};if(l)return{language:e,value:Z(n),illegal:!1,relevance:0,errorRaised:G,_emitter:A,_top:M};throw G}}function v(e,n){n=n||$.languages||Object.keys(a);let t=(e=>{let n={value:Z(e),illegal:!1,relevance:0,_top:f,_emitter:new $.__emitter($)};return n._emitter.addText(e),n})(e),i=n.filter(O).filter(C).map(n=>w(n,e,!1));i.unshift(t);let r=i.sort((e,n)=>{if(e.relevance!==n.relevance)return n.relevance-e.relevance;if(e.language&&n.language){if(O(e.language).supersetOf===n.language)return 1;if(O(n.language).supersetOf===e.language)return -1}return 0}),[s,l]=r,o=s;return o.secondBest=l,o}function x(e){let n=null,t=(e=>{let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";let t=$.languageDetectRe.exec(n);if(t){let a=O(t[1]);return a||(U(o.replace("{}",t[1])),U("Falling back to no-highlight mode for this block.",e)),a?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>y(e)||O(e))})(e);if(y(t))return;if(z("before:highlightElement",{el:e,language:t}),e.children.length>0&&($.ignoreUnescapedHTML||$.throwUnescapedHTML))throw new H("One of your code blocks includes unescaped HTML.",e.innerHTML);n=e;let a=n.textContent,i=t?N(a,{language:t,ignoreIllegals:!0}):v(a);e.innerHTML=i.value,((e,n,t)=>{let a=n&&r[n]||t;e.classList.add("hljs"),e.classList.add("language-"+a)})(e,t,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),z("after:highlightElement",{el:e,result:i,text:a})}let k=!1;function M(){"loading"!==document.readyState?document.querySelectorAll($.cssSelector).forEach(x):k=!0}function O(e){return a[e=(e||"").toLowerCase()]||a[r[e]]}function S(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{r[e.toLowerCase()]=n})}function C(e){let n=O(e);return n&&!n.disableAutodetect}function z(e,n){let t=e;s.forEach(e=>{e[t]&&e[t](n)})}for(let j in"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",()=>{k&&M()},!1),Object.assign(n,{highlight:N,highlightAuto:v,highlightAll:M,highlightElement:x,highlightBlock:e=>(P("10.7.0","highlightBlock will be removed entirely in v12.0"),P("10.7.0","Please use highlightElement now."),x(e)),configure(e){$=G($,e)},initHighlighting(){M(),P("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad(){M(),P("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage(e,t){let i=null;try{i=t(n)}catch(r){if(F("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw r;F(r),i=f}i.name||(i.name=e),a[e]=i,i.rawDefinition=t.bind(null,n),i.aliases&&S(i.aliases,{languageName:e})},unregisterLanguage(e){for(let n of(delete a[e],Object.keys(r)))r[n]===e&&delete r[n]},listLanguages:()=>Object.keys(a),getLanguage:O,registerAliases:S,autoDetection:C,inherit:G,addPlugin(e){var n;(n=e)["before:highlightBlock"]&&!n["before:highlightElement"]&&(n["before:highlightElement"]=e=>{n["before:highlightBlock"](Object.assign({block:e.el},e))}),n["after:highlightBlock"]&&!n["after:highlightElement"]&&(n["after:highlightElement"]=e=>{n["after:highlightBlock"](Object.assign({block:e.el},e))}),s.push(e)}}),n.debugMode=()=>{l=!1},n.safeMode=()=>{l=!0},n.versionString="11.7.0",n.regex={concat:m,lookahead:g,either:p,optional:b,anyNumberOfTimes:u},A)"object"==typeof A[j]&&e.exports(A[j]);return Object.assign(n,A),n})({});let X=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),V=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video",],J=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height",],Y=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where",],ee=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error",],en=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index",].reverse(),et=Y.concat(ee);var ea="\\.([0-9](_*[0-9])*)",ei="[0-9a-fA-F](_*[0-9a-fA-F])*",er={className:"number",variants:[{begin:`(\\b([0-9](_*[0-9])*)((${ea})|\\.)?|(${ea}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`},{begin:`\\b([0-9](_*[0-9])*)((${ea})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${ea})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{begin:`\\b0[xX]((${ei})\\.?|(${ei})?\\.(${ei}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${ei})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"},],relevance:0};let es="[A-Za-z$_][0-9A-Za-z$_]*",el=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends",],eo=["true","false","null","undefined","NaN","Infinity"],ec=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly",],ed=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError",],eg=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape",],eu=["arguments","this","super","console","window","document","localStorage","module","global",],eb=[].concat(eg,ec,ed);function em(e){var n;let t=e.regex,a=es,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag(e,n){let t=e[0].length+e.index,a=e.input[t];if("<"===a||","===a)return void n.ignoreMatch();let i;">"===a&&(((e,{after:n})=>{let t="",v={match:[/const|var|let/,/\s+/,a,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(w),],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:r,exports:{PARAMS_CONTAINS:h,CLASS_REFERENCE:$},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,{match:/\$\d+/},o,$,{className:"attr",begin:a+t.lookahead(":"),relevance:0},v,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[b,e.REGEXP_MODE,{className:"function",begin:w,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:r,contains:h},]},]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end},],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]},]},]},{variants:[{match:[/function/,/\s+/,a,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]},],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[f],illegal:/%/},{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:a,className:"title.function"}),]},{match:/\.\.\./,relevance:0},N,{match:"\\$"+a,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[f]},y,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},E,{match:[/get|set/,/\s+/,a,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},f]},{match:/\$[(.]/},]}}let ep=e=>m(/\b/,e,/\w$/.test(e)?/\b/:/\B/),e8=["Protocol","Type"].map(ep),eh=["init","self"].map(ep),ef=["Any","Self"],eE=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet",],e$=["false","nil","true"],ey=["assignment","associativity","higherThan","left","lowerThan","none","right",],eN=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning",],ew=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip",],ev=p(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),ex=p(ev,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),ek=m(ev,ex,"*"),eM=p(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),eO=p(eM,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),eS=m(eM,eO,"*"),eA=m(/[A-Z]/,eO,"*"),eC=["autoclosure",m(/convention\(/,p("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",m(/objc\(/,eS,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline",],eT=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift",];var eR=Object.freeze({__proto__:null,grmr_bash(e){let n=e.regex,t={};Object.assign(t,{className:"variable",variants:[{begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},{begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]},]});let a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"}),]}},r={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(r);let s={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t,]},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),o={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function",],literal:["true","false"],built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes",]},contains:[l,e.SHEBANG(),o,s,e.HASH_COMMENT_MODE,i,{match:/(\/[a-z._-]+)+/},r,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t,]}},grmr_c(e){let n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/},]},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/}),]},l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"},],relevance:0},o={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE,]},c={className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma",],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary",],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},u=[o,r,t,e.C_BLOCK_COMMENT_MODE,l,s],b={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/},],keywords:g,contains:u.concat([{begin:/\(/,end:/\)/,keywords:g,contains:u.concat(["self"]),relevance:0},]),relevance:0},m={begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)",keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(c,{className:"title.function"}),],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,s,l,r,{begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,l,r]},]},r,t,e.C_BLOCK_COMMENT_MODE,o,]};return{name:"C",aliases:["h"],keywords:g,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE,]},]),exports:{preprocessor:o,strings:s,keywords:g}}},grmr_cpp(e){let n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),a="[a-zA-Z_]\\w*::",i="(?!struct)(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/}),]},l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"},],relevance:0},o={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE,]},c={className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static",],keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq",],literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view",]},u={className:"function.dispatch",relevance:0,keywords:{_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf",]},begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/))},b=[u,o,r,t,e.C_BLOCK_COMMENT_MODE,l,s],m={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/},],keywords:g,contains:b.concat([{begin:/\(/,end:/\)/,keywords:g,contains:b.concat(["self"]),relevance:0},]),relevance:0},p={className:"function",begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)",keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[c],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,l]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,s,l,r,{begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,l,r]},]},r,t,e.C_BLOCK_COMMENT_MODE,o,]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:g,illegal:"",keywords:g,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:g},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/,],className:{1:"keyword",3:"title.class"}},])}},grmr_csharp(e){let n={keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while",].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield",]),built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort",],literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"},],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/,keywords:n},l=e.inherit(s,{illegal:/\n/}),o={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},e.BACKSLASH_ESCAPE,l,]},c={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s,]},d=e.inherit(c,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]});s.contains=[c,o,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE,],l.contains=[d,o,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/}),];let g={variants:[c,o,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t]},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""},]},]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/},]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial",relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[g,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,]},m,]}},grmr_css(e){let n=e.regex,t=X(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Y.join("|")+")"},{begin:":(:)?("+ee.join("|")+")"},]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+en.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0},]},t.FUNCTION_DISPATCH,]},{begin:n.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:J.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE,]},]},{className:"selector-tag",begin:"\\b("+V.join("|")+")\\b"},]}},grmr_diff(e){let n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/},]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/},]}},grmr_go(e){let n={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var",],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune",],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete",]};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n,t,a-1))}("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits",],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double",],built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{begin:/\(/,end:/\)/,contains:["self"]},]},s={className:"params",begin:/\(/,end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"},]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t,],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword",3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:i,relevance:0,contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,er,e.C_BLOCK_COMMENT_MODE,]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,]},er,r,]}},grmr_javascript:em,grmr_json(e){let n=["true","false","null"],t={scope:"literal",beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,],illegal:"\\S"}},grmr_kotlin(e){let n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,i,a]},]};a.contains.push(r);let s={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]},]},o=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),c={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]},]},d=c;return d.variants[1].contains=[c],c.variants[1].contains=[d],{name:"Kotlin",aliases:["kt","kts"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,o,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},t,s,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[c,e.C_LINE_COMMENT_MODE,o],relevance:0},e.C_LINE_COMMENT_MODE,o,s,l,r,e.C_NUMBER_MODE,]},o,]},{begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},s,l,]},r,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},er,]}},grmr_less(e){let n=X(e),t="([\\w-]+|@\\{[\\w-]+\\})",a=[],i=[],r=e=>({className:"string",begin:"~?"+e+".*?"+e}),s=(e,n,t)=>({className:e,begin:n,relevance:t}),l={$pattern:/[a-z-]+/,keyword:"and or not only",attribute:J.join(" ")};i.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,r("'"),r('"'),n.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},n.HEXCOLOR,{begin:"\\(",end:"\\)",contains:i,keywords:l,relevance:0},s("variable","@@?[\\w-]+",10),s("variable","@\\{[\\w-]+\\}"),s("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);let o=i.concat({begin:/\{/,end:/\}/,contains:a}),c={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(i)},d={begin:t+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+en.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:i}},]},g={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:t,end:/\{/},],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,c,s("keyword","all\\b"),s("variable","@\\{[\\w-]+\\}"),{begin:"\\b("+V.join("|")+")\\b",className:"selector-tag"},n.CSS_NUMBER_MODE,s("selector-tag",t,0),s("selector-id","#"+t),s("selector-class","\\."+t,0),s("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+Y.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+ee.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:o},{begin:"!important"},n.FUNCTION_DISPATCH,]},u={begin:`[\\w-]+:(:)?(${et.join("|")})`,returnBegin:!0,contains:[g]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:l,returnEnd:!0,contains:i,relevance:0}},{className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"},],starts:{end:"[;}]",returnEnd:!0,contains:o}},u,d,g,c,n.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}},grmr_lua(e){let n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"]},i=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",t,{contains:[a],relevance:10}),];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i},].concat(i)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:n,end:t,contains:[a],relevance:5},])}},grmr_makefile(e){let n={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/},]},]},]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg",],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,l,s,r,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[i,r,l,s]},]},]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/},]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[o],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[o],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:n.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:o},]},{className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0},]},]}},grmr_markdown(e){let n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0},],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0},]},a={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/},]},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0},]},r=e.inherit(a,{contains:[]}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r);let l=[n,t];return[a,i,r,s].forEach(e=>{e.contains=e.contains.concat(l)}),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:l=l.concat(a,i)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:l},]},]},n,{className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:l,end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0},]},{begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0},]},]}},grmr_objectivec(e){let n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:{"variable.language":["this","super"],$pattern:n,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN",],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL",],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once",],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool",]},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,]},{className:"class",begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0},]}},grmr_perl(e){let n=e.regex,t=/[dualxmsipngr]{0,12}/,a={$pattern:/[\w.]+/,keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0"},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/,end:/\}/},s={variants:[{begin:/\$\d/},{begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@][^\s\w{]/,relevance:0},]},l=[e.BACKSLASH_ESCAPE,i,s],o=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{let r="\\1"===i?i:n.concat(i,a);return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t)},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),r,{className:"string",contains:l,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0},]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:c("s|tr|y",n.either(...o,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")},],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...o,{capture:!0}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{begin:d("m|qr",/\{/,/\}/)},]},]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]},];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a,contains:g}},grmr_php(e){let n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/},]},l=e.inherit(e.APOS_STRING_MODE,{illegal:null}),o="[ \n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),l,e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),]},d={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"},],relevance:0},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield",],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass",],m={keyword:u,literal:(e=>{let n=[];return e.forEach(e=>{n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase())}),n})(g),built_in:b},p=e=>e.map(e=>e.replace(/\|\d+$/,"")),h={variants:[{match:[/new/,n.concat(o,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i,],scope:{1:"keyword",4:"title.class"}},]},f=n.concat(a,"\\b(?!\\()"),E={variants:[{match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),f],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),f],scope:{1:"title.class",3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class",3:"variable.language"}},]},$={scope:"attr",match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0,begin:/\(/,end:/\)/,keywords:m,contains:[$,r,E,e.C_BLOCK_COMMENT_MODE,c,d,h]},N={relevance:0,match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(o,"*"),n.lookahead(/(?=\()/),],scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N);let w=[$,E,e.C_BLOCK_COMMENT_MODE,c,d,h];return{case_insensitive:!1,keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]},contains:["self",...w]},...w,{scope:"meta",match:i},]},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"},]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/},]},{scope:"variable.language",match:/\$this\b/},r,N,E,{match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},h,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m,contains:["self",r,E,e.C_BLOCK_COMMENT_MODE,c,d]},]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/},],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE,]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"}),]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE,]},c,d,]}},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),]},]}),grmr_plaintext:e=>({name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}),grmr_python(e){let n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield",],i={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip",],literal:["__debug__","Ellipsis","False","None","NotImplemented","True",],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union",]},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/,end:/\}/,keywords:i,illegal:/#/},l={begin:/\{\{/,relevance:0},o={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,r,l,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,l,s]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,l,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,l,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,]},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={className:"number",relevance:0,variants:[{begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})`},]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0},]},m={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,u,o,e.HASH_COMMENT_MODE]},]};return s.contains=[o,u,r],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i,illegal:/(<\/|->|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},o,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[m]},{variants:[{match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]},],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,o]},]}},grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/},]},]}),grmr_r(e){let n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:t,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0},]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/},]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0},]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]},]},{scope:{3:"operator"},match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{match:/%[^%]*%/},]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`",contains:[{begin:/\\./}]},]}},grmr_ruby(e){let n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw",],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function",],literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},l={begin:"#<",end:">"},o=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE),],c={className:"subst",begin:/#\{/,end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]}),]},]},g="[0-9](_?[0-9])*",u={className:"number",relevance:0,variants:[{begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"},]},b={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:r},]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{match:[/\b(class|module)\s+/,i]},],scope:{2:"title.class",4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"},]},].concat(l,o),relevance:0},].concat(l,o);return c.contains=m,b.contains=m,o.unshift(l),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat([{begin:/^\s*=>/,starts:{end:"$",contains:m}},{className:"meta.prompt",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",starts:{end:"$",keywords:r,contains:m}},]).concat(o).concat(m)}},grmr_rust(e){let n=e.regex,t={className:"title.function.invoke",relevance:0,begin:n.concat(/\b/,/(?!let\b)/,e.IDENT_RE,n.lookahead(/\s*\(/))},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!",],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec",];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r,keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield",],literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t,]}},grmr_scss(e){let n=X(e),t="@[a-z-]+",a={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+V.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+Y.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+ee.join("|")+")"},a,{begin:/\(/,end:/\)/,contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+en.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[n.BLOCK_COMMENT,a,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH,]},{begin:"@(page|font-face)",keywords:{$pattern:t,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:J.join(" ")},contains:[{begin:t,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},a,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE,]},n.FUNCTION_DISPATCH,]}},grmr_shell:e=>({name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}},]}),grmr_sql(e){let n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary",],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket",],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first",],l=r,o=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view",].filter(e=>!r.includes(e)),c={begin:n.concat(/\b/,n.either(...l),/\s*\(/),relevance:0,keywords:{built_in:l}};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{let a=t;return n=n||[],e.map(e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)})(o,{when:e=>e.length<3}),literal:a,type:i,built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp",]},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/,keyword:o.concat(s),literal:a,type:i}},{className:"type",begin:n.either("double precision","large object","with timezone","without timezone")},c,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]},]},{begin:/"/,end:/"/,contains:[{begin:/""/},]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},]}},grmr_swift(e){let n={match:/\s+/,relevance:0},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={match:[/\./,p(...e8,...eh)],className:{2:"keyword"}},r={match:m(/\./,p(...eE)),relevance:0},s=eE.filter(e=>"string"==typeof e).concat(["_|0"]),l={variants:[{className:"keyword",match:p(...eE.filter(e=>"string"!=typeof e).concat(ef).map(ep),...eh)},]},o={$pattern:p(/\b\w+/,/#\w+/),keyword:s.concat(eN),literal:e$},c=[i,r,l],d=[{match:m(/\./,p(...ew)),relevance:0},{className:"built_in",match:m(/\b/,p(...ew),/(?=\()/)},],u={match:/->/,relevance:0},b=[u,{className:"operator",relevance:0,variants:[{match:ek},{match:`\\.(\\.|${ex})+`}]},],h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0,variants:[{match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(([0-9]_*)+))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/},]},E=(e="")=>({className:"subst",variants:[{match:m(/\\/,e,/[0\\tnr"']/)},{match:m(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)},]}),$=(e="")=>({className:"subst",match:m(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),y=(e="")=>({className:"subst",label:"interpol",begin:m(/\\/,e,/\(/),end:/\)/}),N=(e="")=>({begin:m(e,/"""/),end:m(/"""/,e),contains:[E(e),$(e),y(e)]}),w=(e="")=>({begin:m(e,/"/),end:m(/"/,e),contains:[E(e),y(e)]}),v={className:"string",variants:[N(),N("#"),N("##"),N("###"),w(),w("#"),w("##"),w("###"),]},x={match:m(/`/,eS,/`/)},k=[x,{className:"variable",match:/\$\d+/},{className:"variable",match:`\\$${eO}+`},],M=[{match:/(@|#(un)?)available/,className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:eT,contains:[...b,f,v]},]}},{className:"keyword",match:m(/@/,p(...eC))},{className:"meta",match:m(/@/,eS)},],O={match:g(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:m(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,eO,"+")},{className:"type",match:eA,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:m(/\s+&\s+/,g(eA)),relevance:0},]};O.contains.push({begin://,keywords:o,contains:[...a,...c,...M,u,O]});let S={begin:/\(/,end:/\)/,relevance:0,keywords:o,contains:["self",{match:m(eS,/\s*:/),keywords:"_|0",relevance:0},...a,...c,...d,...b,f,v,...k,...M,O,]},A={begin://,contains:[...a,O]},C={begin:/\(/,end:/\)/,keywords:o,contains:[{begin:p(g(m(eS,/\s*:/)),g(m(eS,/\s+/,eS,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:eS},]},...a,...c,...b,f,v,...M,O,S,],endsParent:!0,illegal:/["']/},T={match:[/func/,/\s+/,p(x.match,eS,ek)],className:{1:"keyword",3:"title.function"},contains:[A,C,n],illegal:[/\[/,/%/]};for(let R of v.variants){let D=R.contains.find(e=>"interpol"===e.label);D.keywords=o;let I=[...c,...d,...b,f,v,...k];D.contains=[...I,{begin:/\(/,end:/\)/,contains:["self",...I]},]}return{name:"Swift",keywords:o,contains:[...a,T,{match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[A,C,n],illegal:/\[|%/},{beginKeywords:"struct protocol class extension enum actor",end:"\\{",excludeEnd:!0,keywords:o,contains:[e.inherit(e.TITLE_MODE,{className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c,]},{match:[/operator/,/\s+/,ek],className:{1:"keyword",3:"title"}},{begin:[/precedencegroup/,/\s+/,eA],className:{1:"keyword",3:"title"},contains:[O],keywords:[...ey,...e$],end:/}/},{beginKeywords:"import",end:/$/,contains:[...a],relevance:0},...c,...d,...b,f,v,...k,...M,O,S,]}},grmr_typescript(e){let n=em(e),t=["any","void","number","boolean","string","object","never","symbol","bigint","unknown",],a={beginKeywords:"namespace",end:/\{/,excludeEnd:!0,contains:[n.exports.CLASS_REFERENCE]},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:t},contains:[n.exports.CLASS_REFERENCE]},r={$pattern:es,keyword:el.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override",]),literal:eo,built_in:eb.concat(t),"variable.language":eu},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,t)=>{let a=e.contains.findIndex(e=>e.label===n);if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)};return Object.assign(n.keywords,r),n.exports.PARAMS_CONTAINS.push(s),n.contains=n.contains.concat([s,a,i]),l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/}),n.contains.find(e=>"func.def"===e.label).relevance=0,Object.assign(n,{name:"TypeScript",aliases:["ts","tsx"]}),n},grmr_vbnet(e){let n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)},]},l=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),o=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/},]},{className:"label",begin:/^\w+:/},l,o,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[o]},]}},grmr_wasm(e){e.regex;let n=e.COMMENT(/\(;/,/;\)/);return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable",]},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},{className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/},{className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},]}},grmr_yaml(e){let n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/},],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/},]},]},i=e.inherit(a,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/},]}),r={end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ ]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ ]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ ]|$)"},]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type",begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},{begin:/\{/,end:/\}/,contains:[r],illegal:"\\n",relevance:0},{begin:"\\[",end:"\\]",contains:[r],illegal:"\\n",relevance:0},a,],l=[...s];return l.pop(),l.push(i),r.contains=l,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}});let eD=Q;for(let eI of Object.keys(eR)){let eL=eI.replace("grmr_","").replace("_","-");eD.registerLanguage(eL,eR[eI])}return eD}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/app/chat-gpt/client/js/highlightjs-copy.min.js b/app/chat-gpt/client/js/highlightjs-copy.min.js new file mode 100644 index 0000000..ac11d33 --- /dev/null +++ b/app/chat-gpt/client/js/highlightjs-copy.min.js @@ -0,0 +1 @@ +class CopyButtonPlugin{constructor(options={}){self.hook=options.hook;self.callback=options.callback}"after:highlightElement"({el,text}){let button=Object.assign(document.createElement("button"),{innerHTML:"Copy",className:"hljs-copy-button"});button.dataset.copied=false;el.parentElement.classList.add("hljs-copy-wrapper");el.parentElement.appendChild(button);el.parentElement.style.setProperty("--hljs-theme-background",window.getComputedStyle(el).backgroundColor);button.onclick=function(){if(!navigator.clipboard)return;let newText=text;if(hook&&typeof hook==="function"){newText=hook(text,el)||text}navigator.clipboard.writeText(newText).then(function(){button.innerHTML="Copied!";button.dataset.copied=true;let alert=Object.assign(document.createElement("div"),{role:"status",className:"hljs-copy-alert",innerHTML:"Copied to clipboard"});el.parentElement.appendChild(alert);setTimeout(()=>{button.innerHTML="Copy";button.dataset.copied=false;el.parentElement.removeChild(alert);alert=null},2e3)}).then(function(){if(typeof callback==="function")return callback(newText,el)})}}} \ No newline at end of file diff --git a/app/chat-gpt/client/js/icons.js b/app/chat-gpt/client/js/icons.js new file mode 100644 index 0000000..84fed38 --- /dev/null +++ b/app/chat-gpt/client/js/icons.js @@ -0,0 +1 @@ +window.FontAwesomeKitConfig={asyncLoading:{enabled:!1},autoA11y:{enabled:!0},baseUrl:"https://ka-f.fontawesome.com",baseUrlKit:"https://kit-pro.fontawesome.com",detectConflictsUntil:null,iconUploads:{},id:96462084,license:"pro",method:"css",minify:{enabled:!0},token:"d0514f1901",v4FontFaceShim:{enabled:!0},v4shim:{enabled:!0},v5FontFaceShim:{enabled:!0},version:"6.1.1"},function(t){"function"==typeof define&&define.amd?define("kit-loader",t):t()}(function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function n(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,o)}return n}function o(t){for(var o=1;ot.length)&&(e=t.length);for(var n=0,o=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:function(){},r=e.document||r,i=a.bind(a,r,["fa","fab","fas","far","fal","fad","fak"]),u=Object.keys(t.iconUploads||{}).length>0;t.autoA11y.enabled&&n(i);var f=[{id:"fa-main",addOn:void 0}];t.v4shim&&t.v4shim.enabled&&f.push({id:"fa-v4-shims",addOn:"-v4-shims"}),t.v5FontFaceShim&&t.v5FontFaceShim.enabled&&f.push({id:"fa-v5-font-face",addOn:"-v5-font-face"}),t.v4FontFaceShim&&t.v4FontFaceShim.enabled&&f.push({id:"fa-v4-font-face",addOn:"-v4-font-face"}),u&&f.push({id:"fa-kit-upload",customCss:!0});var s=f.map(function(n){return new F(function(r,i){E(n.customCss?function(t){return t.baseUrlKit+"/"+t.token+"/"+t.id+"/kit-upload.css"}(t):c(t,{addOn:n.addOn,minify:t.minify.enabled}),e).then(function(i){r(function(t,e){var n=e.contentFilter||function(t,e){return t},o=document.createElement("style"),r=document.createTextNode(n(t,e));return o.appendChild(r),o.media="all",e.id&&o.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&o.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),o}(i,o(o({},e),{},{baseUrl:t.baseUrl,version:t.version,id:n.id,contentFilter:function(t,e){return _(t,e.baseUrl,e.version)}})))}).catch(i)})});return F.all(s)}function P(t,e){var n=document.createElement("SCRIPT"),o=document.createTextNode(t);return n.appendChild(o),n.referrerPolicy="strict-origin",e.id&&n.setAttribute("id",e.id),e&&e.detectingConflicts&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n}function U(t){var e,n=[],o=document,r=(o.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(o.readyState);r||o.addEventListener("DOMContentLoaded",e=function(){for(o.removeEventListener("DOMContentLoaded",e),r=1;e=n.shift();)e()}),r?setTimeout(t,0):n.push(t)}try{if(window.FontAwesomeKitConfig){var k=window.FontAwesomeKitConfig,L={detectingConflicts:k.detectConflictsUntil&&new Date<=new Date(k.detectConflictsUntil),detectionIgnoreAttr:"data-fa-detection-ignore",fetch:window.fetch,token:k.token,XMLHttpRequest:window.XMLHttpRequest,document:document},I=document.currentScript,T=I?I.parentElement:document.head;(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"js"===t.method?function(t,e){e.autoA11y=t.autoA11y.enabled,"pro"===t.license&&(e.autoFetchSvg=!0,e.fetchSvgFrom=t.baseUrl+"/releases/"+("latest"===t.version?"latest":"v".concat(t.version))+"/svgs",e.fetchUploadedSvgFrom=t.uploadsUrl);var n=[];return t.v4shim.enabled&&n.push(new F(function(n,r){E(c(t,{addOn:"-v4-shims",minify:t.minify.enabled}),e).then(function(t){n(P(t,o(o({},e),{},{id:"fa-v4-shims"})))}).catch(r)})),n.push(new F(function(n,r){E(c(t,{minify:t.minify.enabled}),e).then(function(t){var r=P(t,o(o({},e),{},{id:"fa-main"}));n(function(t,e){var n=e&&void 0!==e.autoFetchSvg?e.autoFetchSvg:void 0,o=e&&void 0!==e.autoA11y?e.autoA11y:void 0;return void 0!==o&&t.setAttribute("data-auto-a11y",o?"true":"false"),n&&(t.setAttributeNode(document.createAttribute("data-auto-fetch-svg")),t.setAttribute("data-fetch-svg-from",e.fetchSvgFrom),t.setAttribute("data-fetch-uploaded-svg-from",e.fetchUploadedSvgFrom)),t}(r,e))}).catch(r)})),F.all(n)}(t,e):"css"===t.method?C(t,e,function(t){U(t),function(t){"undefined"!=typeof MutationObserver&&new MutationObserver(t).observe(document,{childList:!0,subtree:!0})}(t)}):void 0})(k,L).then(function(t){t.map(function(t){try{T.insertBefore(t,I?I.nextSibling:null)}catch(e){T.appendChild(t)}}),L.detectingConflicts&&I&&U(function(){I.setAttributeNode(document.createAttribute(L.detectionIgnoreAttr));var t=function(t,e){var n=document.createElement("script");return e&&e.detectionIgnoreAttr&&n.setAttributeNode(document.createAttribute(e.detectionIgnoreAttr)),n.src=c(t,{baseFilename:"conflict-detection",fileSuffix:"js",subdir:"js",minify:t.minify.enabled}),n}(k,L);document.body.appendChild(t)})}).catch(function(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))})}}catch(t){console.error("".concat("Font Awesome Kit:"," ").concat(t))}}); \ No newline at end of file diff --git a/app/chat-gpt/client/js/sidebar-toggler.js b/app/chat-gpt/client/js/sidebar-toggler.js new file mode 100644 index 0000000..b23f94e --- /dev/null +++ b/app/chat-gpt/client/js/sidebar-toggler.js @@ -0,0 +1,34 @@ +const sidebar = document.querySelector(".sidebar"); +const menuButton = document.querySelector(".menu-button"); + +function toggleSidebar(event) { + if (sidebar.classList.contains("shown")) { + hideSidebar(event.target); + } else { + showSidebar(event.target); + } + window.scrollTo(0, 0); +} + +function showSidebar(target) { + sidebar.classList.add("shown"); + target.classList.add("rotated"); + document.body.style.overflow = "hidden"; +} + +function hideSidebar(target) { + sidebar.classList.remove("shown"); + target.classList.remove("rotated"); + document.body.style.overflow = "auto"; +} + +menuButton.addEventListener("click", toggleSidebar); + +document.body.addEventListener('click', function(event) { + if (event.target.matches('.conversation-title')) { + const menuButtonStyle = window.getComputedStyle(menuButton); + if (menuButtonStyle.display !== 'none') { + hideSidebar(menuButton); + } + } +}); diff --git a/app/chat-gpt/client/js/theme-toggler.js b/app/chat-gpt/client/js/theme-toggler.js new file mode 100644 index 0000000..67e1a95 --- /dev/null +++ b/app/chat-gpt/client/js/theme-toggler.js @@ -0,0 +1,22 @@ +var switch_theme_toggler = document.getElementById("theme-toggler"); + +switch_theme_toggler.addEventListener("change", toggleTheme); + +function setTheme(themeName) { + localStorage.setItem("theme", themeName); + document.documentElement.className = themeName; +} + +function toggleTheme() { + var currentTheme = localStorage.getItem("theme"); + var newTheme = currentTheme === "theme-dark" ? "theme-light" : "theme-dark"; + + setTheme(newTheme); + switch_theme_toggler.checked = newTheme === "theme-dark"; +} + +(function () { + var currentTheme = localStorage.getItem("theme") || "theme-dark"; + setTheme(currentTheme); + switch_theme_toggler.checked = currentTheme === "theme-dark"; +})(); diff --git a/app/chat-gpt/config.json b/app/chat-gpt/config.json new file mode 100644 index 0000000..d197229 --- /dev/null +++ b/app/chat-gpt/config.json @@ -0,0 +1,8 @@ +{ + "site_config": { + "host": "0.0.0.0", + "port": 1338, + "debug": false + }, + "url_prefix": "" +} diff --git a/app/chat-gpt/docker-compose.yml b/app/chat-gpt/docker-compose.yml new file mode 100644 index 0000000..630cf75 --- /dev/null +++ b/app/chat-gpt/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3.9" + +networks: + chat_gpt_network: + name: "chat_gpt_network" + +services: + + chat-gpt-caddy: + image: caddy:2.7.4 + container_name: "chat_gpt_caddy" + restart: unless-stopped + networks: + - chat_gpt_network + environment: + - TZ=Europe/Moscow + ports: + - "8081:8080" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - /etc/localtime:/etc/localtime:ro + + chat-gpt: + image: balsh_chat_gpt:latest #ramonvc/freegpt-webui:latest + container_name: "chat_gpt" + build: + context: . + dockerfile: Dockerfile + hostname: "chat_gpt" + networks: + - chat_gpt_network + volumes: + - ./client:/client + depends_on: + - chat-gpt-caddy + expose: + - "1338" + restart: unless-stopped \ No newline at end of file diff --git a/app/chat-gpt/g4f/Provider/Provider.py b/app/chat-gpt/g4f/Provider/Provider.py new file mode 100644 index 0000000..59b9965 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Provider.py @@ -0,0 +1,20 @@ +import os + +from ..typing import get_type_hints + +url = None +model = None +supports_stream = False +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + return + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/AiService.py b/app/chat-gpt/g4f/Provider/Providers/AiService.py new file mode 100644 index 0000000..6f7e818 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/AiService.py @@ -0,0 +1,42 @@ +import os + +import requests + +from ...typing import get_type_hints + +url = "https://aiservice.vercel.app/api/chat/answer" +model = ["gpt-3.5-turbo"] +supports_stream = False +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + base = "" + for message in messages: + base += "%s: %s\n" % (message["role"], message["content"]) + base += "assistant:" + + headers = { + "accept": "*/*", + "content-type": "text/plain;charset=UTF-8", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "Referer": "https://aiservice.vercel.app/chat", + } + data = {"input": base} + response = requests.post(url, headers=headers, json=data) + if response.status_code == 200: + _json = response.json() + yield _json["data"] + else: + print(f"Error Occurred::{response.status_code}") + return None + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/Aichat.py b/app/chat-gpt/g4f/Provider/Providers/Aichat.py new file mode 100644 index 0000000..9342e3e --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/Aichat.py @@ -0,0 +1,47 @@ +import json +import os + +import requests + +from ...typing import get_type_hints + +url = "https://hteyun.com" +model = [ + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-0613", +] +supports_stream = True +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, temperature: float = 0.7, **kwargs): + headers = { + "Content-Type": "application/json", + } + data = { + "model": model, + "temperature": 0.7, + "presence_penalty": 0, + "messages": messages, + } + response = requests.post(url + "/api/chat-stream", json=data, stream=True) + + if stream: + for chunk in response.iter_content(chunk_size=None): + chunk = chunk.decode("utf-8") + if chunk.strip(): + message = json.loads(chunk)["choices"][0]["message"]["content"] + yield message + else: + message = response.json()["choices"][0]["message"]["content"] + yield message + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/Ails.py b/app/chat-gpt/g4f/Provider/Providers/Ails.py new file mode 100644 index 0000000..c3ed314 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/Ails.py @@ -0,0 +1,96 @@ +import hashlib +import json +import os +import time +import uuid +from datetime import datetime + +import requests + +from ...typing import Dict, get_type_hints, sha256 + +url: str = "https://ai.ls" +model: str = "gpt-3.5-turbo" +supports_stream = True +needs_auth = False +working = True + + +class Utils: + def hash(json_data: Dict[str, str]) -> sha256: + base_string: str = "%s:%s:%s:%s" % ( + json_data["t"], + json_data["m"], + "WI,2rU#_r:r~aF4aJ36[.Z(/8Rv93Rf", + len(json_data["m"]), + ) + + return hashlib.sha256(base_string.encode()).hexdigest() + + def format_timestamp(timestamp: int) -> str: + e = timestamp + n = e % 10 + r = n + 1 if n % 2 == 0 else n + return str(e - n + r) + + +def _create_completion(model: str, messages: list, temperature: float = 0.6, stream: bool = False, **kwargs): + headers = { + "authority": "api.caipacity.com", + "accept": "*/*", + "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3", + "authorization": "Bearer free", + "client-id": str(uuid.uuid4()), + "client-v": "0.1.249", + "content-type": "application/json", + "origin": "https://ai.ls", + "referer": "https://ai.ls/", + "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"Windows"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "cross-site", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + } + + timestamp = Utils.format_timestamp(int(time.time() * 1000)) + + sig = { + "d": datetime.now().strftime("%Y-%m-%d"), + "t": timestamp, + "s": Utils.hash({"t": timestamp, "m": messages[-1]["content"]}), + } + + json_data = json.dumps( + separators=(",", ":"), + obj={ + "model": "gpt-3.5-turbo", + "temperature": 0.6, + "stream": True, + "messages": messages, + } + | sig, + ) + + response = requests.post( + "https://api.caipacity.com/v1/chat/completions", + headers=headers, + data=json_data, + stream=True, + ) + + for token in response.iter_lines(): + if b"content" in token: + completion_chunk = json.loads(token.decode().replace("data: ", "")) + token = completion_chunk["choices"][0]["delta"].get("content") + if token != None: + yield token + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/Bard.py b/app/chat-gpt/g4f/Provider/Providers/Bard.py new file mode 100644 index 0000000..23c801e --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/Bard.py @@ -0,0 +1,88 @@ +import json +import os +import random +import re + +import browser_cookie3 +import requests + +from ...typing import get_type_hints + +url = "https://bard.google.com" +model = ["Palm2"] +supports_stream = False +needs_auth = True + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + psid = {cookie.name: cookie.value for cookie in browser_cookie3.chrome(domain_name=".google.com")}["__Secure-1PSID"] + + formatted = "\n".join(["%s: %s" % (message["role"], message["content"]) for message in messages]) + prompt = f"{formatted}\nAssistant:" + + proxy = kwargs.get("proxy", False) + if proxy == False: + print("warning!, you did not give a proxy, a lot of countries are banned from Google Bard, so it may not work") + + snlm0e = None + conversation_id = None + response_id = None + choice_id = None + + client = requests.Session() + client.proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"} if proxy else None + + client.headers = { + "authority": "bard.google.com", + "content-type": "application/x-www-form-urlencoded;charset=UTF-8", + "origin": "https://bard.google.com", + "referer": "https://bard.google.com/", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", + "x-same-domain": "1", + "cookie": f"__Secure-1PSID={psid}", + } + + snlm0e = ( + re.search(r"SNlM0e\":\"(.*?)\"", client.get("https://bard.google.com/").text).group(1) if not snlm0e else snlm0e + ) + + params = { + "bl": "boq_assistant-bard-web-server_20230326.21_p0", + "_reqid": random.randint(1111, 9999), + "rt": "c", + } + + data = { + "at": snlm0e, + "f.req": json.dumps( + [ + None, + json.dumps([[prompt], None, [conversation_id, response_id, choice_id]]), + ] + ), + } + + intents = ".".join(["assistant", "lamda", "BardFrontendService"]) + + response = client.post( + f"https://bard.google.com/_/BardChatUi/data/{intents}/StreamGenerate", + data=data, + params=params, + ) + + chat_data = json.loads(response.content.splitlines()[3])[0][2] + if chat_data: + json_chat_data = json.loads(chat_data) + + yield json_chat_data[0][0] + + else: + yield "error" + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/Better.py b/app/chat-gpt/g4f/Provider/Providers/Better.py new file mode 100644 index 0000000..3185a5a --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/Better.py @@ -0,0 +1,64 @@ +import json +import os +from typing import get_type_hints + +import requests + +url = "https://openai-proxy-api.vercel.app/v1/" +model = [ + "gpt-3.5-turbo", + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo-16k", + "gpt-3.5-turbo-16k-0613", + "gpt-4", +] + +supports_stream = True +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + headers = { + "Content-Type": "application/json", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58", + "Referer": "https://chat.ylokh.xyz/", + "Origin": "https://chat.ylokh.xyz", + "Connection": "keep-alive", + } + + json_data = { + "messages": messages, + "temperature": 1.0, + "model": model, + "stream": stream, + } + + response = requests.post( + "https://openai-proxy-api.vercel.app/v1/chat/completions", + headers=headers, + json=json_data, + stream=True, + ) + + for token in response.iter_lines(): + decoded = token.decode("utf-8") + if decoded.startswith("data: "): + data_str = decoded.replace("data: ", "") + data = json.loads(data_str) + if "choices" in data and "delta" in data["choices"][0]: + delta = data["choices"][0]["delta"] + content = delta.get("content", "") + finish_reason = delta.get("finish_reason", "") + + if finish_reason == "stop": + break + if content: + yield content + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/Bing.py b/app/chat-gpt/g4f/Provider/Providers/Bing.py new file mode 100644 index 0000000..34cb683 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/Bing.py @@ -0,0 +1,356 @@ +import asyncio +import json +import os +import random +import ssl +import uuid + +import aiohttp +import certifi +import requests + +from ...typing import get_type_hints + +url = "https://bing.com/chat" +model = ["gpt-4"] +supports_stream = True +needs_auth = False + +ssl_context = ssl.create_default_context() +ssl_context.load_verify_locations(certifi.where()) + + +class optionsSets: + optionSet: dict = {"tone": str, "optionsSets": list} + + jailbreak: dict = { + "optionsSets": [ + "saharasugg", + "enablenewsfc", + "clgalileo", + "gencontentv3", + "nlu_direct_response_filter", + "deepleo", + "disable_emoji_spoken_text", + "responsible_ai_policy_235", + "enablemm", + "h3precise" + # "harmonyv3", + "dtappid", + "cricinfo", + "cricinfov2", + "dv3sugg", + "nojbfedge", + ] + } + + +class Defaults: + delimiter = "\x1e" + ip_address = f"13.{random.randint(104, 107)}.{random.randint(0, 255)}.{random.randint(0, 255)}" + + allowedMessageTypes = [ + "Chat", + "Disengaged", + "AdsQuery", + "SemanticSerp", + "GenerateContentQuery", + "SearchQuery", + "ActionRequest", + "Context", + "Progress", + "AdsQuery", + "SemanticSerp", + ] + + sliceIds = [ + # "222dtappid", + # "225cricinfo", + # "224locals0" + "winmuid3tf", + "osbsdusgreccf", + "ttstmout", + "crchatrev", + "winlongmsgtf", + "ctrlworkpay", + "norespwtf", + "tempcacheread", + "temptacache", + "505scss0", + "508jbcars0", + "515enbotdets0", + "5082tsports", + "515vaoprvs", + "424dagslnv1s0", + "kcimgattcf", + "427startpms0", + ] + + location = { + "locale": "en-US", + "market": "en-US", + "region": "US", + "locationHints": [ + { + "country": "United States", + "state": "California", + "city": "Los Angeles", + "timezoneoffset": 8, + "countryConfidence": 8, + "Center": {"Latitude": 34.0536909, "Longitude": -118.242766}, + "RegionType": 2, + "SourceType": 1, + } + ], + } + + +def _format(msg: dict) -> str: + return json.dumps(msg, ensure_ascii=False) + Defaults.delimiter + + +async def create_conversation(): + for _ in range(5): + create = requests.get( + "https://www.bing.com/turing/conversation/create", + headers={ + "authority": "edgeservices.bing.com", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "accept-language": "en-US,en;q=0.9", + "cache-control": "max-age=0", + "sec-ch-ua": '"Chromium";v="110", "Not A(Brand";v="24", "Microsoft Edge";v="110"', + "sec-ch-ua-arch": '"x86"', + "sec-ch-ua-bitness": '"64"', + "sec-ch-ua-full-version": '"110.0.1587.69"', + "sec-ch-ua-full-version-list": '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-model": '""', + "sec-ch-ua-platform": '"Windows"', + "sec-ch-ua-platform-version": '"15.0.0"', + "sec-fetch-dest": "document", + "sec-fetch-mode": "navigate", + "sec-fetch-site": "none", + "sec-fetch-user": "?1", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69", + "x-edge-shopping-flag": "1", + "x-forwarded-for": Defaults.ip_address, + }, + ) + + conversationId = create.json().get("conversationId") + clientId = create.json().get("clientId") + conversationSignature = create.json().get("conversationSignature") + + if not conversationId or not clientId or not conversationSignature and _ == 4: + raise Exception("Failed to create conversation.") + + return conversationId, clientId, conversationSignature + + +async def stream_generate( + prompt: str, + mode: optionsSets.optionSet = optionsSets.jailbreak, + context: bool or str = False, +): + timeout = aiohttp.ClientTimeout(total=900) + session = aiohttp.ClientSession(timeout=timeout) + + conversationId, clientId, conversationSignature = await create_conversation() + + wss = await session.ws_connect( + "wss://sydney.bing.com/sydney/ChatHub", + ssl=ssl_context, + autoping=False, + headers={ + "accept": "application/json", + "accept-language": "en-US,en;q=0.9", + "content-type": "application/json", + "sec-ch-ua": '"Not_A Brand";v="99", "Microsoft Edge";v="110", "Chromium";v="110"', + "sec-ch-ua-arch": '"x86"', + "sec-ch-ua-bitness": '"64"', + "sec-ch-ua-full-version": '"109.0.1518.78"', + "sec-ch-ua-full-version-list": '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-model": "", + "sec-ch-ua-platform": '"Windows"', + "sec-ch-ua-platform-version": '"15.0.0"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-ms-client-request-id": str(uuid.uuid4()), + "x-ms-useragent": "azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32", + "Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx", + "Referrer-Policy": "origin-when-cross-origin", + "x-forwarded-for": Defaults.ip_address, + }, + ) + + await wss.send_str(_format({"protocol": "json", "version": 1})) + await wss.receive(timeout=900) + + struct = { + "arguments": [ + { + **mode, + "source": "cib", + "allowedMessageTypes": Defaults.allowedMessageTypes, + "sliceIds": Defaults.sliceIds, + "traceId": os.urandom(16).hex(), + "isStartOfSession": True, + "message": Defaults.location + | { + "author": "user", + "inputMethod": "Keyboard", + "text": prompt, + "messageType": "Chat", + }, + "conversationSignature": conversationSignature, + "participant": {"id": clientId}, + "conversationId": conversationId, + } + ], + "invocationId": "0", + "target": "chat", + "type": 4, + } + + if context: + struct["arguments"][0]["previousMessages"] = [ + { + "author": "user", + "description": context, + "contextType": "WebPage", + "messageType": "Context", + "messageId": "discover-web--page-ping-mriduna-----", + } + ] + + await wss.send_str(_format(struct)) + + final = False + draw = False + resp_txt = "" + result_text = "" + resp_txt_no_link = "" + cache_text = "" + + while not final: + msg = await wss.receive(timeout=900) + objects = msg.data.split(Defaults.delimiter) + + for obj in objects: + if obj is None or not obj: + continue + + response = json.loads(obj) + if response.get("type") == 1 and response["arguments"][0].get( + "messages", + ): + if not draw: + if (response["arguments"][0]["messages"][0]["contentOrigin"] != "Apology") and not draw: + resp_txt = result_text + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][ + 0 + ].get("text", "") + resp_txt_no_link = result_text + response["arguments"][0]["messages"][0].get("text", "") + + if response["arguments"][0]["messages"][0].get( + "messageType", + ): + resp_txt = ( + resp_txt + + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][0]["inlines"][ + 0 + ].get("text") + + "\n" + ) + result_text = ( + result_text + + response["arguments"][0]["messages"][0]["adaptiveCards"][0]["body"][0]["inlines"][ + 0 + ].get("text") + + "\n" + ) + + if cache_text.endswith(" "): + final = True + if wss and not wss.closed: + await wss.close() + if session and not session.closed: + await session.close() + + yield (resp_txt.replace(cache_text, "")) + cache_text = resp_txt + + elif response.get("type") == 2: + if response["item"]["result"].get("error"): + if wss and not wss.closed: + await wss.close() + if session and not session.closed: + await session.close() + + raise Exception(f"{response['item']['result']['value']}: {response['item']['result']['message']}") + + if draw: + cache = response["item"]["messages"][1]["adaptiveCards"][0]["body"][0]["text"] + response["item"]["messages"][1]["adaptiveCards"][0]["body"][0]["text"] = cache + resp_txt + + if response["item"]["messages"][-1]["contentOrigin"] == "Apology" and resp_txt: + response["item"]["messages"][-1]["text"] = resp_txt_no_link + response["item"]["messages"][-1]["adaptiveCards"][0]["body"][0]["text"] = resp_txt + + # print('Preserved the message from being deleted', file=sys.stderr) + + final = True + if wss and not wss.closed: + await wss.close() + if session and not session.closed: + await session.close() + + +def run(generator): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + gen = generator.__aiter__() + + while True: + try: + next_val = loop.run_until_complete(gen.__anext__()) + yield next_val + + except StopAsyncIteration: + break + # print('Done') + + +def convert(messages): + context = "" + + for message in messages: + context += "[%s](#message)\n%s\n\n" % (message["role"], message["content"]) + + return context + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + if len(messages) < 2: + prompt = messages[0]["content"] + context = False + + else: + prompt = messages[-1]["content"] + context = convert(messages[:-1]) + + response = run(stream_generate(prompt, optionsSets.jailbreak, context)) + for token in response: + yield (token) + + # print('Done') + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatFree.py b/app/chat-gpt/g4f/Provider/Providers/ChatFree.py new file mode 100644 index 0000000..78c4e14 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/ChatFree.py @@ -0,0 +1,59 @@ +import json +import os + +import requests + +from ...typing import get_type_hints + +url = "https://v.chatfree.cc" +model = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k"] +supports_stream = False +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + headers = { + "authority": "chat.dfehub.com", + "accept": "*/*", + "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3", + "content-type": "application/json", + "origin": "https://v.chatfree.cc", + "referer": "https://v.chatfree.cc/", + "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"macOS"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + "x-requested-with": "XMLHttpRequest", + } + + json_data = { + "messages": messages, + "stream": True, + "model": model, + "temperature": 0.5, + "presence_penalty": 0, + "frequency_penalty": 0, + "top_p": 1, + } + + response = requests.post( + "https://v.chatfree.cc/api/openai/v1/chat/completions", + headers=headers, + json=json_data, + ) + + for chunk in response.iter_lines(): + if b"content" in chunk: + data = json.loads(chunk.decode().split("data: ")[1]) + yield (data["choices"][0]["delta"]["content"]) + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py b/app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py new file mode 100644 index 0000000..62cd246 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py @@ -0,0 +1,61 @@ +import os +import re + +import requests + +from ...typing import get_type_hints + +url = "https://chatgpt.ai/gpt-4/" +model = ["gpt-4"] +supports_stream = True +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + chat = "" + for message in messages: + chat += "%s: %s\n" % (message["role"], message["content"]) + chat += "assistant: " + + response = requests.get("https://chatgpt.ai/") + nonce, post_id, _, bot_id = re.findall( + r'data-nonce="(.*)"\n data-post-id="(.*)"\n data-url="(.*)"\n data-bot-id="(.*)"\n data-width', + response.text, + )[0] + + headers = { + "authority": "chatgpt.ai", + "accept": "*/*", + "accept-language": "en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3", + "cache-control": "no-cache", + "origin": "https://chatgpt.ai", + "pragma": "no-cache", + "referer": "https://chatgpt.ai/gpt-4/", + "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"Windows"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + } + data = { + "_wpnonce": nonce, + "post_id": post_id, + "url": "https://chatgpt.ai/gpt-4", + "action": "wpaicg_chat_shortcode_message", + "message": chat, + "bot_id": bot_id, + } + + response = requests.post("https://chatgpt.ai/wp-admin/admin-ajax.php", headers=headers, data=data) + + yield (response.json()["data"]) + + +params = f"g4f.Providers.{os.path.basename(__file__)[:-3]} supports: " + "(%s)" % ", ".join( + [ + f"{name}: {get_type_hints(_create_completion)[name].__name__}" + for name in _create_completion.__code__.co_varnames[: _create_completion.__code__.co_argcount] + ] +) diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py b/app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py new file mode 100644 index 0000000..0b11d55 --- /dev/null +++ b/app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py @@ -0,0 +1,114 @@ +import base64 +import os +import re + +import requests + +from ...typing import get_type_hints + +url = "https://chatgptlogin.ac" +model = ["gpt-3.5-turbo"] +supports_stream = False +needs_auth = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + def get_nonce(): + res = requests.get( + "https://chatgptlogin.ac/use-chatgpt-free/", + headers={ + "Referer": "https://chatgptlogin.ac/use-chatgpt-free/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + }, + ) + + src = re.search( + r'class="mwai-chat mwai-chatgpt">.*Send