-// For format details, see https://aka.ms/devcontainer.json. For config options, see the
-// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
-{
- "name": "Dev Container",
- "build": {
- // Sets the run context to one level up instead of the .devcontainer folder.
- "context": "..",
- // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
- "dockerfile": "./Dockerfile"
- },
-
- // Features to add to the dev container. More info: https://containers.dev/features.
- // "features": {},
-
- // Use 'forwardPorts' to make a list of ports inside the container available locally.
- "forwardPorts": [
- 8080
- ],
-
- // Uncomment the next line to run commands after the container is created.
- // "postCreateCommand": "cat /etc/os-release",
-
- // Configure tool-specific properties.
- "customizations": {
- "vscode": {
- "extensions": [
- "ms-python.python",
- "ms-azuretools.vscode-docker",
- "ms-python.black-formatter",
- "esbenp.prettier-vscode",
- "Vue.volar"
- ]
- }
- }
-
- // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
- // "remoteUser": "devcontainer"
-}
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the\r
+// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile\r
+{\r
+ "name": "Dev Container",\r
+ "build": {\r
+ // Sets the run context to one level up instead of the .devcontainer folder.\r
+ "context": "..",\r
+ // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.\r
+ "dockerfile": "./Dockerfile"\r
+ },\r
+\r
+ // Features to add to the dev container. More info: https://containers.dev/features.\r
+ // "features": {},\r
+\r
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.\r
+ "forwardPorts": [\r
+ 8080\r
+ ],\r
+\r
+ // Uncomment the next line to run commands after the container is created.\r
+ // "postCreateCommand": "cat /etc/os-release",\r
+\r
+ // Configure tool-specific properties.\r
+ "customizations": {\r
+ "vscode": {\r
+ "extensions": [\r
+ "ms-python.python",\r
+ "ms-azuretools.vscode-docker",\r
+ "ms-python.black-formatter",\r
+ "esbenp.prettier-vscode",\r
+ "Vue.volar"\r
+ ]\r
+ }\r
+ }\r
+\r
+ // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.\r
+ // "remoteUser": "devcontainer"\r
+}\r
-# Ignore everything
-**
-
-# Include the following
-!.htmlnanorc
-!LICENSE
-!Pipfile
-!Pipfile.lock
-!client/**
-!entrypoint.sh
-!healthcheck.sh
-!package-lock.json
-!package.json
-!server/**
-!vite.config.js
+# Ignore everything\r
+**\r
+\r
+# Include the following\r
+!.htmlnanorc\r
+!LICENSE\r
+!Pipfile\r
+!Pipfile.lock\r
+!client/**\r
+!entrypoint.sh\r
+!healthcheck.sh\r
+!package-lock.json\r
+!package.json\r
+!server/**\r
+!vite.config.js\r
-# Python
-
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-
-# Node
-
-# Logs
-logs
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-lerna-debug.log*
-.pnpm-debug.log*
-
-# Diagnostic reports (https://nodejs.org/api/report.html)
-report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins
-#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules/
-jspm_packages/
-
-# Snowpack dependency directory (https://snowpack.dev/)
-web_modules/
-
-# TypeScript cache
-*.tsbuildinfo
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
-.env.test
-.env.production
-
-# parcel-bundler cache (https://parceljs.org/)
-.parcel-cache
-
-# Next.js build output
-.next
-out
-
-# Nuxt.js build / generate output
-.nuxt
-dist
-
-# Gatsby files
-.cache/
-
-# vuepress build output
-.vuepress/dist
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
-# Stores VSCode versions used for testing VSCode extensions
-.vscode-test
-
-# yarn v2
-.yarn/cache
-.yarn/unplugged
-.yarn/build-state.yml
-.yarn/install-state.gz
-.pnp.*
-
-# Custom
-.vscode/
-data/
-/notes/
+# Python\r
+\r
+# Byte-compiled / optimized / DLL files\r
+__pycache__/\r
+*.py[cod]\r
+*$py.class\r
+\r
+# C extensions\r
+*.so\r
+\r
+# Distribution / packaging\r
+.Python\r
+build/\r
+develop-eggs/\r
+dist/\r
+downloads/\r
+eggs/\r
+.eggs/\r
+lib/\r
+lib64/\r
+parts/\r
+sdist/\r
+var/\r
+wheels/\r
+share/python-wheels/\r
+*.egg-info/\r
+.installed.cfg\r
+*.egg\r
+MANIFEST\r
+\r
+# PyInstaller\r
+# Usually these files are written by a python script from a template\r
+# before PyInstaller builds the exe, so as to inject date/other infos into it.\r
+*.manifest\r
+*.spec\r
+\r
+# Installer logs\r
+pip-log.txt\r
+pip-delete-this-directory.txt\r
+\r
+# Unit test / coverage reports\r
+htmlcov/\r
+.tox/\r
+.nox/\r
+.coverage\r
+.coverage.*\r
+.cache\r
+nosetests.xml\r
+coverage.xml\r
+*.cover\r
+*.py,cover\r
+.hypothesis/\r
+.pytest_cache/\r
+cover/\r
+\r
+# Translations\r
+*.mo\r
+*.pot\r
+\r
+# Django stuff:\r
+*.log\r
+local_settings.py\r
+db.sqlite3\r
+db.sqlite3-journal\r
+\r
+# Flask stuff:\r
+instance/\r
+.webassets-cache\r
+\r
+# Scrapy stuff:\r
+.scrapy\r
+\r
+# Sphinx documentation\r
+docs/_build/\r
+\r
+# PyBuilder\r
+.pybuilder/\r
+target/\r
+\r
+# Jupyter Notebook\r
+.ipynb_checkpoints\r
+\r
+# IPython\r
+profile_default/\r
+ipython_config.py\r
+\r
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow\r
+__pypackages__/\r
+\r
+# Celery stuff\r
+celerybeat-schedule\r
+celerybeat.pid\r
+\r
+# SageMath parsed files\r
+*.sage.py\r
+\r
+# Environments\r
+.env\r
+.venv\r
+env/\r
+venv/\r
+ENV/\r
+env.bak/\r
+venv.bak/\r
+\r
+# Spyder project settings\r
+.spyderproject\r
+.spyproject\r
+\r
+# Rope project settings\r
+.ropeproject\r
+\r
+# mkdocs documentation\r
+/site\r
+\r
+# mypy\r
+.mypy_cache/\r
+.dmypy.json\r
+dmypy.json\r
+\r
+# Pyre type checker\r
+.pyre/\r
+\r
+# pytype static type analyzer\r
+.pytype/\r
+\r
+# Cython debug symbols\r
+cython_debug/\r
+\r
+\r
+# Node\r
+\r
+# Logs\r
+logs\r
+npm-debug.log*\r
+yarn-debug.log*\r
+yarn-error.log*\r
+lerna-debug.log*\r
+.pnpm-debug.log*\r
+\r
+# Diagnostic reports (https://nodejs.org/api/report.html)\r
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\r
+\r
+# Runtime data\r
+pids\r
+*.pid\r
+*.seed\r
+*.pid.lock\r
+\r
+# Directory for instrumented libs generated by jscoverage/JSCover\r
+lib-cov\r
+\r
+# Coverage directory used by tools like istanbul\r
+coverage\r
+*.lcov\r
+\r
+# nyc test coverage\r
+.nyc_output\r
+\r
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins\r
+#storing-task-files)\r
+.grunt\r
+\r
+# Bower dependency directory (https://bower.io/)\r
+bower_components\r
+\r
+# node-waf configuration\r
+.lock-wscript\r
+\r
+# Compiled binary addons (https://nodejs.org/api/addons.html)\r
+build/Release\r
+\r
+# Dependency directories\r
+node_modules/\r
+jspm_packages/\r
+\r
+# Snowpack dependency directory (https://snowpack.dev/)\r
+web_modules/\r
+\r
+# TypeScript cache\r
+*.tsbuildinfo\r
+\r
+# Optional npm cache directory\r
+.npm\r
+\r
+# Optional eslint cache\r
+.eslintcache\r
+\r
+# Microbundle cache\r
+.rpt2_cache/\r
+.rts2_cache_cjs/\r
+.rts2_cache_es/\r
+.rts2_cache_umd/\r
+\r
+# Optional REPL history\r
+.node_repl_history\r
+\r
+# Output of 'npm pack'\r
+*.tgz\r
+\r
+# Yarn Integrity file\r
+.yarn-integrity\r
+\r
+# dotenv environment variables file\r
+.env.test\r
+.env.production\r
+\r
+# parcel-bundler cache (https://parceljs.org/)\r
+.parcel-cache\r
+\r
+# Next.js build output\r
+.next\r
+out\r
+\r
+# Nuxt.js build / generate output\r
+.nuxt\r
+dist\r
+\r
+# Gatsby files\r
+.cache/\r
+\r
+# vuepress build output\r
+.vuepress/dist\r
+\r
+# Serverless directories\r
+.serverless/\r
+\r
+# FuseBox cache\r
+.fusebox/\r
+\r
+# DynamoDB Local files\r
+.dynamodb/\r
+\r
+# TernJS port file\r
+.tern-port\r
+\r
+# Stores VSCode versions used for testing VSCode extensions\r
+.vscode-test\r
+\r
+# yarn v2\r
+.yarn/cache\r
+.yarn/unplugged\r
+.yarn/build-state.yml\r
+.yarn/install-state.gz\r
+.pnp.*\r
+\r
+# Custom\r
+.vscode/\r
+data/\r
+/notes/\r
-{
- "minifySvg": false
-}
+{\r
+ "minifySvg": false\r
+}\r
-ARG BUILD_DIR=/build
-
-# Build Container
-FROM --platform=$BUILDPLATFORM node:20-alpine AS build
-
-ARG BUILD_DIR
-
-RUN mkdir ${BUILD_DIR}
-WORKDIR ${BUILD_DIR}
-
-COPY package.json package-lock.json vite.config.js .htmlnanorc ./
-RUN npm ci
-
-COPY client ./client
-RUN npm run build
-
-# Runtime Container
-FROM python:3.11-slim-bullseye
-
-ARG BUILD_DIR
-
-ENV PUID=1000
-ENV PGID=1000
-ENV EXEC_TOOL=gosu
-ENV FLATNOTES_PORT=8080
-
-ENV APP_PATH=/app
-ENV FLATNOTES_PATH=/data
-
-RUN mkdir -p ${APP_PATH}
-RUN mkdir -p ${FLATNOTES_PATH}
-
-RUN apt update && apt install -y \
- curl \
- gosu \
- && rm -rf /var/lib/apt/lists/*
-
-RUN pip install --no-cache-dir pipenv
-
-WORKDIR ${APP_PATH}
-
-COPY LICENSE Pipfile Pipfile.lock ./
-RUN pipenv install --deploy --ignore-pipfile --system && \
- pipenv --clear
-
-COPY server ./server
-COPY --from=build ${BUILD_DIR}/client/dist ./client/dist
-
-COPY entrypoint.sh healthcheck.sh /
-RUN chmod +x /entrypoint.sh /healthcheck.sh
-
-VOLUME /data
-EXPOSE ${FLATNOTES_PORT}/tcp
-HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh
-
-ENTRYPOINT [ "/entrypoint.sh" ]
+ARG BUILD_DIR=/build\r
+\r
+# Build Container\r
+FROM --platform=$BUILDPLATFORM node:20-alpine AS build\r
+\r
+ARG BUILD_DIR\r
+\r
+RUN mkdir ${BUILD_DIR}\r
+WORKDIR ${BUILD_DIR}\r
+\r
+COPY package.json package-lock.json vite.config.js .htmlnanorc ./\r
+RUN npm ci\r
+\r
+COPY client ./client\r
+RUN npm run build\r
+\r
+# Runtime Container\r
+FROM python:3.11-slim-bullseye\r
+\r
+ARG BUILD_DIR\r
+\r
+ENV PUID=1000\r
+ENV PGID=1000\r
+ENV EXEC_TOOL=gosu\r
+ENV FLATNOTES_PORT=8080\r
+\r
+ENV APP_PATH=/app\r
+ENV FLATNOTES_PATH=/data\r
+\r
+RUN mkdir -p ${APP_PATH}\r
+RUN mkdir -p ${FLATNOTES_PATH}\r
+\r
+RUN apt update && apt install -y \\r
+ curl \\r
+ gosu \\r
+ && rm -rf /var/lib/apt/lists/*\r
+\r
+RUN pip install --no-cache-dir pipenv\r
+\r
+WORKDIR ${APP_PATH}\r
+\r
+COPY LICENSE Pipfile Pipfile.lock ./\r
+RUN pipenv install --deploy --ignore-pipfile --system && \\r
+ pipenv --clear\r
+\r
+COPY server ./server\r
+COPY --from=build ${BUILD_DIR}/client/dist ./client/dist\r
+\r
+COPY entrypoint.sh healthcheck.sh /\r
+RUN chmod +x /entrypoint.sh /healthcheck.sh\r
+\r
+VOLUME /data\r
+EXPOSE ${FLATNOTES_PORT}/tcp\r
+HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh\r
+\r
+ENTRYPOINT [ "/entrypoint.sh" ]\r
-ARG BUILD_DIR=/build
-
-# Client Build Container
-FROM --platform=$BUILDPLATFORM node:20-alpine AS build
-
-ARG BUILD_DIR
-
-RUN mkdir ${BUILD_DIR}
-WORKDIR ${BUILD_DIR}
-
-COPY package.json package-lock.json vite.config.js .htmlnanorc ./
-RUN npm ci
-
-COPY client ./client
-RUN npm run build
-
-# Pipenv Build Container
-FROM python:3.11-alpine3.19 as pipenv-build
-
-ARG BUILD_DIR
-
-ENV APP_PATH=/app
-
-RUN apk add --no-cache build-base rust cargo libffi libffi-dev libssl3 openssl-dev
-
-RUN pip install --no-cache-dir pipenv
-
-WORKDIR ${APP_PATH}
-
-COPY LICENSE Pipfile Pipfile.lock ./
-RUN mkdir .venv
-RUN pipenv install --deploy --ignore-pipfile && \
- pipenv --clear
-
-# Runtime Container
-FROM python:3.11-alpine3.19
-
-ARG BUILD_DIR
-
-ENV PUID=1000
-ENV PGID=1000
-ENV EXEC_TOOL=su-exec
-
-ENV APP_PATH=/app
-ENV FLATNOTES_PATH=/data
-
-RUN mkdir -p ${APP_PATH}
-RUN mkdir -p ${FLATNOTES_PATH}
-
-RUN apk add --no-cache su-exec libssl3 libgcc curl
-
-WORKDIR ${APP_PATH}
-
-COPY server ./server
-COPY --from=build ${BUILD_DIR}/client/dist ./client/dist
-COPY --from=pipenv-build ${APP_PATH}/.venv/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/
-
-VOLUME /data
-EXPOSE 8080/tcp
-HEALTHCHECK --interval=60s --timeout=10s CMD curl -f http://localhost:8080/health || exit 1
-
-COPY entrypoint.sh /
-RUN chmod +x /entrypoint.sh
-ENTRYPOINT [ "/entrypoint.sh" ]
+ARG BUILD_DIR=/build\r
+\r
+# Client Build Container\r
+FROM --platform=$BUILDPLATFORM node:20-alpine AS build\r
+\r
+ARG BUILD_DIR\r
+\r
+RUN mkdir ${BUILD_DIR}\r
+WORKDIR ${BUILD_DIR}\r
+\r
+COPY package.json package-lock.json vite.config.js .htmlnanorc ./\r
+RUN npm ci\r
+\r
+COPY client ./client\r
+RUN npm run build\r
+\r
+# Pipenv Build Container\r
+FROM python:3.11-alpine3.19 as pipenv-build\r
+\r
+ARG BUILD_DIR\r
+\r
+ENV APP_PATH=/app\r
+\r
+RUN apk add --no-cache build-base rust cargo libffi libffi-dev libssl3 openssl-dev\r
+\r
+RUN pip install --no-cache-dir pipenv\r
+\r
+WORKDIR ${APP_PATH}\r
+\r
+COPY LICENSE Pipfile Pipfile.lock ./\r
+RUN mkdir .venv\r
+RUN pipenv install --deploy --ignore-pipfile && \\r
+ pipenv --clear\r
+\r
+# Runtime Container\r
+FROM python:3.11-alpine3.19\r
+\r
+ARG BUILD_DIR\r
+\r
+ENV PUID=1000\r
+ENV PGID=1000\r
+ENV EXEC_TOOL=su-exec\r
+\r
+ENV APP_PATH=/app\r
+ENV FLATNOTES_PATH=/data\r
+\r
+RUN mkdir -p ${APP_PATH}\r
+RUN mkdir -p ${FLATNOTES_PATH}\r
+\r
+RUN apk add --no-cache su-exec libssl3 libgcc curl\r
+\r
+WORKDIR ${APP_PATH}\r
+\r
+COPY server ./server\r
+COPY --from=build ${BUILD_DIR}/client/dist ./client/dist\r
+COPY --from=pipenv-build ${APP_PATH}/.venv/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/\r
+\r
+VOLUME /data\r
+EXPOSE 8080/tcp\r
+HEALTHCHECK --interval=60s --timeout=10s CMD curl -f http://localhost:8080/health || exit 1\r
+\r
+COPY entrypoint.sh /\r
+RUN chmod +x /entrypoint.sh\r
+ENTRYPOINT [ "/entrypoint.sh" ]\r
-MIT License
-
-Copyright (c) 2021 Adam Dullage
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+MIT License\r
+\r
+Copyright (c) 2021 Adam Dullage\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in all\r
+copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+SOFTWARE.\r
-[[source]]
-name = "pypi"
-url = "https://pypi.org/simple"
-verify_ssl = true
-
-[dev-packages]
-black = "*"
-flake8 = "*"
-rope = "*"
-isort = "*"
-
-[packages]
-whoosh = "==2.7.4"
-fastapi = "==0.110.1"
-uvicorn = {extras = ["standard"], version = "==0.29.0"}
-aiofiles = "==23.2.1"
-python-jose = {extras = ["cryptography"], version = "==3.3.0"}
-pyotp = "==2.9.0"
-qrcode = "==7.4.2"
-python-multipart = "==0.0.9"
-
-[requires]
-python_version = "3.11"
-
-[pipenv]
-allow_prereleases = true
+[[source]]\r
+name = "pypi"\r
+url = "https://pypi.org/simple"\r
+verify_ssl = true\r
+\r
+[dev-packages]\r
+black = "*"\r
+flake8 = "*"\r
+rope = "*"\r
+isort = "*"\r
+\r
+[packages]\r
+whoosh = "==2.7.4"\r
+fastapi = "==0.110.1"\r
+uvicorn = {extras = ["standard"], version = "==0.29.0"}\r
+aiofiles = "==23.2.1"\r
+python-jose = {extras = ["cryptography"], version = "==3.3.0"}\r
+pyotp = "==2.9.0"\r
+qrcode = "==7.4.2"\r
+python-multipart = "==0.0.9"\r
+\r
+[requires]\r
+python_version = "3.11"\r
+\r
+[pipenv]\r
+allow_prereleases = true\r
-{
- "_meta": {
- "hash": {
- "sha256": "c7384cf6778b3352e64487ce7284282296ad308108679bb7d7cf1484c16ba411"
- },
- "pipfile-spec": 6,
- "requires": {
- "python_version": "3.11"
- },
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "aiofiles": {
- "hashes": [
- "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107",
- "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==23.2.1"
- },
- "annotated-types": {
- "hashes": [
- "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43",
- "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.6.0"
- },
- "anyio": {
- "hashes": [
- "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8",
- "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.3.0"
- },
- "cffi": {
- "hashes": [
- "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc",
- "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a",
- "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417",
- "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab",
- "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520",
- "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36",
- "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743",
- "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8",
- "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed",
- "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684",
- "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56",
- "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324",
- "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d",
- "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235",
- "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e",
- "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088",
- "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000",
- "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7",
- "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e",
- "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673",
- "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c",
- "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe",
- "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2",
- "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098",
- "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8",
- "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a",
- "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0",
- "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b",
- "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896",
- "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e",
- "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9",
- "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2",
- "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b",
- "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6",
- "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404",
- "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f",
- "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0",
- "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4",
- "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc",
- "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936",
- "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba",
- "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872",
- "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb",
- "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614",
- "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1",
- "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d",
- "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969",
- "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b",
- "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4",
- "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627",
- "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",
- "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"
- ],
- "markers": "platform_python_implementation != 'PyPy'",
- "version": "==1.16.0"
- },
- "click": {
- "hashes": [
- "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
- "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==8.1.7"
- },
- "cryptography": {
- "hashes": [
- "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee",
- "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576",
- "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d",
- "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30",
- "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413",
- "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb",
- "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da",
- "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4",
- "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd",
- "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc",
- "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8",
- "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1",
- "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc",
- "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e",
- "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8",
- "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940",
- "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400",
- "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7",
- "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16",
- "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278",
- "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74",
- "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec",
- "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1",
- "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2",
- "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c",
- "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922",
- "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a",
- "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6",
- "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1",
- "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e",
- "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac",
- "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"
- ],
- "version": "==42.0.5"
- },
- "ecdsa": {
- "hashes": [
- "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a",
- "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"
- ],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==0.19.0"
- },
- "fastapi": {
- "hashes": [
- "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc",
- "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==0.110.1"
- },
- "h11": {
- "hashes": [
- "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
- "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.14.0"
- },
- "httptools": {
- "hashes": [
- "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563",
- "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142",
- "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d",
- "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b",
- "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4",
- "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb",
- "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658",
- "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084",
- "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2",
- "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97",
- "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837",
- "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3",
- "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58",
- "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da",
- "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d",
- "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90",
- "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0",
- "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1",
- "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2",
- "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e",
- "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0",
- "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf",
- "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc",
- "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3",
- "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503",
- "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a",
- "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3",
- "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949",
- "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84",
- "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb",
- "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a",
- "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f",
- "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e",
- "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81",
- "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185",
- "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"
- ],
- "version": "==0.6.1"
- },
- "idna": {
- "hashes": [
- "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",
- "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==3.7"
- },
- "pyasn1": {
- "hashes": [
- "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c",
- "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.6.0"
- },
- "pycparser": {
- "hashes": [
- "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
- "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.22"
- },
- "pydantic": {
- "hashes": [
- "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5",
- "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.7.1"
- },
- "pydantic-core": {
- "hashes": [
- "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b",
- "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a",
- "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90",
- "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d",
- "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e",
- "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d",
- "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027",
- "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804",
- "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347",
- "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400",
- "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3",
- "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399",
- "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349",
- "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd",
- "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c",
- "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e",
- "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413",
- "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3",
- "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e",
- "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3",
- "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91",
- "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce",
- "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c",
- "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb",
- "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664",
- "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6",
- "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd",
- "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3",
- "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af",
- "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043",
- "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350",
- "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7",
- "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0",
- "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563",
- "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761",
- "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72",
- "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3",
- "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb",
- "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788",
- "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b",
- "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c",
- "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038",
- "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250",
- "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec",
- "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c",
- "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74",
- "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81",
- "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439",
- "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75",
- "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0",
- "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8",
- "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150",
- "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438",
- "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae",
- "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857",
- "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038",
- "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374",
- "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f",
- "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241",
- "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592",
- "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4",
- "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d",
- "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b",
- "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b",
- "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182",
- "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e",
- "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641",
- "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70",
- "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9",
- "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a",
- "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543",
- "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b",
- "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f",
- "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38",
- "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845",
- "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2",
- "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0",
- "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4",
- "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.18.2"
- },
- "pyotp": {
- "hashes": [
- "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63",
- "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==2.9.0"
- },
- "pypng": {
- "hashes": [
- "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c",
- "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1"
- ],
- "version": "==0.20220715.0"
- },
- "python-dotenv": {
- "hashes": [
- "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",
- "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
- ],
- "version": "==1.0.1"
- },
- "python-jose": {
- "extras": [
- "cryptography"
- ],
- "hashes": [
- "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a",
- "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"
- ],
- "version": "==3.3.0"
- },
- "python-multipart": {
- "hashes": [
- "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026",
- "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==0.0.9"
- },
- "pyyaml": {
- "hashes": [
- "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
- "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
- "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
- "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
- "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
- "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
- "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
- "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
- "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
- "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
- "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
- "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
- "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
- "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
- "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
- "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
- "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
- "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
- "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
- "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
- "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
- "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
- "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
- "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
- "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
- "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
- "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
- "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
- "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
- "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef",
- "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
- "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
- "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
- "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
- "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
- "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
- "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
- "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
- "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
- "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
- "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
- "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
- "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
- "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
- "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
- "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
- "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
- "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
- "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
- "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
- "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
- ],
- "version": "==6.0.1"
- },
- "qrcode": {
- "hashes": [
- "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a",
- "sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==7.4.2"
- },
- "rsa": {
- "hashes": [
- "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7",
- "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"
- ],
- "markers": "python_version >= '3.6' and python_version < '4'",
- "version": "==4.9"
- },
- "six": {
- "hashes": [
- "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
- "version": "==1.16.0"
- },
- "sniffio": {
- "hashes": [
- "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
- "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.3.1"
- },
- "starlette": {
- "hashes": [
- "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee",
- "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.37.2"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0",
- "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.11.0"
- },
- "uvicorn": {
- "extras": [
- "standard"
- ],
- "hashes": [
- "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de",
- "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.29.0"
- },
- "uvloop": {
- "hashes": [
- "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd",
- "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec",
- "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b",
- "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc",
- "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797",
- "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5",
- "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2",
- "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d",
- "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be",
- "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd",
- "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12",
- "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17",
- "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef",
- "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24",
- "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428",
- "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1",
- "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849",
- "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593",
- "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd",
- "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67",
- "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6",
- "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3",
- "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd",
- "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8",
- "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7",
- "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533",
- "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957",
- "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650",
- "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e",
- "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7",
- "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"
- ],
- "version": "==0.19.0"
- },
- "watchfiles": {
- "hashes": [
- "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc",
- "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365",
- "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0",
- "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e",
- "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124",
- "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c",
- "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317",
- "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094",
- "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7",
- "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235",
- "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c",
- "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c",
- "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c",
- "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235",
- "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293",
- "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa",
- "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef",
- "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19",
- "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8",
- "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d",
- "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915",
- "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429",
- "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097",
- "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe",
- "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0",
- "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d",
- "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99",
- "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1",
- "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a",
- "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895",
- "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94",
- "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562",
- "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab",
- "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360",
- "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1",
- "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7",
- "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f",
- "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03",
- "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01",
- "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58",
- "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052",
- "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e",
- "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765",
- "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6",
- "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137",
- "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85",
- "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca",
- "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f",
- "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214",
- "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7",
- "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7",
- "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3",
- "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b",
- "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7",
- "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6",
- "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994",
- "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9",
- "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec",
- "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128",
- "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c",
- "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2",
- "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078",
- "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3",
- "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e",
- "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a",
- "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6",
- "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49",
- "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b",
- "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28",
- "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9",
- "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586",
- "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400",
- "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165",
- "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303",
- "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"
- ],
- "version": "==0.21.0"
- },
- "websockets": {
- "hashes": [
- "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b",
- "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6",
- "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df",
- "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b",
- "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205",
- "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892",
- "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53",
- "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2",
- "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed",
- "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c",
- "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd",
- "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b",
- "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931",
- "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30",
- "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370",
- "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be",
- "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec",
- "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf",
- "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62",
- "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b",
- "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402",
- "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f",
- "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123",
- "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9",
- "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603",
- "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45",
- "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558",
- "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4",
- "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438",
- "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137",
- "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480",
- "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447",
- "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8",
- "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04",
- "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c",
- "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb",
- "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967",
- "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b",
- "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d",
- "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def",
- "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c",
- "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92",
- "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2",
- "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113",
- "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b",
- "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28",
- "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7",
- "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d",
- "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f",
- "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468",
- "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8",
- "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae",
- "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611",
- "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d",
- "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9",
- "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca",
- "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f",
- "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2",
- "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077",
- "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2",
- "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6",
- "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374",
- "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc",
- "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e",
- "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53",
- "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399",
- "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547",
- "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3",
- "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870",
- "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5",
- "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8",
- "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"
- ],
- "version": "==12.0"
- },
- "whoosh": {
- "hashes": [
- "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83",
- "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852",
- "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"
- ],
- "index": "pypi",
- "version": "==2.7.4"
- }
- },
- "develop": {
- "black": {
- "hashes": [
- "sha256:0889f4eb8b3bdf8b189e41a71cf0dbb8141a98346cd1a2695dea5995d416e940",
- "sha256:0f404b6e77043b23d0321fb7772522b876b6de737ad3cb97d6b156638d68ce81",
- "sha256:171959bc879637a8cdbc53dc3fddae2a83e151937a28cf605fd175ce61e0e94a",
- "sha256:1f7749fd0d97ff9415975a1432fac7df89bf13c3833cea079e55fa004d5f28c0",
- "sha256:4ef4764437d7eba8386689cd06e1fb5341ee0ae2e9e22582b21178782de7ed94",
- "sha256:5241612dc8cad5b6fd47432b8bd04db80e07cfbc53bb69e9ae18985063bcb8dd",
- "sha256:59271c9c29dfa97f7fda51f56c7809b3f78e72fd8d2205189bbd23022a0618b6",
- "sha256:5bb0143f175db45a55227eefd63e90849d96c266330ba31719e9667d0d5ec3b9",
- "sha256:5ed9c34cba223149b5a0144951a0f33d65507cf82c5449cb3c35fe4b515fea9a",
- "sha256:5f8698974a81af83283eb47644f2711b5261138d6d9180c863fce673cbe04b13",
- "sha256:713a04a78e78f28ef7e8df7a16fe075670ea164860fcef3885e4f3dffc0184b3",
- "sha256:859f3cc5d2051adadf8fd504a01e02b0fd866d7549fff54bc9202d524d2e8bd7",
- "sha256:92b183f8eef5baf7b20a513abcf982ad616f544f593f6688bb2850d2982911f1",
- "sha256:945abd7b3572add997757c94295bb3e73c6ffaf3366b1f26cb2356a4bffd1dc3",
- "sha256:962d9e953872cdb83b97bb737ad47244ce2938054dc946685a4cad98520dab38",
- "sha256:9dae3ae59d6f2dc93700fd5034a3115434686e66fd6e63d4dcaa48d19880f2b0",
- "sha256:afc84c33c1a9aaf3d73140cee776b4ddf73ff429ffe6b7c56dc1c9c10725856d",
- "sha256:b1d8e3b2486b7dd522b1ab2ba1ec4907f0aa8f5e10a33c4271fb331d1d10b70c",
- "sha256:c94e52b766477bdcd010b872ba0714d5458536dc9d0734eff6583ba7266ffd89",
- "sha256:db5154b9e5b478031371d8bc41ff37b33855fa223a6cfba456c9b73fb96f77d4",
- "sha256:ecbab810604fe02c70b3a08afd39beb599f7cc9afd13e81f5336014133b4fe35",
- "sha256:ed77e214b785148f57e43ca425b6e0850165144aa727d66ac604e56a70bb7825"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==24.4.1"
- },
- "click": {
- "hashes": [
- "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
- "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==8.1.7"
- },
- "flake8": {
- "hashes": [
- "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132",
- "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"
- ],
- "index": "pypi",
- "markers": "python_full_version >= '3.8.1'",
- "version": "==7.0.0"
- },
- "isort": {
- "hashes": [
- "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118",
- "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76"
- ],
- "index": "pypi",
- "markers": "python_full_version >= '3.7.0'",
- "version": "==6.0.0b2"
- },
- "mccabe": {
- "hashes": [
- "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
- "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.7.0"
- },
- "mypy-extensions": {
- "hashes": [
- "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
- "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.0.0"
- },
- "packaging": {
- "hashes": [
- "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
- "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==24.0"
- },
- "pathspec": {
- "hashes": [
- "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",
- "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.12.1"
- },
- "platformdirs": {
- "hashes": [
- "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf",
- "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.2.1"
- },
- "pycodestyle": {
- "hashes": [
- "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f",
- "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==2.11.1"
- },
- "pyflakes": {
- "hashes": [
- "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f",
- "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==3.2.0"
- },
- "pytoolconfig": {
- "extras": [
- "global"
- ],
- "hashes": [
- "sha256:51e6bd1a6f108238ae6aab6a65e5eed5e75d456be1c2bf29b04e5c1e7d7adbae",
- "sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.3.1"
- },
- "rope": {
- "hashes": [
- "sha256:51437d2decc8806cd5e9dd1fd9c1306a6d9075ecaf78d191af85fc1dfface880",
- "sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==1.13.0"
- }
- }
-}
+{\r
+ "_meta": {\r
+ "hash": {\r
+ "sha256": "c7384cf6778b3352e64487ce7284282296ad308108679bb7d7cf1484c16ba411"\r
+ },\r
+ "pipfile-spec": 6,\r
+ "requires": {\r
+ "python_version": "3.11"\r
+ },\r
+ "sources": [\r
+ {\r
+ "name": "pypi",\r
+ "url": "https://pypi.org/simple",\r
+ "verify_ssl": true\r
+ }\r
+ ]\r
+ },\r
+ "default": {\r
+ "aiofiles": {\r
+ "hashes": [\r
+ "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107",\r
+ "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==23.2.1"\r
+ },\r
+ "annotated-types": {\r
+ "hashes": [\r
+ "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43",\r
+ "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.6.0"\r
+ },\r
+ "anyio": {\r
+ "hashes": [\r
+ "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8",\r
+ "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==4.3.0"\r
+ },\r
+ "cffi": {\r
+ "hashes": [\r
+ "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc",\r
+ "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a",\r
+ "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417",\r
+ "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab",\r
+ "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520",\r
+ "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36",\r
+ "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743",\r
+ "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8",\r
+ "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed",\r
+ "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684",\r
+ "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56",\r
+ "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324",\r
+ "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d",\r
+ "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235",\r
+ "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e",\r
+ "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088",\r
+ "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000",\r
+ "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7",\r
+ "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e",\r
+ "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673",\r
+ "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c",\r
+ "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe",\r
+ "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2",\r
+ "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098",\r
+ "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8",\r
+ "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a",\r
+ "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0",\r
+ "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b",\r
+ "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896",\r
+ "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e",\r
+ "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9",\r
+ "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2",\r
+ "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b",\r
+ "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6",\r
+ "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404",\r
+ "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f",\r
+ "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0",\r
+ "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4",\r
+ "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc",\r
+ "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936",\r
+ "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba",\r
+ "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872",\r
+ "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb",\r
+ "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614",\r
+ "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1",\r
+ "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d",\r
+ "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969",\r
+ "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b",\r
+ "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4",\r
+ "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627",\r
+ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956",\r
+ "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"\r
+ ],\r
+ "markers": "platform_python_implementation != 'PyPy'",\r
+ "version": "==1.16.0"\r
+ },\r
+ "click": {\r
+ "hashes": [\r
+ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",\r
+ "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"\r
+ ],\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==8.1.7"\r
+ },\r
+ "cryptography": {\r
+ "hashes": [\r
+ "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee",\r
+ "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576",\r
+ "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d",\r
+ "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30",\r
+ "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413",\r
+ "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb",\r
+ "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da",\r
+ "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4",\r
+ "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd",\r
+ "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc",\r
+ "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8",\r
+ "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1",\r
+ "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc",\r
+ "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e",\r
+ "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8",\r
+ "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940",\r
+ "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400",\r
+ "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7",\r
+ "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16",\r
+ "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278",\r
+ "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74",\r
+ "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec",\r
+ "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1",\r
+ "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2",\r
+ "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c",\r
+ "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922",\r
+ "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a",\r
+ "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6",\r
+ "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1",\r
+ "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e",\r
+ "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac",\r
+ "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"\r
+ ],\r
+ "version": "==42.0.5"\r
+ },\r
+ "ecdsa": {\r
+ "hashes": [\r
+ "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a",\r
+ "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"\r
+ ],\r
+ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",\r
+ "version": "==0.19.0"\r
+ },\r
+ "fastapi": {\r
+ "hashes": [\r
+ "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc",\r
+ "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.110.1"\r
+ },\r
+ "h11": {\r
+ "hashes": [\r
+ "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",\r
+ "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"\r
+ ],\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==0.14.0"\r
+ },\r
+ "httptools": {\r
+ "hashes": [\r
+ "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563",\r
+ "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142",\r
+ "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d",\r
+ "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b",\r
+ "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4",\r
+ "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb",\r
+ "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658",\r
+ "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084",\r
+ "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2",\r
+ "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97",\r
+ "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837",\r
+ "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3",\r
+ "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58",\r
+ "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da",\r
+ "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d",\r
+ "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90",\r
+ "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0",\r
+ "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1",\r
+ "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2",\r
+ "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e",\r
+ "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0",\r
+ "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf",\r
+ "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc",\r
+ "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3",\r
+ "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503",\r
+ "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a",\r
+ "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3",\r
+ "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949",\r
+ "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84",\r
+ "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb",\r
+ "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a",\r
+ "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f",\r
+ "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e",\r
+ "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81",\r
+ "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185",\r
+ "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"\r
+ ],\r
+ "version": "==0.6.1"\r
+ },\r
+ "idna": {\r
+ "hashes": [\r
+ "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",\r
+ "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"\r
+ ],\r
+ "markers": "python_version >= '3.5'",\r
+ "version": "==3.7"\r
+ },\r
+ "pyasn1": {\r
+ "hashes": [\r
+ "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c",\r
+ "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.6.0"\r
+ },\r
+ "pycparser": {\r
+ "hashes": [\r
+ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",\r
+ "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==2.22"\r
+ },\r
+ "pydantic": {\r
+ "hashes": [\r
+ "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5",\r
+ "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==2.7.1"\r
+ },\r
+ "pydantic-core": {\r
+ "hashes": [\r
+ "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b",\r
+ "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a",\r
+ "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90",\r
+ "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d",\r
+ "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e",\r
+ "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d",\r
+ "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027",\r
+ "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804",\r
+ "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347",\r
+ "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400",\r
+ "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3",\r
+ "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399",\r
+ "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349",\r
+ "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd",\r
+ "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c",\r
+ "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e",\r
+ "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413",\r
+ "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3",\r
+ "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e",\r
+ "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3",\r
+ "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91",\r
+ "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce",\r
+ "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c",\r
+ "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb",\r
+ "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664",\r
+ "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6",\r
+ "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd",\r
+ "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3",\r
+ "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af",\r
+ "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043",\r
+ "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350",\r
+ "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7",\r
+ "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0",\r
+ "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563",\r
+ "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761",\r
+ "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72",\r
+ "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3",\r
+ "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb",\r
+ "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788",\r
+ "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b",\r
+ "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c",\r
+ "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038",\r
+ "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250",\r
+ "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec",\r
+ "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c",\r
+ "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74",\r
+ "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81",\r
+ "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439",\r
+ "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75",\r
+ "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0",\r
+ "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8",\r
+ "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150",\r
+ "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438",\r
+ "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae",\r
+ "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857",\r
+ "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038",\r
+ "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374",\r
+ "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f",\r
+ "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241",\r
+ "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592",\r
+ "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4",\r
+ "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d",\r
+ "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b",\r
+ "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b",\r
+ "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182",\r
+ "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e",\r
+ "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641",\r
+ "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70",\r
+ "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9",\r
+ "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a",\r
+ "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543",\r
+ "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b",\r
+ "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f",\r
+ "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38",\r
+ "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845",\r
+ "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2",\r
+ "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0",\r
+ "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4",\r
+ "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==2.18.2"\r
+ },\r
+ "pyotp": {\r
+ "hashes": [\r
+ "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63",\r
+ "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==2.9.0"\r
+ },\r
+ "pypng": {\r
+ "hashes": [\r
+ "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c",\r
+ "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1"\r
+ ],\r
+ "version": "==0.20220715.0"\r
+ },\r
+ "python-dotenv": {\r
+ "hashes": [\r
+ "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",\r
+ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"\r
+ ],\r
+ "version": "==1.0.1"\r
+ },\r
+ "python-jose": {\r
+ "extras": [\r
+ "cryptography"\r
+ ],\r
+ "hashes": [\r
+ "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a",\r
+ "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"\r
+ ],\r
+ "version": "==3.3.0"\r
+ },\r
+ "python-multipart": {\r
+ "hashes": [\r
+ "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026",\r
+ "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.0.9"\r
+ },\r
+ "pyyaml": {\r
+ "hashes": [\r
+ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",\r
+ "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",\r
+ "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",\r
+ "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",\r
+ "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",\r
+ "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",\r
+ "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",\r
+ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",\r
+ "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",\r
+ "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",\r
+ "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",\r
+ "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",\r
+ "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",\r
+ "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",\r
+ "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",\r
+ "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",\r
+ "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",\r
+ "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",\r
+ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",\r
+ "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",\r
+ "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",\r
+ "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",\r
+ "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",\r
+ "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",\r
+ "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",\r
+ "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",\r
+ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",\r
+ "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",\r
+ "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",\r
+ "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef",\r
+ "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",\r
+ "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",\r
+ "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",\r
+ "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",\r
+ "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",\r
+ "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",\r
+ "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",\r
+ "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",\r
+ "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",\r
+ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",\r
+ "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",\r
+ "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",\r
+ "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",\r
+ "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",\r
+ "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",\r
+ "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",\r
+ "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",\r
+ "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",\r
+ "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",\r
+ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",\r
+ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"\r
+ ],\r
+ "version": "==6.0.1"\r
+ },\r
+ "qrcode": {\r
+ "hashes": [\r
+ "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a",\r
+ "sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==7.4.2"\r
+ },\r
+ "rsa": {\r
+ "hashes": [\r
+ "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7",\r
+ "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"\r
+ ],\r
+ "markers": "python_version >= '3.6' and python_version < '4'",\r
+ "version": "==4.9"\r
+ },\r
+ "six": {\r
+ "hashes": [\r
+ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",\r
+ "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"\r
+ ],\r
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",\r
+ "version": "==1.16.0"\r
+ },\r
+ "sniffio": {\r
+ "hashes": [\r
+ "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",\r
+ "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"\r
+ ],\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==1.3.1"\r
+ },\r
+ "starlette": {\r
+ "hashes": [\r
+ "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee",\r
+ "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.37.2"\r
+ },\r
+ "typing-extensions": {\r
+ "hashes": [\r
+ "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0",\r
+ "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==4.11.0"\r
+ },\r
+ "uvicorn": {\r
+ "extras": [\r
+ "standard"\r
+ ],\r
+ "hashes": [\r
+ "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de",\r
+ "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.29.0"\r
+ },\r
+ "uvloop": {\r
+ "hashes": [\r
+ "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd",\r
+ "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec",\r
+ "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b",\r
+ "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc",\r
+ "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797",\r
+ "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5",\r
+ "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2",\r
+ "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d",\r
+ "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be",\r
+ "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd",\r
+ "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12",\r
+ "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17",\r
+ "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef",\r
+ "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24",\r
+ "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428",\r
+ "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1",\r
+ "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849",\r
+ "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593",\r
+ "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd",\r
+ "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67",\r
+ "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6",\r
+ "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3",\r
+ "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd",\r
+ "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8",\r
+ "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7",\r
+ "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533",\r
+ "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957",\r
+ "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650",\r
+ "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e",\r
+ "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7",\r
+ "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"\r
+ ],\r
+ "version": "==0.19.0"\r
+ },\r
+ "watchfiles": {\r
+ "hashes": [\r
+ "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc",\r
+ "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365",\r
+ "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0",\r
+ "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e",\r
+ "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124",\r
+ "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c",\r
+ "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317",\r
+ "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094",\r
+ "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7",\r
+ "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235",\r
+ "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c",\r
+ "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c",\r
+ "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c",\r
+ "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235",\r
+ "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293",\r
+ "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa",\r
+ "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef",\r
+ "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19",\r
+ "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8",\r
+ "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d",\r
+ "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915",\r
+ "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429",\r
+ "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097",\r
+ "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe",\r
+ "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0",\r
+ "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d",\r
+ "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99",\r
+ "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1",\r
+ "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a",\r
+ "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895",\r
+ "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94",\r
+ "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562",\r
+ "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab",\r
+ "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360",\r
+ "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1",\r
+ "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7",\r
+ "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f",\r
+ "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03",\r
+ "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01",\r
+ "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58",\r
+ "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052",\r
+ "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e",\r
+ "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765",\r
+ "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6",\r
+ "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137",\r
+ "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85",\r
+ "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca",\r
+ "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f",\r
+ "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214",\r
+ "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7",\r
+ "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7",\r
+ "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3",\r
+ "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b",\r
+ "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7",\r
+ "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6",\r
+ "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994",\r
+ "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9",\r
+ "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec",\r
+ "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128",\r
+ "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c",\r
+ "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2",\r
+ "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078",\r
+ "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3",\r
+ "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e",\r
+ "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a",\r
+ "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6",\r
+ "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49",\r
+ "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b",\r
+ "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28",\r
+ "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9",\r
+ "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586",\r
+ "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400",\r
+ "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165",\r
+ "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303",\r
+ "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"\r
+ ],\r
+ "version": "==0.21.0"\r
+ },\r
+ "websockets": {\r
+ "hashes": [\r
+ "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b",\r
+ "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6",\r
+ "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df",\r
+ "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b",\r
+ "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205",\r
+ "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892",\r
+ "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53",\r
+ "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2",\r
+ "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed",\r
+ "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c",\r
+ "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd",\r
+ "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b",\r
+ "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931",\r
+ "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30",\r
+ "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370",\r
+ "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be",\r
+ "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec",\r
+ "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf",\r
+ "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62",\r
+ "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b",\r
+ "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402",\r
+ "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f",\r
+ "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123",\r
+ "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9",\r
+ "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603",\r
+ "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45",\r
+ "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558",\r
+ "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4",\r
+ "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438",\r
+ "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137",\r
+ "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480",\r
+ "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447",\r
+ "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8",\r
+ "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04",\r
+ "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c",\r
+ "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb",\r
+ "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967",\r
+ "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b",\r
+ "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d",\r
+ "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def",\r
+ "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c",\r
+ "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92",\r
+ "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2",\r
+ "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113",\r
+ "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b",\r
+ "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28",\r
+ "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7",\r
+ "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d",\r
+ "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f",\r
+ "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468",\r
+ "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8",\r
+ "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae",\r
+ "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611",\r
+ "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d",\r
+ "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9",\r
+ "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca",\r
+ "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f",\r
+ "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2",\r
+ "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077",\r
+ "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2",\r
+ "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6",\r
+ "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374",\r
+ "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc",\r
+ "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e",\r
+ "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53",\r
+ "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399",\r
+ "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547",\r
+ "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3",\r
+ "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870",\r
+ "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5",\r
+ "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8",\r
+ "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"\r
+ ],\r
+ "version": "==12.0"\r
+ },\r
+ "whoosh": {\r
+ "hashes": [\r
+ "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83",\r
+ "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852",\r
+ "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"\r
+ ],\r
+ "index": "pypi",\r
+ "version": "==2.7.4"\r
+ }\r
+ },\r
+ "develop": {\r
+ "black": {\r
+ "hashes": [\r
+ "sha256:0889f4eb8b3bdf8b189e41a71cf0dbb8141a98346cd1a2695dea5995d416e940",\r
+ "sha256:0f404b6e77043b23d0321fb7772522b876b6de737ad3cb97d6b156638d68ce81",\r
+ "sha256:171959bc879637a8cdbc53dc3fddae2a83e151937a28cf605fd175ce61e0e94a",\r
+ "sha256:1f7749fd0d97ff9415975a1432fac7df89bf13c3833cea079e55fa004d5f28c0",\r
+ "sha256:4ef4764437d7eba8386689cd06e1fb5341ee0ae2e9e22582b21178782de7ed94",\r
+ "sha256:5241612dc8cad5b6fd47432b8bd04db80e07cfbc53bb69e9ae18985063bcb8dd",\r
+ "sha256:59271c9c29dfa97f7fda51f56c7809b3f78e72fd8d2205189bbd23022a0618b6",\r
+ "sha256:5bb0143f175db45a55227eefd63e90849d96c266330ba31719e9667d0d5ec3b9",\r
+ "sha256:5ed9c34cba223149b5a0144951a0f33d65507cf82c5449cb3c35fe4b515fea9a",\r
+ "sha256:5f8698974a81af83283eb47644f2711b5261138d6d9180c863fce673cbe04b13",\r
+ "sha256:713a04a78e78f28ef7e8df7a16fe075670ea164860fcef3885e4f3dffc0184b3",\r
+ "sha256:859f3cc5d2051adadf8fd504a01e02b0fd866d7549fff54bc9202d524d2e8bd7",\r
+ "sha256:92b183f8eef5baf7b20a513abcf982ad616f544f593f6688bb2850d2982911f1",\r
+ "sha256:945abd7b3572add997757c94295bb3e73c6ffaf3366b1f26cb2356a4bffd1dc3",\r
+ "sha256:962d9e953872cdb83b97bb737ad47244ce2938054dc946685a4cad98520dab38",\r
+ "sha256:9dae3ae59d6f2dc93700fd5034a3115434686e66fd6e63d4dcaa48d19880f2b0",\r
+ "sha256:afc84c33c1a9aaf3d73140cee776b4ddf73ff429ffe6b7c56dc1c9c10725856d",\r
+ "sha256:b1d8e3b2486b7dd522b1ab2ba1ec4907f0aa8f5e10a33c4271fb331d1d10b70c",\r
+ "sha256:c94e52b766477bdcd010b872ba0714d5458536dc9d0734eff6583ba7266ffd89",\r
+ "sha256:db5154b9e5b478031371d8bc41ff37b33855fa223a6cfba456c9b73fb96f77d4",\r
+ "sha256:ecbab810604fe02c70b3a08afd39beb599f7cc9afd13e81f5336014133b4fe35",\r
+ "sha256:ed77e214b785148f57e43ca425b6e0850165144aa727d66ac604e56a70bb7825"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==24.4.1"\r
+ },\r
+ "click": {\r
+ "hashes": [\r
+ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",\r
+ "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"\r
+ ],\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==8.1.7"\r
+ },\r
+ "flake8": {\r
+ "hashes": [\r
+ "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132",\r
+ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_full_version >= '3.8.1'",\r
+ "version": "==7.0.0"\r
+ },\r
+ "isort": {\r
+ "hashes": [\r
+ "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118",\r
+ "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_full_version >= '3.7.0'",\r
+ "version": "==6.0.0b2"\r
+ },\r
+ "mccabe": {\r
+ "hashes": [\r
+ "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",\r
+ "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"\r
+ ],\r
+ "markers": "python_version >= '3.6'",\r
+ "version": "==0.7.0"\r
+ },\r
+ "mypy-extensions": {\r
+ "hashes": [\r
+ "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",\r
+ "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"\r
+ ],\r
+ "markers": "python_version >= '3.5'",\r
+ "version": "==1.0.0"\r
+ },\r
+ "packaging": {\r
+ "hashes": [\r
+ "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",\r
+ "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"\r
+ ],\r
+ "markers": "python_version >= '3.7'",\r
+ "version": "==24.0"\r
+ },\r
+ "pathspec": {\r
+ "hashes": [\r
+ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",\r
+ "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==0.12.1"\r
+ },\r
+ "platformdirs": {\r
+ "hashes": [\r
+ "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf",\r
+ "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==4.2.1"\r
+ },\r
+ "pycodestyle": {\r
+ "hashes": [\r
+ "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f",\r
+ "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==2.11.1"\r
+ },\r
+ "pyflakes": {\r
+ "hashes": [\r
+ "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f",\r
+ "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==3.2.0"\r
+ },\r
+ "pytoolconfig": {\r
+ "extras": [\r
+ "global"\r
+ ],\r
+ "hashes": [\r
+ "sha256:51e6bd1a6f108238ae6aab6a65e5eed5e75d456be1c2bf29b04e5c1e7d7adbae",\r
+ "sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b"\r
+ ],\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==1.3.1"\r
+ },\r
+ "rope": {\r
+ "hashes": [\r
+ "sha256:51437d2decc8806cd5e9dd1fd9c1306a6d9075ecaf78d191af85fc1dfface880",\r
+ "sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c"\r
+ ],\r
+ "index": "pypi",\r
+ "markers": "python_version >= '3.8'",\r
+ "version": "==1.13.0"\r
+ }\r
+ }\r
+}\r
-<p align="center">
- <img src="docs/logo.svg" width="300px"></img>
-</p>
-<p align="center">
- <img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/dullage/flatnotes?style=for-the-badge">
-</p>
-
-A self-hosted, database-less note-taking web app that utilises a flat folder of markdown files for storage.
-
-Log into the [demo site](https://demo.flatnotes.io) and take a look around. *Note: This site resets every 15 minutes.*
-
-## Contents
-
-* [Design Principle](#design-principle)
-* [Features](#features)
-* [Getting Started](#getting-started)
- * [Hosted](#hosted)
- * [Self Hosted](#self-hosted)
-* [Roadmap](#roadmap)
-* [Sponsorship](#sponsorship)
-* [Thanks](#thanks)
-
-## Design Principle
-
-flatnotes is designed to be a distraction-free note-taking app that puts your note content first. This means:
-
-* A clean and simple user interface.
-* No folders, notebooks or anything like that. Just all of your notes, backed by powerful search and tagging functionality.
-* Quick access to a full-text search from anywhere in the app (keyboard shortcut "/").
-
-Another key design principle is not to take your notes hostage. Your notes are just markdown files. There's no database, proprietary formatting, complicated folder structures or anything like that. You're free at any point to just move the files elsewhere and use another app.
-
-Equally, the only thing flatnotes caches is the search index and that's incrementally synced on every search (and when flatnotes first starts). This means that you're free to add, edit & delete the markdown files outside of flatnotes even whilst flatnotes is running.
-
-## Features
-
-* Mobile responsive web interface.
-* Raw/WYSIWYG markdown editor modes.
-* Advanced search functionality.
-* Note "tagging" functionality.
-* Wikilink support to easily link to other notes (`[[My Other Note]]`).
-* Light/dark themes.
-* Multiple authentication options (none, read-only, username/password, 2FA).
-* Restful API.
-
-See [the wiki](https://github.com/dullage/flatnotes/wiki) for more details.
-
-## Getting Started
-
-### Hosted
-
-A quick and easy way to get started with flatnotes is to host it on PikaPods. Just click the button below and follow the instructions.
-
-[](https://www.pikapods.com/pods?run=flatnotes)
-
-
-### Self Hosted
-
-If you'd prefer to host flatnotes yourself then the recommendation is to use Docker.
-
-### Example Docker Run Command
-
-```shell
-docker run -d \
- -e "PUID=1000" \
- -e "PGID=1000" \
- -e "FLATNOTES_AUTH_TYPE=password" \
- -e "FLATNOTES_USERNAME=user" \
- -e "FLATNOTES_PASSWORD=changeMe!" \
- -e "FLATNOTES_SECRET_KEY=aLongRandomSeriesOfCharacters" \
- -v "$(pwd)/data:/data" \
- -p "8080:8080" \
- dullage/flatnotes:latest
-```
-
-### Example Docker Compose
-```yaml
-version: "3"
-
-services:
- flatnotes:
- container_name: flatnotes
- image: dullage/flatnotes:latest
- environment:
- PUID: 1000
- PGID: 1000
- FLATNOTES_AUTH_TYPE: "password"
- FLATNOTES_USERNAME: "user"
- FLATNOTES_PASSWORD: "changeMe!"
- FLATNOTES_SECRET_KEY: "aLongRandomSeriesOfCharacters"
- volumes:
- - "./data:/data"
- # Optional. Allows you to save the search index in a different location:
- # - "./index:/data/.flatnotes"
- ports:
- - "8080:8080"
- restart: unless-stopped
-```
-
-See the [Environment Variables](https://github.com/dullage/flatnotes/wiki/Environment-Variables) article in the wiki for a full list of configuration options.
-
-
-## Roadmap
-
-I want to keep flatnotes as simple and distraction-free as possible which means limiting new features. This said, I welcome feedback and suggestions.
-
-
-## Sponsorship
-
-If you find this project useful, please consider buying me a beer. It would genuinely make my day.
-
-[](https://github.com/sponsors/Dullage)
-
-
-## Thanks
-
-A special thanks to 2 fantastic open-source projects that make flatnotes possible.
-
-* [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html) - A fast, pure Python search engine library.
-* [TOAST UI Editor](https://ui.toast.com/tui-editor) - A GFM Markdown and WYSIWYG editor for the browser.
+<p align="center">\r
+ <img src="docs/logo.svg" width="300px"></img>\r
+</p>\r
+<p align="center">\r
+ <img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/dullage/flatnotes?style=for-the-badge">\r
+</p>\r
+\r
+A self-hosted, database-less note-taking web app that utilises a flat folder of markdown files for storage.\r
+\r
+Log into the [demo site](https://demo.flatnotes.io) and take a look around. *Note: This site resets every 15 minutes.*\r
+\r
+## Contents\r
+\r
+* [Design Principle](#design-principle)\r
+* [Features](#features)\r
+* [Getting Started](#getting-started)\r
+ * [Hosted](#hosted)\r
+ * [Self Hosted](#self-hosted)\r
+* [Roadmap](#roadmap)\r
+* [Sponsorship](#sponsorship)\r
+* [Thanks](#thanks)\r
+\r
+## Design Principle\r
+\r
+flatnotes is designed to be a distraction-free note-taking app that puts your note content first. This means:\r
+\r
+* A clean and simple user interface.\r
+* No folders, notebooks or anything like that. Just all of your notes, backed by powerful search and tagging functionality.\r
+* Quick access to a full-text search from anywhere in the app (keyboard shortcut "/").\r
+\r
+Another key design principle is not to take your notes hostage. Your notes are just markdown files. There's no database, proprietary formatting, complicated folder structures or anything like that. You're free at any point to just move the files elsewhere and use another app.\r
+\r
+Equally, the only thing flatnotes caches is the search index and that's incrementally synced on every search (and when flatnotes first starts). This means that you're free to add, edit & delete the markdown files outside of flatnotes even whilst flatnotes is running.\r
+\r
+## Features\r
+\r
+* Mobile responsive web interface.\r
+* Raw/WYSIWYG markdown editor modes.\r
+* Advanced search functionality.\r
+* Note "tagging" functionality.\r
+* Wikilink support to easily link to other notes (`[[My Other Note]]`).\r
+* Light/dark themes.\r
+* Multiple authentication options (none, read-only, username/password, 2FA).\r
+* Restful API.\r
+\r
+See [the wiki](https://github.com/dullage/flatnotes/wiki) for more details.\r
+\r
+## Getting Started\r
+\r
+### Hosted\r
+\r
+A quick and easy way to get started with flatnotes is to host it on PikaPods. Just click the button below and follow the instructions.\r
+\r
+[](https://www.pikapods.com/pods?run=flatnotes)\r
+\r
+\r
+### Self Hosted\r
+\r
+If you'd prefer to host flatnotes yourself then the recommendation is to use Docker.\r
+\r
+### Example Docker Run Command\r
+\r
+```shell\r
+docker run -d \\r
+ -e "PUID=1000" \\r
+ -e "PGID=1000" \\r
+ -e "FLATNOTES_AUTH_TYPE=password" \\r
+ -e "FLATNOTES_USERNAME=user" \\r
+ -e "FLATNOTES_PASSWORD=changeMe!" \\r
+ -e "FLATNOTES_SECRET_KEY=aLongRandomSeriesOfCharacters" \\r
+ -v "$(pwd)/data:/data" \\r
+ -p "8080:8080" \\r
+ dullage/flatnotes:latest\r
+```\r
+\r
+### Example Docker Compose\r
+```yaml\r
+version: "3"\r
+\r
+services:\r
+ flatnotes:\r
+ container_name: flatnotes\r
+ image: dullage/flatnotes:latest\r
+ environment:\r
+ PUID: 1000\r
+ PGID: 1000\r
+ FLATNOTES_AUTH_TYPE: "password"\r
+ FLATNOTES_USERNAME: "user"\r
+ FLATNOTES_PASSWORD: "changeMe!"\r
+ FLATNOTES_SECRET_KEY: "aLongRandomSeriesOfCharacters"\r
+ volumes:\r
+ - "./data:/data"\r
+ # Optional. Allows you to save the search index in a different location: \r
+ # - "./index:/data/.flatnotes"\r
+ ports:\r
+ - "8080:8080"\r
+ restart: unless-stopped\r
+```\r
+\r
+See the [Environment Variables](https://github.com/dullage/flatnotes/wiki/Environment-Variables) article in the wiki for a full list of configuration options.\r
+\r
+\r
+## Roadmap\r
+\r
+I want to keep flatnotes as simple and distraction-free as possible which means limiting new features. This said, I welcome feedback and suggestions.\r
+\r
+\r
+## Sponsorship\r
+\r
+If you find this project useful, please consider buying me a beer. It would genuinely make my day.\r
+\r
+[](https://github.com/sponsors/Dullage)\r
+\r
+\r
+## Thanks\r
+\r
+A special thanks to 2 fantastic open-source projects that make flatnotes possible.\r
+\r
+* [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html) - A fast, pure Python search engine library.\r
+* [TOAST UI Editor](https://ui.toast.com/tui-editor) - A GFM Markdown and WYSIWYG editor for the browser.\r
-<template>
- <div class="container mx-auto flex h-screen flex-col px-2 py-4">
- <NavBar />
- <RouterView />
- </div>
-</template>
-
-<script setup>
-import { RouterView } from "vue-router";
-import NavBar from "/partials/NavBar.vue";
-</script>
+<template>\r
+ <div class="container mx-auto flex h-screen flex-col px-2 py-4">\r
+ <NavBar />\r
+ <RouterView />\r
+ </div>\r
+</template>\r
+\r
+<script setup>\r
+import { RouterView } from "vue-router";\r
+import NavBar from "/partials/NavBar.vue";\r
+</script>\r
-Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
+Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)\r
+\r
+This Font Software is licensed under the SIL Open Font License, Version 1.1.\r
+This license is copied below, and is also available with a FAQ at:\r
+http://scripts.sil.org/OFL\r
+\r
+\r
+-----------------------------------------------------------\r
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r
+-----------------------------------------------------------\r
+\r
+PREAMBLE\r
+The goals of the Open Font License (OFL) are to stimulate worldwide\r
+development of collaborative font projects, to support the font creation\r
+efforts of academic and linguistic communities, and to provide a free and\r
+open framework in which fonts may be shared and improved in partnership\r
+with others.\r
+\r
+The OFL allows the licensed fonts to be used, studied, modified and\r
+redistributed freely as long as they are not sold by themselves. The\r
+fonts, including any derivative works, can be bundled, embedded, \r
+redistributed and/or sold with any software provided that any reserved\r
+names are not used by derivative works. The fonts and derivatives,\r
+however, cannot be released under any other type of license. The\r
+requirement for fonts to remain under this license does not apply\r
+to any document created using the fonts or their derivatives.\r
+\r
+DEFINITIONS\r
+"Font Software" refers to the set of files released by the Copyright\r
+Holder(s) under this license and clearly marked as such. This may\r
+include source files, build scripts and documentation.\r
+\r
+"Reserved Font Name" refers to any names specified as such after the\r
+copyright statement(s).\r
+\r
+"Original Version" refers to the collection of Font Software components as\r
+distributed by the Copyright Holder(s).\r
+\r
+"Modified Version" refers to any derivative made by adding to, deleting,\r
+or substituting -- in part or in whole -- any of the components of the\r
+Original Version, by changing formats or by porting the Font Software to a\r
+new environment.\r
+\r
+"Author" refers to any designer, engineer, programmer, technical\r
+writer or other person who contributed to the Font Software.\r
+\r
+PERMISSION & CONDITIONS\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of the Font Software, to use, study, copy, merge, embed, modify,\r
+redistribute, and sell modified and unmodified copies of the Font\r
+Software, subject to the following conditions:\r
+\r
+1) Neither the Font Software nor any of its individual components,\r
+in Original or Modified Versions, may be sold by itself.\r
+\r
+2) Original or Modified Versions of the Font Software may be bundled,\r
+redistributed and/or sold with any software, provided that each copy\r
+contains the above copyright notice and this license. These can be\r
+included either as stand-alone text files, human-readable headers or\r
+in the appropriate machine-readable metadata fields within text or\r
+binary files as long as those fields can be easily viewed by the user.\r
+\r
+3) No Modified Version of the Font Software may use the Reserved Font\r
+Name(s) unless explicit written permission is granted by the corresponding\r
+Copyright Holder. This restriction only applies to the primary font name as\r
+presented to the users.\r
+\r
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r
+Software shall not be used to promote, endorse or advertise any\r
+Modified Version, except to acknowledge the contribution(s) of the\r
+Copyright Holder(s) and the Author(s) or with their explicit written\r
+permission.\r
+\r
+5) The Font Software, modified or unmodified, in part or in whole,\r
+must be distributed entirely under this license, and must not be\r
+distributed under any other license. The requirement for fonts to\r
+remain under this license does not apply to any document created\r
+using the Font Software.\r
+\r
+TERMINATION\r
+This license becomes null and void if any of the above conditions are\r
+not met.\r
+\r
+DISCLAIMER\r
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r
+OTHER DEALINGS IN THE FONT SOFTWARE.\r
-<template>
- <button
- class="hover:bg-theme-background-hover flex items-center rounded px-2 py-1 text-theme-text-muted"
- >
- <SvgIcon
- v-if="iconPath"
- type="mdi"
- :path="iconPath"
- :size="iconSize"
- :class="{ 'mr-1': label }"
- ></SvgIcon>
- <span v-if-label>{{ label }}</span>
- </button>
-</template>
-
-<script setup>
-import SvgIcon from "@jamescoyle/vue-icon";
-
-defineProps({
- iconPath: String,
- iconSize: {
- type: String,
- default: "1.25em",
- },
- label: String,
-});
-</script>
+<template>\r
+ <button\r
+ class="hover:bg-theme-background-hover flex items-center rounded px-2 py-1 text-theme-text-muted"\r
+ >\r
+ <SvgIcon\r
+ v-if="iconPath"\r
+ type="mdi"\r
+ :path="iconPath"\r
+ :size="iconSize"\r
+ :class="{ 'mr-1': label }"\r
+ ></SvgIcon>\r
+ <span v-if-label>{{ label }}</span>\r
+ </button>\r
+</template>\r
+\r
+<script setup>\r
+import SvgIcon from "@jamescoyle/vue-icon";\r
+\r
+defineProps({\r
+ iconPath: String,\r
+ iconSize: {\r
+ type: String,\r
+ default: "1.25em",\r
+ },\r
+ label: String,\r
+});\r
+</script>\r
-<template>
- <div class="flex items-center">
- <svg
- width="36"
- height="36"
- viewBox="0 0 36 36"
- fill="none"
- xmlns="http://www.w3.org/2000/svg"
- class="text-theme-brand"
- >
- <rect width="36" height="36" rx="4" fill="currentColor" />
- <path
- d="M9.904 28.88C9.75467 28.88 9.59467 28.7733 9.424 28.56C9.27467 28.3467 9.14667 28.1013 9.04 27.824C8.95467 27.5467 8.912 27.3227 8.912 27.152C8.95467 26.32 9.14667 25.3813 9.488 24.336C9.59467 24.0373 9.75467 23.9093 9.968 23.952C10.0107 23.5893 10.0533 23.1307 10.096 22.576C10.16 22.0213 10.2347 21.3813 10.32 20.656C10.2133 20.3573 9.98933 20.208 9.648 20.208C9.56267 20.208 9.24267 20.2613 8.688 20.368C8.15467 20.4747 7.36533 20.6347 6.32 20.848C6.29867 20.848 6.27733 20.8587 6.256 20.88C6.23467 20.88 6.20267 20.8693 6.16 20.848C5.94667 20.848 5.84 20.72 5.84 20.464C5.84 20.1653 5.97867 19.952 6.256 19.824L6.224 19.856C6.544 19.7067 7.32267 19.4827 8.56 19.184C9.47733 18.9493 10.2133 18.6507 10.768 18.288L10.96 16.656C11.0453 15.8667 11.184 15.056 11.376 14.224C11.568 13.3707 11.8347 12.5067 12.176 11.632C12.88 9.73333 13.712 8.208 14.672 7.056C15.4827 6.11733 16.2933 5.648 17.104 5.648C17.808 5.648 18.4267 5.97867 18.96 6.64C19.0453 6.72533 19.088 6.82133 19.088 6.928C19.088 7.16267 18.96 7.28 18.704 7.28C18.5547 7.28 18.4267 7.216 18.32 7.088C17.9787 6.68267 17.6053 6.48 17.2 6.48C16.24 6.48 15.2267 7.536 14.16 9.648C13.7333 10.5013 13.36 11.5147 13.04 12.688C12.72 13.84 12.4747 15.1413 12.304 16.592L12.272 17.136L12.208 18C12.8267 18.192 13.5093 18.288 14.256 18.288L16.304 18.224C16.944 18.2453 17.264 18.4587 17.264 18.864C17.264 19.2267 17.0933 19.408 16.752 19.408H14.256C13.36 19.472 12.5707 19.7173 11.888 20.144C11.248 25.0933 10.704 27.92 10.256 28.624C10.1493 28.7947 10.032 28.88 9.904 28.88ZM17.839 27.856C17.3483 27.856 16.9643 27.792 16.687 27.664C16.431 27.536 16.303 27.3973 16.303 27.248C16.303 27.12 16.367 27.0027 16.495 26.896C16.6443 26.7893 16.8897 26.7253 17.231 26.704C17.6577 26.6827 18.255 26.6613 19.023 26.64C19.791 26.6187 20.6337 26.5973 21.551 26.576C22.4897 26.5547 23.407 26.544 24.303 26.544C24.7723 26.544 25.231 26.544 25.679 26.544C26.127 26.544 26.5217 26.5547 26.863 26.576C27.2257 26.5973 27.4923 26.6293 27.663 26.672C27.8337 26.7147 27.919 26.832 27.919 27.024C27.919 27.2587 27.823 27.408 27.631 27.472C27.439 27.536 27.2043 27.568 26.927 27.568C26.4363 27.568 25.7963 27.5787 25.007 27.6C24.2177 27.6427 23.375 27.6747 22.479 27.696C21.583 27.7387 20.719 27.7707 19.887 27.792C19.0763 27.8347 18.3937 27.856 17.839 27.856Z"
- fill="white"
- />
- </svg>
- <svg
- width="149"
- height="29"
- viewBox="0 0 149 29"
- fill="none"
- xmlns="http://www.w3.org/2000/svg"
- class="text-theme-text-muted ml-2"
- >
- <path
- d="M11.5057 8.36364V10.9205H0.920455V8.36364H11.5057ZM4.09091 28V5.65341C4.09091 4.52841 4.35511 3.59091 4.88352 2.84091C5.41193 2.09091 6.09801 1.52841 6.94176 1.15341C7.78551 0.778407 8.67614 0.590907 9.61364 0.590907C10.3551 0.590907 10.9602 0.650567 11.429 0.769886C11.8977 0.889203 12.2472 0.999999 12.4773 1.10227L11.608 3.71023C11.4545 3.65909 11.2415 3.59517 10.9688 3.51847C10.7045 3.44176 10.3551 3.40341 9.92045 3.40341C8.9233 3.40341 8.20313 3.65483 7.75994 4.15767C7.32528 4.66051 7.10795 5.39773 7.10795 6.36932V28H4.09091ZM18.7511 1.81818V28H15.734V1.81818H18.7511ZM30.0554 28.4602C28.8111 28.4602 27.6818 28.2259 26.6676 27.7571C25.6534 27.2798 24.848 26.5938 24.2514 25.6989C23.6548 24.7955 23.3565 23.7045 23.3565 22.4261C23.3565 21.3011 23.5781 20.3892 24.0213 19.6903C24.4645 18.983 25.0568 18.429 25.7983 18.0284C26.5398 17.6278 27.358 17.3295 28.2528 17.1335C29.1563 16.929 30.0639 16.767 30.9759 16.6477C32.169 16.4943 33.1364 16.3793 33.8778 16.3026C34.6278 16.2173 35.1733 16.0767 35.5142 15.8807C35.8636 15.6847 36.0384 15.3437 36.0384 14.858V14.7557C36.0384 13.4943 35.6932 12.5142 35.0028 11.8153C34.321 11.1165 33.2855 10.767 31.8963 10.767C30.456 10.767 29.3267 11.0824 28.5085 11.7131C27.6903 12.3437 27.1151 13.017 26.7827 13.733L23.919 12.7102C24.4304 11.517 25.1122 10.5881 25.9645 9.9233C26.8253 9.25 27.7628 8.78125 28.777 8.51705C29.7997 8.24432 30.8054 8.10795 31.794 8.10795C32.4247 8.10795 33.1491 8.18466 33.9673 8.33807C34.794 8.48295 35.5909 8.78551 36.358 9.24574C37.1335 9.70597 37.777 10.4006 38.2884 11.3295C38.7997 12.2585 39.0554 13.5028 39.0554 15.0625V28H36.0384V25.3409H35.8849C35.6804 25.767 35.3395 26.223 34.8622 26.7088C34.3849 27.1946 33.75 27.608 32.9574 27.9489C32.1648 28.2898 31.1974 28.4602 30.0554 28.4602ZM30.5156 25.75C31.7088 25.75 32.7145 25.5156 33.5327 25.0469C34.3594 24.5781 34.9815 23.973 35.3991 23.2315C35.8253 22.4901 36.0384 21.7102 36.0384 20.892V18.1307C35.9105 18.2841 35.6293 18.4247 35.1946 18.5526C34.7685 18.6719 34.2741 18.7784 33.7116 18.8722C33.1577 18.9574 32.6165 19.0341 32.0881 19.1023C31.5682 19.1619 31.1463 19.2131 30.8224 19.2557C30.0384 19.358 29.3054 19.5241 28.6236 19.7543C27.9503 19.9759 27.4048 20.3125 26.9872 20.7642C26.5781 21.2074 26.3736 21.8125 26.3736 22.5795C26.3736 23.6278 26.7614 24.4205 27.5369 24.9574C28.321 25.4858 29.3139 25.75 30.5156 25.75ZM53.1019 8.36364V10.9205H42.9258V8.36364H53.1019ZM45.8917 3.65909H48.9087V22.375C48.9087 23.2273 49.0323 23.8665 49.2795 24.2926C49.5352 24.7102 49.859 24.9915 50.2511 25.1364C50.6516 25.2727 51.0735 25.3409 51.5167 25.3409C51.8491 25.3409 52.1218 25.3239 52.3349 25.2898C52.5479 25.2472 52.7184 25.2131 52.8462 25.1875L53.4599 27.8977C53.2553 27.9744 52.9698 28.0511 52.6033 28.1278C52.2369 28.2131 51.7724 28.2557 51.2099 28.2557C50.3576 28.2557 49.5224 28.0724 48.7042 27.706C47.8945 27.3395 47.2212 26.7812 46.6843 26.0312C46.1559 25.2812 45.8917 24.3352 45.8917 23.1932V3.65909ZM60.6573 16.1875V28H57.6403V8.36364H60.555V11.4318H60.8107C61.271 10.4347 61.9698 9.63352 62.9073 9.02841C63.8448 8.41477 65.055 8.10795 66.538 8.10795C67.8675 8.10795 69.0309 8.38068 70.0281 8.92614C71.0252 9.46307 71.8008 10.2812 72.3548 11.3807C72.9087 12.4716 73.1857 13.8523 73.1857 15.5227V28H70.1687V15.7273C70.1687 14.1847 69.7681 12.983 68.967 12.1222C68.1658 11.2528 67.0664 10.8182 65.6687 10.8182C64.7056 10.8182 63.8448 11.027 63.0863 11.4446C62.3363 11.8622 61.744 12.4716 61.3093 13.2727C60.8746 14.0739 60.6573 15.0455 60.6573 16.1875ZM86.6761 28.4091C84.9034 28.4091 83.348 27.9872 82.0099 27.1435C80.6804 26.2997 79.6406 25.1193 78.8906 23.6023C78.1491 22.0852 77.7784 20.3125 77.7784 18.2841C77.7784 16.2386 78.1491 14.4531 78.8906 12.9276C79.6406 11.402 80.6804 10.2173 82.0099 9.37358C83.348 8.52983 84.9034 8.10795 86.6761 8.10795C88.4489 8.10795 90 8.52983 91.3295 9.37358C92.6676 10.2173 93.7074 11.402 94.4489 12.9276C95.1989 14.4531 95.5739 16.2386 95.5739 18.2841C95.5739 20.3125 95.1989 22.0852 94.4489 23.6023C93.7074 25.1193 92.6676 26.2997 91.3295 27.1435C90 27.9872 88.4489 28.4091 86.6761 28.4091ZM86.6761 25.6989C88.0227 25.6989 89.1307 25.3537 90 24.6634C90.8693 23.973 91.5128 23.0653 91.9304 21.9403C92.348 20.8153 92.5568 19.5966 92.5568 18.2841C92.5568 16.9716 92.348 15.7486 91.9304 14.6151C91.5128 13.4815 90.8693 12.5653 90 11.8665C89.1307 11.1676 88.0227 10.8182 86.6761 10.8182C85.3295 10.8182 84.2216 11.1676 83.3523 11.8665C82.483 12.5653 81.8395 13.4815 81.4219 14.6151C81.0043 15.7486 80.7955 16.9716 80.7955 18.2841C80.7955 19.5966 81.0043 20.8153 81.4219 21.9403C81.8395 23.0653 82.483 23.973 83.3523 24.6634C84.2216 25.3537 85.3295 25.6989 86.6761 25.6989ZM108.719 8.36364V10.9205H98.543V8.36364H108.719ZM101.509 3.65909H104.526V22.375C104.526 23.2273 104.65 23.8665 104.897 24.2926C105.152 24.7102 105.476 24.9915 105.868 25.1364C106.269 25.2727 106.691 25.3409 107.134 25.3409C107.466 25.3409 107.739 25.3239 107.952 25.2898C108.165 25.2472 108.336 25.2131 108.463 25.1875L109.077 27.8977C108.873 27.9744 108.587 28.0511 108.221 28.1278C107.854 28.2131 107.39 28.2557 106.827 28.2557C105.975 28.2557 105.14 28.0724 104.321 27.706C103.512 27.3395 102.838 26.7812 102.301 26.0312C101.773 25.2812 101.509 24.3352 101.509 23.1932V3.65909ZM121.279 28.4091C119.387 28.4091 117.755 27.9915 116.383 27.1562C115.02 26.3125 113.967 25.1364 113.225 23.6278C112.493 22.1108 112.126 20.3466 112.126 18.3352C112.126 16.3239 112.493 14.5511 113.225 13.017C113.967 11.4744 114.998 10.2727 116.319 9.41193C117.649 8.54261 119.2 8.10795 120.973 8.10795C121.995 8.10795 123.005 8.27841 124.002 8.61932C125 8.96023 125.907 9.5142 126.725 10.2812C127.544 11.0398 128.196 12.0455 128.681 13.2983C129.167 14.5511 129.41 16.0937 129.41 17.9261V19.2045H114.274V16.5966H126.342C126.342 15.4886 126.12 14.5 125.677 13.6307C125.243 12.7614 124.62 12.0753 123.811 11.5724C123.01 11.0696 122.064 10.8182 120.973 10.8182C119.771 10.8182 118.731 11.1165 117.853 11.7131C116.984 12.3011 116.315 13.0682 115.846 14.0142C115.377 14.9602 115.143 15.9744 115.143 17.0568V18.7955C115.143 20.2784 115.399 21.5355 115.91 22.5668C116.43 23.5895 117.15 24.3693 118.071 24.9062C118.991 25.4347 120.061 25.6989 121.279 25.6989C122.072 25.6989 122.788 25.5881 123.427 25.3665C124.075 25.1364 124.633 24.7955 125.102 24.3438C125.571 23.8835 125.933 23.3125 126.189 22.6307L129.103 23.4489C128.797 24.4375 128.281 25.3068 127.556 26.0568C126.832 26.7983 125.937 27.3778 124.872 27.7955C123.806 28.2045 122.609 28.4091 121.279 28.4091ZM147.909 12.7614L145.199 13.5284C145.028 13.0767 144.777 12.6378 144.444 12.2116C144.12 11.777 143.677 11.419 143.115 11.1378C142.552 10.8565 141.832 10.7159 140.954 10.7159C139.752 10.7159 138.751 10.9929 137.95 11.5469C137.157 12.0923 136.761 12.7869 136.761 13.6307C136.761 14.3807 137.034 14.973 137.579 15.4077C138.125 15.8423 138.977 16.2045 140.136 16.4943L143.051 17.2102C144.806 17.6364 146.115 18.2884 146.975 19.1662C147.836 20.0355 148.267 21.1562 148.267 22.5284C148.267 23.6534 147.943 24.6591 147.295 25.5455C146.656 26.4318 145.761 27.1307 144.61 27.642C143.46 28.1534 142.122 28.4091 140.596 28.4091C138.593 28.4091 136.936 27.9744 135.623 27.1051C134.311 26.2358 133.48 24.9659 133.13 23.2955L135.994 22.5795C136.267 23.6364 136.782 24.429 137.541 24.9574C138.308 25.4858 139.309 25.75 140.545 25.75C141.951 25.75 143.068 25.4517 143.895 24.8551C144.73 24.25 145.147 23.5256 145.147 22.6818C145.147 22 144.909 21.429 144.431 20.9688C143.954 20.5 143.221 20.1506 142.233 19.9205L138.96 19.1534C137.162 18.7273 135.841 18.0668 134.997 17.1719C134.162 16.2685 133.744 15.1392 133.744 13.7841C133.744 12.6761 134.055 11.696 134.677 10.8438C135.308 9.99148 136.164 9.32244 137.247 8.83665C138.338 8.35085 139.574 8.10795 140.954 8.10795C142.897 8.10795 144.423 8.53409 145.531 9.38636C146.647 10.2386 147.44 11.3636 147.909 12.7614Z"
- fill="currentColor"
- />
- </svg>
- </div>
-</template>
+<template>\r
+ <div class="flex items-center">\r
+ <svg\r
+ width="36"\r
+ height="36"\r
+ viewBox="0 0 36 36"\r
+ fill="none"\r
+ xmlns="http://www.w3.org/2000/svg"\r
+ class="text-theme-brand"\r
+ >\r
+ <rect width="36" height="36" rx="4" fill="currentColor" />\r
+ <path\r
+ d="M9.904 28.88C9.75467 28.88 9.59467 28.7733 9.424 28.56C9.27467 28.3467 9.14667 28.1013 9.04 27.824C8.95467 27.5467 8.912 27.3227 8.912 27.152C8.95467 26.32 9.14667 25.3813 9.488 24.336C9.59467 24.0373 9.75467 23.9093 9.968 23.952C10.0107 23.5893 10.0533 23.1307 10.096 22.576C10.16 22.0213 10.2347 21.3813 10.32 20.656C10.2133 20.3573 9.98933 20.208 9.648 20.208C9.56267 20.208 9.24267 20.2613 8.688 20.368C8.15467 20.4747 7.36533 20.6347 6.32 20.848C6.29867 20.848 6.27733 20.8587 6.256 20.88C6.23467 20.88 6.20267 20.8693 6.16 20.848C5.94667 20.848 5.84 20.72 5.84 20.464C5.84 20.1653 5.97867 19.952 6.256 19.824L6.224 19.856C6.544 19.7067 7.32267 19.4827 8.56 19.184C9.47733 18.9493 10.2133 18.6507 10.768 18.288L10.96 16.656C11.0453 15.8667 11.184 15.056 11.376 14.224C11.568 13.3707 11.8347 12.5067 12.176 11.632C12.88 9.73333 13.712 8.208 14.672 7.056C15.4827 6.11733 16.2933 5.648 17.104 5.648C17.808 5.648 18.4267 5.97867 18.96 6.64C19.0453 6.72533 19.088 6.82133 19.088 6.928C19.088 7.16267 18.96 7.28 18.704 7.28C18.5547 7.28 18.4267 7.216 18.32 7.088C17.9787 6.68267 17.6053 6.48 17.2 6.48C16.24 6.48 15.2267 7.536 14.16 9.648C13.7333 10.5013 13.36 11.5147 13.04 12.688C12.72 13.84 12.4747 15.1413 12.304 16.592L12.272 17.136L12.208 18C12.8267 18.192 13.5093 18.288 14.256 18.288L16.304 18.224C16.944 18.2453 17.264 18.4587 17.264 18.864C17.264 19.2267 17.0933 19.408 16.752 19.408H14.256C13.36 19.472 12.5707 19.7173 11.888 20.144C11.248 25.0933 10.704 27.92 10.256 28.624C10.1493 28.7947 10.032 28.88 9.904 28.88ZM17.839 27.856C17.3483 27.856 16.9643 27.792 16.687 27.664C16.431 27.536 16.303 27.3973 16.303 27.248C16.303 27.12 16.367 27.0027 16.495 26.896C16.6443 26.7893 16.8897 26.7253 17.231 26.704C17.6577 26.6827 18.255 26.6613 19.023 26.64C19.791 26.6187 20.6337 26.5973 21.551 26.576C22.4897 26.5547 23.407 26.544 24.303 26.544C24.7723 26.544 25.231 26.544 25.679 26.544C26.127 26.544 26.5217 26.5547 26.863 26.576C27.2257 26.5973 27.4923 26.6293 27.663 26.672C27.8337 26.7147 27.919 26.832 27.919 27.024C27.919 27.2587 27.823 27.408 27.631 27.472C27.439 27.536 27.2043 27.568 26.927 27.568C26.4363 27.568 25.7963 27.5787 25.007 27.6C24.2177 27.6427 23.375 27.6747 22.479 27.696C21.583 27.7387 20.719 27.7707 19.887 27.792C19.0763 27.8347 18.3937 27.856 17.839 27.856Z"\r
+ fill="white"\r
+ />\r
+ </svg>\r
+ <svg\r
+ width="149"\r
+ height="29"\r
+ viewBox="0 0 149 29"\r
+ fill="none"\r
+ xmlns="http://www.w3.org/2000/svg"\r
+ class="text-theme-text-muted ml-2"\r
+ >\r
+ <path\r
+ d="M11.5057 8.36364V10.9205H0.920455V8.36364H11.5057ZM4.09091 28V5.65341C4.09091 4.52841 4.35511 3.59091 4.88352 2.84091C5.41193 2.09091 6.09801 1.52841 6.94176 1.15341C7.78551 0.778407 8.67614 0.590907 9.61364 0.590907C10.3551 0.590907 10.9602 0.650567 11.429 0.769886C11.8977 0.889203 12.2472 0.999999 12.4773 1.10227L11.608 3.71023C11.4545 3.65909 11.2415 3.59517 10.9688 3.51847C10.7045 3.44176 10.3551 3.40341 9.92045 3.40341C8.9233 3.40341 8.20313 3.65483 7.75994 4.15767C7.32528 4.66051 7.10795 5.39773 7.10795 6.36932V28H4.09091ZM18.7511 1.81818V28H15.734V1.81818H18.7511ZM30.0554 28.4602C28.8111 28.4602 27.6818 28.2259 26.6676 27.7571C25.6534 27.2798 24.848 26.5938 24.2514 25.6989C23.6548 24.7955 23.3565 23.7045 23.3565 22.4261C23.3565 21.3011 23.5781 20.3892 24.0213 19.6903C24.4645 18.983 25.0568 18.429 25.7983 18.0284C26.5398 17.6278 27.358 17.3295 28.2528 17.1335C29.1563 16.929 30.0639 16.767 30.9759 16.6477C32.169 16.4943 33.1364 16.3793 33.8778 16.3026C34.6278 16.2173 35.1733 16.0767 35.5142 15.8807C35.8636 15.6847 36.0384 15.3437 36.0384 14.858V14.7557C36.0384 13.4943 35.6932 12.5142 35.0028 11.8153C34.321 11.1165 33.2855 10.767 31.8963 10.767C30.456 10.767 29.3267 11.0824 28.5085 11.7131C27.6903 12.3437 27.1151 13.017 26.7827 13.733L23.919 12.7102C24.4304 11.517 25.1122 10.5881 25.9645 9.9233C26.8253 9.25 27.7628 8.78125 28.777 8.51705C29.7997 8.24432 30.8054 8.10795 31.794 8.10795C32.4247 8.10795 33.1491 8.18466 33.9673 8.33807C34.794 8.48295 35.5909 8.78551 36.358 9.24574C37.1335 9.70597 37.777 10.4006 38.2884 11.3295C38.7997 12.2585 39.0554 13.5028 39.0554 15.0625V28H36.0384V25.3409H35.8849C35.6804 25.767 35.3395 26.223 34.8622 26.7088C34.3849 27.1946 33.75 27.608 32.9574 27.9489C32.1648 28.2898 31.1974 28.4602 30.0554 28.4602ZM30.5156 25.75C31.7088 25.75 32.7145 25.5156 33.5327 25.0469C34.3594 24.5781 34.9815 23.973 35.3991 23.2315C35.8253 22.4901 36.0384 21.7102 36.0384 20.892V18.1307C35.9105 18.2841 35.6293 18.4247 35.1946 18.5526C34.7685 18.6719 34.2741 18.7784 33.7116 18.8722C33.1577 18.9574 32.6165 19.0341 32.0881 19.1023C31.5682 19.1619 31.1463 19.2131 30.8224 19.2557C30.0384 19.358 29.3054 19.5241 28.6236 19.7543C27.9503 19.9759 27.4048 20.3125 26.9872 20.7642C26.5781 21.2074 26.3736 21.8125 26.3736 22.5795C26.3736 23.6278 26.7614 24.4205 27.5369 24.9574C28.321 25.4858 29.3139 25.75 30.5156 25.75ZM53.1019 8.36364V10.9205H42.9258V8.36364H53.1019ZM45.8917 3.65909H48.9087V22.375C48.9087 23.2273 49.0323 23.8665 49.2795 24.2926C49.5352 24.7102 49.859 24.9915 50.2511 25.1364C50.6516 25.2727 51.0735 25.3409 51.5167 25.3409C51.8491 25.3409 52.1218 25.3239 52.3349 25.2898C52.5479 25.2472 52.7184 25.2131 52.8462 25.1875L53.4599 27.8977C53.2553 27.9744 52.9698 28.0511 52.6033 28.1278C52.2369 28.2131 51.7724 28.2557 51.2099 28.2557C50.3576 28.2557 49.5224 28.0724 48.7042 27.706C47.8945 27.3395 47.2212 26.7812 46.6843 26.0312C46.1559 25.2812 45.8917 24.3352 45.8917 23.1932V3.65909ZM60.6573 16.1875V28H57.6403V8.36364H60.555V11.4318H60.8107C61.271 10.4347 61.9698 9.63352 62.9073 9.02841C63.8448 8.41477 65.055 8.10795 66.538 8.10795C67.8675 8.10795 69.0309 8.38068 70.0281 8.92614C71.0252 9.46307 71.8008 10.2812 72.3548 11.3807C72.9087 12.4716 73.1857 13.8523 73.1857 15.5227V28H70.1687V15.7273C70.1687 14.1847 69.7681 12.983 68.967 12.1222C68.1658 11.2528 67.0664 10.8182 65.6687 10.8182C64.7056 10.8182 63.8448 11.027 63.0863 11.4446C62.3363 11.8622 61.744 12.4716 61.3093 13.2727C60.8746 14.0739 60.6573 15.0455 60.6573 16.1875ZM86.6761 28.4091C84.9034 28.4091 83.348 27.9872 82.0099 27.1435C80.6804 26.2997 79.6406 25.1193 78.8906 23.6023C78.1491 22.0852 77.7784 20.3125 77.7784 18.2841C77.7784 16.2386 78.1491 14.4531 78.8906 12.9276C79.6406 11.402 80.6804 10.2173 82.0099 9.37358C83.348 8.52983 84.9034 8.10795 86.6761 8.10795C88.4489 8.10795 90 8.52983 91.3295 9.37358C92.6676 10.2173 93.7074 11.402 94.4489 12.9276C95.1989 14.4531 95.5739 16.2386 95.5739 18.2841C95.5739 20.3125 95.1989 22.0852 94.4489 23.6023C93.7074 25.1193 92.6676 26.2997 91.3295 27.1435C90 27.9872 88.4489 28.4091 86.6761 28.4091ZM86.6761 25.6989C88.0227 25.6989 89.1307 25.3537 90 24.6634C90.8693 23.973 91.5128 23.0653 91.9304 21.9403C92.348 20.8153 92.5568 19.5966 92.5568 18.2841C92.5568 16.9716 92.348 15.7486 91.9304 14.6151C91.5128 13.4815 90.8693 12.5653 90 11.8665C89.1307 11.1676 88.0227 10.8182 86.6761 10.8182C85.3295 10.8182 84.2216 11.1676 83.3523 11.8665C82.483 12.5653 81.8395 13.4815 81.4219 14.6151C81.0043 15.7486 80.7955 16.9716 80.7955 18.2841C80.7955 19.5966 81.0043 20.8153 81.4219 21.9403C81.8395 23.0653 82.483 23.973 83.3523 24.6634C84.2216 25.3537 85.3295 25.6989 86.6761 25.6989ZM108.719 8.36364V10.9205H98.543V8.36364H108.719ZM101.509 3.65909H104.526V22.375C104.526 23.2273 104.65 23.8665 104.897 24.2926C105.152 24.7102 105.476 24.9915 105.868 25.1364C106.269 25.2727 106.691 25.3409 107.134 25.3409C107.466 25.3409 107.739 25.3239 107.952 25.2898C108.165 25.2472 108.336 25.2131 108.463 25.1875L109.077 27.8977C108.873 27.9744 108.587 28.0511 108.221 28.1278C107.854 28.2131 107.39 28.2557 106.827 28.2557C105.975 28.2557 105.14 28.0724 104.321 27.706C103.512 27.3395 102.838 26.7812 102.301 26.0312C101.773 25.2812 101.509 24.3352 101.509 23.1932V3.65909ZM121.279 28.4091C119.387 28.4091 117.755 27.9915 116.383 27.1562C115.02 26.3125 113.967 25.1364 113.225 23.6278C112.493 22.1108 112.126 20.3466 112.126 18.3352C112.126 16.3239 112.493 14.5511 113.225 13.017C113.967 11.4744 114.998 10.2727 116.319 9.41193C117.649 8.54261 119.2 8.10795 120.973 8.10795C121.995 8.10795 123.005 8.27841 124.002 8.61932C125 8.96023 125.907 9.5142 126.725 10.2812C127.544 11.0398 128.196 12.0455 128.681 13.2983C129.167 14.5511 129.41 16.0937 129.41 17.9261V19.2045H114.274V16.5966H126.342C126.342 15.4886 126.12 14.5 125.677 13.6307C125.243 12.7614 124.62 12.0753 123.811 11.5724C123.01 11.0696 122.064 10.8182 120.973 10.8182C119.771 10.8182 118.731 11.1165 117.853 11.7131C116.984 12.3011 116.315 13.0682 115.846 14.0142C115.377 14.9602 115.143 15.9744 115.143 17.0568V18.7955C115.143 20.2784 115.399 21.5355 115.91 22.5668C116.43 23.5895 117.15 24.3693 118.071 24.9062C118.991 25.4347 120.061 25.6989 121.279 25.6989C122.072 25.6989 122.788 25.5881 123.427 25.3665C124.075 25.1364 124.633 24.7955 125.102 24.3438C125.571 23.8835 125.933 23.3125 126.189 22.6307L129.103 23.4489C128.797 24.4375 128.281 25.3068 127.556 26.0568C126.832 26.7983 125.937 27.3778 124.872 27.7955C123.806 28.2045 122.609 28.4091 121.279 28.4091ZM147.909 12.7614L145.199 13.5284C145.028 13.0767 144.777 12.6378 144.444 12.2116C144.12 11.777 143.677 11.419 143.115 11.1378C142.552 10.8565 141.832 10.7159 140.954 10.7159C139.752 10.7159 138.751 10.9929 137.95 11.5469C137.157 12.0923 136.761 12.7869 136.761 13.6307C136.761 14.3807 137.034 14.973 137.579 15.4077C138.125 15.8423 138.977 16.2045 140.136 16.4943L143.051 17.2102C144.806 17.6364 146.115 18.2884 146.975 19.1662C147.836 20.0355 148.267 21.1562 148.267 22.5284C148.267 23.6534 147.943 24.6591 147.295 25.5455C146.656 26.4318 145.761 27.1307 144.61 27.642C143.46 28.1534 142.122 28.4091 140.596 28.4091C138.593 28.4091 136.936 27.9744 135.623 27.1051C134.311 26.2358 133.48 24.9659 133.13 23.2955L135.994 22.5795C136.267 23.6364 136.782 24.429 137.541 24.9574C138.308 25.4858 139.309 25.75 140.545 25.75C141.951 25.75 143.068 25.4517 143.895 24.8551C144.73 24.25 145.147 23.5256 145.147 22.6818C145.147 22 144.909 21.429 144.431 20.9688C143.954 20.5 143.221 20.1506 142.233 19.9205L138.96 19.1534C137.162 18.7273 135.841 18.0668 134.997 17.1719C134.162 16.2685 133.744 15.1392 133.744 13.7841C133.744 12.6761 134.055 11.696 134.677 10.8438C135.308 9.99148 136.164 9.32244 137.247 8.83665C138.338 8.35085 139.574 8.10795 140.954 8.10795C142.897 8.10795 144.423 8.53409 145.531 9.38636C146.647 10.2386 147.44 11.3636 147.909 12.7614Z"\r
+ fill="currentColor"\r
+ />\r
+ </svg>\r
+ </div>\r
+</template>\r
-<template>
- <form class="flex" v-on:submit.prevent="search">
- <input
- type="text"
- class="rounded rounded-r-none border border-theme-border bg-theme-background-elevated px-3 py-2"
- placeholder="Search"
- />
- <Button
- :iconPath="mdilMagnify"
- iconSize="1.75em"
- class="rounded-l-none border border-l-0 border-theme-border"
- />
- </form>
-</template>
-
-<script setup>
-import Button from "./Button.vue";
-import { mdilMagnify } from "@mdi/light-js";
-
-function search() {
- console.log("searching...");
-}
-</script>
+<template>\r
+ <form class="flex" v-on:submit.prevent="search">\r
+ <input\r
+ type="text"\r
+ class="rounded rounded-r-none border border-theme-border bg-theme-background-elevated px-3 py-2"\r
+ placeholder="Search"\r
+ />\r
+ <Button\r
+ :iconPath="mdilMagnify"\r
+ iconSize="1.75em"\r
+ class="rounded-l-none border border-l-0 border-theme-border"\r
+ />\r
+ </form>\r
+</template>\r
+\r
+<script setup>\r
+import Button from "./Button.vue";\r
+import { mdilMagnify } from "@mdi/light-js";\r
+\r
+function search() {\r
+ console.log("searching...");\r
+}\r
+</script>\r
-<!doctype html>
-<html lang="en">
- <head>
- <meta charset="UTF-8" />
- <link rel="icon" href="/favicon.ico" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>flatnotes</title>
-
- <link href="/style.css" rel="stylesheet" />
- </head>
- <body class="bg-theme-background text-theme-text">
- <div id="app"></div>
- <script type="module" src="/index.js"></script>
- </body>
-</html>
+<!doctype html>\r
+<html lang="en">\r
+ <head>\r
+ <meta charset="UTF-8" />\r
+ <link rel="icon" href="/favicon.ico" />\r
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />\r
+ <title>flatnotes</title>\r
+\r
+ <link href="/style.css" rel="stylesheet" />\r
+ </head>\r
+ <body class="bg-theme-background text-theme-text">\r
+ <div id="app"></div>\r
+ <script type="module" src="/index.js"></script>\r
+ </body>\r
+</html>\r
-import App from "/App.vue";
-import { createApp } from "vue";
-import router from "/router.js";
-
-const app = createApp(App);
-app.use(router);
-app.mount("#app");
+import App from "/App.vue";\r
+import { createApp } from "vue";\r
+import router from "/router.js";\r
+\r
+const app = createApp(App);\r
+app.use(router);\r
+app.mount("#app");\r
-<template>
- <nav class="flex justify-between">
- <Logo></Logo>
- <div>
- <Button
- :iconPath="mdilPlusCircle"
- label="New Note"
- @click="toggleTheme"
- ></Button>
- </div>
- </nav>
-</template>
-
-<script setup>
-import { mdilPlusCircle } from "@mdi/light-js";
-
-import Button from "/components/Button.vue";
-import Logo from "/components/Logo.vue";
-
-function toggleTheme() {
- document.body.classList.toggle("dark-theme");
-}
-</script>
+<template>\r
+ <nav class="flex justify-between">\r
+ <Logo></Logo>\r
+ <div>\r
+ <Button\r
+ :iconPath="mdilPlusCircle"\r
+ label="New Note"\r
+ @click="toggleTheme"\r
+ ></Button>\r
+ </div>\r
+ </nav>\r
+</template>\r
+\r
+<script setup>\r
+import { mdilPlusCircle } from "@mdi/light-js";\r
+\r
+import Button from "/components/Button.vue";\r
+import Logo from "/components/Logo.vue";\r
+\r
+function toggleTheme() {\r
+ document.body.classList.toggle("dark-theme");\r
+}\r
+</script>\r
-import { createRouter, createWebHistory } from 'vue-router'
-
-import HomeView from '/views/HomeView.vue'
-
-const router = createRouter({
- history: createWebHistory(import.meta.env.BASE_URL),
- routes: [
- {
- path: '/',
- name: 'home',
- component: HomeView
- }
- ]
-})
-
-export default router
+import { createRouter, createWebHistory } from 'vue-router'\r
+\r
+import HomeView from '/views/HomeView.vue'\r
+\r
+const router = createRouter({\r
+ history: createWebHistory(import.meta.env.BASE_URL),\r
+ routes: [\r
+ {\r
+ path: '/',\r
+ name: 'home',\r
+ component: HomeView\r
+ }\r
+ ]\r
+})\r
+\r
+export default router\r
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-@layer base {
- @font-face {
- font-family: "Poppins";
- font-style: normal;
- font-weight: 400;
- font-display: swap;
- src: url("/assets/fonts/Poppins/Poppins-Regular.ttf");
- }
-
- body {
- --theme-brand: 248 166 107;
-
- --theme-background: 255 255 255;
- --theme-background-elevated: 255 255 255;
- --theme-background-tint: 243 244 245;
- --theme-background-highlight: 239 243 255;
- --theme-background-hover: var(--theme-background-tint);
-
- --theme-text: 44 49 57;
- --theme-text-muted: 136 145 161;
- --theme-text-very-muted: 193 199 208;
-
- --theme-shadow: 236 238 240;
- --theme-border: 236 238 240;
- }
-
- body.dark-theme {
- /* --theme-brand: 248 166 107; */
-
- --theme-background: 34 38 44;
- --theme-background-elevated: 44 49 57;
- --theme-background-tint: 34 38 44;
- --theme-background-highlight: 136 145 161;
- --theme-background-hover: var(--theme-background-elevated);
-
- --theme-text: 193 199 208;
- --theme-text-muted: 136 145 161;
- --theme-text-very-muted: 94 107 128;
-
- --theme-shadow: none;
- --theme-border: 94 107 128;
- }
+@tailwind base;\r
+@tailwind components;\r
+@tailwind utilities;\r
+\r
+@layer base {\r
+ @font-face {\r
+ font-family: "Poppins";\r
+ font-style: normal;\r
+ font-weight: 400;\r
+ font-display: swap;\r
+ src: url("/assets/fonts/Poppins/Poppins-Regular.ttf");\r
+ }\r
+\r
+ body {\r
+ --theme-brand: 248 166 107;\r
+\r
+ --theme-background: 255 255 255;\r
+ --theme-background-elevated: 255 255 255;\r
+ --theme-background-tint: 243 244 245;\r
+ --theme-background-highlight: 239 243 255;\r
+ --theme-background-hover: var(--theme-background-tint);\r
+\r
+ --theme-text: 44 49 57;\r
+ --theme-text-muted: 136 145 161;\r
+ --theme-text-very-muted: 193 199 208;\r
+\r
+ --theme-shadow: 236 238 240;\r
+ --theme-border: 236 238 240;\r
+ }\r
+\r
+ body.dark-theme {\r
+ /* --theme-brand: 248 166 107; */\r
+\r
+ --theme-background: 34 38 44;\r
+ --theme-background-elevated: 44 49 57;\r
+ --theme-background-tint: 34 38 44;\r
+ --theme-background-highlight: 136 145 161;\r
+ --theme-background-hover: var(--theme-background-elevated);\r
+\r
+ --theme-text: 193 199 208;\r
+ --theme-text-muted: 136 145 161;\r
+ --theme-text-very-muted: 94 107 128;\r
+\r
+ --theme-shadow: none;\r
+ --theme-border: 94 107 128;\r
+ }\r
}
\ No newline at end of file
-<template>
- <div class="flex h-full flex-col items-center justify-center">
- <SearchInput />
- </div>
-</template>
-
-<script setup>
-import SearchInput from "../components/SearchInput.vue";
-</script>
+<template>\r
+ <div class="flex h-full flex-col items-center justify-center">\r
+ <SearchInput />\r
+ </div>\r
+</template>\r
+\r
+<script setup>\r
+import SearchInput from "../components/SearchInput.vue";\r
+</script>\r
-<svg width="197" height="44" viewBox="0 0 197 44" fill="none"
- xmlns="http://www.w3.org/2000/svg">
- <rect y="4" width="36" height="36" rx="4" fill="#F8A66B"/>
- <path d="M9.904 32.88C9.75467 32.88 9.59467 32.7733 9.424 32.56C9.27467 32.3467 9.14667 32.1013 9.04 31.824C8.95467 31.5467 8.912 31.3227 8.912 31.152C8.95467 30.32 9.14667 29.3813 9.488 28.336C9.59467 28.0373 9.75467 27.9093 9.968 27.952C10.0107 27.5893 10.0533 27.1307 10.096 26.576C10.16 26.0213 10.2347 25.3813 10.32 24.656C10.2133 24.3573 9.98933 24.208 9.648 24.208C9.56267 24.208 9.24267 24.2613 8.688 24.368C8.15467 24.4747 7.36533 24.6347 6.32 24.848C6.29867 24.848 6.27733 24.8587 6.256 24.88C6.23467 24.88 6.20267 24.8693 6.16 24.848C5.94667 24.848 5.84 24.72 5.84 24.464C5.84 24.1653 5.97867 23.952 6.256 23.824L6.224 23.856C6.544 23.7067 7.32267 23.4827 8.56 23.184C9.47733 22.9493 10.2133 22.6507 10.768 22.288L10.96 20.656C11.0453 19.8667 11.184 19.056 11.376 18.224C11.568 17.3707 11.8347 16.5067 12.176 15.632C12.88 13.7333 13.712 12.208 14.672 11.056C15.4827 10.1173 16.2933 9.648 17.104 9.648C17.808 9.648 18.4267 9.97867 18.96 10.64C19.0453 10.7253 19.088 10.8213 19.088 10.928C19.088 11.1627 18.96 11.28 18.704 11.28C18.5547 11.28 18.4267 11.216 18.32 11.088C17.9787 10.6827 17.6053 10.48 17.2 10.48C16.24 10.48 15.2267 11.536 14.16 13.648C13.7333 14.5013 13.36 15.5147 13.04 16.688C12.72 17.84 12.4747 19.1413 12.304 20.592L12.272 21.136L12.208 22C12.8267 22.192 13.5093 22.288 14.256 22.288L16.304 22.224C16.944 22.2453 17.264 22.4587 17.264 22.864C17.264 23.2267 17.0933 23.408 16.752 23.408H14.256C13.36 23.472 12.5707 23.7173 11.888 24.144C11.248 29.0933 10.704 31.92 10.256 32.624C10.1493 32.7947 10.032 32.88 9.904 32.88ZM17.839 31.856C17.3483 31.856 16.9643 31.792 16.687 31.664C16.431 31.536 16.303 31.3973 16.303 31.248C16.303 31.12 16.367 31.0027 16.495 30.896C16.6443 30.7893 16.8897 30.7253 17.231 30.704C17.6577 30.6827 18.255 30.6613 19.023 30.64C19.791 30.6187 20.6337 30.5973 21.551 30.576C22.4897 30.5547 23.407 30.544 24.303 30.544C24.7723 30.544 25.231 30.544 25.679 30.544C26.127 30.544 26.5217 30.5547 26.863 30.576C27.2257 30.5973 27.4923 30.6293 27.663 30.672C27.8337 30.7147 27.919 30.832 27.919 31.024C27.919 31.2587 27.823 31.408 27.631 31.472C27.439 31.536 27.2043 31.568 26.927 31.568C26.4363 31.568 25.7963 31.5787 25.007 31.6C24.2177 31.6427 23.375 31.6747 22.479 31.696C21.583 31.7387 20.719 31.7707 19.887 31.792C19.0763 31.8347 18.3937 31.856 17.839 31.856Z" fill="white"/>
- <path d="M57.5057 15.3636V17.9205H46.9205V15.3636H57.5057ZM50.0909 35V12.6534C50.0909 11.5284 50.3551 10.5909 50.8835 9.84091C51.4119 9.09091 52.098 8.52841 52.9418 8.15341C53.7855 7.77841 54.6761 7.59091 55.6136 7.59091C56.3551 7.59091 56.9602 7.65057 57.429 7.76989C57.8977 7.8892 58.2472 8 58.4773 8.10227L57.608 10.7102C57.4545 10.6591 57.2415 10.5952 56.9688 10.5185C56.7045 10.4418 56.3551 10.4034 55.9205 10.4034C54.9233 10.4034 54.2031 10.6548 53.7599 11.1577C53.3253 11.6605 53.108 12.3977 53.108 13.3693V35H50.0909ZM64.7511 8.81818V35H61.734V8.81818H64.7511ZM76.0554 35.4602C74.8111 35.4602 73.6818 35.2259 72.6676 34.7571C71.6534 34.2798 70.848 33.5938 70.2514 32.6989C69.6548 31.7955 69.3565 30.7045 69.3565 29.4261C69.3565 28.3011 69.5781 27.3892 70.0213 26.6903C70.4645 25.983 71.0568 25.429 71.7983 25.0284C72.5398 24.6278 73.358 24.3295 74.2528 24.1335C75.1563 23.929 76.0639 23.767 76.9759 23.6477C78.169 23.4943 79.1364 23.3793 79.8778 23.3026C80.6278 23.2173 81.1733 23.0767 81.5142 22.8807C81.8636 22.6847 82.0384 22.3437 82.0384 21.858V21.7557C82.0384 20.4943 81.6932 19.5142 81.0028 18.8153C80.321 18.1165 79.2855 17.767 77.8963 17.767C76.456 17.767 75.3267 18.0824 74.5085 18.7131C73.6903 19.3437 73.1151 20.017 72.7827 20.733L69.919 19.7102C70.4304 18.517 71.1122 17.5881 71.9645 16.9233C72.8253 16.25 73.7628 15.7812 74.777 15.517C75.7997 15.2443 76.8054 15.108 77.794 15.108C78.4247 15.108 79.1491 15.1847 79.9673 15.3381C80.794 15.483 81.5909 15.7855 82.358 16.2457C83.1335 16.706 83.777 17.4006 84.2884 18.3295C84.7997 19.2585 85.0554 20.5028 85.0554 22.0625V35H82.0384V32.3409H81.8849C81.6804 32.767 81.3395 33.223 80.8622 33.7088C80.3849 34.1946 79.75 34.608 78.9574 34.9489C78.1648 35.2898 77.1974 35.4602 76.0554 35.4602ZM76.5156 32.75C77.7088 32.75 78.7145 32.5156 79.5327 32.0469C80.3594 31.5781 80.9815 30.973 81.3991 30.2315C81.8253 29.4901 82.0384 28.7102 82.0384 27.892V25.1307C81.9105 25.2841 81.6293 25.4247 81.1946 25.5526C80.7685 25.6719 80.2741 25.7784 79.7116 25.8722C79.1577 25.9574 78.6165 26.0341 78.0881 26.1023C77.5682 26.1619 77.1463 26.2131 76.8224 26.2557C76.0384 26.358 75.3054 26.5241 74.6236 26.7543C73.9503 26.9759 73.4048 27.3125 72.9872 27.7642C72.5781 28.2074 72.3736 28.8125 72.3736 29.5795C72.3736 30.6278 72.7614 31.4205 73.5369 31.9574C74.321 32.4858 75.3139 32.75 76.5156 32.75ZM99.1019 15.3636V17.9205H88.9258V15.3636H99.1019ZM91.8917 10.6591H94.9087V29.375C94.9087 30.2273 95.0323 30.8665 95.2795 31.2926C95.5352 31.7102 95.859 31.9915 96.2511 32.1364C96.6516 32.2727 97.0735 32.3409 97.5167 32.3409C97.8491 32.3409 98.1218 32.3239 98.3349 32.2898C98.5479 32.2472 98.7184 32.2131 98.8462 32.1875L99.4599 34.8977C99.2553 34.9744 98.9698 35.0511 98.6033 35.1278C98.2369 35.2131 97.7724 35.2557 97.2099 35.2557C96.3576 35.2557 95.5224 35.0724 94.7042 34.706C93.8945 34.3395 93.2212 33.7812 92.6843 33.0312C92.1559 32.2812 91.8917 31.3352 91.8917 30.1932V10.6591ZM106.657 23.1875V35H103.64V15.3636H106.555V18.4318H106.811C107.271 17.4347 107.97 16.6335 108.907 16.0284C109.845 15.4148 111.055 15.108 112.538 15.108C113.868 15.108 115.031 15.3807 116.028 15.9261C117.025 16.4631 117.801 17.2812 118.355 18.3807C118.909 19.4716 119.186 20.8523 119.186 22.5227V35H116.169V22.7273C116.169 21.1847 115.768 19.983 114.967 19.1222C114.166 18.2528 113.066 17.8182 111.669 17.8182C110.706 17.8182 109.845 18.027 109.086 18.4446C108.336 18.8622 107.744 19.4716 107.309 20.2727C106.875 21.0739 106.657 22.0455 106.657 23.1875ZM132.676 35.4091C130.903 35.4091 129.348 34.9872 128.01 34.1435C126.68 33.2997 125.641 32.1193 124.891 30.6023C124.149 29.0852 123.778 27.3125 123.778 25.2841C123.778 23.2386 124.149 21.4531 124.891 19.9276C125.641 18.402 126.68 17.2173 128.01 16.3736C129.348 15.5298 130.903 15.108 132.676 15.108C134.449 15.108 136 15.5298 137.33 16.3736C138.668 17.2173 139.707 18.402 140.449 19.9276C141.199 21.4531 141.574 23.2386 141.574 25.2841C141.574 27.3125 141.199 29.0852 140.449 30.6023C139.707 32.1193 138.668 33.2997 137.33 34.1435C136 34.9872 134.449 35.4091 132.676 35.4091ZM132.676 32.6989C134.023 32.6989 135.131 32.3537 136 31.6634C136.869 30.973 137.513 30.0653 137.93 28.9403C138.348 27.8153 138.557 26.5966 138.557 25.2841C138.557 23.9716 138.348 22.7486 137.93 21.6151C137.513 20.4815 136.869 19.5653 136 18.8665C135.131 18.1676 134.023 17.8182 132.676 17.8182C131.33 17.8182 130.222 18.1676 129.352 18.8665C128.483 19.5653 127.839 20.4815 127.422 21.6151C127.004 22.7486 126.795 23.9716 126.795 25.2841C126.795 26.5966 127.004 27.8153 127.422 28.9403C127.839 30.0653 128.483 30.973 129.352 31.6634C130.222 32.3537 131.33 32.6989 132.676 32.6989ZM154.719 15.3636V17.9205H144.543V15.3636H154.719ZM147.509 10.6591H150.526V29.375C150.526 30.2273 150.65 30.8665 150.897 31.2926C151.152 31.7102 151.476 31.9915 151.868 32.1364C152.269 32.2727 152.691 32.3409 153.134 32.3409C153.466 32.3409 153.739 32.3239 153.952 32.2898C154.165 32.2472 154.336 32.2131 154.463 32.1875L155.077 34.8977C154.873 34.9744 154.587 35.0511 154.221 35.1278C153.854 35.2131 153.39 35.2557 152.827 35.2557C151.975 35.2557 151.14 35.0724 150.321 34.706C149.512 34.3395 148.838 33.7812 148.301 33.0312C147.773 32.2812 147.509 31.3352 147.509 30.1932V10.6591ZM167.279 35.4091C165.387 35.4091 163.755 34.9915 162.383 34.1562C161.02 33.3125 159.967 32.1364 159.225 30.6278C158.493 29.1108 158.126 27.3466 158.126 25.3352C158.126 23.3239 158.493 21.5511 159.225 20.017C159.967 18.4744 160.998 17.2727 162.319 16.4119C163.649 15.5426 165.2 15.108 166.973 15.108C167.995 15.108 169.005 15.2784 170.002 15.6193C171 15.9602 171.907 16.5142 172.725 17.2812C173.544 18.0398 174.196 19.0455 174.681 20.2983C175.167 21.5511 175.41 23.0937 175.41 24.9261V26.2045H160.274V23.5966H172.342C172.342 22.4886 172.12 21.5 171.677 20.6307C171.243 19.7614 170.62 19.0753 169.811 18.5724C169.01 18.0696 168.064 17.8182 166.973 17.8182C165.771 17.8182 164.731 18.1165 163.853 18.7131C162.984 19.3011 162.315 20.0682 161.846 21.0142C161.377 21.9602 161.143 22.9744 161.143 24.0568V25.7955C161.143 27.2784 161.399 28.5355 161.91 29.5668C162.43 30.5895 163.15 31.3693 164.071 31.9062C164.991 32.4347 166.061 32.6989 167.279 32.6989C168.072 32.6989 168.788 32.5881 169.427 32.3665C170.075 32.1364 170.633 31.7955 171.102 31.3438C171.571 30.8835 171.933 30.3125 172.189 29.6307L175.103 30.4489C174.797 31.4375 174.281 32.3068 173.556 33.0568C172.832 33.7983 171.937 34.3778 170.872 34.7955C169.806 35.2045 168.609 35.4091 167.279 35.4091ZM193.909 19.7614L191.199 20.5284C191.028 20.0767 190.777 19.6378 190.444 19.2116C190.12 18.777 189.677 18.419 189.115 18.1378C188.552 17.8565 187.832 17.7159 186.954 17.7159C185.752 17.7159 184.751 17.9929 183.95 18.5469C183.157 19.0923 182.761 19.7869 182.761 20.6307C182.761 21.3807 183.034 21.973 183.579 22.4077C184.125 22.8423 184.977 23.2045 186.136 23.4943L189.051 24.2102C190.806 24.6364 192.115 25.2884 192.975 26.1662C193.836 27.0355 194.267 28.1562 194.267 29.5284C194.267 30.6534 193.943 31.6591 193.295 32.5455C192.656 33.4318 191.761 34.1307 190.61 34.642C189.46 35.1534 188.122 35.4091 186.596 35.4091C184.593 35.4091 182.936 34.9744 181.623 34.1051C180.311 33.2358 179.48 31.9659 179.13 30.2955L181.994 29.5795C182.267 30.6364 182.782 31.429 183.541 31.9574C184.308 32.4858 185.309 32.75 186.545 32.75C187.951 32.75 189.068 32.4517 189.895 31.8551C190.73 31.25 191.147 30.5256 191.147 29.6818C191.147 29 190.909 28.429 190.431 27.9688C189.954 27.5 189.221 27.1506 188.233 26.9205L184.96 26.1534C183.162 25.7273 181.841 25.0668 180.997 24.1719C180.162 23.2685 179.744 22.1392 179.744 20.7841C179.744 19.6761 180.055 18.696 180.677 17.8438C181.308 16.9915 182.164 16.3224 183.247 15.8366C184.338 15.3509 185.574 15.108 186.954 15.108C188.897 15.108 190.423 15.5341 191.531 16.3864C192.647 17.2386 193.44 18.3636 193.909 19.7614Z" fill="#9CAFBF"/>
-</svg>
+<svg width="197" height="44" viewBox="0 0 197 44" fill="none"\r
+ xmlns="http://www.w3.org/2000/svg">\r
+ <rect y="4" width="36" height="36" rx="4" fill="#F8A66B"/>\r
+ <path d="M9.904 32.88C9.75467 32.88 9.59467 32.7733 9.424 32.56C9.27467 32.3467 9.14667 32.1013 9.04 31.824C8.95467 31.5467 8.912 31.3227 8.912 31.152C8.95467 30.32 9.14667 29.3813 9.488 28.336C9.59467 28.0373 9.75467 27.9093 9.968 27.952C10.0107 27.5893 10.0533 27.1307 10.096 26.576C10.16 26.0213 10.2347 25.3813 10.32 24.656C10.2133 24.3573 9.98933 24.208 9.648 24.208C9.56267 24.208 9.24267 24.2613 8.688 24.368C8.15467 24.4747 7.36533 24.6347 6.32 24.848C6.29867 24.848 6.27733 24.8587 6.256 24.88C6.23467 24.88 6.20267 24.8693 6.16 24.848C5.94667 24.848 5.84 24.72 5.84 24.464C5.84 24.1653 5.97867 23.952 6.256 23.824L6.224 23.856C6.544 23.7067 7.32267 23.4827 8.56 23.184C9.47733 22.9493 10.2133 22.6507 10.768 22.288L10.96 20.656C11.0453 19.8667 11.184 19.056 11.376 18.224C11.568 17.3707 11.8347 16.5067 12.176 15.632C12.88 13.7333 13.712 12.208 14.672 11.056C15.4827 10.1173 16.2933 9.648 17.104 9.648C17.808 9.648 18.4267 9.97867 18.96 10.64C19.0453 10.7253 19.088 10.8213 19.088 10.928C19.088 11.1627 18.96 11.28 18.704 11.28C18.5547 11.28 18.4267 11.216 18.32 11.088C17.9787 10.6827 17.6053 10.48 17.2 10.48C16.24 10.48 15.2267 11.536 14.16 13.648C13.7333 14.5013 13.36 15.5147 13.04 16.688C12.72 17.84 12.4747 19.1413 12.304 20.592L12.272 21.136L12.208 22C12.8267 22.192 13.5093 22.288 14.256 22.288L16.304 22.224C16.944 22.2453 17.264 22.4587 17.264 22.864C17.264 23.2267 17.0933 23.408 16.752 23.408H14.256C13.36 23.472 12.5707 23.7173 11.888 24.144C11.248 29.0933 10.704 31.92 10.256 32.624C10.1493 32.7947 10.032 32.88 9.904 32.88ZM17.839 31.856C17.3483 31.856 16.9643 31.792 16.687 31.664C16.431 31.536 16.303 31.3973 16.303 31.248C16.303 31.12 16.367 31.0027 16.495 30.896C16.6443 30.7893 16.8897 30.7253 17.231 30.704C17.6577 30.6827 18.255 30.6613 19.023 30.64C19.791 30.6187 20.6337 30.5973 21.551 30.576C22.4897 30.5547 23.407 30.544 24.303 30.544C24.7723 30.544 25.231 30.544 25.679 30.544C26.127 30.544 26.5217 30.5547 26.863 30.576C27.2257 30.5973 27.4923 30.6293 27.663 30.672C27.8337 30.7147 27.919 30.832 27.919 31.024C27.919 31.2587 27.823 31.408 27.631 31.472C27.439 31.536 27.2043 31.568 26.927 31.568C26.4363 31.568 25.7963 31.5787 25.007 31.6C24.2177 31.6427 23.375 31.6747 22.479 31.696C21.583 31.7387 20.719 31.7707 19.887 31.792C19.0763 31.8347 18.3937 31.856 17.839 31.856Z" fill="white"/>\r
+ <path d="M57.5057 15.3636V17.9205H46.9205V15.3636H57.5057ZM50.0909 35V12.6534C50.0909 11.5284 50.3551 10.5909 50.8835 9.84091C51.4119 9.09091 52.098 8.52841 52.9418 8.15341C53.7855 7.77841 54.6761 7.59091 55.6136 7.59091C56.3551 7.59091 56.9602 7.65057 57.429 7.76989C57.8977 7.8892 58.2472 8 58.4773 8.10227L57.608 10.7102C57.4545 10.6591 57.2415 10.5952 56.9688 10.5185C56.7045 10.4418 56.3551 10.4034 55.9205 10.4034C54.9233 10.4034 54.2031 10.6548 53.7599 11.1577C53.3253 11.6605 53.108 12.3977 53.108 13.3693V35H50.0909ZM64.7511 8.81818V35H61.734V8.81818H64.7511ZM76.0554 35.4602C74.8111 35.4602 73.6818 35.2259 72.6676 34.7571C71.6534 34.2798 70.848 33.5938 70.2514 32.6989C69.6548 31.7955 69.3565 30.7045 69.3565 29.4261C69.3565 28.3011 69.5781 27.3892 70.0213 26.6903C70.4645 25.983 71.0568 25.429 71.7983 25.0284C72.5398 24.6278 73.358 24.3295 74.2528 24.1335C75.1563 23.929 76.0639 23.767 76.9759 23.6477C78.169 23.4943 79.1364 23.3793 79.8778 23.3026C80.6278 23.2173 81.1733 23.0767 81.5142 22.8807C81.8636 22.6847 82.0384 22.3437 82.0384 21.858V21.7557C82.0384 20.4943 81.6932 19.5142 81.0028 18.8153C80.321 18.1165 79.2855 17.767 77.8963 17.767C76.456 17.767 75.3267 18.0824 74.5085 18.7131C73.6903 19.3437 73.1151 20.017 72.7827 20.733L69.919 19.7102C70.4304 18.517 71.1122 17.5881 71.9645 16.9233C72.8253 16.25 73.7628 15.7812 74.777 15.517C75.7997 15.2443 76.8054 15.108 77.794 15.108C78.4247 15.108 79.1491 15.1847 79.9673 15.3381C80.794 15.483 81.5909 15.7855 82.358 16.2457C83.1335 16.706 83.777 17.4006 84.2884 18.3295C84.7997 19.2585 85.0554 20.5028 85.0554 22.0625V35H82.0384V32.3409H81.8849C81.6804 32.767 81.3395 33.223 80.8622 33.7088C80.3849 34.1946 79.75 34.608 78.9574 34.9489C78.1648 35.2898 77.1974 35.4602 76.0554 35.4602ZM76.5156 32.75C77.7088 32.75 78.7145 32.5156 79.5327 32.0469C80.3594 31.5781 80.9815 30.973 81.3991 30.2315C81.8253 29.4901 82.0384 28.7102 82.0384 27.892V25.1307C81.9105 25.2841 81.6293 25.4247 81.1946 25.5526C80.7685 25.6719 80.2741 25.7784 79.7116 25.8722C79.1577 25.9574 78.6165 26.0341 78.0881 26.1023C77.5682 26.1619 77.1463 26.2131 76.8224 26.2557C76.0384 26.358 75.3054 26.5241 74.6236 26.7543C73.9503 26.9759 73.4048 27.3125 72.9872 27.7642C72.5781 28.2074 72.3736 28.8125 72.3736 29.5795C72.3736 30.6278 72.7614 31.4205 73.5369 31.9574C74.321 32.4858 75.3139 32.75 76.5156 32.75ZM99.1019 15.3636V17.9205H88.9258V15.3636H99.1019ZM91.8917 10.6591H94.9087V29.375C94.9087 30.2273 95.0323 30.8665 95.2795 31.2926C95.5352 31.7102 95.859 31.9915 96.2511 32.1364C96.6516 32.2727 97.0735 32.3409 97.5167 32.3409C97.8491 32.3409 98.1218 32.3239 98.3349 32.2898C98.5479 32.2472 98.7184 32.2131 98.8462 32.1875L99.4599 34.8977C99.2553 34.9744 98.9698 35.0511 98.6033 35.1278C98.2369 35.2131 97.7724 35.2557 97.2099 35.2557C96.3576 35.2557 95.5224 35.0724 94.7042 34.706C93.8945 34.3395 93.2212 33.7812 92.6843 33.0312C92.1559 32.2812 91.8917 31.3352 91.8917 30.1932V10.6591ZM106.657 23.1875V35H103.64V15.3636H106.555V18.4318H106.811C107.271 17.4347 107.97 16.6335 108.907 16.0284C109.845 15.4148 111.055 15.108 112.538 15.108C113.868 15.108 115.031 15.3807 116.028 15.9261C117.025 16.4631 117.801 17.2812 118.355 18.3807C118.909 19.4716 119.186 20.8523 119.186 22.5227V35H116.169V22.7273C116.169 21.1847 115.768 19.983 114.967 19.1222C114.166 18.2528 113.066 17.8182 111.669 17.8182C110.706 17.8182 109.845 18.027 109.086 18.4446C108.336 18.8622 107.744 19.4716 107.309 20.2727C106.875 21.0739 106.657 22.0455 106.657 23.1875ZM132.676 35.4091C130.903 35.4091 129.348 34.9872 128.01 34.1435C126.68 33.2997 125.641 32.1193 124.891 30.6023C124.149 29.0852 123.778 27.3125 123.778 25.2841C123.778 23.2386 124.149 21.4531 124.891 19.9276C125.641 18.402 126.68 17.2173 128.01 16.3736C129.348 15.5298 130.903 15.108 132.676 15.108C134.449 15.108 136 15.5298 137.33 16.3736C138.668 17.2173 139.707 18.402 140.449 19.9276C141.199 21.4531 141.574 23.2386 141.574 25.2841C141.574 27.3125 141.199 29.0852 140.449 30.6023C139.707 32.1193 138.668 33.2997 137.33 34.1435C136 34.9872 134.449 35.4091 132.676 35.4091ZM132.676 32.6989C134.023 32.6989 135.131 32.3537 136 31.6634C136.869 30.973 137.513 30.0653 137.93 28.9403C138.348 27.8153 138.557 26.5966 138.557 25.2841C138.557 23.9716 138.348 22.7486 137.93 21.6151C137.513 20.4815 136.869 19.5653 136 18.8665C135.131 18.1676 134.023 17.8182 132.676 17.8182C131.33 17.8182 130.222 18.1676 129.352 18.8665C128.483 19.5653 127.839 20.4815 127.422 21.6151C127.004 22.7486 126.795 23.9716 126.795 25.2841C126.795 26.5966 127.004 27.8153 127.422 28.9403C127.839 30.0653 128.483 30.973 129.352 31.6634C130.222 32.3537 131.33 32.6989 132.676 32.6989ZM154.719 15.3636V17.9205H144.543V15.3636H154.719ZM147.509 10.6591H150.526V29.375C150.526 30.2273 150.65 30.8665 150.897 31.2926C151.152 31.7102 151.476 31.9915 151.868 32.1364C152.269 32.2727 152.691 32.3409 153.134 32.3409C153.466 32.3409 153.739 32.3239 153.952 32.2898C154.165 32.2472 154.336 32.2131 154.463 32.1875L155.077 34.8977C154.873 34.9744 154.587 35.0511 154.221 35.1278C153.854 35.2131 153.39 35.2557 152.827 35.2557C151.975 35.2557 151.14 35.0724 150.321 34.706C149.512 34.3395 148.838 33.7812 148.301 33.0312C147.773 32.2812 147.509 31.3352 147.509 30.1932V10.6591ZM167.279 35.4091C165.387 35.4091 163.755 34.9915 162.383 34.1562C161.02 33.3125 159.967 32.1364 159.225 30.6278C158.493 29.1108 158.126 27.3466 158.126 25.3352C158.126 23.3239 158.493 21.5511 159.225 20.017C159.967 18.4744 160.998 17.2727 162.319 16.4119C163.649 15.5426 165.2 15.108 166.973 15.108C167.995 15.108 169.005 15.2784 170.002 15.6193C171 15.9602 171.907 16.5142 172.725 17.2812C173.544 18.0398 174.196 19.0455 174.681 20.2983C175.167 21.5511 175.41 23.0937 175.41 24.9261V26.2045H160.274V23.5966H172.342C172.342 22.4886 172.12 21.5 171.677 20.6307C171.243 19.7614 170.62 19.0753 169.811 18.5724C169.01 18.0696 168.064 17.8182 166.973 17.8182C165.771 17.8182 164.731 18.1165 163.853 18.7131C162.984 19.3011 162.315 20.0682 161.846 21.0142C161.377 21.9602 161.143 22.9744 161.143 24.0568V25.7955C161.143 27.2784 161.399 28.5355 161.91 29.5668C162.43 30.5895 163.15 31.3693 164.071 31.9062C164.991 32.4347 166.061 32.6989 167.279 32.6989C168.072 32.6989 168.788 32.5881 169.427 32.3665C170.075 32.1364 170.633 31.7955 171.102 31.3438C171.571 30.8835 171.933 30.3125 172.189 29.6307L175.103 30.4489C174.797 31.4375 174.281 32.3068 173.556 33.0568C172.832 33.7983 171.937 34.3778 170.872 34.7955C169.806 35.2045 168.609 35.4091 167.279 35.4091ZM193.909 19.7614L191.199 20.5284C191.028 20.0767 190.777 19.6378 190.444 19.2116C190.12 18.777 189.677 18.419 189.115 18.1378C188.552 17.8565 187.832 17.7159 186.954 17.7159C185.752 17.7159 184.751 17.9929 183.95 18.5469C183.157 19.0923 182.761 19.7869 182.761 20.6307C182.761 21.3807 183.034 21.973 183.579 22.4077C184.125 22.8423 184.977 23.2045 186.136 23.4943L189.051 24.2102C190.806 24.6364 192.115 25.2884 192.975 26.1662C193.836 27.0355 194.267 28.1562 194.267 29.5284C194.267 30.6534 193.943 31.6591 193.295 32.5455C192.656 33.4318 191.761 34.1307 190.61 34.642C189.46 35.1534 188.122 35.4091 186.596 35.4091C184.593 35.4091 182.936 34.9744 181.623 34.1051C180.311 33.2358 179.48 31.9659 179.13 30.2955L181.994 29.5795C182.267 30.6364 182.782 31.429 183.541 31.9574C184.308 32.4858 185.309 32.75 186.545 32.75C187.951 32.75 189.068 32.4517 189.895 31.8551C190.73 31.25 191.147 30.5256 191.147 29.6818C191.147 29 190.909 28.429 190.431 27.9688C189.954 27.5 189.221 27.1506 188.233 26.9205L184.96 26.1534C183.162 25.7273 181.841 25.0668 180.997 24.1719C180.162 23.2685 179.744 22.1392 179.744 20.7841C179.744 19.6761 180.055 18.696 180.677 17.8438C181.308 16.9915 182.164 16.3224 183.247 15.8366C184.338 15.3509 185.574 15.108 186.954 15.108C188.897 15.108 190.423 15.5341 191.531 16.3864C192.647 17.2386 193.44 18.3636 193.909 19.7614Z" fill="#9CAFBF"/>\r
+</svg>\r
-#!/bin/sh
-
-[ "$EXEC_TOOL" ] || EXEC_TOOL=gosu
-[ "$FLATNOTES_PORT" ] || FLATNOTES_PORT=8080
-
-set -e
-
-echo "\
-======================================
-======== Welcome to flatnotes ========
-======================================
-
-If you enjoy using flatnotes, please
-consider sponsoring the project at:
-
-https://sponsor.flatnotes.io
-
-It would really make my day 🙏.
-
-──────────────────────────────────────
-"
-
-flatnotes_command="python -m \
- uvicorn \
- main:app \
- --app-dir server \
- --host 0.0.0.0 \
- --port ${FLATNOTES_PORT} \
- --proxy-headers \
- --forwarded-allow-ips '*'"
-
-if [ `id -u` -eq 0 ] && [ `id -g` -eq 0 ]; then
- echo Setting file permissions...
- chown -R ${PUID}:${PGID} ${FLATNOTES_PATH}
-
- echo Starting flatnotes as user ${PUID}...
- exec ${EXEC_TOOL} ${PUID}:${PGID} ${flatnotes_command}
-
-else
- echo "A user was set by docker, skipping file permission changes."
- echo Starting flatnotes as user $(id -u)...
- exec ${flatnotes_command}
-fi
+#!/bin/sh\r
+\r
+[ "$EXEC_TOOL" ] || EXEC_TOOL=gosu\r
+[ "$FLATNOTES_PORT" ] || FLATNOTES_PORT=8080\r
+\r
+set -e\r
+\r
+echo "\\r
+======================================\r
+======== Welcome to flatnotes ========\r
+======================================\r
+\r
+If you enjoy using flatnotes, please\r
+consider sponsoring the project at:\r
+\r
+https://sponsor.flatnotes.io\r
+\r
+It would really make my day 🙏.\r
+\r
+──────────────────────────────────────\r
+"\r
+\r
+flatnotes_command="python -m \\r
+ uvicorn \\r
+ main:app \\r
+ --app-dir server \\r
+ --host 0.0.0.0 \\r
+ --port ${FLATNOTES_PORT} \\r
+ --proxy-headers \\r
+ --forwarded-allow-ips '*'"\r
+\r
+if [ `id -u` -eq 0 ] && [ `id -g` -eq 0 ]; then\r
+ echo Setting file permissions...\r
+ chown -R ${PUID}:${PGID} ${FLATNOTES_PATH}\r
+\r
+ echo Starting flatnotes as user ${PUID}...\r
+ exec ${EXEC_TOOL} ${PUID}:${PGID} ${flatnotes_command}\r
+\r
+else\r
+ echo "A user was set by docker, skipping file permission changes."\r
+ echo Starting flatnotes as user $(id -u)...\r
+ exec ${flatnotes_command}\r
+fi\r
-#!/bin/sh
-
-curl -f http://localhost:${FLATNOTES_PORT}/health || exit 1
+#!/bin/sh\r
+\r
+curl -f http://localhost:${FLATNOTES_PORT}/health || exit 1\r
-{
- "name": "flatnotes",
- "version": "4.0.4",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "flatnotes",
- "version": "4.0.4",
- "license": "MIT",
- "dependencies": {
- "@jamescoyle/vue-icon": "0.1.2",
- "@mdi/js": "7.4.47",
- "@mdi/light-js": "0.2.63",
- "axios": "1.6.8",
- "mousetrap": "1.6.5",
- "vue": "3.4.24",
- "vue-router": "4.3.2"
- },
- "devDependencies": {
- "@vitejs/plugin-vue": "5.0.4",
- "autoprefixer": "10.4.19",
- "postcss": "8.4.38",
- "prettier-plugin-tailwindcss": "0.5.14",
- "tailwindcss": "3.4.3",
- "vite": "5.2.9"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.24.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
- "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jamescoyle/vue-icon": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@jamescoyle/vue-icon/-/vue-icon-0.1.2.tgz",
- "integrity": "sha512-KFrImXx5TKIi6iQXlnyLEBl4rNosNKbTeRnr70ucTdUaciVmd9qK9d/pZAaKt1Ob/8xNnX2GMp8LisyHdKtEgw=="
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@mdi/js": {
- "version": "7.4.47",
- "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz",
- "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ=="
- },
- "node_modules/@mdi/light-js": {
- "version": "0.2.63",
- "resolved": "https://registry.npmjs.org/@mdi/light-js/-/light-js-0.2.63.tgz",
- "integrity": "sha512-+SUtJIOxvEy6DiVq0wTRPIzVuoPB5fhnubmzaN7e2ew0v3/nvnpC4mqbGCjiTK0diVd3+zvhEQHZzPDErGb1fg=="
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",
- "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",
- "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",
- "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",
- "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",
- "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",
- "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",
- "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",
- "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",
- "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",
- "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",
- "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",
- "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",
- "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",
- "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",
- "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",
- "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@vitejs/plugin-vue": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
- "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",
- "dev": true,
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "peerDependencies": {
- "vite": "^5.0.0",
- "vue": "^3.2.25"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.24.tgz",
- "integrity": "sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==",
- "dependencies": {
- "@babel/parser": "^7.24.4",
- "@vue/shared": "3.4.24",
- "entities": "^4.5.0",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.2.0"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz",
- "integrity": "sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==",
- "dependencies": {
- "@vue/compiler-core": "3.4.24",
- "@vue/shared": "3.4.24"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz",
- "integrity": "sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==",
- "dependencies": {
- "@babel/parser": "^7.24.4",
- "@vue/compiler-core": "3.4.24",
- "@vue/compiler-dom": "3.4.24",
- "@vue/compiler-ssr": "3.4.24",
- "@vue/shared": "3.4.24",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.10",
- "postcss": "^8.4.38",
- "source-map-js": "^1.2.0"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz",
- "integrity": "sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==",
- "dependencies": {
- "@vue/compiler-dom": "3.4.24",
- "@vue/shared": "3.4.24"
- }
- },
- "node_modules/@vue/devtools-api": {
- "version": "6.6.1",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",
- "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="
- },
- "node_modules/@vue/reactivity": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.24.tgz",
- "integrity": "sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==",
- "dependencies": {
- "@vue/shared": "3.4.24"
- }
- },
- "node_modules/@vue/runtime-core": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.24.tgz",
- "integrity": "sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==",
- "dependencies": {
- "@vue/reactivity": "3.4.24",
- "@vue/shared": "3.4.24"
- }
- },
- "node_modules/@vue/runtime-dom": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz",
- "integrity": "sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==",
- "dependencies": {
- "@vue/runtime-core": "3.4.24",
- "@vue/shared": "3.4.24",
- "csstype": "^3.1.3"
- }
- },
- "node_modules/@vue/server-renderer": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.24.tgz",
- "integrity": "sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==",
- "dependencies": {
- "@vue/compiler-ssr": "3.4.24",
- "@vue/shared": "3.4.24"
- },
- "peerDependencies": {
- "vue": "3.4.24"
- }
- },
- "node_modules/@vue/shared": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.24.tgz",
- "integrity": "sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw=="
- },
- "node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "dev": true
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/autoprefixer": {
- "version": "10.4.19",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
- "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-lite": "^1.0.30001599",
- "fraction.js": "^4.3.7",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/axios": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
- "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/axios/node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001612",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
- "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.746",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz",
- "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/foreground-child": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
- "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
- "dev": true,
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "10.3.12",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
- "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^2.3.6",
- "minimatch": "^9.0.1",
- "minipass": "^7.0.4",
- "path-scurry": "^1.10.2"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/immutable": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",
- "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/jackspeak": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
- "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
- "dev": true,
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
- "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
- "dev": true,
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.10",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
- "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mousetrap": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
- "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-scurry": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
- "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "dev": true,
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
- "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
- "dev": true,
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
- "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "lilconfig": "^3.0.0",
- "yaml": "^2.3.4"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-load-config/node_modules/lilconfig": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
- "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
- "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
- "dev": true,
- "dependencies": {
- "postcss-selector-parser": "^6.0.11"
- },
- "engines": {
- "node": ">=12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.0.16",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
- "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "node_modules/prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
- "dev": true,
- "peer": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-plugin-tailwindcss": {
- "version": "0.5.14",
- "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz",
- "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==",
- "dev": true,
- "engines": {
- "node": ">=14.21.3"
- },
- "peerDependencies": {
- "@ianvs/prettier-plugin-sort-imports": "*",
- "@prettier/plugin-pug": "*",
- "@shopify/prettier-plugin-liquid": "*",
- "@trivago/prettier-plugin-sort-imports": "*",
- "@zackad/prettier-plugin-twig-melody": "*",
- "prettier": "^3.0",
- "prettier-plugin-astro": "*",
- "prettier-plugin-css-order": "*",
- "prettier-plugin-import-sort": "*",
- "prettier-plugin-jsdoc": "*",
- "prettier-plugin-marko": "*",
- "prettier-plugin-organize-attributes": "*",
- "prettier-plugin-organize-imports": "*",
- "prettier-plugin-sort-imports": "*",
- "prettier-plugin-style-order": "*",
- "prettier-plugin-svelte": "*"
- },
- "peerDependenciesMeta": {
- "@ianvs/prettier-plugin-sort-imports": {
- "optional": true
- },
- "@prettier/plugin-pug": {
- "optional": true
- },
- "@shopify/prettier-plugin-liquid": {
- "optional": true
- },
- "@trivago/prettier-plugin-sort-imports": {
- "optional": true
- },
- "@zackad/prettier-plugin-twig-melody": {
- "optional": true
- },
- "prettier-plugin-astro": {
- "optional": true
- },
- "prettier-plugin-css-order": {
- "optional": true
- },
- "prettier-plugin-import-sort": {
- "optional": true
- },
- "prettier-plugin-jsdoc": {
- "optional": true
- },
- "prettier-plugin-marko": {
- "optional": true
- },
- "prettier-plugin-organize-attributes": {
- "optional": true
- },
- "prettier-plugin-organize-imports": {
- "optional": true
- },
- "prettier-plugin-sort-imports": {
- "optional": true
- },
- "prettier-plugin-style-order": {
- "optional": true
- },
- "prettier-plugin-svelte": {
- "optional": true
- }
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rollup": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz",
- "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",
- "dev": true,
- "dependencies": {
- "@types/estree": "1.0.5"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.14.3",
- "@rollup/rollup-android-arm64": "4.14.3",
- "@rollup/rollup-darwin-arm64": "4.14.3",
- "@rollup/rollup-darwin-x64": "4.14.3",
- "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",
- "@rollup/rollup-linux-arm-musleabihf": "4.14.3",
- "@rollup/rollup-linux-arm64-gnu": "4.14.3",
- "@rollup/rollup-linux-arm64-musl": "4.14.3",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",
- "@rollup/rollup-linux-riscv64-gnu": "4.14.3",
- "@rollup/rollup-linux-s390x-gnu": "4.14.3",
- "@rollup/rollup-linux-x64-gnu": "4.14.3",
- "@rollup/rollup-linux-x64-musl": "4.14.3",
- "@rollup/rollup-win32-arm64-msvc": "4.14.3",
- "@rollup/rollup-win32-ia32-msvc": "4.14.3",
- "@rollup/rollup-win32-x64-msvc": "4.14.3",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/sass": {
- "version": "1.74.1",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz",
- "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/string-width-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase": {
- "version": "3.35.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
- "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "^10.3.10",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
- "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
- "dev": true,
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.5.3",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.3.0",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.21.0",
- "lilconfig": "^2.1.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.23",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.1",
- "postcss-nested": "^6.0.1",
- "postcss-selector-parser": "^6.0.11",
- "resolve": "^1.22.2",
- "sucrase": "^3.32.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/terser": {
- "version": "5.30.3",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",
- "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser/node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/vite": {
- "version": "5.2.9",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz",
- "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==",
- "dev": true,
- "dependencies": {
- "esbuild": "^0.20.1",
- "postcss": "^8.4.38",
- "rollup": "^4.13.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vue": {
- "version": "3.4.24",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.24.tgz",
- "integrity": "sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==",
- "dependencies": {
- "@vue/compiler-dom": "3.4.24",
- "@vue/compiler-sfc": "3.4.24",
- "@vue/runtime-dom": "3.4.24",
- "@vue/server-renderer": "3.4.24",
- "@vue/shared": "3.4.24"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/vue-router": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",
- "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==",
- "dependencies": {
- "@vue/devtools-api": "^6.5.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/posva"
- },
- "peerDependencies": {
- "vue": "^3.2.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/wrap-ansi-cjs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yaml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
- "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
- "dev": true,
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14"
- }
- }
- }
-}
+{\r
+ "name": "flatnotes",\r
+ "version": "4.0.4",\r
+ "lockfileVersion": 3,\r
+ "requires": true,\r
+ "packages": {\r
+ "": {\r
+ "name": "flatnotes",\r
+ "version": "4.0.4",\r
+ "license": "MIT",\r
+ "dependencies": {\r
+ "@jamescoyle/vue-icon": "0.1.2",\r
+ "@mdi/js": "7.4.47",\r
+ "@mdi/light-js": "0.2.63",\r
+ "axios": "1.6.8",\r
+ "mousetrap": "1.6.5",\r
+ "vue": "3.4.24",\r
+ "vue-router": "4.3.2"\r
+ },\r
+ "devDependencies": {\r
+ "@vitejs/plugin-vue": "5.0.4",\r
+ "autoprefixer": "10.4.19",\r
+ "postcss": "8.4.38",\r
+ "prettier-plugin-tailwindcss": "0.5.14",\r
+ "tailwindcss": "3.4.3",\r
+ "vite": "5.2.9"\r
+ }\r
+ },\r
+ "node_modules/@alloc/quick-lru": {\r
+ "version": "5.2.0",\r
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",\r
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=10"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/sindresorhus"\r
+ }\r
+ },\r
+ "node_modules/@babel/parser": {\r
+ "version": "7.24.4",\r
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",\r
+ "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",\r
+ "bin": {\r
+ "parser": "bin/babel-parser.js"\r
+ },\r
+ "engines": {\r
+ "node": ">=6.0.0"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/aix-ppc64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",\r
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",\r
+ "cpu": [\r
+ "ppc64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "aix"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/android-arm": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",\r
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",\r
+ "cpu": [\r
+ "arm"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "android"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/android-arm64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",\r
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "android"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/android-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",\r
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "android"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/darwin-arm64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",\r
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "darwin"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/darwin-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",\r
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "darwin"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/freebsd-arm64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",\r
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "freebsd"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/freebsd-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",\r
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "freebsd"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-arm": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",\r
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",\r
+ "cpu": [\r
+ "arm"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-arm64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",\r
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-ia32": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",\r
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",\r
+ "cpu": [\r
+ "ia32"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-loong64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",\r
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",\r
+ "cpu": [\r
+ "loong64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-mips64el": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",\r
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",\r
+ "cpu": [\r
+ "mips64el"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-ppc64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",\r
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",\r
+ "cpu": [\r
+ "ppc64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-riscv64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",\r
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",\r
+ "cpu": [\r
+ "riscv64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-s390x": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",\r
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",\r
+ "cpu": [\r
+ "s390x"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/linux-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",\r
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/netbsd-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",\r
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "netbsd"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/openbsd-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",\r
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "openbsd"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/sunos-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",\r
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "sunos"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/win32-arm64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",\r
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/win32-ia32": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",\r
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",\r
+ "cpu": [\r
+ "ia32"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@esbuild/win32-x64": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",\r
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ],\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@isaacs/cliui": {\r
+ "version": "8.0.2",\r
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",\r
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "string-width": "^5.1.2",\r
+ "string-width-cjs": "npm:string-width@^4.2.0",\r
+ "strip-ansi": "^7.0.1",\r
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",\r
+ "wrap-ansi": "^8.1.0",\r
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=12"\r
+ }\r
+ },\r
+ "node_modules/@jamescoyle/vue-icon": {\r
+ "version": "0.1.2",\r
+ "resolved": "https://registry.npmjs.org/@jamescoyle/vue-icon/-/vue-icon-0.1.2.tgz",\r
+ "integrity": "sha512-KFrImXx5TKIi6iQXlnyLEBl4rNosNKbTeRnr70ucTdUaciVmd9qK9d/pZAaKt1Ob/8xNnX2GMp8LisyHdKtEgw=="\r
+ },\r
+ "node_modules/@jridgewell/gen-mapping": {\r
+ "version": "0.3.5",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",\r
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@jridgewell/set-array": "^1.2.1",\r
+ "@jridgewell/sourcemap-codec": "^1.4.10",\r
+ "@jridgewell/trace-mapping": "^0.3.24"\r
+ },\r
+ "engines": {\r
+ "node": ">=6.0.0"\r
+ }\r
+ },\r
+ "node_modules/@jridgewell/resolve-uri": {\r
+ "version": "3.1.0",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",\r
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=6.0.0"\r
+ }\r
+ },\r
+ "node_modules/@jridgewell/set-array": {\r
+ "version": "1.2.1",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",\r
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=6.0.0"\r
+ }\r
+ },\r
+ "node_modules/@jridgewell/source-map": {\r
+ "version": "0.3.6",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",\r
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "dependencies": {\r
+ "@jridgewell/gen-mapping": "^0.3.5",\r
+ "@jridgewell/trace-mapping": "^0.3.25"\r
+ }\r
+ },\r
+ "node_modules/@jridgewell/sourcemap-codec": {\r
+ "version": "1.4.15",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",\r
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="\r
+ },\r
+ "node_modules/@jridgewell/trace-mapping": {\r
+ "version": "0.3.25",\r
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",\r
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@jridgewell/resolve-uri": "^3.1.0",\r
+ "@jridgewell/sourcemap-codec": "^1.4.14"\r
+ }\r
+ },\r
+ "node_modules/@mdi/js": {\r
+ "version": "7.4.47",\r
+ "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz",\r
+ "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ=="\r
+ },\r
+ "node_modules/@mdi/light-js": {\r
+ "version": "0.2.63",\r
+ "resolved": "https://registry.npmjs.org/@mdi/light-js/-/light-js-0.2.63.tgz",\r
+ "integrity": "sha512-+SUtJIOxvEy6DiVq0wTRPIzVuoPB5fhnubmzaN7e2ew0v3/nvnpC4mqbGCjiTK0diVd3+zvhEQHZzPDErGb1fg=="\r
+ },\r
+ "node_modules/@nodelib/fs.scandir": {\r
+ "version": "2.1.5",\r
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",\r
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@nodelib/fs.stat": "2.0.5",\r
+ "run-parallel": "^1.1.9"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/@nodelib/fs.stat": {\r
+ "version": "2.0.5",\r
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",\r
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/@nodelib/fs.walk": {\r
+ "version": "1.2.8",\r
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",\r
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@nodelib/fs.scandir": "2.1.5",\r
+ "fastq": "^1.6.0"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/@pkgjs/parseargs": {\r
+ "version": "0.11.0",\r
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",\r
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "engines": {\r
+ "node": ">=14"\r
+ }\r
+ },\r
+ "node_modules/@rollup/rollup-android-arm-eabi": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",\r
+ "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",\r
+ "cpu": [\r
+ "arm"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "android"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-android-arm64": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",\r
+ "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "android"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-darwin-arm64": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",\r
+ "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "darwin"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-darwin-x64": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",\r
+ "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "darwin"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",\r
+ "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",\r
+ "cpu": [\r
+ "arm"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",\r
+ "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",\r
+ "cpu": [\r
+ "arm"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",\r
+ "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-arm64-musl": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",\r
+ "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",\r
+ "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",\r
+ "cpu": [\r
+ "ppc64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",\r
+ "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",\r
+ "cpu": [\r
+ "riscv64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",\r
+ "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",\r
+ "cpu": [\r
+ "s390x"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-x64-gnu": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",\r
+ "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-linux-x64-musl": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",\r
+ "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "linux"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",\r
+ "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",\r
+ "cpu": [\r
+ "arm64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",\r
+ "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",\r
+ "cpu": [\r
+ "ia32"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ]\r
+ },\r
+ "node_modules/@rollup/rollup-win32-x64-msvc": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",\r
+ "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",\r
+ "cpu": [\r
+ "x64"\r
+ ],\r
+ "dev": true,\r
+ "optional": true,\r
+ "os": [\r
+ "win32"\r
+ ]\r
+ },\r
+ "node_modules/@types/estree": {\r
+ "version": "1.0.5",\r
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",\r
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/@vitejs/plugin-vue": {\r
+ "version": "5.0.4",\r
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",\r
+ "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": "^18.0.0 || >=20.0.0"\r
+ },\r
+ "peerDependencies": {\r
+ "vite": "^5.0.0",\r
+ "vue": "^3.2.25"\r
+ }\r
+ },\r
+ "node_modules/@vue/compiler-core": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.24.tgz",\r
+ "integrity": "sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==",\r
+ "dependencies": {\r
+ "@babel/parser": "^7.24.4",\r
+ "@vue/shared": "3.4.24",\r
+ "entities": "^4.5.0",\r
+ "estree-walker": "^2.0.2",\r
+ "source-map-js": "^1.2.0"\r
+ }\r
+ },\r
+ "node_modules/@vue/compiler-dom": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz",\r
+ "integrity": "sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==",\r
+ "dependencies": {\r
+ "@vue/compiler-core": "3.4.24",\r
+ "@vue/shared": "3.4.24"\r
+ }\r
+ },\r
+ "node_modules/@vue/compiler-sfc": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz",\r
+ "integrity": "sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==",\r
+ "dependencies": {\r
+ "@babel/parser": "^7.24.4",\r
+ "@vue/compiler-core": "3.4.24",\r
+ "@vue/compiler-dom": "3.4.24",\r
+ "@vue/compiler-ssr": "3.4.24",\r
+ "@vue/shared": "3.4.24",\r
+ "estree-walker": "^2.0.2",\r
+ "magic-string": "^0.30.10",\r
+ "postcss": "^8.4.38",\r
+ "source-map-js": "^1.2.0"\r
+ }\r
+ },\r
+ "node_modules/@vue/compiler-ssr": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz",\r
+ "integrity": "sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==",\r
+ "dependencies": {\r
+ "@vue/compiler-dom": "3.4.24",\r
+ "@vue/shared": "3.4.24"\r
+ }\r
+ },\r
+ "node_modules/@vue/devtools-api": {\r
+ "version": "6.6.1",\r
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",\r
+ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="\r
+ },\r
+ "node_modules/@vue/reactivity": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.24.tgz",\r
+ "integrity": "sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==",\r
+ "dependencies": {\r
+ "@vue/shared": "3.4.24"\r
+ }\r
+ },\r
+ "node_modules/@vue/runtime-core": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.24.tgz",\r
+ "integrity": "sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==",\r
+ "dependencies": {\r
+ "@vue/reactivity": "3.4.24",\r
+ "@vue/shared": "3.4.24"\r
+ }\r
+ },\r
+ "node_modules/@vue/runtime-dom": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz",\r
+ "integrity": "sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==",\r
+ "dependencies": {\r
+ "@vue/runtime-core": "3.4.24",\r
+ "@vue/shared": "3.4.24",\r
+ "csstype": "^3.1.3"\r
+ }\r
+ },\r
+ "node_modules/@vue/server-renderer": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.24.tgz",\r
+ "integrity": "sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==",\r
+ "dependencies": {\r
+ "@vue/compiler-ssr": "3.4.24",\r
+ "@vue/shared": "3.4.24"\r
+ },\r
+ "peerDependencies": {\r
+ "vue": "3.4.24"\r
+ }\r
+ },\r
+ "node_modules/@vue/shared": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.24.tgz",\r
+ "integrity": "sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw=="\r
+ },\r
+ "node_modules/ansi-regex": {\r
+ "version": "6.0.1",\r
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",\r
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/ansi-styles": {\r
+ "version": "6.2.1",\r
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",\r
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/any-promise": {\r
+ "version": "1.3.0",\r
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",\r
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",\r
+ "dev": true\r
+ },\r
+ "node_modules/anymatch": {\r
+ "version": "3.1.3",\r
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",\r
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "normalize-path": "^3.0.0",\r
+ "picomatch": "^2.0.4"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/arg": {\r
+ "version": "5.0.2",\r
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",\r
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",\r
+ "dev": true\r
+ },\r
+ "node_modules/asynckit": {\r
+ "version": "0.4.0",\r
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",\r
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="\r
+ },\r
+ "node_modules/autoprefixer": {\r
+ "version": "10.4.19",\r
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",\r
+ "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/postcss/"\r
+ },\r
+ {\r
+ "type": "tidelift",\r
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "browserslist": "^4.23.0",\r
+ "caniuse-lite": "^1.0.30001599",\r
+ "fraction.js": "^4.3.7",\r
+ "normalize-range": "^0.1.2",\r
+ "picocolors": "^1.0.0",\r
+ "postcss-value-parser": "^4.2.0"\r
+ },\r
+ "bin": {\r
+ "autoprefixer": "bin/autoprefixer"\r
+ },\r
+ "engines": {\r
+ "node": "^10 || ^12 || >=14"\r
+ },\r
+ "peerDependencies": {\r
+ "postcss": "^8.1.0"\r
+ }\r
+ },\r
+ "node_modules/axios": {\r
+ "version": "1.6.8",\r
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",\r
+ "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",\r
+ "dependencies": {\r
+ "follow-redirects": "^1.15.6",\r
+ "form-data": "^4.0.0",\r
+ "proxy-from-env": "^1.1.0"\r
+ }\r
+ },\r
+ "node_modules/axios/node_modules/form-data": {\r
+ "version": "4.0.0",\r
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",\r
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",\r
+ "dependencies": {\r
+ "asynckit": "^0.4.0",\r
+ "combined-stream": "^1.0.8",\r
+ "mime-types": "^2.1.12"\r
+ },\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/balanced-match": {\r
+ "version": "1.0.2",\r
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",\r
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/binary-extensions": {\r
+ "version": "2.3.0",\r
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",\r
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/sindresorhus"\r
+ }\r
+ },\r
+ "node_modules/brace-expansion": {\r
+ "version": "2.0.1",\r
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",\r
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "balanced-match": "^1.0.0"\r
+ }\r
+ },\r
+ "node_modules/braces": {\r
+ "version": "3.0.2",\r
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",\r
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "fill-range": "^7.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/browserslist": {\r
+ "version": "4.23.0",\r
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",\r
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/browserslist"\r
+ },\r
+ {\r
+ "type": "tidelift",\r
+ "url": "https://tidelift.com/funding/github/npm/browserslist"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "caniuse-lite": "^1.0.30001587",\r
+ "electron-to-chromium": "^1.4.668",\r
+ "node-releases": "^2.0.14",\r
+ "update-browserslist-db": "^1.0.13"\r
+ },\r
+ "bin": {\r
+ "browserslist": "cli.js"\r
+ },\r
+ "engines": {\r
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"\r
+ }\r
+ },\r
+ "node_modules/buffer-from": {\r
+ "version": "1.1.2",\r
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",\r
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true\r
+ },\r
+ "node_modules/camelcase-css": {\r
+ "version": "2.0.1",\r
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",\r
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/caniuse-lite": {\r
+ "version": "1.0.30001612",\r
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",\r
+ "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/browserslist"\r
+ },\r
+ {\r
+ "type": "tidelift",\r
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ]\r
+ },\r
+ "node_modules/chokidar": {\r
+ "version": "3.6.0",\r
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",\r
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "anymatch": "~3.1.2",\r
+ "braces": "~3.0.2",\r
+ "glob-parent": "~5.1.2",\r
+ "is-binary-path": "~2.1.0",\r
+ "is-glob": "~4.0.1",\r
+ "normalize-path": "~3.0.0",\r
+ "readdirp": "~3.6.0"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8.10.0"\r
+ },\r
+ "funding": {\r
+ "url": "https://paulmillr.com/funding/"\r
+ },\r
+ "optionalDependencies": {\r
+ "fsevents": "~2.3.2"\r
+ }\r
+ },\r
+ "node_modules/chokidar/node_modules/glob-parent": {\r
+ "version": "5.1.2",\r
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",\r
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-glob": "^4.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/color-convert": {\r
+ "version": "2.0.1",\r
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",\r
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "color-name": "~1.1.4"\r
+ },\r
+ "engines": {\r
+ "node": ">=7.0.0"\r
+ }\r
+ },\r
+ "node_modules/color-name": {\r
+ "version": "1.1.4",\r
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",\r
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",\r
+ "dev": true\r
+ },\r
+ "node_modules/combined-stream": {\r
+ "version": "1.0.8",\r
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",\r
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",\r
+ "dependencies": {\r
+ "delayed-stream": "~1.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">= 0.8"\r
+ }\r
+ },\r
+ "node_modules/commander": {\r
+ "version": "2.20.3",\r
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",\r
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true\r
+ },\r
+ "node_modules/cross-spawn": {\r
+ "version": "7.0.3",\r
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",\r
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "path-key": "^3.1.0",\r
+ "shebang-command": "^2.0.0",\r
+ "which": "^2.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/cssesc": {\r
+ "version": "3.0.0",\r
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",\r
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",\r
+ "dev": true,\r
+ "bin": {\r
+ "cssesc": "bin/cssesc"\r
+ },\r
+ "engines": {\r
+ "node": ">=4"\r
+ }\r
+ },\r
+ "node_modules/csstype": {\r
+ "version": "3.1.3",\r
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",\r
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="\r
+ },\r
+ "node_modules/delayed-stream": {\r
+ "version": "1.0.0",\r
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",\r
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",\r
+ "engines": {\r
+ "node": ">=0.4.0"\r
+ }\r
+ },\r
+ "node_modules/didyoumean": {\r
+ "version": "1.2.2",\r
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",\r
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/dlv": {\r
+ "version": "1.1.3",\r
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",\r
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",\r
+ "dev": true\r
+ },\r
+ "node_modules/eastasianwidth": {\r
+ "version": "0.2.0",\r
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",\r
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",\r
+ "dev": true\r
+ },\r
+ "node_modules/electron-to-chromium": {\r
+ "version": "1.4.746",\r
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz",\r
+ "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==",\r
+ "dev": true\r
+ },\r
+ "node_modules/emoji-regex": {\r
+ "version": "9.2.2",\r
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",\r
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",\r
+ "dev": true\r
+ },\r
+ "node_modules/entities": {\r
+ "version": "4.5.0",\r
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",\r
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",\r
+ "engines": {\r
+ "node": ">=0.12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/fb55/entities?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/esbuild": {\r
+ "version": "0.20.2",\r
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",\r
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",\r
+ "dev": true,\r
+ "hasInstallScript": true,\r
+ "bin": {\r
+ "esbuild": "bin/esbuild"\r
+ },\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "optionalDependencies": {\r
+ "@esbuild/aix-ppc64": "0.20.2",\r
+ "@esbuild/android-arm": "0.20.2",\r
+ "@esbuild/android-arm64": "0.20.2",\r
+ "@esbuild/android-x64": "0.20.2",\r
+ "@esbuild/darwin-arm64": "0.20.2",\r
+ "@esbuild/darwin-x64": "0.20.2",\r
+ "@esbuild/freebsd-arm64": "0.20.2",\r
+ "@esbuild/freebsd-x64": "0.20.2",\r
+ "@esbuild/linux-arm": "0.20.2",\r
+ "@esbuild/linux-arm64": "0.20.2",\r
+ "@esbuild/linux-ia32": "0.20.2",\r
+ "@esbuild/linux-loong64": "0.20.2",\r
+ "@esbuild/linux-mips64el": "0.20.2",\r
+ "@esbuild/linux-ppc64": "0.20.2",\r
+ "@esbuild/linux-riscv64": "0.20.2",\r
+ "@esbuild/linux-s390x": "0.20.2",\r
+ "@esbuild/linux-x64": "0.20.2",\r
+ "@esbuild/netbsd-x64": "0.20.2",\r
+ "@esbuild/openbsd-x64": "0.20.2",\r
+ "@esbuild/sunos-x64": "0.20.2",\r
+ "@esbuild/win32-arm64": "0.20.2",\r
+ "@esbuild/win32-ia32": "0.20.2",\r
+ "@esbuild/win32-x64": "0.20.2"\r
+ }\r
+ },\r
+ "node_modules/escalade": {\r
+ "version": "3.1.2",\r
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",\r
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=6"\r
+ }\r
+ },\r
+ "node_modules/estree-walker": {\r
+ "version": "2.0.2",\r
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",\r
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="\r
+ },\r
+ "node_modules/fast-glob": {\r
+ "version": "3.3.2",\r
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",\r
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@nodelib/fs.stat": "^2.0.2",\r
+ "@nodelib/fs.walk": "^1.2.3",\r
+ "glob-parent": "^5.1.2",\r
+ "merge2": "^1.3.0",\r
+ "micromatch": "^4.0.4"\r
+ },\r
+ "engines": {\r
+ "node": ">=8.6.0"\r
+ }\r
+ },\r
+ "node_modules/fast-glob/node_modules/glob-parent": {\r
+ "version": "5.1.2",\r
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",\r
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-glob": "^4.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/fastq": {\r
+ "version": "1.17.1",\r
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",\r
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "reusify": "^1.0.4"\r
+ }\r
+ },\r
+ "node_modules/fill-range": {\r
+ "version": "7.0.1",\r
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",\r
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "to-regex-range": "^5.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/follow-redirects": {\r
+ "version": "1.15.6",\r
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",\r
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",\r
+ "funding": [\r
+ {\r
+ "type": "individual",\r
+ "url": "https://github.com/sponsors/RubenVerborgh"\r
+ }\r
+ ],\r
+ "engines": {\r
+ "node": ">=4.0"\r
+ },\r
+ "peerDependenciesMeta": {\r
+ "debug": {\r
+ "optional": true\r
+ }\r
+ }\r
+ },\r
+ "node_modules/foreground-child": {\r
+ "version": "3.1.1",\r
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",\r
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "cross-spawn": "^7.0.0",\r
+ "signal-exit": "^4.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=14"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ }\r
+ },\r
+ "node_modules/fraction.js": {\r
+ "version": "4.3.7",\r
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",\r
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": "*"\r
+ },\r
+ "funding": {\r
+ "type": "patreon",\r
+ "url": "https://github.com/sponsors/rawify"\r
+ }\r
+ },\r
+ "node_modules/fsevents": {\r
+ "version": "2.3.3",\r
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",\r
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",\r
+ "dev": true,\r
+ "hasInstallScript": true,\r
+ "optional": true,\r
+ "os": [\r
+ "darwin"\r
+ ],\r
+ "engines": {\r
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"\r
+ }\r
+ },\r
+ "node_modules/function-bind": {\r
+ "version": "1.1.2",\r
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",\r
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",\r
+ "dev": true,\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/ljharb"\r
+ }\r
+ },\r
+ "node_modules/glob": {\r
+ "version": "10.3.12",\r
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",\r
+ "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "foreground-child": "^3.1.0",\r
+ "jackspeak": "^2.3.6",\r
+ "minimatch": "^9.0.1",\r
+ "minipass": "^7.0.4",\r
+ "path-scurry": "^1.10.2"\r
+ },\r
+ "bin": {\r
+ "glob": "dist/esm/bin.mjs"\r
+ },\r
+ "engines": {\r
+ "node": ">=16 || 14 >=14.17"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ }\r
+ },\r
+ "node_modules/glob-parent": {\r
+ "version": "6.0.2",\r
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",\r
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-glob": "^4.0.3"\r
+ },\r
+ "engines": {\r
+ "node": ">=10.13.0"\r
+ }\r
+ },\r
+ "node_modules/hasown": {\r
+ "version": "2.0.2",\r
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",\r
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "function-bind": "^1.1.2"\r
+ },\r
+ "engines": {\r
+ "node": ">= 0.4"\r
+ }\r
+ },\r
+ "node_modules/immutable": {\r
+ "version": "4.2.4",\r
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",\r
+ "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true\r
+ },\r
+ "node_modules/is-binary-path": {\r
+ "version": "2.1.0",\r
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",\r
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "binary-extensions": "^2.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/is-core-module": {\r
+ "version": "2.13.1",\r
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",\r
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "hasown": "^2.0.0"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/ljharb"\r
+ }\r
+ },\r
+ "node_modules/is-extglob": {\r
+ "version": "2.1.1",\r
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",\r
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/is-fullwidth-code-point": {\r
+ "version": "3.0.0",\r
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",\r
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/is-glob": {\r
+ "version": "4.0.3",\r
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",\r
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-extglob": "^2.1.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/is-number": {\r
+ "version": "7.0.0",\r
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",\r
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.12.0"\r
+ }\r
+ },\r
+ "node_modules/isexe": {\r
+ "version": "2.0.0",\r
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",\r
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/jackspeak": {\r
+ "version": "2.3.6",\r
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",\r
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@isaacs/cliui": "^8.0.2"\r
+ },\r
+ "engines": {\r
+ "node": ">=14"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ },\r
+ "optionalDependencies": {\r
+ "@pkgjs/parseargs": "^0.11.0"\r
+ }\r
+ },\r
+ "node_modules/jiti": {\r
+ "version": "1.21.0",\r
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",\r
+ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",\r
+ "dev": true,\r
+ "bin": {\r
+ "jiti": "bin/jiti.js"\r
+ }\r
+ },\r
+ "node_modules/lilconfig": {\r
+ "version": "2.1.0",\r
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",\r
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=10"\r
+ }\r
+ },\r
+ "node_modules/lines-and-columns": {\r
+ "version": "1.2.4",\r
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",\r
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",\r
+ "dev": true\r
+ },\r
+ "node_modules/lru-cache": {\r
+ "version": "10.2.0",\r
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",\r
+ "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": "14 || >=16.14"\r
+ }\r
+ },\r
+ "node_modules/magic-string": {\r
+ "version": "0.30.10",\r
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",\r
+ "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",\r
+ "dependencies": {\r
+ "@jridgewell/sourcemap-codec": "^1.4.15"\r
+ }\r
+ },\r
+ "node_modules/merge2": {\r
+ "version": "1.4.1",\r
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",\r
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/micromatch": {\r
+ "version": "4.0.5",\r
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",\r
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "braces": "^3.0.2",\r
+ "picomatch": "^2.3.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8.6"\r
+ }\r
+ },\r
+ "node_modules/mime-db": {\r
+ "version": "1.52.0",\r
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",\r
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",\r
+ "engines": {\r
+ "node": ">= 0.6"\r
+ }\r
+ },\r
+ "node_modules/mime-types": {\r
+ "version": "2.1.35",\r
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",\r
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",\r
+ "dependencies": {\r
+ "mime-db": "1.52.0"\r
+ },\r
+ "engines": {\r
+ "node": ">= 0.6"\r
+ }\r
+ },\r
+ "node_modules/minimatch": {\r
+ "version": "9.0.4",\r
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",\r
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "brace-expansion": "^2.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=16 || 14 >=14.17"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ }\r
+ },\r
+ "node_modules/minipass": {\r
+ "version": "7.0.4",\r
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",\r
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=16 || 14 >=14.17"\r
+ }\r
+ },\r
+ "node_modules/mousetrap": {\r
+ "version": "1.6.5",\r
+ "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",\r
+ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="\r
+ },\r
+ "node_modules/mz": {\r
+ "version": "2.7.0",\r
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",\r
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "any-promise": "^1.0.0",\r
+ "object-assign": "^4.0.1",\r
+ "thenify-all": "^1.0.0"\r
+ }\r
+ },\r
+ "node_modules/nanoid": {\r
+ "version": "3.3.7",\r
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",\r
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",\r
+ "funding": [\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "bin": {\r
+ "nanoid": "bin/nanoid.cjs"\r
+ },\r
+ "engines": {\r
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"\r
+ }\r
+ },\r
+ "node_modules/node-releases": {\r
+ "version": "2.0.14",\r
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",\r
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/normalize-path": {\r
+ "version": "3.0.0",\r
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",\r
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/normalize-range": {\r
+ "version": "0.1.2",\r
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",\r
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/object-assign": {\r
+ "version": "4.1.1",\r
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",\r
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/object-hash": {\r
+ "version": "3.0.0",\r
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",\r
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/path-key": {\r
+ "version": "3.1.1",\r
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",\r
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/path-parse": {\r
+ "version": "1.0.7",\r
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",\r
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/path-scurry": {\r
+ "version": "1.10.2",\r
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",\r
+ "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "lru-cache": "^10.2.0",\r
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=16 || 14 >=14.17"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ }\r
+ },\r
+ "node_modules/picocolors": {\r
+ "version": "1.0.0",\r
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",\r
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="\r
+ },\r
+ "node_modules/picomatch": {\r
+ "version": "2.3.1",\r
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",\r
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8.6"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/jonschlinkert"\r
+ }\r
+ },\r
+ "node_modules/pify": {\r
+ "version": "2.3.0",\r
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",\r
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/pirates": {\r
+ "version": "4.0.6",\r
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",\r
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/postcss": {\r
+ "version": "8.4.38",\r
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",\r
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/postcss/"\r
+ },\r
+ {\r
+ "type": "tidelift",\r
+ "url": "https://tidelift.com/funding/github/npm/postcss"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "nanoid": "^3.3.7",\r
+ "picocolors": "^1.0.0",\r
+ "source-map-js": "^1.2.0"\r
+ },\r
+ "engines": {\r
+ "node": "^10 || ^12 || >=14"\r
+ }\r
+ },\r
+ "node_modules/postcss-import": {\r
+ "version": "15.1.0",\r
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",\r
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "postcss-value-parser": "^4.0.0",\r
+ "read-cache": "^1.0.0",\r
+ "resolve": "^1.1.7"\r
+ },\r
+ "engines": {\r
+ "node": ">=14.0.0"\r
+ },\r
+ "peerDependencies": {\r
+ "postcss": "^8.0.0"\r
+ }\r
+ },\r
+ "node_modules/postcss-js": {\r
+ "version": "4.0.1",\r
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",\r
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "camelcase-css": "^2.0.1"\r
+ },\r
+ "engines": {\r
+ "node": "^12 || ^14 || >= 16"\r
+ },\r
+ "funding": {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/postcss/"\r
+ },\r
+ "peerDependencies": {\r
+ "postcss": "^8.4.21"\r
+ }\r
+ },\r
+ "node_modules/postcss-load-config": {\r
+ "version": "4.0.2",\r
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",\r
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/postcss/"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "lilconfig": "^3.0.0",\r
+ "yaml": "^2.3.4"\r
+ },\r
+ "engines": {\r
+ "node": ">= 14"\r
+ },\r
+ "peerDependencies": {\r
+ "postcss": ">=8.0.9",\r
+ "ts-node": ">=9.0.0"\r
+ },\r
+ "peerDependenciesMeta": {\r
+ "postcss": {\r
+ "optional": true\r
+ },\r
+ "ts-node": {\r
+ "optional": true\r
+ }\r
+ }\r
+ },\r
+ "node_modules/postcss-load-config/node_modules/lilconfig": {\r
+ "version": "3.1.1",\r
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",\r
+ "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=14"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/antonk52"\r
+ }\r
+ },\r
+ "node_modules/postcss-nested": {\r
+ "version": "6.0.1",\r
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",\r
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "postcss-selector-parser": "^6.0.11"\r
+ },\r
+ "engines": {\r
+ "node": ">=12.0"\r
+ },\r
+ "funding": {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/postcss/"\r
+ },\r
+ "peerDependencies": {\r
+ "postcss": "^8.2.14"\r
+ }\r
+ },\r
+ "node_modules/postcss-selector-parser": {\r
+ "version": "6.0.16",\r
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",\r
+ "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "cssesc": "^3.0.0",\r
+ "util-deprecate": "^1.0.2"\r
+ },\r
+ "engines": {\r
+ "node": ">=4"\r
+ }\r
+ },\r
+ "node_modules/postcss-value-parser": {\r
+ "version": "4.2.0",\r
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",\r
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",\r
+ "dev": true\r
+ },\r
+ "node_modules/prettier": {\r
+ "version": "3.2.5",\r
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",\r
+ "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",\r
+ "dev": true,\r
+ "peer": true,\r
+ "bin": {\r
+ "prettier": "bin/prettier.cjs"\r
+ },\r
+ "engines": {\r
+ "node": ">=14"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/prettier/prettier?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/prettier-plugin-tailwindcss": {\r
+ "version": "0.5.14",\r
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz",\r
+ "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=14.21.3"\r
+ },\r
+ "peerDependencies": {\r
+ "@ianvs/prettier-plugin-sort-imports": "*",\r
+ "@prettier/plugin-pug": "*",\r
+ "@shopify/prettier-plugin-liquid": "*",\r
+ "@trivago/prettier-plugin-sort-imports": "*",\r
+ "@zackad/prettier-plugin-twig-melody": "*",\r
+ "prettier": "^3.0",\r
+ "prettier-plugin-astro": "*",\r
+ "prettier-plugin-css-order": "*",\r
+ "prettier-plugin-import-sort": "*",\r
+ "prettier-plugin-jsdoc": "*",\r
+ "prettier-plugin-marko": "*",\r
+ "prettier-plugin-organize-attributes": "*",\r
+ "prettier-plugin-organize-imports": "*",\r
+ "prettier-plugin-sort-imports": "*",\r
+ "prettier-plugin-style-order": "*",\r
+ "prettier-plugin-svelte": "*"\r
+ },\r
+ "peerDependenciesMeta": {\r
+ "@ianvs/prettier-plugin-sort-imports": {\r
+ "optional": true\r
+ },\r
+ "@prettier/plugin-pug": {\r
+ "optional": true\r
+ },\r
+ "@shopify/prettier-plugin-liquid": {\r
+ "optional": true\r
+ },\r
+ "@trivago/prettier-plugin-sort-imports": {\r
+ "optional": true\r
+ },\r
+ "@zackad/prettier-plugin-twig-melody": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-astro": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-css-order": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-import-sort": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-jsdoc": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-marko": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-organize-attributes": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-organize-imports": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-sort-imports": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-style-order": {\r
+ "optional": true\r
+ },\r
+ "prettier-plugin-svelte": {\r
+ "optional": true\r
+ }\r
+ }\r
+ },\r
+ "node_modules/proxy-from-env": {\r
+ "version": "1.1.0",\r
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",\r
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="\r
+ },\r
+ "node_modules/queue-microtask": {\r
+ "version": "1.2.3",\r
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",\r
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/feross"\r
+ },\r
+ {\r
+ "type": "patreon",\r
+ "url": "https://www.patreon.com/feross"\r
+ },\r
+ {\r
+ "type": "consulting",\r
+ "url": "https://feross.org/support"\r
+ }\r
+ ]\r
+ },\r
+ "node_modules/read-cache": {\r
+ "version": "1.0.0",\r
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",\r
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "pify": "^2.3.0"\r
+ }\r
+ },\r
+ "node_modules/readdirp": {\r
+ "version": "3.6.0",\r
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",\r
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "picomatch": "^2.2.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8.10.0"\r
+ }\r
+ },\r
+ "node_modules/resolve": {\r
+ "version": "1.22.8",\r
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",\r
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-core-module": "^2.13.0",\r
+ "path-parse": "^1.0.7",\r
+ "supports-preserve-symlinks-flag": "^1.0.0"\r
+ },\r
+ "bin": {\r
+ "resolve": "bin/resolve"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/ljharb"\r
+ }\r
+ },\r
+ "node_modules/reusify": {\r
+ "version": "1.0.4",\r
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",\r
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",\r
+ "dev": true,\r
+ "engines": {\r
+ "iojs": ">=1.0.0",\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/rollup": {\r
+ "version": "4.14.3",\r
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz",\r
+ "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@types/estree": "1.0.5"\r
+ },\r
+ "bin": {\r
+ "rollup": "dist/bin/rollup"\r
+ },\r
+ "engines": {\r
+ "node": ">=18.0.0",\r
+ "npm": ">=8.0.0"\r
+ },\r
+ "optionalDependencies": {\r
+ "@rollup/rollup-android-arm-eabi": "4.14.3",\r
+ "@rollup/rollup-android-arm64": "4.14.3",\r
+ "@rollup/rollup-darwin-arm64": "4.14.3",\r
+ "@rollup/rollup-darwin-x64": "4.14.3",\r
+ "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",\r
+ "@rollup/rollup-linux-arm-musleabihf": "4.14.3",\r
+ "@rollup/rollup-linux-arm64-gnu": "4.14.3",\r
+ "@rollup/rollup-linux-arm64-musl": "4.14.3",\r
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",\r
+ "@rollup/rollup-linux-riscv64-gnu": "4.14.3",\r
+ "@rollup/rollup-linux-s390x-gnu": "4.14.3",\r
+ "@rollup/rollup-linux-x64-gnu": "4.14.3",\r
+ "@rollup/rollup-linux-x64-musl": "4.14.3",\r
+ "@rollup/rollup-win32-arm64-msvc": "4.14.3",\r
+ "@rollup/rollup-win32-ia32-msvc": "4.14.3",\r
+ "@rollup/rollup-win32-x64-msvc": "4.14.3",\r
+ "fsevents": "~2.3.2"\r
+ }\r
+ },\r
+ "node_modules/run-parallel": {\r
+ "version": "1.2.0",\r
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",\r
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/feross"\r
+ },\r
+ {\r
+ "type": "patreon",\r
+ "url": "https://www.patreon.com/feross"\r
+ },\r
+ {\r
+ "type": "consulting",\r
+ "url": "https://feross.org/support"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "queue-microtask": "^1.2.2"\r
+ }\r
+ },\r
+ "node_modules/sass": {\r
+ "version": "1.74.1",\r
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz",\r
+ "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "dependencies": {\r
+ "chokidar": ">=3.0.0 <4.0.0",\r
+ "immutable": "^4.0.0",\r
+ "source-map-js": ">=0.6.2 <2.0.0"\r
+ },\r
+ "bin": {\r
+ "sass": "sass.js"\r
+ },\r
+ "engines": {\r
+ "node": ">=14.0.0"\r
+ }\r
+ },\r
+ "node_modules/shebang-command": {\r
+ "version": "2.0.0",\r
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",\r
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "shebang-regex": "^3.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/shebang-regex": {\r
+ "version": "3.0.0",\r
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",\r
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/signal-exit": {\r
+ "version": "4.1.0",\r
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",\r
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=14"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/isaacs"\r
+ }\r
+ },\r
+ "node_modules/source-map": {\r
+ "version": "0.6.1",\r
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",\r
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/source-map-js": {\r
+ "version": "1.2.0",\r
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",\r
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",\r
+ "engines": {\r
+ "node": ">=0.10.0"\r
+ }\r
+ },\r
+ "node_modules/source-map-support": {\r
+ "version": "0.5.21",\r
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",\r
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "dependencies": {\r
+ "buffer-from": "^1.0.0",\r
+ "source-map": "^0.6.0"\r
+ }\r
+ },\r
+ "node_modules/string-width": {\r
+ "version": "5.1.2",\r
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",\r
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "eastasianwidth": "^0.2.0",\r
+ "emoji-regex": "^9.2.2",\r
+ "strip-ansi": "^7.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/sindresorhus"\r
+ }\r
+ },\r
+ "node_modules/string-width-cjs": {\r
+ "name": "string-width",\r
+ "version": "4.2.3",\r
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",\r
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "emoji-regex": "^8.0.0",\r
+ "is-fullwidth-code-point": "^3.0.0",\r
+ "strip-ansi": "^6.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {\r
+ "version": "5.0.1",\r
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {\r
+ "version": "8.0.0",\r
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",\r
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",\r
+ "dev": true\r
+ },\r
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {\r
+ "version": "6.0.1",\r
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-regex": "^5.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/strip-ansi": {\r
+ "version": "7.1.0",\r
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",\r
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-regex": "^6.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/strip-ansi-cjs": {\r
+ "name": "strip-ansi",\r
+ "version": "6.0.1",\r
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-regex": "^5.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {\r
+ "version": "5.0.1",\r
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/sucrase": {\r
+ "version": "3.35.0",\r
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",\r
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@jridgewell/gen-mapping": "^0.3.2",\r
+ "commander": "^4.0.0",\r
+ "glob": "^10.3.10",\r
+ "lines-and-columns": "^1.1.6",\r
+ "mz": "^2.7.0",\r
+ "pirates": "^4.0.1",\r
+ "ts-interface-checker": "^0.1.9"\r
+ },\r
+ "bin": {\r
+ "sucrase": "bin/sucrase",\r
+ "sucrase-node": "bin/sucrase-node"\r
+ },\r
+ "engines": {\r
+ "node": ">=16 || 14 >=14.17"\r
+ }\r
+ },\r
+ "node_modules/sucrase/node_modules/commander": {\r
+ "version": "4.1.1",\r
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",\r
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 6"\r
+ }\r
+ },\r
+ "node_modules/supports-preserve-symlinks-flag": {\r
+ "version": "1.0.0",\r
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",\r
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">= 0.4"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/ljharb"\r
+ }\r
+ },\r
+ "node_modules/tailwindcss": {\r
+ "version": "3.4.3",\r
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",\r
+ "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "@alloc/quick-lru": "^5.2.0",\r
+ "arg": "^5.0.2",\r
+ "chokidar": "^3.5.3",\r
+ "didyoumean": "^1.2.2",\r
+ "dlv": "^1.1.3",\r
+ "fast-glob": "^3.3.0",\r
+ "glob-parent": "^6.0.2",\r
+ "is-glob": "^4.0.3",\r
+ "jiti": "^1.21.0",\r
+ "lilconfig": "^2.1.0",\r
+ "micromatch": "^4.0.5",\r
+ "normalize-path": "^3.0.0",\r
+ "object-hash": "^3.0.0",\r
+ "picocolors": "^1.0.0",\r
+ "postcss": "^8.4.23",\r
+ "postcss-import": "^15.1.0",\r
+ "postcss-js": "^4.0.1",\r
+ "postcss-load-config": "^4.0.1",\r
+ "postcss-nested": "^6.0.1",\r
+ "postcss-selector-parser": "^6.0.11",\r
+ "resolve": "^1.22.2",\r
+ "sucrase": "^3.32.0"\r
+ },\r
+ "bin": {\r
+ "tailwind": "lib/cli.js",\r
+ "tailwindcss": "lib/cli.js"\r
+ },\r
+ "engines": {\r
+ "node": ">=14.0.0"\r
+ }\r
+ },\r
+ "node_modules/terser": {\r
+ "version": "5.30.3",\r
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",\r
+ "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "dependencies": {\r
+ "@jridgewell/source-map": "^0.3.3",\r
+ "acorn": "^8.8.2",\r
+ "commander": "^2.20.0",\r
+ "source-map-support": "~0.5.20"\r
+ },\r
+ "bin": {\r
+ "terser": "bin/terser"\r
+ },\r
+ "engines": {\r
+ "node": ">=10"\r
+ }\r
+ },\r
+ "node_modules/terser/node_modules/acorn": {\r
+ "version": "8.11.3",\r
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",\r
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",\r
+ "dev": true,\r
+ "optional": true,\r
+ "peer": true,\r
+ "bin": {\r
+ "acorn": "bin/acorn"\r
+ },\r
+ "engines": {\r
+ "node": ">=0.4.0"\r
+ }\r
+ },\r
+ "node_modules/thenify": {\r
+ "version": "3.3.1",\r
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",\r
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "any-promise": "^1.0.0"\r
+ }\r
+ },\r
+ "node_modules/thenify-all": {\r
+ "version": "1.6.0",\r
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",\r
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "thenify": ">= 3.1.0 < 4"\r
+ },\r
+ "engines": {\r
+ "node": ">=0.8"\r
+ }\r
+ },\r
+ "node_modules/to-regex-range": {\r
+ "version": "5.0.1",\r
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",\r
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "is-number": "^7.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=8.0"\r
+ }\r
+ },\r
+ "node_modules/ts-interface-checker": {\r
+ "version": "0.1.13",\r
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",\r
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",\r
+ "dev": true\r
+ },\r
+ "node_modules/update-browserslist-db": {\r
+ "version": "1.0.13",\r
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",\r
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",\r
+ "dev": true,\r
+ "funding": [\r
+ {\r
+ "type": "opencollective",\r
+ "url": "https://opencollective.com/browserslist"\r
+ },\r
+ {\r
+ "type": "tidelift",\r
+ "url": "https://tidelift.com/funding/github/npm/browserslist"\r
+ },\r
+ {\r
+ "type": "github",\r
+ "url": "https://github.com/sponsors/ai"\r
+ }\r
+ ],\r
+ "dependencies": {\r
+ "escalade": "^3.1.1",\r
+ "picocolors": "^1.0.0"\r
+ },\r
+ "bin": {\r
+ "update-browserslist-db": "cli.js"\r
+ },\r
+ "peerDependencies": {\r
+ "browserslist": ">= 4.21.0"\r
+ }\r
+ },\r
+ "node_modules/util-deprecate": {\r
+ "version": "1.0.2",\r
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",\r
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",\r
+ "dev": true\r
+ },\r
+ "node_modules/vite": {\r
+ "version": "5.2.9",\r
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz",\r
+ "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "esbuild": "^0.20.1",\r
+ "postcss": "^8.4.38",\r
+ "rollup": "^4.13.0"\r
+ },\r
+ "bin": {\r
+ "vite": "bin/vite.js"\r
+ },\r
+ "engines": {\r
+ "node": "^18.0.0 || >=20.0.0"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/vitejs/vite?sponsor=1"\r
+ },\r
+ "optionalDependencies": {\r
+ "fsevents": "~2.3.3"\r
+ },\r
+ "peerDependencies": {\r
+ "@types/node": "^18.0.0 || >=20.0.0",\r
+ "less": "*",\r
+ "lightningcss": "^1.21.0",\r
+ "sass": "*",\r
+ "stylus": "*",\r
+ "sugarss": "*",\r
+ "terser": "^5.4.0"\r
+ },\r
+ "peerDependenciesMeta": {\r
+ "@types/node": {\r
+ "optional": true\r
+ },\r
+ "less": {\r
+ "optional": true\r
+ },\r
+ "lightningcss": {\r
+ "optional": true\r
+ },\r
+ "sass": {\r
+ "optional": true\r
+ },\r
+ "stylus": {\r
+ "optional": true\r
+ },\r
+ "sugarss": {\r
+ "optional": true\r
+ },\r
+ "terser": {\r
+ "optional": true\r
+ }\r
+ }\r
+ },\r
+ "node_modules/vue": {\r
+ "version": "3.4.24",\r
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.24.tgz",\r
+ "integrity": "sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==",\r
+ "dependencies": {\r
+ "@vue/compiler-dom": "3.4.24",\r
+ "@vue/compiler-sfc": "3.4.24",\r
+ "@vue/runtime-dom": "3.4.24",\r
+ "@vue/server-renderer": "3.4.24",\r
+ "@vue/shared": "3.4.24"\r
+ },\r
+ "peerDependencies": {\r
+ "typescript": "*"\r
+ },\r
+ "peerDependenciesMeta": {\r
+ "typescript": {\r
+ "optional": true\r
+ }\r
+ }\r
+ },\r
+ "node_modules/vue-router": {\r
+ "version": "4.3.2",\r
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",\r
+ "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==",\r
+ "dependencies": {\r
+ "@vue/devtools-api": "^6.5.1"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/sponsors/posva"\r
+ },\r
+ "peerDependencies": {\r
+ "vue": "^3.2.0"\r
+ }\r
+ },\r
+ "node_modules/which": {\r
+ "version": "2.0.2",\r
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",\r
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "isexe": "^2.0.0"\r
+ },\r
+ "bin": {\r
+ "node-which": "bin/node-which"\r
+ },\r
+ "engines": {\r
+ "node": ">= 8"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi": {\r
+ "version": "8.1.0",\r
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",\r
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-styles": "^6.1.0",\r
+ "string-width": "^5.0.1",\r
+ "strip-ansi": "^7.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=12"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi-cjs": {\r
+ "name": "wrap-ansi",\r
+ "version": "7.0.0",\r
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",\r
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-styles": "^4.0.0",\r
+ "string-width": "^4.1.0",\r
+ "strip-ansi": "^6.0.0"\r
+ },\r
+ "engines": {\r
+ "node": ">=10"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {\r
+ "version": "5.0.1",\r
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
+ "dev": true,\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {\r
+ "version": "4.3.0",\r
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",\r
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "color-convert": "^2.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ },\r
+ "funding": {\r
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {\r
+ "version": "8.0.0",\r
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",\r
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",\r
+ "dev": true\r
+ },\r
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {\r
+ "version": "4.2.3",\r
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",\r
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "emoji-regex": "^8.0.0",\r
+ "is-fullwidth-code-point": "^3.0.0",\r
+ "strip-ansi": "^6.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {\r
+ "version": "6.0.1",\r
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
+ "dev": true,\r
+ "dependencies": {\r
+ "ansi-regex": "^5.0.1"\r
+ },\r
+ "engines": {\r
+ "node": ">=8"\r
+ }\r
+ },\r
+ "node_modules/yaml": {\r
+ "version": "2.4.1",\r
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",\r
+ "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",\r
+ "dev": true,\r
+ "bin": {\r
+ "yaml": "bin.mjs"\r
+ },\r
+ "engines": {\r
+ "node": ">= 14"\r
+ }\r
+ }\r
+ }\r
+}\r
-{
- "name": "flatnotes",
- "version": "4.0.4",
- "description": "A database-less note taking web app that utilises a flat folder of markdown files for storage.",
- "main": "client/index.html",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "build": "vite build",
- "watch": "vite build --watch"
- },
- "author": "Adam Dullage",
- "license": "MIT",
- "dependencies": {
- "@jamescoyle/vue-icon": "0.1.2",
- "@mdi/js": "7.4.47",
- "@mdi/light-js": "0.2.63",
- "axios": "1.6.8",
- "mousetrap": "1.6.5",
- "vue": "3.4.24",
- "vue-router": "4.3.2"
- },
- "devDependencies": {
- "@vitejs/plugin-vue": "5.0.4",
- "autoprefixer": "10.4.19",
- "postcss": "8.4.38",
- "prettier-plugin-tailwindcss": "0.5.14",
- "tailwindcss": "3.4.3",
- "vite": "5.2.9"
- }
-}
+{\r
+ "name": "flatnotes",\r
+ "version": "4.0.4",\r
+ "description": "A database-less note taking web app that utilises a flat folder of markdown files for storage.",\r
+ "main": "client/index.html",\r
+ "scripts": {\r
+ "test": "echo \"Error: no test specified\" && exit 1",\r
+ "build": "vite build",\r
+ "watch": "vite build --watch"\r
+ },\r
+ "author": "Adam Dullage",\r
+ "license": "MIT",\r
+ "dependencies": {\r
+ "@jamescoyle/vue-icon": "0.1.2",\r
+ "@mdi/js": "7.4.47",\r
+ "@mdi/light-js": "0.2.63",\r
+ "axios": "1.6.8",\r
+ "mousetrap": "1.6.5",\r
+ "vue": "3.4.24",\r
+ "vue-router": "4.3.2"\r
+ },\r
+ "devDependencies": {\r
+ "@vitejs/plugin-vue": "5.0.4",\r
+ "autoprefixer": "10.4.19",\r
+ "postcss": "8.4.38",\r
+ "prettier-plugin-tailwindcss": "0.5.14",\r
+ "tailwindcss": "3.4.3",\r
+ "vite": "5.2.9"\r
+ }\r
+}\r
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-}
+module.exports = {\r
+ plugins: {\r
+ tailwindcss: {},\r
+ autoprefixer: {},\r
+ },\r
+}\r
-module.exports = {
- plugins: ["prettier-plugin-tailwindcss"],
-};
+module.exports = {\r
+ plugins: ["prettier-plugin-tailwindcss"],\r
+};\r
-[tool.isort]
-profile = "black"
-line_length = 79
-src_paths = ["server"]
+[tool.isort]\r
+profile = "black"\r
+line_length = 79\r
+src_paths = ["server"]\r
-login_failed = "Invalid login details."
-note_exists = "Cannot create note. A note with the same title already exists."
-note_not_found = "The specified note cannot be found."
-invalid_note_title = "The specified note title contains invalid characters."
-attachment_exists = (
- "Cannot create attachment. An attachment with the same filename already "
- "exists."
-)
-attachment_not_found = "The specified attachment cannot be found."
-invalid_attachment_filename = (
- "The specified filename contains invalid characters."
-)
+login_failed = "Invalid login details."\r
+note_exists = "Cannot create note. A note with the same title already exists."\r
+note_not_found = "The specified note cannot be found."\r
+invalid_note_title = "The specified note title contains invalid characters."\r
+attachment_exists = (\r
+ "Cannot create attachment. An attachment with the same filename already "\r
+ "exists."\r
+)\r
+attachment_not_found = "The specified attachment cannot be found."\r
+invalid_attachment_filename = (\r
+ "The specified filename contains invalid characters."\r
+)\r
-from abc import ABC, abstractmethod
-
-from fastapi import UploadFile
-from fastapi.responses import FileResponse
-
-from .models import AttachmentCreateResponse
-
-
-class BaseAttachments(ABC):
- @abstractmethod
- def create(self, file: UploadFile) -> AttachmentCreateResponse:
- """Create a new attachment."""
- pass
-
- @abstractmethod
- def get(self, filename: str) -> FileResponse:
- """Get a specific attachment."""
- pass
+from abc import ABC, abstractmethod\r
+\r
+from fastapi import UploadFile\r
+from fastapi.responses import FileResponse\r
+\r
+from .models import AttachmentCreateResponse\r
+\r
+\r
+class BaseAttachments(ABC):\r
+ @abstractmethod\r
+ def create(self, file: UploadFile) -> AttachmentCreateResponse:\r
+ """Create a new attachment."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def get(self, filename: str) -> FileResponse:\r
+ """Get a specific attachment."""\r
+ pass\r
-from .file_system import FileSystemAttachments # noqa
+from .file_system import FileSystemAttachments # noqa\r
-import os
-import shutil
-import urllib.parse
-from datetime import datetime
-
-from fastapi import UploadFile
-from fastapi.responses import FileResponse
-
-from helpers import get_env, is_valid_filename
-
-from ..base import BaseAttachments
-from ..models import AttachmentCreateResponse
-
-
-class FileSystemAttachments(BaseAttachments):
- def __init__(self):
- self.base_path = get_env("FLATNOTES_PATH", mandatory=True)
- if not os.path.exists(self.base_path):
- raise NotADirectoryError(
- f"'{self.base_path}' is not a valid directory."
- )
- self.storage_path = os.path.join(self.base_path, "attachments")
- os.makedirs(self.storage_path, exist_ok=True)
-
- def create(self, file: UploadFile) -> AttachmentCreateResponse:
- """Create a new attachment."""
- is_valid_filename(file.filename)
- try:
- self._save_file(file)
- except FileExistsError:
- file.filename = self._datetime_suffix_filename(file.filename)
- self._save_file(file)
- return AttachmentCreateResponse(
- filename=file.filename, url=self._url_for_filename(file.filename)
- )
-
- def get(self, filename: str) -> FileResponse:
- """Get a specific attachment."""
- is_valid_filename(filename)
- filepath = os.path.join(self.storage_path, filename)
- if not os.path.isfile(filepath):
- raise FileNotFoundError(f"'{filename}' not found.")
- return FileResponse(filepath)
-
- def _save_file(self, file: UploadFile):
- filepath = os.path.join(self.storage_path, file.filename)
- with open(filepath, "xb") as f:
- shutil.copyfileobj(file.file, f)
-
- def _datetime_suffix_filename(self, filename: str) -> str:
- """Add a timestamp suffix to the filename."""
- timestamp = datetime.utcnow().strftime("%Y-%m-%dT%H-%M-%SZ")
- name, ext = os.path.splitext(filename)
- return f"{name}_{timestamp}{ext}"
-
- def _url_for_filename(self, filename: str) -> str:
- """Return the URL for the given filename."""
- return f"/attachments/{urllib.parse.quote(filename)}"
+import os\r
+import shutil\r
+import urllib.parse\r
+from datetime import datetime\r
+\r
+from fastapi import UploadFile\r
+from fastapi.responses import FileResponse\r
+\r
+from helpers import get_env, is_valid_filename\r
+\r
+from ..base import BaseAttachments\r
+from ..models import AttachmentCreateResponse\r
+\r
+\r
+class FileSystemAttachments(BaseAttachments):\r
+ def __init__(self):\r
+ self.base_path = get_env("FLATNOTES_PATH", mandatory=True)\r
+ if not os.path.exists(self.base_path):\r
+ raise NotADirectoryError(\r
+ f"'{self.base_path}' is not a valid directory."\r
+ )\r
+ self.storage_path = os.path.join(self.base_path, "attachments")\r
+ os.makedirs(self.storage_path, exist_ok=True)\r
+\r
+ def create(self, file: UploadFile) -> AttachmentCreateResponse:\r
+ """Create a new attachment."""\r
+ is_valid_filename(file.filename)\r
+ try:\r
+ self._save_file(file)\r
+ except FileExistsError:\r
+ file.filename = self._datetime_suffix_filename(file.filename)\r
+ self._save_file(file)\r
+ return AttachmentCreateResponse(\r
+ filename=file.filename, url=self._url_for_filename(file.filename)\r
+ )\r
+\r
+ def get(self, filename: str) -> FileResponse:\r
+ """Get a specific attachment."""\r
+ is_valid_filename(filename)\r
+ filepath = os.path.join(self.storage_path, filename)\r
+ if not os.path.isfile(filepath):\r
+ raise FileNotFoundError(f"'{filename}' not found.")\r
+ return FileResponse(filepath)\r
+\r
+ def _save_file(self, file: UploadFile):\r
+ filepath = os.path.join(self.storage_path, file.filename)\r
+ with open(filepath, "xb") as f:\r
+ shutil.copyfileobj(file.file, f)\r
+\r
+ def _datetime_suffix_filename(self, filename: str) -> str:\r
+ """Add a timestamp suffix to the filename."""\r
+ timestamp = datetime.utcnow().strftime("%Y-%m-%dT%H-%M-%SZ")\r
+ name, ext = os.path.splitext(filename)\r
+ return f"{name}_{timestamp}{ext}"\r
+\r
+ def _url_for_filename(self, filename: str) -> str:\r
+ """Return the URL for the given filename."""\r
+ return f"/attachments/{urllib.parse.quote(filename)}"\r
-from helpers import CustomBaseModel
-
-
-class AttachmentCreateResponse(CustomBaseModel):
- filename: str
- url: str
+from helpers import CustomBaseModel\r
+\r
+\r
+class AttachmentCreateResponse(CustomBaseModel):\r
+ filename: str\r
+ url: str\r
-from abc import ABC, abstractmethod
-
-from .models import Login, Token
-
-
-class BaseAuth(ABC):
- @abstractmethod
- def login(self, data: Login) -> Token:
- """Login a user."""
- pass
-
- @abstractmethod
- def authenticate(self, token: str) -> bool:
- """Authenticate a user."""
- pass
+from abc import ABC, abstractmethod\r
+\r
+from .models import Login, Token\r
+\r
+\r
+class BaseAuth(ABC):\r
+ @abstractmethod\r
+ def login(self, data: Login) -> Token:\r
+ """Login a user."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def authenticate(self, token: str) -> bool:\r
+ """Authenticate a user."""\r
+ pass\r
-from .local import LocalAuth # noqa
+from .local import LocalAuth # noqa\r
-import secrets
-from base64 import b32encode
-from datetime import datetime, timedelta
-
-import pyotp
-from fastapi import Depends, HTTPException, Request
-from fastapi.security import OAuth2PasswordBearer
-from jose import JWTError, jwt
-from qrcode import QRCode
-
-from global_config import AuthType, GlobalConfig
-from helpers import get_env
-
-from ..base import BaseAuth
-from ..models import Login, Token
-
-global_config = GlobalConfig()
-oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/token", auto_error=False)
-
-
-class LocalAuth(BaseAuth):
- JWT_ALGORITHM = "HS256"
-
- def __init__(self) -> None:
- self.username = get_env("FLATNOTES_USERNAME", mandatory=True).lower()
- self.password = get_env("FLATNOTES_PASSWORD", mandatory=True)
- self.secret_key = get_env("FLATNOTES_SECRET_KEY", mandatory=True)
- self.session_expiry_days = get_env(
- "FLATNOTES_SESSION_EXPIRY_DAYS", default=30, cast_int=True
- )
-
- # TOTP
- self.is_totp_enabled = False
- if global_config.auth_type == AuthType.TOTP:
- self.is_totp_enabled = True
- self.totp_key = get_env("FLATNOTES_TOTP_KEY", mandatory=True)
- self.totp_key = b32encode(self.totp_key.encode("utf-8"))
- self.totp = pyotp.TOTP(self.totp_key)
- self.last_used_totp = None
- self._display_totp_enrolment()
-
- def login(self, data: Login) -> Token:
- # Check Username
- username_correct = secrets.compare_digest(
- self.username.lower(), data.username.lower()
- )
-
- # Check Password & TOTP
- expected_password = self.password
- if self.is_totp_enabled:
- current_totp = self.totp.now()
- expected_password += current_totp
- password_correct = secrets.compare_digest(
- expected_password, data.password
- )
-
- # Raise error if incorrect
- if not (
- username_correct
- and password_correct
- # Prevent TOTP from being reused
- and (
- self.is_totp_enabled is False
- or current_totp != self.last_used_totp
- )
- ):
- raise ValueError("Incorrect login credentials.")
- if self.is_totp_enabled:
- self.last_used_totp = current_totp
-
- # Create Token
- access_token = self._create_access_token(data={"sub": self.username})
- return Token(access_token=access_token)
-
- def authenticate(
- self, request: Request, token: str = Depends(oauth2_scheme)
- ):
- # If no token is found in the header, check the cookies
- if token is None:
- token = request.cookies.get("token")
- # Validate the token
- try:
- self._validate_token(token)
- except (JWTError, ValueError):
- raise HTTPException(
- status_code=401,
- detail="Invalid authentication credentials",
- headers={"WWW-Authenticate": "Bearer"},
- )
-
- def _validate_token(self, token: str) -> bool:
- if token is None:
- raise ValueError
- payload = jwt.decode(
- token, self.secret_key, algorithms=[self.JWT_ALGORITHM]
- )
- username = payload.get("sub")
- if username is None or username.lower() != self.username:
- raise ValueError
-
- def _create_access_token(self, data: dict):
- to_encode = data.copy()
- expiry_datetime = datetime.utcnow() + timedelta(
- days=self.session_expiry_days
- )
- to_encode.update({"exp": expiry_datetime})
- encoded_jwt = jwt.encode(
- to_encode, self.secret_key, algorithm=self.JWT_ALGORITHM
- )
- return encoded_jwt
-
- def _display_totp_enrolment(self):
- uri = self.totp.provisioning_uri(
- issuer_name="flatnotes", name=self.username
- )
- qr = QRCode()
- qr.add_data(uri)
- print(
- "\nScan this QR code with your TOTP app of choice",
- "e.g. Authy or Google Authenticator:",
- )
- qr.print_ascii()
- print(
- f"Or manually enter this key: {self.totp.secret.decode('utf-8')}\n"
- )
+import secrets\r
+from base64 import b32encode\r
+from datetime import datetime, timedelta\r
+\r
+import pyotp\r
+from fastapi import Depends, HTTPException, Request\r
+from fastapi.security import OAuth2PasswordBearer\r
+from jose import JWTError, jwt\r
+from qrcode import QRCode\r
+\r
+from global_config import AuthType, GlobalConfig\r
+from helpers import get_env\r
+\r
+from ..base import BaseAuth\r
+from ..models import Login, Token\r
+\r
+global_config = GlobalConfig()\r
+oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/token", auto_error=False)\r
+\r
+\r
+class LocalAuth(BaseAuth):\r
+ JWT_ALGORITHM = "HS256"\r
+\r
+ def __init__(self) -> None:\r
+ self.username = get_env("FLATNOTES_USERNAME", mandatory=True).lower()\r
+ self.password = get_env("FLATNOTES_PASSWORD", mandatory=True)\r
+ self.secret_key = get_env("FLATNOTES_SECRET_KEY", mandatory=True)\r
+ self.session_expiry_days = get_env(\r
+ "FLATNOTES_SESSION_EXPIRY_DAYS", default=30, cast_int=True\r
+ )\r
+\r
+ # TOTP\r
+ self.is_totp_enabled = False\r
+ if global_config.auth_type == AuthType.TOTP:\r
+ self.is_totp_enabled = True\r
+ self.totp_key = get_env("FLATNOTES_TOTP_KEY", mandatory=True)\r
+ self.totp_key = b32encode(self.totp_key.encode("utf-8"))\r
+ self.totp = pyotp.TOTP(self.totp_key)\r
+ self.last_used_totp = None\r
+ self._display_totp_enrolment()\r
+\r
+ def login(self, data: Login) -> Token:\r
+ # Check Username\r
+ username_correct = secrets.compare_digest(\r
+ self.username.lower(), data.username.lower()\r
+ )\r
+\r
+ # Check Password & TOTP\r
+ expected_password = self.password\r
+ if self.is_totp_enabled:\r
+ current_totp = self.totp.now()\r
+ expected_password += current_totp\r
+ password_correct = secrets.compare_digest(\r
+ expected_password, data.password\r
+ )\r
+\r
+ # Raise error if incorrect\r
+ if not (\r
+ username_correct\r
+ and password_correct\r
+ # Prevent TOTP from being reused\r
+ and (\r
+ self.is_totp_enabled is False\r
+ or current_totp != self.last_used_totp\r
+ )\r
+ ):\r
+ raise ValueError("Incorrect login credentials.")\r
+ if self.is_totp_enabled:\r
+ self.last_used_totp = current_totp\r
+\r
+ # Create Token\r
+ access_token = self._create_access_token(data={"sub": self.username})\r
+ return Token(access_token=access_token)\r
+\r
+ def authenticate(\r
+ self, request: Request, token: str = Depends(oauth2_scheme)\r
+ ):\r
+ # If no token is found in the header, check the cookies\r
+ if token is None:\r
+ token = request.cookies.get("token")\r
+ # Validate the token\r
+ try:\r
+ self._validate_token(token)\r
+ except (JWTError, ValueError):\r
+ raise HTTPException(\r
+ status_code=401,\r
+ detail="Invalid authentication credentials",\r
+ headers={"WWW-Authenticate": "Bearer"},\r
+ )\r
+\r
+ def _validate_token(self, token: str) -> bool:\r
+ if token is None:\r
+ raise ValueError\r
+ payload = jwt.decode(\r
+ token, self.secret_key, algorithms=[self.JWT_ALGORITHM]\r
+ )\r
+ username = payload.get("sub")\r
+ if username is None or username.lower() != self.username:\r
+ raise ValueError\r
+\r
+ def _create_access_token(self, data: dict):\r
+ to_encode = data.copy()\r
+ expiry_datetime = datetime.utcnow() + timedelta(\r
+ days=self.session_expiry_days\r
+ )\r
+ to_encode.update({"exp": expiry_datetime})\r
+ encoded_jwt = jwt.encode(\r
+ to_encode, self.secret_key, algorithm=self.JWT_ALGORITHM\r
+ )\r
+ return encoded_jwt\r
+\r
+ def _display_totp_enrolment(self):\r
+ uri = self.totp.provisioning_uri(\r
+ issuer_name="flatnotes", name=self.username\r
+ )\r
+ qr = QRCode()\r
+ qr.add_data(uri)\r
+ print(\r
+ "\nScan this QR code with your TOTP app of choice",\r
+ "e.g. Authy or Google Authenticator:",\r
+ )\r
+ qr.print_ascii()\r
+ print(\r
+ f"Or manually enter this key: {self.totp.secret.decode('utf-8')}\n"\r
+ )\r
-from pydantic import BaseModel, Field
-
-from helpers import CustomBaseModel
-
-
-class Login(CustomBaseModel):
- username: str
- password: str
-
-
-class Token(BaseModel):
- # Note: OAuth requires keys to be snake_case so we use the standard
- # BaseModel here
- access_token: str
- token_type: str = Field("bearer")
+from pydantic import BaseModel, Field\r
+\r
+from helpers import CustomBaseModel\r
+\r
+\r
+class Login(CustomBaseModel):\r
+ username: str\r
+ password: str\r
+\r
+\r
+class Token(BaseModel):\r
+ # Note: OAuth requires keys to be snake_case so we use the standard\r
+ # BaseModel here\r
+ access_token: str\r
+ token_type: str = Field("bearer")\r
-import sys
-from enum import Enum
-
-from helpers import CustomBaseModel, get_env
-from logger import logger
-
-
-class GlobalConfig:
- def __init__(self) -> None:
- logger.debug("Loading global config...")
- self.auth_type: AuthType = self._load_auth_type()
-
- def load_auth(self):
- if self.auth_type in (AuthType.NONE, AuthType.READ_ONLY):
- return None
- elif self.auth_type in (AuthType.PASSWORD, AuthType.TOTP):
- from auth.local import LocalAuth
-
- return LocalAuth()
-
- def load_note_storage(self):
- from notes.file_system import FileSystemNotes
-
- return FileSystemNotes()
-
- def load_attachment_storage(self):
- from attachments.file_system import FileSystemAttachments
-
- return FileSystemAttachments()
-
- def _load_auth_type(self):
- key = "FLATNOTES_AUTH_TYPE"
- auth_type = get_env(
- key, mandatory=False, default=AuthType.PASSWORD.value
- )
- try:
- auth_type = AuthType(auth_type.lower())
- except ValueError:
- logger.error(
- f"Invalid value '{auth_type}' for {key}. "
- + "Must be one of: "
- + ", ".join([auth_type.value for auth_type in AuthType])
- + "."
- )
- sys.exit(1)
- return auth_type
-
-
-class AuthType(str, Enum):
- NONE = "none"
- READ_ONLY = "read_only"
- PASSWORD = "password"
- TOTP = "totp"
-
-
-class GlobalConfigResponseModel(CustomBaseModel):
- auth_type: AuthType
+import sys\r
+from enum import Enum\r
+\r
+from helpers import CustomBaseModel, get_env\r
+from logger import logger\r
+\r
+\r
+class GlobalConfig:\r
+ def __init__(self) -> None:\r
+ logger.debug("Loading global config...")\r
+ self.auth_type: AuthType = self._load_auth_type()\r
+\r
+ def load_auth(self):\r
+ if self.auth_type in (AuthType.NONE, AuthType.READ_ONLY):\r
+ return None\r
+ elif self.auth_type in (AuthType.PASSWORD, AuthType.TOTP):\r
+ from auth.local import LocalAuth\r
+\r
+ return LocalAuth()\r
+\r
+ def load_note_storage(self):\r
+ from notes.file_system import FileSystemNotes\r
+\r
+ return FileSystemNotes()\r
+\r
+ def load_attachment_storage(self):\r
+ from attachments.file_system import FileSystemAttachments\r
+\r
+ return FileSystemAttachments()\r
+\r
+ def _load_auth_type(self):\r
+ key = "FLATNOTES_AUTH_TYPE"\r
+ auth_type = get_env(\r
+ key, mandatory=False, default=AuthType.PASSWORD.value\r
+ )\r
+ try:\r
+ auth_type = AuthType(auth_type.lower())\r
+ except ValueError:\r
+ logger.error(\r
+ f"Invalid value '{auth_type}' for {key}. "\r
+ + "Must be one of: "\r
+ + ", ".join([auth_type.value for auth_type in AuthType])\r
+ + "."\r
+ )\r
+ sys.exit(1)\r
+ return auth_type\r
+\r
+\r
+class AuthType(str, Enum):\r
+ NONE = "none"\r
+ READ_ONLY = "read_only"\r
+ PASSWORD = "password"\r
+ TOTP = "totp"\r
+\r
+\r
+class GlobalConfigResponseModel(CustomBaseModel):\r
+ auth_type: AuthType\r
-import os
-import sys
-
-from pydantic import BaseModel
-
-from logger import logger
-
-
-def camel_case(snake_case_str: str) -> str:
- """Return the declared snake_case string in camelCase."""
- parts = [part for part in snake_case_str.split("_") if part != ""]
- return parts[0] + "".join(part.title() for part in parts[1:])
-
-
-def is_valid_filename(value):
- """Raise ValueError if the declared string contains any of the following
- characters: <>:"/\\|?*"""
- invalid_chars = r'<>:"/\|?*'
- if any(invalid_char in value for invalid_char in invalid_chars):
- raise ValueError(
- "title cannot include any of the following characters: "
- + invalid_chars
- )
- return value
-
-
-def strip_whitespace(value):
- """Return the declared string with leading and trailing whitespace
- removed."""
- return value.strip()
-
-
-def get_env(key, mandatory=False, default=None, cast_int=False):
- """Get an environment variable. If `mandatory` is True and environment
- variable isn't set, exit the program"""
- value = os.environ.get(key)
- if mandatory and not value:
- logger.error(f"Environment variable {key} must be set.")
- sys.exit(1)
- if not mandatory and not value:
- return default
- if cast_int:
- try:
- value = int(value)
- except (TypeError, ValueError):
- logger.error(f"Invalid value '{value}' for {key}.")
- sys.exit(1)
- return value
-
-
-class CustomBaseModel(BaseModel):
- class Config:
- alias_generator = camel_case
- populate_by_name = True
- from_attributes = True
+import os\r
+import sys\r
+\r
+from pydantic import BaseModel\r
+\r
+from logger import logger\r
+\r
+\r
+def camel_case(snake_case_str: str) -> str:\r
+ """Return the declared snake_case string in camelCase."""\r
+ parts = [part for part in snake_case_str.split("_") if part != ""]\r
+ return parts[0] + "".join(part.title() for part in parts[1:])\r
+\r
+\r
+def is_valid_filename(value):\r
+ """Raise ValueError if the declared string contains any of the following\r
+ characters: <>:"/\\|?*"""\r
+ invalid_chars = r'<>:"/\|?*'\r
+ if any(invalid_char in value for invalid_char in invalid_chars):\r
+ raise ValueError(\r
+ "title cannot include any of the following characters: "\r
+ + invalid_chars\r
+ )\r
+ return value\r
+\r
+\r
+def strip_whitespace(value):\r
+ """Return the declared string with leading and trailing whitespace\r
+ removed."""\r
+ return value.strip()\r
+\r
+\r
+def get_env(key, mandatory=False, default=None, cast_int=False):\r
+ """Get an environment variable. If `mandatory` is True and environment\r
+ variable isn't set, exit the program"""\r
+ value = os.environ.get(key)\r
+ if mandatory and not value:\r
+ logger.error(f"Environment variable {key} must be set.")\r
+ sys.exit(1)\r
+ if not mandatory and not value:\r
+ return default\r
+ if cast_int:\r
+ try:\r
+ value = int(value)\r
+ except (TypeError, ValueError):\r
+ logger.error(f"Invalid value '{value}' for {key}.")\r
+ sys.exit(1)\r
+ return value\r
+\r
+\r
+class CustomBaseModel(BaseModel):\r
+ class Config:\r
+ alias_generator = camel_case\r
+ populate_by_name = True\r
+ from_attributes = True\r
-import logging
-import os
-
-formatter = logging.Formatter(
- "%(asctime)s [%(levelname)s]: %(message)s", "%Y-%m-%d %H:%M:%S"
-)
-log_level = os.environ.get("LOGLEVEL", "INFO").upper()
-
-# Internal
-logger = logging.getLogger()
-handler = logging.StreamHandler()
-handler.setFormatter(formatter)
-logger.addHandler(handler)
-logger.setLevel(log_level)
-
-
-# Uvicorn
-class HealthEndpointFilter(logging.Filter):
- def filter(self, record: logging.LogRecord) -> bool:
- return (
- record.args
- and len(record.args) >= 3
- and record.args[2] != "/health"
- )
-
-
-uvicorn_logger = logging.getLogger("uvicorn.access")
-uvicorn_logger.addFilter(HealthEndpointFilter())
-for handler in uvicorn_logger.handlers:
- handler.setFormatter(formatter)
-uvicorn_logger.setLevel(log_level)
+import logging\r
+import os\r
+\r
+formatter = logging.Formatter(\r
+ "%(asctime)s [%(levelname)s]: %(message)s", "%Y-%m-%d %H:%M:%S"\r
+)\r
+log_level = os.environ.get("LOGLEVEL", "INFO").upper()\r
+\r
+# Internal\r
+logger = logging.getLogger()\r
+handler = logging.StreamHandler()\r
+handler.setFormatter(formatter)\r
+logger.addHandler(handler)\r
+logger.setLevel(log_level)\r
+\r
+\r
+# Uvicorn\r
+class HealthEndpointFilter(logging.Filter):\r
+ def filter(self, record: logging.LogRecord) -> bool:\r
+ return (\r
+ record.args\r
+ and len(record.args) >= 3\r
+ and record.args[2] != "/health"\r
+ )\r
+\r
+\r
+uvicorn_logger = logging.getLogger("uvicorn.access")\r
+uvicorn_logger.addFilter(HealthEndpointFilter())\r
+for handler in uvicorn_logger.handlers:\r
+ handler.setFormatter(formatter)\r
+uvicorn_logger.setLevel(log_level)\r
-from typing import List, Literal
-
-from fastapi import Depends, FastAPI, HTTPException, UploadFile
-from fastapi.responses import HTMLResponse
-from fastapi.staticfiles import StaticFiles
-
-import api_messages
-from attachments.base import BaseAttachments
-from attachments.models import AttachmentCreateResponse
-from auth.base import BaseAuth
-from auth.models import Login, Token
-from global_config import AuthType, GlobalConfig, GlobalConfigResponseModel
-from notes.base import BaseNotes
-from notes.models import Note, NoteCreate, NoteUpdate, SearchResult
-
-global_config = GlobalConfig()
-auth: BaseAuth = global_config.load_auth()
-note_storage: BaseNotes = global_config.load_note_storage()
-attachment_storage: BaseAttachments = global_config.load_attachment_storage()
-auth_deps = [Depends(auth.authenticate)] if auth else []
-app = FastAPI()
-
-
-# region UI
-@app.get("/", include_in_schema=False)
-@app.get("/login", include_in_schema=False)
-@app.get("/search", include_in_schema=False)
-@app.get("/new", include_in_schema=False)
-@app.get("/note/{title}", include_in_schema=False)
-def root(title: str = ""):
- with open("client/dist/index.html", "r", encoding="utf-8") as f:
- html = f.read()
- return HTMLResponse(content=html)
-
-
-# endregion
-
-
-# region Login
-if global_config.auth_type not in [AuthType.NONE, AuthType.READ_ONLY]:
-
- @app.post("/api/token", response_model=Token)
- def token(data: Login):
- try:
- return auth.login(data)
- except ValueError:
- raise HTTPException(
- status_code=401, detail=api_messages.login_failed
- )
-
-
-# endregion
-
-
-# region Notes
-# Get Note
-@app.get(
- "/api/notes/{title}",
- dependencies=auth_deps,
- response_model=Note,
-)
-def get_note(title: str):
- """Get a specific note."""
- try:
- return note_storage.get(title)
- except ValueError:
- raise HTTPException(
- status_code=400, detail=api_messages.invalid_note_title
- )
- except FileNotFoundError:
- raise HTTPException(404, api_messages.note_not_found)
-
-
-if global_config.auth_type != AuthType.READ_ONLY:
-
- # Create Note
- @app.post(
- "/api/notes",
- dependencies=auth_deps,
- response_model=Note,
- )
- def post_note(note: NoteCreate):
- """Create a new note."""
- try:
- return note_storage.create(note)
- except ValueError:
- raise HTTPException(
- status_code=400,
- detail=api_messages.invalid_note_title,
- )
- except FileExistsError:
- raise HTTPException(
- status_code=409, detail=api_messages.note_exists
- )
-
- # Update Note
- @app.patch(
- "/api/notes/{title}",
- dependencies=auth_deps,
- response_model=Note,
- )
- def patch_note(title: str, data: NoteUpdate):
- try:
- return note_storage.update(title, data)
- except ValueError:
- raise HTTPException(
- status_code=400,
- detail=api_messages.invalid_note_title,
- )
- except FileExistsError:
- raise HTTPException(
- status_code=409, detail=api_messages.note_exists
- )
- except FileNotFoundError:
- raise HTTPException(404, api_messages.note_not_found)
-
- # Delete Note
- @app.delete(
- "/api/notes/{title}",
- dependencies=auth_deps,
- response_model=None,
- )
- def delete_note(title: str):
- try:
- note_storage.delete(title)
- except ValueError:
- raise HTTPException(
- status_code=400,
- detail=api_messages.invalid_note_title,
- )
- except FileNotFoundError:
- raise HTTPException(404, api_messages.note_not_found)
-
-
-# endregion
-
-
-# region Search
-@app.get(
- "/api/search",
- dependencies=auth_deps,
- response_model=List[SearchResult],
-)
-def search(
- term: str,
- sort: Literal["score", "title", "lastModified"] = "score",
- order: Literal["asc", "desc"] = "desc",
- limit: int = None,
-):
- """Perform a full text search on all notes."""
- if sort == "lastModified":
- sort = "last_modified"
- return note_storage.search(term, sort=sort, order=order, limit=limit)
-
-
-@app.get(
- "/api/tags",
- dependencies=auth_deps,
- response_model=List[str],
-)
-def get_tags():
- """Get a list of all indexed tags."""
- return note_storage.get_tags()
-
-
-# endregion
-
-
-# region Config
-@app.get("/api/config", response_model=GlobalConfigResponseModel)
-def get_config():
- """Retrieve server-side config required for the UI."""
- return GlobalConfigResponseModel(auth_type=global_config.auth_type)
-
-
-# endregion
-
-
-# region Attachments
-# Get Attachment
-@app.get(
- "/api/attachments/{filename}",
- dependencies=auth_deps,
-)
-# Include a secondary route used to create relative URLs that can be used
-# outside the context of flatnotes (e.g. "/attachments/image.jpg").
-@app.get(
- "/attachments/{filename}",
- dependencies=auth_deps,
- include_in_schema=False,
-)
-def get_attachment(filename: str):
- """Download an attachment."""
- try:
- return attachment_storage.get(filename)
- except ValueError:
- raise HTTPException(
- status_code=400,
- detail=api_messages.invalid_attachment_filename,
- )
- except FileNotFoundError:
- raise HTTPException(
- status_code=404, detail=api_messages.attachment_not_found
- )
-
-
-if global_config.auth_type != AuthType.READ_ONLY:
-
- # Create Attachment
- @app.post(
- "/api/attachments",
- dependencies=auth_deps,
- response_model=AttachmentCreateResponse,
- )
- def post_attachment(file: UploadFile):
- """Upload an attachment."""
- try:
- return attachment_storage.create(file)
- except ValueError:
- raise HTTPException(
- status_code=400,
- detail=api_messages.invalid_attachment_filename,
- )
- except FileExistsError:
- raise HTTPException(409, api_messages.attachment_exists)
-
-
-# endregion
-
-
-# region Healthcheck
-@app.get("/health")
-def healthcheck() -> str:
- """A lightweight endpoint that simply returns 'OK' to indicate the server
- is running."""
- return "OK"
-
-
-# endregion
-
-app.mount("/", StaticFiles(directory="client/dist"), name="dist")
+from typing import List, Literal\r
+\r
+from fastapi import Depends, FastAPI, HTTPException, UploadFile\r
+from fastapi.responses import HTMLResponse\r
+from fastapi.staticfiles import StaticFiles\r
+\r
+import api_messages\r
+from attachments.base import BaseAttachments\r
+from attachments.models import AttachmentCreateResponse\r
+from auth.base import BaseAuth\r
+from auth.models import Login, Token\r
+from global_config import AuthType, GlobalConfig, GlobalConfigResponseModel\r
+from notes.base import BaseNotes\r
+from notes.models import Note, NoteCreate, NoteUpdate, SearchResult\r
+\r
+global_config = GlobalConfig()\r
+auth: BaseAuth = global_config.load_auth()\r
+note_storage: BaseNotes = global_config.load_note_storage()\r
+attachment_storage: BaseAttachments = global_config.load_attachment_storage()\r
+auth_deps = [Depends(auth.authenticate)] if auth else []\r
+app = FastAPI()\r
+\r
+\r
+# region UI\r
+@app.get("/", include_in_schema=False)\r
+@app.get("/login", include_in_schema=False)\r
+@app.get("/search", include_in_schema=False)\r
+@app.get("/new", include_in_schema=False)\r
+@app.get("/note/{title}", include_in_schema=False)\r
+def root(title: str = ""):\r
+ with open("client/dist/index.html", "r", encoding="utf-8") as f:\r
+ html = f.read()\r
+ return HTMLResponse(content=html)\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Login\r
+if global_config.auth_type not in [AuthType.NONE, AuthType.READ_ONLY]:\r
+\r
+ @app.post("/api/token", response_model=Token)\r
+ def token(data: Login):\r
+ try:\r
+ return auth.login(data)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=401, detail=api_messages.login_failed\r
+ )\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Notes\r
+# Get Note\r
+@app.get(\r
+ "/api/notes/{title}",\r
+ dependencies=auth_deps,\r
+ response_model=Note,\r
+)\r
+def get_note(title: str):\r
+ """Get a specific note."""\r
+ try:\r
+ return note_storage.get(title)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400, detail=api_messages.invalid_note_title\r
+ )\r
+ except FileNotFoundError:\r
+ raise HTTPException(404, api_messages.note_not_found)\r
+\r
+\r
+if global_config.auth_type != AuthType.READ_ONLY:\r
+\r
+ # Create Note\r
+ @app.post(\r
+ "/api/notes",\r
+ dependencies=auth_deps,\r
+ response_model=Note,\r
+ )\r
+ def post_note(note: NoteCreate):\r
+ """Create a new note."""\r
+ try:\r
+ return note_storage.create(note)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400,\r
+ detail=api_messages.invalid_note_title,\r
+ )\r
+ except FileExistsError:\r
+ raise HTTPException(\r
+ status_code=409, detail=api_messages.note_exists\r
+ )\r
+\r
+ # Update Note\r
+ @app.patch(\r
+ "/api/notes/{title}",\r
+ dependencies=auth_deps,\r
+ response_model=Note,\r
+ )\r
+ def patch_note(title: str, data: NoteUpdate):\r
+ try:\r
+ return note_storage.update(title, data)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400,\r
+ detail=api_messages.invalid_note_title,\r
+ )\r
+ except FileExistsError:\r
+ raise HTTPException(\r
+ status_code=409, detail=api_messages.note_exists\r
+ )\r
+ except FileNotFoundError:\r
+ raise HTTPException(404, api_messages.note_not_found)\r
+\r
+ # Delete Note\r
+ @app.delete(\r
+ "/api/notes/{title}",\r
+ dependencies=auth_deps,\r
+ response_model=None,\r
+ )\r
+ def delete_note(title: str):\r
+ try:\r
+ note_storage.delete(title)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400,\r
+ detail=api_messages.invalid_note_title,\r
+ )\r
+ except FileNotFoundError:\r
+ raise HTTPException(404, api_messages.note_not_found)\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Search\r
+@app.get(\r
+ "/api/search",\r
+ dependencies=auth_deps,\r
+ response_model=List[SearchResult],\r
+)\r
+def search(\r
+ term: str,\r
+ sort: Literal["score", "title", "lastModified"] = "score",\r
+ order: Literal["asc", "desc"] = "desc",\r
+ limit: int = None,\r
+):\r
+ """Perform a full text search on all notes."""\r
+ if sort == "lastModified":\r
+ sort = "last_modified"\r
+ return note_storage.search(term, sort=sort, order=order, limit=limit)\r
+\r
+\r
+@app.get(\r
+ "/api/tags",\r
+ dependencies=auth_deps,\r
+ response_model=List[str],\r
+)\r
+def get_tags():\r
+ """Get a list of all indexed tags."""\r
+ return note_storage.get_tags()\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Config\r
+@app.get("/api/config", response_model=GlobalConfigResponseModel)\r
+def get_config():\r
+ """Retrieve server-side config required for the UI."""\r
+ return GlobalConfigResponseModel(auth_type=global_config.auth_type)\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Attachments\r
+# Get Attachment\r
+@app.get(\r
+ "/api/attachments/{filename}",\r
+ dependencies=auth_deps,\r
+)\r
+# Include a secondary route used to create relative URLs that can be used\r
+# outside the context of flatnotes (e.g. "/attachments/image.jpg").\r
+@app.get(\r
+ "/attachments/{filename}",\r
+ dependencies=auth_deps,\r
+ include_in_schema=False,\r
+)\r
+def get_attachment(filename: str):\r
+ """Download an attachment."""\r
+ try:\r
+ return attachment_storage.get(filename)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400,\r
+ detail=api_messages.invalid_attachment_filename,\r
+ )\r
+ except FileNotFoundError:\r
+ raise HTTPException(\r
+ status_code=404, detail=api_messages.attachment_not_found\r
+ )\r
+\r
+\r
+if global_config.auth_type != AuthType.READ_ONLY:\r
+\r
+ # Create Attachment\r
+ @app.post(\r
+ "/api/attachments",\r
+ dependencies=auth_deps,\r
+ response_model=AttachmentCreateResponse,\r
+ )\r
+ def post_attachment(file: UploadFile):\r
+ """Upload an attachment."""\r
+ try:\r
+ return attachment_storage.create(file)\r
+ except ValueError:\r
+ raise HTTPException(\r
+ status_code=400,\r
+ detail=api_messages.invalid_attachment_filename,\r
+ )\r
+ except FileExistsError:\r
+ raise HTTPException(409, api_messages.attachment_exists)\r
+\r
+\r
+# endregion\r
+\r
+\r
+# region Healthcheck\r
+@app.get("/health")\r
+def healthcheck() -> str:\r
+ """A lightweight endpoint that simply returns 'OK' to indicate the server\r
+ is running."""\r
+ return "OK"\r
+\r
+\r
+# endregion\r
+\r
+app.mount("/", StaticFiles(directory="client/dist"), name="dist")\r
-from abc import ABC, abstractmethod
-from typing import Literal
-
-from .models import Note, NoteCreate, NoteUpdate, SearchResult
-
-
-class BaseNotes(ABC):
- @abstractmethod
- def create(self, data: NoteCreate) -> Note:
- """Create a new note."""
- pass
-
- @abstractmethod
- def get(self, title: str) -> Note:
- """Get a specific note."""
- pass
-
- @abstractmethod
- def update(self, title: str, new_data: NoteUpdate) -> Note:
- """Update a specific note."""
- pass
-
- @abstractmethod
- def delete(self, title: str) -> None:
- """Delete a specific note.""" ""
- pass
-
- @abstractmethod
- def search(
- self,
- term: str,
- sort: Literal["score", "title", "last_modified"] = "score",
- order: Literal["asc", "desc"] = "desc",
- limit: int = None,
- ) -> list[SearchResult]:
- """Search for notes."""
- pass
-
- @abstractmethod
- def get_tags(self) -> list[str]:
- """Get a list of all indexed tags."""
- pass
+from abc import ABC, abstractmethod\r
+from typing import Literal\r
+\r
+from .models import Note, NoteCreate, NoteUpdate, SearchResult\r
+\r
+\r
+class BaseNotes(ABC):\r
+ @abstractmethod\r
+ def create(self, data: NoteCreate) -> Note:\r
+ """Create a new note."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def get(self, title: str) -> Note:\r
+ """Get a specific note."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def update(self, title: str, new_data: NoteUpdate) -> Note:\r
+ """Update a specific note."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def delete(self, title: str) -> None:\r
+ """Delete a specific note.""" ""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def search(\r
+ self,\r
+ term: str,\r
+ sort: Literal["score", "title", "last_modified"] = "score",\r
+ order: Literal["asc", "desc"] = "desc",\r
+ limit: int = None,\r
+ ) -> list[SearchResult]:\r
+ """Search for notes."""\r
+ pass\r
+\r
+ @abstractmethod\r
+ def get_tags(self) -> list[str]:\r
+ """Get a list of all indexed tags."""\r
+ pass\r
-from .file_system import FileSystemNotes
+from .file_system import FileSystemNotes\r
-import glob
-import os
-import re
-import shutil
-from datetime import datetime
-from typing import List, Literal, Set, Tuple
-
-import whoosh
-from whoosh import writing
-from whoosh.analysis import CharsetFilter, StemmingAnalyzer
-from whoosh.fields import DATETIME, ID, KEYWORD, TEXT, SchemaClass
-from whoosh.highlight import ContextFragmenter, WholeFragmenter
-from whoosh.index import Index
-from whoosh.qparser import MultifieldParser
-from whoosh.qparser.dateparse import DateParserPlugin
-from whoosh.query import Every
-from whoosh.searching import Hit
-from whoosh.support.charset import accent_map
-
-from helpers import get_env, is_valid_filename
-from logger import logger
-
-from ..base import BaseNotes
-from ..models import Note, NoteCreate, NoteUpdate, SearchResult
-
-MARKDOWN_EXT = ".md"
-INDEX_SCHEMA_VERSION = "4"
-
-StemmingFoldingAnalyzer = StemmingAnalyzer() | CharsetFilter(accent_map)
-
-
-class IndexSchema(SchemaClass):
- filename = ID(unique=True, stored=True)
- last_modified = DATETIME(stored=True, sortable=True)
- title = TEXT(
- field_boost=2.0, analyzer=StemmingFoldingAnalyzer, sortable=True
- )
- content = TEXT(analyzer=StemmingFoldingAnalyzer)
- tags = KEYWORD(lowercase=True, field_boost=2.0)
-
-
-class FileSystemNotes(BaseNotes):
- TAGS_RE = re.compile(r"(?:(?<=^#)|(?<=\s#))\w+(?=\s|$)")
- CODEBLOCK_RE = re.compile(r"`{1,3}.*?`{1,3}", re.DOTALL)
- TAGS_WITH_HASH_RE = re.compile(r"(?:(?<=^)|(?<=\s))#\w+(?=\s|$)")
-
- def __init__(self):
- self.storage_path = get_env("FLATNOTES_PATH", mandatory=True)
- if not os.path.exists(self.storage_path):
- raise NotADirectoryError(
- f"'{self.storage_path}' is not a valid directory."
- )
- self.index = self._load_index()
- self._sync_index()
-
- def create(self, data: NoteCreate) -> Note:
- """Create a new note."""
- filepath = self._path_from_title(data.title)
- self._write_file(filepath, data.content)
- return Note(
- title=data.title,
- content=data.content,
- last_modified=os.path.getmtime(filepath),
- )
-
- def get(self, title: str) -> Note:
- """Get a specific note."""
- is_valid_filename(title)
- filepath = self._path_from_title(title)
- content = self._read_file(filepath)
- return Note(
- title=title,
- content=content,
- last_modified=os.path.getmtime(filepath),
- )
-
- def update(self, title: str, data: NoteUpdate) -> Note:
- """Update a specific note."""
- is_valid_filename(title)
- filepath = self._path_from_title(title)
- if data.new_title is not None:
- new_filepath = self._path_from_title(data.new_title)
- os.rename(filepath, new_filepath)
- title = data.new_title
- filepath = new_filepath
- if data.new_content is not None:
- self._write_file(filepath, data.new_content, overwrite=True)
- content = data.new_content
- else:
- content = self._read_file(filepath)
- return Note(
- title=title,
- content=content,
- last_modified=os.path.getmtime(filepath),
- )
-
- def delete(self, title: str) -> None:
- """Delete a specific note."""
- is_valid_filename(title)
- filepath = self._path_from_title(title)
- os.remove(filepath)
-
- def search(
- self,
- term: str,
- sort: Literal["score", "title", "last_modified"] = "score",
- order: Literal["asc", "desc"] = "desc",
- limit: int = None,
- ) -> Tuple[SearchResult, ...]:
- """Search the index for the given term."""
- self._sync_index()
- term = self._pre_process_search_term(term)
- with self.index.searcher() as searcher:
- # Parse Query
- if term == "*":
- query = Every()
- else:
- parser = MultifieldParser(
- self._fieldnames_for_term(term), self.index.schema
- )
- parser.add_plugin(DateParserPlugin())
- query = parser.parse(term)
-
- # Determine Sort By
- # Note: For the 'sort' option, "score" is converted to None as
- # that is the default for searches anyway and it's quicker for
- # Whoosh if you specify None.
- sort = sort if sort in ["title", "last_modified"] else None
-
- # Determine Sort Direction
- # Note: Confusingly, when sorting by 'score', reverse = True means
- # asc so we have to flip the logic for that case!
- reverse = order == "desc"
- if sort is None:
- reverse = not reverse
-
- # Run Search
- results = searcher.search(
- query,
- sortedby=sort,
- reverse=reverse,
- limit=limit,
- terms=True,
- )
- return tuple(self._search_result_from_hit(hit) for hit in results)
-
- def get_tags(self) -> list[str]:
- """Return a list of all indexed tags."""
- self._sync_index()
- with self.index.reader() as reader:
- tags = reader.field_terms("tags")
- return [tag for tag in tags]
-
- @property
- def _index_path(self):
- return os.path.join(self.storage_path, ".flatnotes")
-
- def _path_from_title(self, title: str) -> str:
- return os.path.join(self.storage_path, title + MARKDOWN_EXT)
-
- def _get_by_filename(self, filename: str) -> Note:
- """Get a note by its filename."""
- return self.get(self._strip_ext(filename))
-
- def _load_index(self) -> Index:
- """Load the note index or create new if not exists."""
- index_dir_exists = os.path.exists(self._index_path)
- if index_dir_exists and whoosh.index.exists_in(
- self._index_path, indexname=INDEX_SCHEMA_VERSION
- ):
- logger.info("Loading existing index")
- return whoosh.index.open_dir(
- self._index_path, indexname=INDEX_SCHEMA_VERSION
- )
- else:
- if index_dir_exists:
- logger.info("Deleting outdated index")
- self._clear_dir(self._index_path)
- else:
- os.mkdir(self._index_path)
- logger.info("Creating new index")
- return whoosh.index.create_in(
- self._index_path, IndexSchema, indexname=INDEX_SCHEMA_VERSION
- )
-
- @classmethod
- def _extract_tags(cls, content) -> Tuple[str, Set[str]]:
- """Strip tags from the given content and return a tuple consisting of:
-
- - The content without the tags.
- - A set of tags converted to lowercase."""
- content_ex_codeblock = re.sub(cls.CODEBLOCK_RE, "", content)
- _, tags = cls._re_extract(cls.TAGS_RE, content_ex_codeblock)
- content_ex_tags, _ = cls._re_extract(cls.TAGS_RE, content)
- try:
- tags = [tag.lower() for tag in tags]
- return (content_ex_tags, set(tags))
- except IndexError:
- return (content, set())
-
- def _add_note_to_index(
- self, writer: writing.IndexWriter, note: Note
- ) -> None:
- """Add a Note object to the index using the given writer. If the
- filename already exists in the index an update will be performed
- instead."""
- content_ex_tags, tag_set = self._extract_tags(note.content)
- tag_string = " ".join(tag_set)
- writer.update_document(
- filename=note.title + MARKDOWN_EXT,
- last_modified=datetime.fromtimestamp(note.last_modified),
- title=note.title,
- content=content_ex_tags,
- tags=tag_string,
- )
-
- def _list_all_note_filenames(self) -> List[str]:
- """Return a list of all note filenames."""
- return [
- os.path.split(filepath)[1]
- for filepath in glob.glob(
- os.path.join(self.storage_path, "*" + MARKDOWN_EXT)
- )
- ]
-
- def _sync_index(self, clean: bool = False) -> None:
- """Synchronize the index with the notes directory.
- Specify clean=True to completely rebuild the index"""
- indexed = set()
- writer = self.index.writer()
- if clean:
- writer.mergetype = writing.CLEAR # Clear the index
- with self.index.searcher() as searcher:
- for idx_note in searcher.all_stored_fields():
- idx_filename = idx_note["filename"]
- idx_filepath = os.path.join(self.storage_path, idx_filename)
- # Delete missing
- if not os.path.exists(idx_filepath):
- writer.delete_by_term("filename", idx_filename)
- logger.info(f"'{idx_filename}' removed from index")
- # Update modified
- elif (
- datetime.fromtimestamp(os.path.getmtime(idx_filepath))
- != idx_note["last_modified"]
- ):
- logger.info(f"'{idx_filename}' updated")
- self._add_note_to_index(
- writer, self._get_by_filename(idx_filename)
- )
- indexed.add(idx_filename)
- # Ignore already indexed
- else:
- indexed.add(idx_filename)
- # Add new
- for filename in self._list_all_note_filenames():
- if filename not in indexed:
- self._add_note_to_index(
- writer, self._get_by_filename(filename)
- )
- logger.info(f"'{filename}' added to index")
- writer.commit()
-
- @classmethod
- def _pre_process_search_term(cls, term):
- term = term.strip()
- # Replace "#tagname" with "tags:tagname"
- term = re.sub(
- cls.TAGS_WITH_HASH_RE,
- lambda tag: "tags:" + tag.group(0)[1:],
- term,
- )
- return term
-
- @staticmethod
- def _re_extract(pattern, string) -> Tuple[str, List[str]]:
- """Similar to re.sub but returns a tuple of:
-
- - `string` with matches removed
- - list of matches"""
- matches = []
- text = re.sub(pattern, lambda tag: matches.append(tag.group()), string)
- return (text, matches)
-
- @staticmethod
- def _strip_ext(filename):
- """Return the given filename without the extension."""
- return os.path.splitext(filename)[0]
-
- @staticmethod
- def _clear_dir(path):
- """Delete all contents of the given directory."""
- for item in os.listdir(path):
- item_path = os.path.join(path, item)
- if os.path.isfile(item_path):
- os.remove(item_path)
- elif os.path.isdir(item_path):
- shutil.rmtree(item_path)
-
- def _search_result_from_hit(self, hit: Hit):
- matched_fields = self._get_matched_fields(hit.matched_terms())
-
- title = self._strip_ext(hit["filename"])
- last_modified = hit["last_modified"].timestamp()
-
- # If the search was ordered using a text field then hit.score is the
- # value of that field. This isn't useful so only set self._score if it
- # is a float.
- score = hit.score if type(hit.score) is float else None
-
- if "title" in matched_fields:
- hit.results.fragmenter = WholeFragmenter()
- title_highlights = hit.highlights("title", text=title)
- else:
- title_highlights = None
-
- if "content" in matched_fields:
- hit.results.fragmenter = ContextFragmenter()
- content = self._read_file(self._path_from_title(title))
- content_ex_tags, _ = FileSystemNotes._extract_tags(content)
- content_highlights = hit.highlights(
- "content",
- text=content_ex_tags,
- )
- else:
- content_highlights = None
-
- tag_matches = (
- [field[1] for field in hit.matched_terms() if field[0] == "tags"]
- if "tags" in matched_fields
- else None
- )
-
- return SearchResult(
- title=title,
- last_modified=last_modified,
- score=score,
- title_highlights=title_highlights,
- content_highlights=content_highlights,
- tag_matches=tag_matches,
- )
-
- def _fieldnames_for_term(self, term: str) -> List[str]:
- """Return a list of field names to search based on the given term. If
- the term includes a phrase then only search title and content. If the
- term does not include a phrase then also search tags."""
- fields = ["title", "content"]
- if '"' not in term:
- # If the term does not include a phrase then also search tags
- fields.append("tags")
- return fields
-
- @staticmethod
- def _get_matched_fields(matched_terms):
- """Return a set of matched fields from a set of ('field', 'term') "
- "tuples generated by whoosh.searching.Hit.matched_terms()."""
- return set([matched_term[0] for matched_term in matched_terms])
-
- @staticmethod
- def _read_file(filepath: str):
- logger.debug(f"Reading from '{filepath}'")
- with open(filepath, "r") as f:
- content = f.read()
- return content
-
- @staticmethod
- def _write_file(filepath: str, content: str, overwrite: bool = False):
- logger.debug(f"Writing to '{filepath}'")
- with open(filepath, "w" if overwrite else "x") as f:
- f.write(content)
+import glob\r
+import os\r
+import re\r
+import shutil\r
+from datetime import datetime\r
+from typing import List, Literal, Set, Tuple\r
+\r
+import whoosh\r
+from whoosh import writing\r
+from whoosh.analysis import CharsetFilter, StemmingAnalyzer\r
+from whoosh.fields import DATETIME, ID, KEYWORD, TEXT, SchemaClass\r
+from whoosh.highlight import ContextFragmenter, WholeFragmenter\r
+from whoosh.index import Index\r
+from whoosh.qparser import MultifieldParser\r
+from whoosh.qparser.dateparse import DateParserPlugin\r
+from whoosh.query import Every\r
+from whoosh.searching import Hit\r
+from whoosh.support.charset import accent_map\r
+\r
+from helpers import get_env, is_valid_filename\r
+from logger import logger\r
+\r
+from ..base import BaseNotes\r
+from ..models import Note, NoteCreate, NoteUpdate, SearchResult\r
+\r
+MARKDOWN_EXT = ".md"\r
+INDEX_SCHEMA_VERSION = "4"\r
+\r
+StemmingFoldingAnalyzer = StemmingAnalyzer() | CharsetFilter(accent_map)\r
+\r
+\r
+class IndexSchema(SchemaClass):\r
+ filename = ID(unique=True, stored=True)\r
+ last_modified = DATETIME(stored=True, sortable=True)\r
+ title = TEXT(\r
+ field_boost=2.0, analyzer=StemmingFoldingAnalyzer, sortable=True\r
+ )\r
+ content = TEXT(analyzer=StemmingFoldingAnalyzer)\r
+ tags = KEYWORD(lowercase=True, field_boost=2.0)\r
+\r
+\r
+class FileSystemNotes(BaseNotes):\r
+ TAGS_RE = re.compile(r"(?:(?<=^#)|(?<=\s#))\w+(?=\s|$)")\r
+ CODEBLOCK_RE = re.compile(r"`{1,3}.*?`{1,3}", re.DOTALL)\r
+ TAGS_WITH_HASH_RE = re.compile(r"(?:(?<=^)|(?<=\s))#\w+(?=\s|$)")\r
+\r
+ def __init__(self):\r
+ self.storage_path = get_env("FLATNOTES_PATH", mandatory=True)\r
+ if not os.path.exists(self.storage_path):\r
+ raise NotADirectoryError(\r
+ f"'{self.storage_path}' is not a valid directory."\r
+ )\r
+ self.index = self._load_index()\r
+ self._sync_index()\r
+\r
+ def create(self, data: NoteCreate) -> Note:\r
+ """Create a new note."""\r
+ filepath = self._path_from_title(data.title)\r
+ self._write_file(filepath, data.content)\r
+ return Note(\r
+ title=data.title,\r
+ content=data.content,\r
+ last_modified=os.path.getmtime(filepath),\r
+ )\r
+\r
+ def get(self, title: str) -> Note:\r
+ """Get a specific note."""\r
+ is_valid_filename(title)\r
+ filepath = self._path_from_title(title)\r
+ content = self._read_file(filepath)\r
+ return Note(\r
+ title=title,\r
+ content=content,\r
+ last_modified=os.path.getmtime(filepath),\r
+ )\r
+\r
+ def update(self, title: str, data: NoteUpdate) -> Note:\r
+ """Update a specific note."""\r
+ is_valid_filename(title)\r
+ filepath = self._path_from_title(title)\r
+ if data.new_title is not None:\r
+ new_filepath = self._path_from_title(data.new_title)\r
+ os.rename(filepath, new_filepath)\r
+ title = data.new_title\r
+ filepath = new_filepath\r
+ if data.new_content is not None:\r
+ self._write_file(filepath, data.new_content, overwrite=True)\r
+ content = data.new_content\r
+ else:\r
+ content = self._read_file(filepath)\r
+ return Note(\r
+ title=title,\r
+ content=content,\r
+ last_modified=os.path.getmtime(filepath),\r
+ )\r
+\r
+ def delete(self, title: str) -> None:\r
+ """Delete a specific note."""\r
+ is_valid_filename(title)\r
+ filepath = self._path_from_title(title)\r
+ os.remove(filepath)\r
+\r
+ def search(\r
+ self,\r
+ term: str,\r
+ sort: Literal["score", "title", "last_modified"] = "score",\r
+ order: Literal["asc", "desc"] = "desc",\r
+ limit: int = None,\r
+ ) -> Tuple[SearchResult, ...]:\r
+ """Search the index for the given term."""\r
+ self._sync_index()\r
+ term = self._pre_process_search_term(term)\r
+ with self.index.searcher() as searcher:\r
+ # Parse Query\r
+ if term == "*":\r
+ query = Every()\r
+ else:\r
+ parser = MultifieldParser(\r
+ self._fieldnames_for_term(term), self.index.schema\r
+ )\r
+ parser.add_plugin(DateParserPlugin())\r
+ query = parser.parse(term)\r
+\r
+ # Determine Sort By\r
+ # Note: For the 'sort' option, "score" is converted to None as\r
+ # that is the default for searches anyway and it's quicker for\r
+ # Whoosh if you specify None.\r
+ sort = sort if sort in ["title", "last_modified"] else None\r
+\r
+ # Determine Sort Direction\r
+ # Note: Confusingly, when sorting by 'score', reverse = True means\r
+ # asc so we have to flip the logic for that case!\r
+ reverse = order == "desc"\r
+ if sort is None:\r
+ reverse = not reverse\r
+\r
+ # Run Search\r
+ results = searcher.search(\r
+ query,\r
+ sortedby=sort,\r
+ reverse=reverse,\r
+ limit=limit,\r
+ terms=True,\r
+ )\r
+ return tuple(self._search_result_from_hit(hit) for hit in results)\r
+\r
+ def get_tags(self) -> list[str]:\r
+ """Return a list of all indexed tags."""\r
+ self._sync_index()\r
+ with self.index.reader() as reader:\r
+ tags = reader.field_terms("tags")\r
+ return [tag for tag in tags]\r
+\r
+ @property\r
+ def _index_path(self):\r
+ return os.path.join(self.storage_path, ".flatnotes")\r
+\r
+ def _path_from_title(self, title: str) -> str:\r
+ return os.path.join(self.storage_path, title + MARKDOWN_EXT)\r
+\r
+ def _get_by_filename(self, filename: str) -> Note:\r
+ """Get a note by its filename."""\r
+ return self.get(self._strip_ext(filename))\r
+\r
+ def _load_index(self) -> Index:\r
+ """Load the note index or create new if not exists."""\r
+ index_dir_exists = os.path.exists(self._index_path)\r
+ if index_dir_exists and whoosh.index.exists_in(\r
+ self._index_path, indexname=INDEX_SCHEMA_VERSION\r
+ ):\r
+ logger.info("Loading existing index")\r
+ return whoosh.index.open_dir(\r
+ self._index_path, indexname=INDEX_SCHEMA_VERSION\r
+ )\r
+ else:\r
+ if index_dir_exists:\r
+ logger.info("Deleting outdated index")\r
+ self._clear_dir(self._index_path)\r
+ else:\r
+ os.mkdir(self._index_path)\r
+ logger.info("Creating new index")\r
+ return whoosh.index.create_in(\r
+ self._index_path, IndexSchema, indexname=INDEX_SCHEMA_VERSION\r
+ )\r
+\r
+ @classmethod\r
+ def _extract_tags(cls, content) -> Tuple[str, Set[str]]:\r
+ """Strip tags from the given content and return a tuple consisting of:\r
+\r
+ - The content without the tags.\r
+ - A set of tags converted to lowercase."""\r
+ content_ex_codeblock = re.sub(cls.CODEBLOCK_RE, "", content)\r
+ _, tags = cls._re_extract(cls.TAGS_RE, content_ex_codeblock)\r
+ content_ex_tags, _ = cls._re_extract(cls.TAGS_RE, content)\r
+ try:\r
+ tags = [tag.lower() for tag in tags]\r
+ return (content_ex_tags, set(tags))\r
+ except IndexError:\r
+ return (content, set())\r
+\r
+ def _add_note_to_index(\r
+ self, writer: writing.IndexWriter, note: Note\r
+ ) -> None:\r
+ """Add a Note object to the index using the given writer. If the\r
+ filename already exists in the index an update will be performed\r
+ instead."""\r
+ content_ex_tags, tag_set = self._extract_tags(note.content)\r
+ tag_string = " ".join(tag_set)\r
+ writer.update_document(\r
+ filename=note.title + MARKDOWN_EXT,\r
+ last_modified=datetime.fromtimestamp(note.last_modified),\r
+ title=note.title,\r
+ content=content_ex_tags,\r
+ tags=tag_string,\r
+ )\r
+\r
+ def _list_all_note_filenames(self) -> List[str]:\r
+ """Return a list of all note filenames."""\r
+ return [\r
+ os.path.split(filepath)[1]\r
+ for filepath in glob.glob(\r
+ os.path.join(self.storage_path, "*" + MARKDOWN_EXT)\r
+ )\r
+ ]\r
+\r
+ def _sync_index(self, clean: bool = False) -> None:\r
+ """Synchronize the index with the notes directory.\r
+ Specify clean=True to completely rebuild the index"""\r
+ indexed = set()\r
+ writer = self.index.writer()\r
+ if clean:\r
+ writer.mergetype = writing.CLEAR # Clear the index\r
+ with self.index.searcher() as searcher:\r
+ for idx_note in searcher.all_stored_fields():\r
+ idx_filename = idx_note["filename"]\r
+ idx_filepath = os.path.join(self.storage_path, idx_filename)\r
+ # Delete missing\r
+ if not os.path.exists(idx_filepath):\r
+ writer.delete_by_term("filename", idx_filename)\r
+ logger.info(f"'{idx_filename}' removed from index")\r
+ # Update modified\r
+ elif (\r
+ datetime.fromtimestamp(os.path.getmtime(idx_filepath))\r
+ != idx_note["last_modified"]\r
+ ):\r
+ logger.info(f"'{idx_filename}' updated")\r
+ self._add_note_to_index(\r
+ writer, self._get_by_filename(idx_filename)\r
+ )\r
+ indexed.add(idx_filename)\r
+ # Ignore already indexed\r
+ else:\r
+ indexed.add(idx_filename)\r
+ # Add new\r
+ for filename in self._list_all_note_filenames():\r
+ if filename not in indexed:\r
+ self._add_note_to_index(\r
+ writer, self._get_by_filename(filename)\r
+ )\r
+ logger.info(f"'{filename}' added to index")\r
+ writer.commit()\r
+\r
+ @classmethod\r
+ def _pre_process_search_term(cls, term):\r
+ term = term.strip()\r
+ # Replace "#tagname" with "tags:tagname"\r
+ term = re.sub(\r
+ cls.TAGS_WITH_HASH_RE,\r
+ lambda tag: "tags:" + tag.group(0)[1:],\r
+ term,\r
+ )\r
+ return term\r
+\r
+ @staticmethod\r
+ def _re_extract(pattern, string) -> Tuple[str, List[str]]:\r
+ """Similar to re.sub but returns a tuple of:\r
+\r
+ - `string` with matches removed\r
+ - list of matches"""\r
+ matches = []\r
+ text = re.sub(pattern, lambda tag: matches.append(tag.group()), string)\r
+ return (text, matches)\r
+\r
+ @staticmethod\r
+ def _strip_ext(filename):\r
+ """Return the given filename without the extension."""\r
+ return os.path.splitext(filename)[0]\r
+\r
+ @staticmethod\r
+ def _clear_dir(path):\r
+ """Delete all contents of the given directory."""\r
+ for item in os.listdir(path):\r
+ item_path = os.path.join(path, item)\r
+ if os.path.isfile(item_path):\r
+ os.remove(item_path)\r
+ elif os.path.isdir(item_path):\r
+ shutil.rmtree(item_path)\r
+\r
+ def _search_result_from_hit(self, hit: Hit):\r
+ matched_fields = self._get_matched_fields(hit.matched_terms())\r
+\r
+ title = self._strip_ext(hit["filename"])\r
+ last_modified = hit["last_modified"].timestamp()\r
+\r
+ # If the search was ordered using a text field then hit.score is the\r
+ # value of that field. This isn't useful so only set self._score if it\r
+ # is a float.\r
+ score = hit.score if type(hit.score) is float else None\r
+\r
+ if "title" in matched_fields:\r
+ hit.results.fragmenter = WholeFragmenter()\r
+ title_highlights = hit.highlights("title", text=title)\r
+ else:\r
+ title_highlights = None\r
+\r
+ if "content" in matched_fields:\r
+ hit.results.fragmenter = ContextFragmenter()\r
+ content = self._read_file(self._path_from_title(title))\r
+ content_ex_tags, _ = FileSystemNotes._extract_tags(content)\r
+ content_highlights = hit.highlights(\r
+ "content",\r
+ text=content_ex_tags,\r
+ )\r
+ else:\r
+ content_highlights = None\r
+\r
+ tag_matches = (\r
+ [field[1] for field in hit.matched_terms() if field[0] == "tags"]\r
+ if "tags" in matched_fields\r
+ else None\r
+ )\r
+\r
+ return SearchResult(\r
+ title=title,\r
+ last_modified=last_modified,\r
+ score=score,\r
+ title_highlights=title_highlights,\r
+ content_highlights=content_highlights,\r
+ tag_matches=tag_matches,\r
+ )\r
+\r
+ def _fieldnames_for_term(self, term: str) -> List[str]:\r
+ """Return a list of field names to search based on the given term. If\r
+ the term includes a phrase then only search title and content. If the\r
+ term does not include a phrase then also search tags."""\r
+ fields = ["title", "content"]\r
+ if '"' not in term:\r
+ # If the term does not include a phrase then also search tags\r
+ fields.append("tags")\r
+ return fields\r
+\r
+ @staticmethod\r
+ def _get_matched_fields(matched_terms):\r
+ """Return a set of matched fields from a set of ('field', 'term') "\r
+ "tuples generated by whoosh.searching.Hit.matched_terms()."""\r
+ return set([matched_term[0] for matched_term in matched_terms])\r
+\r
+ @staticmethod\r
+ def _read_file(filepath: str):\r
+ logger.debug(f"Reading from '{filepath}'")\r
+ with open(filepath, "r") as f:\r
+ content = f.read()\r
+ return content\r
+\r
+ @staticmethod\r
+ def _write_file(filepath: str, content: str, overwrite: bool = False):\r
+ logger.debug(f"Writing to '{filepath}'")\r
+ with open(filepath, "w" if overwrite else "x") as f:\r
+ f.write(content)\r
-from typing import List, Optional
-
-from pydantic import Field
-from pydantic.functional_validators import AfterValidator
-from typing_extensions import Annotated
-
-from helpers import CustomBaseModel, is_valid_filename, strip_whitespace
-
-
-class NoteBase(CustomBaseModel):
- title: str
-
-
-class NoteCreate(CustomBaseModel):
- title: Annotated[
- str,
- AfterValidator(strip_whitespace),
- AfterValidator(is_valid_filename),
- ]
- content: Optional[str] = Field(None)
-
-
-class Note(CustomBaseModel):
- title: str
- content: Optional[str] = Field(None)
- last_modified: float
-
-
-class NoteUpdate(CustomBaseModel):
- new_title: Annotated[
- Optional[str],
- AfterValidator(strip_whitespace),
- AfterValidator(is_valid_filename),
- ] = Field(None)
- new_content: Optional[str] = Field(None)
-
-
-class SearchResult(CustomBaseModel):
- title: str
- last_modified: float
-
- score: Optional[float] = Field(None)
- title_highlights: Optional[str] = Field(None)
- content_highlights: Optional[str] = Field(None)
- tag_matches: Optional[List[str]] = Field(None)
+from typing import List, Optional\r
+\r
+from pydantic import Field\r
+from pydantic.functional_validators import AfterValidator\r
+from typing_extensions import Annotated\r
+\r
+from helpers import CustomBaseModel, is_valid_filename, strip_whitespace\r
+\r
+\r
+class NoteBase(CustomBaseModel):\r
+ title: str\r
+\r
+\r
+class NoteCreate(CustomBaseModel):\r
+ title: Annotated[\r
+ str,\r
+ AfterValidator(strip_whitespace),\r
+ AfterValidator(is_valid_filename),\r
+ ]\r
+ content: Optional[str] = Field(None)\r
+\r
+\r
+class Note(CustomBaseModel):\r
+ title: str\r
+ content: Optional[str] = Field(None)\r
+ last_modified: float\r
+\r
+\r
+class NoteUpdate(CustomBaseModel):\r
+ new_title: Annotated[\r
+ Optional[str],\r
+ AfterValidator(strip_whitespace),\r
+ AfterValidator(is_valid_filename),\r
+ ] = Field(None)\r
+ new_content: Optional[str] = Field(None)\r
+\r
+\r
+class SearchResult(CustomBaseModel):\r
+ title: str\r
+ last_modified: float\r
+\r
+ score: Optional[float] = Field(None)\r
+ title_highlights: Optional[str] = Field(None)\r
+ content_highlights: Optional[str] = Field(None)\r
+ tag_matches: Optional[List[str]] = Field(None)\r
-/** @type {import('tailwindcss').Config} */
-
-module.exports = {
- content: ["client/**/*.{html,js,vue}"],
- theme: {
- fontFamily: {
- sans: ["Poppins", "sans-serif"],
- },
- screens: {
- sm: "640px",
- md: "768px",
- lg: "1024px",
- },
- extend: {
- colors: {
- "theme-brand": "rgb(var(--theme-brand) / <alpha-value>)",
- "theme-background": "rgb(var(--theme-background) / <alpha-value>)",
- "theme-background-elevated":
- "rgb(var(--theme-background-elevated) / <alpha-value>)",
- "theme-background-tint":
- "rgb(var(--theme-background-tint) / <alpha-value>)",
- "theme-background-highlight":
- "rgb(var(--theme-background-highlight) / <alpha-value>)",
- "theme-background-hover":
- "rgb(var(--theme-background-hover) / <alpha-value>)",
- "theme-text": "rgb(var(--theme-text) / <alpha-value>)",
- "theme-text-muted": "rgb(var(--theme-text-muted) / <alpha-value>)",
- "theme-text-very-muted":
- "rgb(var(--theme-text-very-muted) / <alpha-value>)",
- "theme-shadow": "rgb(var(--theme-shadow) / <alpha-value>)",
- "theme-border": "rgb(var(--theme-border) / <alpha-value>)",
- },
- },
- },
- plugins: [],
-};
+/** @type {import('tailwindcss').Config} */\r
+\r
+module.exports = {\r
+ content: ["client/**/*.{html,js,vue}"],\r
+ theme: {\r
+ fontFamily: {\r
+ sans: ["Poppins", "sans-serif"],\r
+ },\r
+ screens: {\r
+ sm: "640px",\r
+ md: "768px",\r
+ lg: "1024px",\r
+ },\r
+ extend: {\r
+ colors: {\r
+ "theme-brand": "rgb(var(--theme-brand) / <alpha-value>)",\r
+ "theme-background": "rgb(var(--theme-background) / <alpha-value>)",\r
+ "theme-background-elevated":\r
+ "rgb(var(--theme-background-elevated) / <alpha-value>)",\r
+ "theme-background-tint":\r
+ "rgb(var(--theme-background-tint) / <alpha-value>)",\r
+ "theme-background-highlight":\r
+ "rgb(var(--theme-background-highlight) / <alpha-value>)",\r
+ "theme-background-hover":\r
+ "rgb(var(--theme-background-hover) / <alpha-value>)",\r
+ "theme-text": "rgb(var(--theme-text) / <alpha-value>)",\r
+ "theme-text-muted": "rgb(var(--theme-text-muted) / <alpha-value>)",\r
+ "theme-text-very-muted":\r
+ "rgb(var(--theme-text-very-muted) / <alpha-value>)",\r
+ "theme-shadow": "rgb(var(--theme-shadow) / <alpha-value>)",\r
+ "theme-border": "rgb(var(--theme-border) / <alpha-value>)",\r
+ },\r
+ },\r
+ },\r
+ plugins: [],\r
+};\r
-import { defineConfig } from "vite";
-import vue from "@vitejs/plugin-vue";
-
-export default defineConfig({
- plugins: [vue()],
- root: "client",
- server: {
- port: 8080,
- },
-});
+import { defineConfig } from "vite";\r
+import vue from "@vitejs/plugin-vue";\r
+\r
+export default defineConfig({\r
+ plugins: [vue()],\r
+ root: "client",\r
+ server: {\r
+ port: 8080,\r
+ },\r
+});\r