From c9107105459e3360005020f7381c2a1c2986e514 Mon Sep 17 00:00:00 2001 From: Kamaar Date: Wed, 2 Sep 2026 11:13:48 +0200 Subject: [PATCH 1/3] Restructure onto the InvenTree plugin creator template (2.0.0) Rebuild the plugin on the official plugin creator template (creator 1.20.0), targeting InvenTree 1.0+ (developed against 1.5.2). The plugin slug and the distribution name are unchanged, so stored settings survive and installing the new distribution is an upgrade rather than a new package. Fix three bugs that made the 1.x settings silently inert: - The generate_batch_code hook read kwargs['stock_item'], but InvenTree passes the stock item as 'item' (see stock/generators.py and the caller kwargs in GenerateBatchCodeSerializer). Part and location were therefore always None, so PER_PART, PER_LOCATION and USE_LOCATION_PREFIX never had any effect. - get_setting()'s second positional parameter is 'cache', not a default value, so every call of the form get_setting('KEY', default) passed the default as the cache flag. - MIN_DIGITS was only applied on the format-error fallback path, never to normal output. Replace the derived counter with a persistent one. models.BatchCounter holds one row per scope, advanced atomically under select_for_update(), so the sequence no longer depends on the code format being sortable as a string and survives concurrent stock creation. SEED_FROM_EXISTING raises the counter past numbers already present in existing batch codes, so upgrading from 1.x does not reissue codes which are already in use. This requires AppMixin, so the plugin is now a Django app: it needs a server restart to load, and a migration. Other changes: - DAILY_RESET now resets the counter itself, rather than filtering existing codes for today's date, so it no longer requires {date} in CODE_FORMAT. - TRIGGER_MODE=on_receive now means "a purchase order is part of the request", which is what the hook context actually exposes. - Remove TARGET_FIELD: the hook returns a string and InvenTree decides where it goes, which is always StockItem.batch. - Add preview/ and generate/ REST endpoints via UrlsMixin. The 1.x urls.py was never mounted (no UrlsMixin, no setup_urls) and called a method that did not exist, so nothing depended on it. - Add a React panel for the stock item page and a live format preview on the plugin settings page, with a complete Italian catalog. - Manage the Python environment with uv; format and lint with ruff; run CI on GitHub Actions. - Version is now declared once, in batchcode_plugin/__init__.py. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yaml | 42 + .github/workflows/pypi.yaml | 44 + .github/workflows/translations.yaml | 32 + .gitignore | 165 + .gitlab-ci.yml | 26 - .pre-commit-config.yaml | 19 + CLAUDE.md | 172 + LICENSE | 21 + MANIFEST.in | 1 + README.md | 328 +- batchcode_plugin/.gitignore | 2 + batchcode_plugin/__init__.py | 5 +- batchcode_plugin/admin.py | 20 + batchcode_plugin/apps.py | 10 + batchcode_plugin/core.py | 456 ++ batchcode_plugin/migrations/0001_initial.py | 87 + batchcode_plugin/migrations/__init__.py | 0 batchcode_plugin/models.py | 148 + batchcode_plugin/plugin.json | 8 - batchcode_plugin/plugin.py | 209 - batchcode_plugin/serializers.py | 105 + batchcode_plugin/urls.py | 59 - batchcode_plugin/views.py | 107 + biome.json | 47 + frontend/.gitignore | 6 + frontend/README.md | 79 + frontend/lingui.config.ts | 31 + frontend/package-lock.json | 7105 +++++++++++++++++ frontend/package.json | 45 + frontend/src/Panel.tsx | 251 + frontend/src/Settings.tsx | 97 + frontend/src/locales.tsx | 5 + frontend/src/locales/de/messages.d.ts | 4 + frontend/src/locales/de/messages.po | 115 + frontend/src/locales/de/messages.ts | 1 + frontend/src/locales/en/messages.d.ts | 4 + frontend/src/locales/en/messages.po | 115 + frontend/src/locales/en/messages.ts | 1 + frontend/src/locales/es/messages.d.ts | 4 + frontend/src/locales/es/messages.po | 115 + frontend/src/locales/es/messages.ts | 1 + frontend/src/locales/fr/messages.d.ts | 4 + frontend/src/locales/fr/messages.po | 115 + frontend/src/locales/fr/messages.ts | 1 + frontend/src/locales/it/messages.d.ts | 4 + frontend/src/locales/it/messages.po | 115 + frontend/src/locales/it/messages.ts | 1 + frontend/src/locales/ja/messages.d.ts | 4 + frontend/src/locales/ja/messages.po | 115 + frontend/src/locales/ja/messages.ts | 1 + .../src/locales/pseudo-LOCALE/messages.d.ts | 4 + .../src/locales/pseudo-LOCALE/messages.po | 115 + .../src/locales/pseudo-LOCALE/messages.ts | 1 + frontend/src/locales/ru/messages.d.ts | 4 + frontend/src/locales/ru/messages.po | 115 + frontend/src/locales/ru/messages.ts | 1 + frontend/src/locales/zh_Hans/messages.d.ts | 4 + frontend/src/locales/zh_Hans/messages.po | 115 + frontend/src/locales/zh_Hans/messages.ts | 1 + frontend/src/locales/zh_Hant/messages.d.ts | 4 + frontend/src/locales/zh_Hant/messages.po | 115 + frontend/src/locales/zh_Hant/messages.ts | 1 + frontend/src/vite-env.d.ts | 1 + frontend/tsconfig.app.json | 26 + frontend/tsconfig.json | 10 + frontend/tsconfig.node.json | 24 + frontend/vite.config.ts | 78 + frontend/vite.dev.config.ts | 50 + pyproject.toml | 88 + setup.cfg | 16 + setup.py | 20 - uv.lock | 1398 ++++ 72 files changed, 12217 insertions(+), 426 deletions(-) create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/pypi.yaml create mode 100644 .github/workflows/translations.yaml create mode 100644 .gitignore delete mode 100644 .gitlab-ci.yml create mode 100644 .pre-commit-config.yaml create mode 100644 CLAUDE.md create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 batchcode_plugin/.gitignore create mode 100644 batchcode_plugin/admin.py create mode 100644 batchcode_plugin/apps.py create mode 100644 batchcode_plugin/core.py create mode 100644 batchcode_plugin/migrations/0001_initial.py create mode 100644 batchcode_plugin/migrations/__init__.py create mode 100644 batchcode_plugin/models.py delete mode 100644 batchcode_plugin/plugin.json delete mode 100644 batchcode_plugin/plugin.py create mode 100644 batchcode_plugin/serializers.py delete mode 100644 batchcode_plugin/urls.py create mode 100644 batchcode_plugin/views.py create mode 100644 biome.json create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/lingui.config.ts create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/Panel.tsx create mode 100644 frontend/src/Settings.tsx create mode 100644 frontend/src/locales.tsx create mode 100644 frontend/src/locales/de/messages.d.ts create mode 100644 frontend/src/locales/de/messages.po create mode 100644 frontend/src/locales/de/messages.ts create mode 100644 frontend/src/locales/en/messages.d.ts create mode 100644 frontend/src/locales/en/messages.po create mode 100644 frontend/src/locales/en/messages.ts create mode 100644 frontend/src/locales/es/messages.d.ts create mode 100644 frontend/src/locales/es/messages.po create mode 100644 frontend/src/locales/es/messages.ts create mode 100644 frontend/src/locales/fr/messages.d.ts create mode 100644 frontend/src/locales/fr/messages.po create mode 100644 frontend/src/locales/fr/messages.ts create mode 100644 frontend/src/locales/it/messages.d.ts create mode 100644 frontend/src/locales/it/messages.po create mode 100644 frontend/src/locales/it/messages.ts create mode 100644 frontend/src/locales/ja/messages.d.ts create mode 100644 frontend/src/locales/ja/messages.po create mode 100644 frontend/src/locales/ja/messages.ts create mode 100644 frontend/src/locales/pseudo-LOCALE/messages.d.ts create mode 100644 frontend/src/locales/pseudo-LOCALE/messages.po create mode 100644 frontend/src/locales/pseudo-LOCALE/messages.ts create mode 100644 frontend/src/locales/ru/messages.d.ts create mode 100644 frontend/src/locales/ru/messages.po create mode 100644 frontend/src/locales/ru/messages.ts create mode 100644 frontend/src/locales/zh_Hans/messages.d.ts create mode 100644 frontend/src/locales/zh_Hans/messages.po create mode 100644 frontend/src/locales/zh_Hans/messages.ts create mode 100644 frontend/src/locales/zh_Hant/messages.d.ts create mode 100644 frontend/src/locales/zh_Hant/messages.po create mode 100644 frontend/src/locales/zh_Hant/messages.ts create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100644 frontend/vite.dev.config.ts create mode 100644 pyproject.toml create mode 100644 setup.cfg delete mode 100644 setup.py create mode 100644 uv.lock diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..f82f5f3 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,42 @@ +# Ensure that the plugin meets the required style guidelines +# Ensure that the plugin builds correctly + +name: CI Checks + +on: ["push", "pull_request"] + +jobs: + ci: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + - name: Install Deps + run: uv sync --locked + - name: Style Checks + run: | + uv run ruff format --check . + uv run ruff check . + - name: Build Plugin + run: uv run python -m build + + frontend: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Build Frontend + run: | + cd frontend + npm install + npm run translate + npm run build + npm run lint diff --git a/.github/workflows/pypi.yaml b/.github/workflows/pypi.yaml new file mode 100644 index 0000000..cfaaa5a --- /dev/null +++ b/.github/workflows/pypi.yaml @@ -0,0 +1,44 @@ +# Publish to PyPi package index +# Note: Requires a secret named PYPI_API_TOKEN to be set in the repository settings + +name: PIP Publish + +on: + release: + types: [published] + +jobs: + + publish: + name: Publish to PyPi + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + - name: Install Python Dependencies + run: uv sync --locked + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + # The static bundles are gitignored, so they must be built here: + # a wheel published without them has no plugin UI. + - name: Build Frontend + run: | + cd frontend + npm install + npm run translate + npm run build + - name: Build Binary + run: uv run python -m build + - name: Publish + run: uv run python -m twine upload dist/* + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + TWINE_REPOSITORY: pypi diff --git a/.github/workflows/translations.yaml b/.github/workflows/translations.yaml new file mode 100644 index 0000000..0342534 --- /dev/null +++ b/.github/workflows/translations.yaml @@ -0,0 +1,32 @@ +# Check that compiled translation catalogs are up-to-date with source strings + +name: Translation Check + +on: ["push", "pull_request"] + +jobs: + translations: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Install Dependencies + run: | + cd frontend + npm install + - name: Compile Translations + run: | + cd frontend + npm run translate + - name: Check for Uncommitted Changes + run: | + if ! git diff --exit-code frontend/src/locales; then + echo "" + echo "ERROR: Translation catalogs are out of date." + echo "Run 'cd frontend && npm run translate' and commit the updated files in src/locales." + exit 1 + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b1617f --- /dev/null +++ b/.gitignore @@ -0,0 +1,165 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff +.ruff_cache/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index b0976a8..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,26 +0,0 @@ -# You can override the included template(s) by including variable overrides -# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings -# Secret Detection customization: https://docs.gitlab.com/user/application_security/secret_detection/pipeline/configure -# Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings -# Container Scanning customization: https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings -# Note that environment variables can be set in several places -# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence -stages: -- build -- test -- deploy -- review -- dast -- staging -- canary -- production -- incremental rollout 10% -- incremental rollout 25% -- incremental rollout 50% -- incremental rollout 100% -- performance -- cleanup -sast: - stage: test -include: -- template: Auto-DevOps.gitlab-ci.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..029fdca --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: +- repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.12.0 + hooks: + - id: ruff-format + args: [ --preview ] + - id: ruff + args: [ + --fix, + # --unsafe-fixes, + --preview + ] +- repo: https://github.com/biomejs/pre-commit + rev: v2.0.0-beta.5 + hooks: + - id: biome-check + additional_dependencies: ["@biomejs/biome@2.0.0"] + files: ^frontend/src.*\.(js|ts|tsx)$ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..4d1b41b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,172 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +`inventree-batchcode-plugin` — a server-side InvenTree plugin that generates progressive batch +codes for `StockItem` records. It is a Python package installed *into* an InvenTree instance, +plus a React bundle rendered inside InvenTree's own UI. Targets InvenTree 1.0.0+ (developed +against 1.5.2). + +Version 2.0.0 was restructured onto the [InvenTree plugin creator](https://github.com/inventree/plugin-creator) +template (creator 1.20.0). Keep the generated layout: `batchcode_plugin/core.py` is the plugin +entry point, `frontend/` builds into `batchcode_plugin/static/`. + +## Commands + +Python tooling is managed with **uv**; the frontend with **npm**. + +```bash +uv sync # create .venv from pyproject's [dependency-groups] dev +uv run ruff format . # format (single quotes, see [tool.ruff.format]) +uv run ruff check . # lint — CI runs format --check plus this +uv run python -m build # sdist + wheel into dist/ + +cd frontend +npm install +npm run translate # lingui extract + compile — must be re-run when UI strings change +npm run build # tsc -b && vite build -> ../batchcode_plugin/static/ +npm run lint # biome check +npm run lint:fix # biome check --fix (also formats) +npm run dev # vite dev server on :5174, pairs with INVENTREE_PLUGIN_DEV_HOST +``` + +There is **no test suite**. See *Verifying changes* below for what can actually be checked +locally. + +### Release ordering + +`batchcode_plugin/static/` is gitignored, so `cd frontend && npm run build` must run **before** +`python -m build` or the wheel ships without a UI. `.github/workflows/pypi.yaml` does this in +order; a manual release must too. + +## Verifying changes + +Nothing in `batchcode_plugin/` can be imported outside a configured InvenTree/Django process — +`core.py` imports `from plugin import InvenTreePlugin`, and the views and `seed_value` import +`stock.models` / `part.models`. So: + +- **Backend logic** can be exercised offline by stubbing `plugin`, `plugin.mixins`, + `InvenTree.helpers`, `stock.models` and `batchcode_plugin.models` in `sys.modules`, then + loading `core.py` via `importlib`, subclassing `BatchCodePlugin` and overriding `get_setting` + to read from a dict. This covers `render_code`, `resolve_prefix`, `counter_scope`, + `wants_to_generate`, `extract_targets` and `build_code` — i.e. everything that decides what a + code looks like. Requires `uv run --with django==5.2.17`. +- **Frontend** is genuinely verified by `npm run build` (`tsc -b` typechecks) and `npm run lint`. +- **Packaging** is verified by `python -m build` plus inspecting the wheel for + `batchcode_plugin/static/Panel.js` and the `inventree_plugins` entry point. +- **Anything touching the ORM or the registry** needs a real InvenTree instance. + +## Architecture + +### The hook contract — get this right + +InvenTree calls `generate_batch_code(**kwargs)` from `stock/generators.py`, which passes: + +- always: `date`, `year`, `month`, `day`, `hour`, `minute`, `week` +- from the caller (see `GenerateBatchCodeSerializer` in InvenTree's `stock/serializers.py`): + `item`, `part`, `location`, `quantity`, `build_order`, `purchase_order` + +The stock item arrives as **`item`**, not `stock_item`. Version 1.x read `kwargs['stock_item']`, +so `part` and `location` were always `None` and `PER_PART` / `PER_LOCATION` / +`USE_LOCATION_PREFIX` never did anything. `extract_targets()` now resolves `part`/`location` +from the explicit kwargs first and falls back to `item.part` / `item.location`. + +Two other things about that call site: exceptions raised by the hook are caught and logged by +InvenTree (a failure means "no code", not an error to the user), and returning `None` hands the +request to the next plugin and finally to InvenTree's own `STOCK_BATCH_CODE_TEMPLATE`. That is +why `render_code` falls back to a simple code instead of letting a bad `CODE_FORMAT` propagate. + +### Counters are persisted, not derived + +`models.BatchCounter` holds one row per scope. `key` — built by `build_key()` as +`part=|loc=|period=`, with empty segments for unscoped dimensions — is the +authoritative unique constraint. The `part` / `location` FKs alongside it are denormalized +copies for admin readability only: a `unique_together` over nullable FKs would not be enforced, +since `NULL != NULL` in SQL. + +`advance()` is the only writer: `get_or_create`, then re-read `select_for_update()` under +`transaction.atomic()` so concurrent stock creation serializes. `peek()` is the read-only twin +used for previews. + +`seed`, passed on every `advance()`/`peek()`, is a floor derived from batch codes already in the +database (`seed_value()`, gated by the `SEED_FROM_EXISTING` setting). It exists so upgrading from +1.x — where the counter was recomputed from the stock table each time — does not reissue codes +already in use. + +Counter values are consumed at generation time, not when the stock item is saved, so abandoned +forms leave gaps. Codes are unique and increasing, **not** gapless. Don't "fix" this without +changing the model to reserve-and-confirm. + +### Settings + +`get_setting(key)` takes only the key. Its second positional parameter is `cache`, **not** a +default — `get_setting('ENABLED', True)` silently passes `True` as `cache`. Defaults come from +the `SETTINGS` dict. (1.x had this wrong throughout.) + +`SLUG = 'batchcode'` keys every stored setting value and the plugin's API URLs. Changing it +orphans every existing installation's configuration. + +`CODE_FORMAT` is rendered with `string.Formatter().vformat` against a mapping of plain +strings/ints (plus the datetime). Model instances are deliberately not exposed — a format string +can traverse attributes. A bare `{num}` is rewritten to `{num:0d}` before +formatting, so an explicit spec like `{num:06d}` wins over `MIN_DIGITS`. + +### Frontend + +`frontend/src/Panel.tsx` renders the stock item panel (`get_ui_panels`, gated on +`target_model == 'stockitem'`); `Settings.tsx` renders the live format preview on the plugin +settings page (`ADMIN_SOURCE`). Both are wired by name — `'Panel.js:RenderBatchCodePluginPanel'` +and `'Settings.js:RenderPluginSettings'` — so renaming an exported function requires updating +`core.py` too. + +The dict returned in a panel's `context` key arrives as **`context.context`** in the component +(`context.instance` is the stock item, `context.reloadInstance()` refetches it). React, Mantine, +lingui and `@lingui/react` are externalized in `vite.config.ts` and provided by the InvenTree +host — do not bundle them, and prefer `context.api` over adding an HTTP client. + +`@tanstack/react-query` and `@tabler/icons-react` are used by the creator's example code but are +**not** declared in `package.json`; they resolve only transitively. The panel deliberately uses +plain `useState`/`useEffect` and no icon imports instead. + +Panel strings go through the lingui `t` macro. `frontend/src/locales/it/messages.po` is fully +translated and `.github/workflows/translations.yaml` fails the build if the catalogs are stale, +so run `npm run translate` after touching any `t` string. Use `npx lingui extract --clean` to +drop entries whose source strings are gone. + +### AppMixin consequences + +The plugin is a Django app, which means: a server **restart** is required to load it (not just +enabling it in the UI), schema changes need a migration in `batchcode_plugin/migrations/`, and +`BatchCounter.check_user_permission` must exist — InvenTree denies every permission on a plugin +model that does not implement it. Migrations here are hand-written (`0001_initial.py`); +generating them with `makemigrations` requires a full InvenTree checkout. `DEFAULT_AUTO_FIELD` in +InvenTree is plain `AutoField`, so use that, not `BigAutoField`. + +There is no separate server flag for app plugins in InvenTree 1.x — only `plugins_enabled` / +`INVENTREE_PLUGINS_ENABLED`. + +## Conventions + +- Code, setting keys and user-facing strings are English; Django strings use `gettext_lazy as _`, + frontend strings the lingui `t` macro. Italian is the fully-translated frontend locale. +- Ruff formats with **single quotes** and enforces google-style docstrings (`D` rules) on every + module, class and public method. `batchcode_plugin/migrations/` is exempt from `D`. +- Logging goes through `logging.getLogger('inventree')`, messages prefixed `BatchCodePlugin:`. +- Bump the version in **one** place: `batchcode_plugin/__init__.py:PLUGIN_VERSION`. + `pyproject.toml` reads it dynamically and `core.py` uses it for `VERSION`. (1.x had three + disagreeing version strings.) +- The README's *Upgrading from 1.x* and *Changelog* sections are maintained per release; add an + entry for behavioural changes. + +## Running the plugin creator again + +`create-inventree-plugin` cannot run in this environment: it prints via +`questionary`/`prompt_toolkit`, which needs a real Windows console screen buffer and raises +`NoConsoleScreenBufferError` from both bash and PowerShell here. To re-scaffold, drive the +cookiecutter template directly — monkeypatch `plugin_creator.helpers.pretty_print` to `print`, +build the context yourself, call `cookiecutter(..., no_input=True, extra_context=...)`, then run +the same cleanup steps `plugin_creator.cli.cleanup` does (`devops.cleanup_devops_files`, +`frontend.update_frontend`, `mixins.cleanup_mixins`). Skip `devops.git_init` — it `pip install`s +pre-commit globally, which conflicts with the uv-managed environment. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9053089 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2026 Simone Amadori + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..1eee02d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include batchcode_plugin/static * \ No newline at end of file diff --git a/README.md b/README.md index a38a4e6..e92ebc7 100644 --- a/README.md +++ b/README.md @@ -1,117 +1,241 @@ # BatchCodePlugin -**Autore:** Simone Amadori -**Sito:** [https://github.com/Kamaar](https://github.com/Kamaar) -**Compatibilità:** InvenTree 1.1.3 → 1.7 -**Versione plugin:** 1.7 +Generate progressive batch codes for InvenTree `StockItem` records, with a +configurable format and persistent per-part / per-location counters. + +- **Author:** Simone Amadori +- **Plugin version:** 2.0.0 +- **Requires:** InvenTree 1.0.0 or newer (developed against 1.5.2) --- -## Descrizione +## What it does -BatchCodePlugin genera automaticamente **codici batch numerici progressivi** per ogni nuovo `StockItem`. -Supporta: +The plugin implements the `generate_batch_code` hook of InvenTree's +`ValidationMixin`. InvenTree calls it whenever a batch code is required: -- Contatori separati per **parte** e/o **magazzino** -- Prefisso statico o derivato dalla **location** -- Formati personalizzabili con placeholders `{prefix}`, `{num}`, `{date}`, `{part}`, `{loc}` -- **Reset giornaliero** del contatore -- Pulsante manuale nella scheda StockItem (su InvenTree 1.2+) -- Logging dei batch generati +- when a new `StockItem` is created, +- from the *generate* action in the stock creation and receive forms, +- from `POST /api/stock/generate/batch-code/`, +- from this plugin's own panel on the stock item detail page. ---- +Each code is built from a format string and a counter. The counter lives in the +database (one row per scope), is advanced atomically, and does not depend on +how the code is formatted. -## Changelog +## Installation + +### Plugin manager + +Install `inventree-batchcode-plugin` from the InvenTree plugin manager +(Settings → Plugins → Install Plugin), then restart the server. + +### Command line + +```bash +pip install -U inventree-batchcode-plugin +``` + +### After installing + +1. **Enable the plugin** in Settings → Plugins. +2. **Restart the InvenTree server.** The plugin uses `AppMixin`, so it is loaded + as a Django application; this only happens at startup. +3. **Apply the database migration** that creates the counter table: + ```bash + invoke migrate + ``` + (or `python manage.py migrate batchcode_plugin` in a manual installation). + +Plugins must be enabled server-side for any of this to work — set +`plugins_enabled: True` in `config.yaml`, or `INVENTREE_PLUGINS_ENABLED=true`. + +## Configuration + +All settings live under Settings → Plugins → Batch Code Generator. + +| Setting | Default | Description | +| --- | --- | --- | +| `ENABLED` | `true` | Generate batch codes for new stock items | +| `CODE_FORMAT` | `{prefix}{date:%Y%m%d}{sep}{num:04d}` | Format string (see placeholders below) | +| `PREFIX` | `B` | Static prefix, used unless the location prefix is enabled | +| `SEPARATOR` | `-` | Value substituted for `{sep}` | +| `MIN_DIGITS` | `4` | Zero-padding applied to a bare `{num}` | +| `DAILY_RESET` | `false` | Restart the counter at 1 each day | +| `PER_PART` | `false` | Separate counter per part | +| `PER_LOCATION` | `false` | Separate counter per stock location | +| `USE_LOCATION_PREFIX` | `false` | Use a stock location field as the prefix | +| `LOCATION_FIELD` | `name` | Which location field: `name`, `pathstring` or `description` | +| `TRIGGER_MODE` | `always` | `always`, `on_receive` (purchase order receipts only) or `manual` | +| `SEED_FROM_EXISTING` | `true` | Raise the counter past numbers already present in existing batch codes | +| `MANUAL_BUTTON` | `true` | Show the generate button in the stock item panel | +| `MANUAL_BUTTON_ROLE` | `staff` | Who may generate manually: `all`, `staff` or `superuser` | + +### Format placeholders -### Versione 1.0 -- Generazione batch base -- Progressivo globale -- Prefisso fisso `B` -- Formato predefinito: `B{num:06d}` - -### Versione 1.1 -- Contatore separato per **parte** -- Formato numerico configurabile (`MIN_DIGITS`) -- Logging dei batch generati - -### Versione 1.2 -- Supporto `EventMixin` (1.2+) -- Parametri SETTINGS opzionali -- Pulsante manuale aggiunto nella UI - -### Versione 1.3 -- Reset giornaliero del contatore -- Compatibilità con batch per singola **location** -- Migliorata compatibilità con codici esistenti - -### Versione 1.4 -- Formato codice personalizzabile con data e placeholders -- Contatore progressivo aggiornato con regex per estrazione numerica - -### Versione 1.5 -- Campo target configurabile (`TARGET_FIELD`) -- Prefisso dinamico basato sulla location (`USE_LOCATION_PREFIX`, `LOCATION_FIELD`) -- Trigger mode configurabile (`always`, `on_receive`, `manual`) - -### Versione 1.6 -- Ruoli per pulsante manuale (`MANUAL_BUTTON_ROLE`) -- Logging tramite `logger.info` -- Bugfix compatibilità 1.1.3 - -### Versione 1.7 -- Compatibile con InvenTree 1.1.3 e 1.2+ -- Tutti i parametri SETTINGS presenti -- Pulsante manuale pienamente funzionante su 1.2+ -- Logging automatico e gestione eccezioni -- Versione stabile e completa - -### Versione 1.7.3 - -## Overview -The BatchCode plugin automatically generates sequential, formatted batch codes for StockItems in InvenTree. Compatible with versions 1.1.3 → 1.2+. - -### Features -- Automatic batch code generation on StockItem creation. -- Optional manual generation via Actions menu. -- Supports per-Part and per-Location sequential counters. -- Configurable prefix, date, and number formatting (`CODE_FORMAT`). -- Daily reset of counters. -- Multi-language ready (English plugin, Italian default locale). -- Logging of batch code generation. +`CODE_FORMAT` is a Python format string. Standard format specs work, so +`{num:06d}` and `{date:%y%W}` are both valid. + +| Placeholder | Value | +| --- | --- | +| `{prefix}` | `PREFIX`, or the location field if `USE_LOCATION_PREFIX` is set | +| `{num}` | The counter value, zero-padded to `MIN_DIGITS` | +| `{sep}` | `SEPARATOR` | +| `{date}` | Generation timestamp — supply a spec, e.g. `{date:%Y%m%d}` | +| `{part}` | Part name | +| `{ipn}` | Part IPN | +| `{loc}` | Stock location name | +| `{year}` `{month}` `{day}` `{week}` `{hour}` `{minute}` | Components of the generation time | + +A bare `{num}` inherits the `MIN_DIGITS` padding. If the format supplies its +own padding — `{num:06d}` — that wins and `MIN_DIGITS` is ignored. + +If the format string is invalid the plugin logs a warning and falls back to +`{prefix}{sep}{num}`, rather than failing the stock operation. Codes are +truncated to 100 characters, the maximum length of `StockItem.batch`. + +### Counter scope + +`PER_PART`, `PER_LOCATION` and `DAILY_RESET` decide how many counters exist. +With all three off there is one global sequence; with `PER_PART` on, each part +gets its own. The scopes are visible in the Django admin interface under +*Batch Counters*, where a sequence can also be inspected or reset by hand. + +Counter values are consumed when a code is **generated**, not when the stock +item is saved. Abandoning a part-filled stock form therefore leaves a gap in +the sequence. Codes are guaranteed unique and increasing, not gapless. + +## API + +Two endpoints are mounted under the plugin's URL namespace. Both require an +authenticated session. + +| Endpoint | Body | Effect | +| --- | --- | --- | +| `POST /plugin/batchcode/preview/` | `item`, `part`, `location` (all optional) | Returns the code which *would* be issued next. Does not advance the counter. | +| `POST /plugin/batchcode/generate/` | `item` (required), `overwrite` (default `false`) | Issues a code and saves it to the stock item. Requires `MANUAL_BUTTON_ROLE`. | + +## User interface + +- **Stock item panel** — shows the current batch code, previews the next one, + summarises the active configuration, and offers a *Generate and save* button + to users allowed by `MANUAL_BUTTON_ROLE`. +- **Plugin settings page** — renders a live preview of the configured format, + so a format can be checked before it is used. + +Panel strings are translated; the Italian catalog is complete, other locales +fall back to English. + +## Development + +The Python environment is managed with [uv](https://docs.astral.sh/uv/). + +```bash +uv sync # create .venv with the dev tooling +uv run ruff format . # format +uv run ruff check . # lint +uv run python -m build # build sdist + wheel +``` + +Frontend (see `frontend/README.md` for details): + +```bash +cd frontend +npm install +npm run translate # extract + compile message catalogs +npm run build # bundle into batchcode_plugin/static/ +npm run lint # biome +``` + +The compiled bundles in `batchcode_plugin/static/` are not committed, so +`npm run build` must run before packaging — the release workflow does this. + +This project was restructured with the +[InvenTree plugin creator](https://github.com/inventree/plugin-creator). --- -### Configuration -Available plugin settings: -- **TARGET_FIELD**: Field in StockItem where batch code is saved (`batch` by default). -- **CODE_FORMAT**: Batch code format using placeholders `{prefix}`, `{num}`, `{date}`, `{part}`, `{loc}`, `{sep}`. -- **PREFIX**: Static prefix if location prefix not used. -- **MIN_DIGITS**: Minimum digits for numeric part. -- **DAILY_RESET**: Reset counter daily. -- **PER_PART**: Separate counter per Part. -- **PER_LOCATION**: Separate counter per StockLocation. -- **TRIGGER_MODE**: `always`, `on_receive`, or `manual`. -- **USE_LOCATION_PREFIX**: Use StockLocation field as prefix. -- **LOCATION_FIELD**: Field from StockLocation to use as prefix. -- **INCLUDE_DATE**: Include date in code. -- **SEPARATOR**: Separator character. -- **ENABLED**: Enable/disable automatic batch code generation. -- **MANUAL_BUTTON**: Show manual generate button. -- **MANUAL_BUTTON_ROLE**: Who can use manual button (`all`, `staff`, `superuser`). - -### Usage -- Automatic generation occurs based on `TRIGGER_MODE`. -- Manual generation via Actions menu button if enabled. -- Preview codes can be logged for testing purposes. - -### Localization -- Plugin in English. -- Default locale in Italian. -- To add more translations, create `.po` files in `locale//LC_MESSAGES/` and compile to `.mo`. - -### Logging -Batch code generation logs are recorded via `inventree` logger: -```text -[BatchCodePlugin] Generated preview batch: B20251216-0001 +## Upgrading from 1.x + +Version 2.0.0 is a restructure onto the official plugin template. Existing +settings are preserved: the plugin slug is unchanged (`batchcode`), so stored +setting values are picked up as before. + +Breaking and behavioural changes: + +- **The plugin entry point moved** from `batchcode_plugin.plugin:BatchCodePlugin` + to `batchcode_plugin.core:BatchCodePlugin`. Installing the new distribution + handles this; a plugin installed by copying files must be replaced. +- **A database migration is now required** (see *After installing*). +- **`TARGET_FIELD` was removed.** The `generate_batch_code` hook returns a + string and InvenTree decides where it goes, which is always `StockItem.batch`. + Writing to an arbitrary field was never part of that contract. +- **`PER_PART`, `PER_LOCATION` and `USE_LOCATION_PREFIX` now work.** In 1.x the + hook read a `stock_item` keyword which InvenTree does not pass, so the part + and location were always empty and these three settings had no effect. +- **`DAILY_RESET` now resets the counter itself**, rather than filtering + existing codes for today's date. It no longer requires the date to appear in + `CODE_FORMAT`. +- **`MIN_DIGITS` now applies to normal output**, not only to the error fallback. +- **`TRIGGER_MODE=on_receive`** now means "only when a purchase order is part of + the request", which is what the hook context actually exposes. +- **The counter is persisted** instead of being derived from existing batch + codes on every call. `SEED_FROM_EXISTING` (on by default) keeps the first + code issued after the upgrade above whatever numbers are already in use; + it can be turned off once the sequence has caught up. +- **`INCLUDE_DATE`** was documented in 1.x but never implemented. Put `{date}` + in `CODE_FORMAT` instead. +## Changelog +### 2.0.0 +- Restructured onto the official InvenTree plugin creator template +- Persistent, atomically incremented counters (`AppMixin` + `BatchCounter` model) +- Correct handling of the `generate_batch_code` hook context +- React panel for the stock item page and a live preview on the settings page +- Preview and generate REST endpoints (`UrlsMixin`) +- uv-managed Python environment, ruff formatting and linting, GitHub Actions CI +- Removed `TARGET_FIELD`; see *Upgrading from 1.x* + +### 1.7 +- Compatible with InvenTree 1.1.3 and 1.2+ +- All SETTINGS parameters present +- Manual button functional on 1.2+ +- Automatic logging and exception handling + +### 1.6 +- Roles for the manual button (`MANUAL_BUTTON_ROLE`) +- Logging via `logger.info` +- Compatibility fixes for 1.1.3 + +### 1.5 +- Configurable target field (`TARGET_FIELD`) +- Location-derived prefix (`USE_LOCATION_PREFIX`, `LOCATION_FIELD`) +- Configurable trigger mode (`always`, `on_receive`, `manual`) + +### 1.4 +- Customisable code format with date and placeholders +- Progressive counter extracted from existing codes by regex + +### 1.3 +- Daily counter reset +- Per-location batch codes +- Improved compatibility with existing codes + +### 1.2 +- `EventMixin` support (1.2+) +- Optional SETTINGS parameters +- Manual button added to the UI + +### 1.1 +- Per-part counter +- Configurable number format (`MIN_DIGITS`) +- Logging of generated batches + +### 1.0 +- Basic batch generation, global counter, fixed prefix `B` +- Default format `B{num:06d}` + +## License + +MIT — see [LICENSE](LICENSE). diff --git a/batchcode_plugin/.gitignore b/batchcode_plugin/.gitignore new file mode 100644 index 0000000..f99b298 --- /dev/null +++ b/batchcode_plugin/.gitignore @@ -0,0 +1,2 @@ +# static files are generated from ../frontend directory +static diff --git a/batchcode_plugin/__init__.py b/batchcode_plugin/__init__.py index 55ddd19..90fc5bc 100644 --- a/batchcode_plugin/__init__.py +++ b/batchcode_plugin/__init__.py @@ -1,2 +1,3 @@ -# file: batchcode_plugin/__init__.py -# Può rimanere vuoto, serve solo per definire il pacchetto +"""BatchCodePlugin - progressive batch code generation for InvenTree.""" + +PLUGIN_VERSION = '2.0.0' diff --git a/batchcode_plugin/admin.py b/batchcode_plugin/admin.py new file mode 100644 index 0000000..e0d0780 --- /dev/null +++ b/batchcode_plugin/admin.py @@ -0,0 +1,20 @@ +"""Admin site configuration for the BatchCodePlugin plugin.""" + +from django.contrib import admin + +from .models import BatchCounter + + +@admin.register(BatchCounter) +class BatchCounterAdmin(admin.ModelAdmin): + """Admin interface for BatchCounter. + + Counters are created and advanced by the plugin. The main reason to reach + for this interface is to inspect a sequence, or to reset one by hand. + """ + + list_display = ('key', 'value', 'part', 'location', 'period', 'updated') + list_filter = ('period',) + search_fields = ('key',) + readonly_fields = ('key', 'part', 'location', 'period', 'updated') + autocomplete_fields = () diff --git a/batchcode_plugin/apps.py b/batchcode_plugin/apps.py new file mode 100644 index 0000000..8c24070 --- /dev/null +++ b/batchcode_plugin/apps.py @@ -0,0 +1,10 @@ +"""Django config for the BatchCodePlugin plugin.""" + +from django.apps import AppConfig + + +class BatchCodePluginConfig(AppConfig): + """Config class for the BatchCodePlugin plugin.""" + + name = 'batchcode_plugin' + verbose_name = 'Batch Code Generator' diff --git a/batchcode_plugin/core.py b/batchcode_plugin/core.py new file mode 100644 index 0000000..c4893d0 --- /dev/null +++ b/batchcode_plugin/core.py @@ -0,0 +1,456 @@ +"""Generate progressive batch codes for StockItems. + +The plugin implements the ``generate_batch_code`` hook of InvenTree's +ValidationMixin. InvenTree calls it whenever a batch code is required - on +StockItem creation, from the "generate" action in stock forms, and from the +``/api/stock/generate/batch-code/`` endpoint. +""" + +import logging +import re +import string + +from django.core.validators import MaxValueValidator, MinValueValidator +from django.utils.translation import gettext_lazy as _ +from plugin import InvenTreePlugin +from plugin.mixins import ( + AppMixin, + SettingsMixin, + UrlsMixin, + UserInterfaceMixin, + ValidationMixin, +) + +from . import PLUGIN_VERSION +from .models import BATCH_CODE_MAX_LENGTH, BatchCounter + +logger = logging.getLogger('inventree') + +# Trailing digit group of an existing batch code, used to seed counters +TRAILING_NUMBER = re.compile(r'(\d+)$') + +# A bare '{num}' placeholder, to which MIN_DIGITS padding is applied +BARE_NUM = re.compile(r'\{num\}') + + +class BatchCodePlugin( + AppMixin, + SettingsMixin, + UrlsMixin, + UserInterfaceMixin, + ValidationMixin, + InvenTreePlugin, +): + """BatchCodePlugin - progressive batch code generation for InvenTree.""" + + # Plugin metadata + TITLE = 'Batch Code Generator' + NAME = 'BatchCodePlugin' + # The slug keys every stored setting and the plugin API URLs: do not change it + SLUG = 'batchcode' + DESCRIPTION = ( + 'Generate progressive batch codes for StockItems, with a configurable ' + 'format and persistent per-part / per-location counters.' + ) + VERSION = PLUGIN_VERSION + + # Additional project information + AUTHOR = 'Simone Amadori' + WEBSITE = 'https://github.com/Kamaar/inventree-batchcode-plugin' + LICENSE = 'MIT' + + MIN_VERSION = '1.0.0' + + # Render custom UI elements to the plugin settings page + ADMIN_SOURCE = 'Settings.js:RenderPluginSettings' + + # Plugin settings (from SettingsMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/settings/ + SETTINGS = { + 'ENABLED': { + 'name': _('Enabled'), + 'description': _('Generate batch codes for new stock items'), + 'validator': bool, + 'default': True, + }, + 'CODE_FORMAT': { + 'name': _('Code Format'), + 'description': _( + 'Batch code format. Placeholders: {prefix}, {num}, {sep}, {date}, ' + '{part}, {ipn}, {loc}, {year}, {month}, {day}, {week}' + ), + 'default': '{prefix}{date:%Y%m%d}{sep}{num:04d}', + }, + 'PREFIX': { + 'name': _('Prefix'), + 'description': _( + 'Static prefix, used unless the location prefix is enabled' + ), + 'default': 'B', + }, + 'SEPARATOR': { + 'name': _('Separator'), + 'description': _('Value substituted for the {sep} placeholder'), + 'default': '-', + }, + 'MIN_DIGITS': { + 'name': _('Minimum digits'), + 'description': _( + 'Zero-padding applied to a bare {num} placeholder. Ignored if the ' + 'format specifies its own padding, e.g. {num:06d}' + ), + 'validator': [int, MinValueValidator(1), MaxValueValidator(12)], + 'default': 4, + }, + 'DAILY_RESET': { + 'name': _('Daily reset'), + 'description': _('Restart the counter at 1 each day'), + 'validator': bool, + 'default': False, + }, + 'PER_PART': { + 'name': _('Per part counter'), + 'description': _('Maintain a separate counter for each part'), + 'validator': bool, + 'default': False, + }, + 'PER_LOCATION': { + 'name': _('Per location counter'), + 'description': _('Maintain a separate counter for each stock location'), + 'validator': bool, + 'default': False, + }, + 'USE_LOCATION_PREFIX': { + 'name': _('Use location prefix'), + 'description': _( + 'Use a stock location field as the prefix, instead of PREFIX' + ), + 'validator': bool, + 'default': False, + }, + 'LOCATION_FIELD': { + 'name': _('Location field'), + 'description': _('Stock location field used as the prefix'), + 'default': 'name', + 'choices': [ + ('name', _('Name')), + ('pathstring', _('Full path')), + ('description', _('Description')), + ], + }, + 'TRIGGER_MODE': { + 'name': _('Trigger mode'), + 'description': _('Which requests this plugin responds to'), + 'default': 'always', + 'choices': [ + ('always', _('Always')), + ('on_receive', _('Purchase order receipt only')), + ('manual', _('Manual only')), + ], + }, + 'SEED_FROM_EXISTING': { + 'name': _('Seed from existing codes'), + 'description': _( + 'Before issuing a code, raise the counter past any higher number ' + 'already present in existing batch codes. Keep enabled when ' + 'upgrading from plugin version 1.x' + ), + 'validator': bool, + 'default': True, + }, + 'MANUAL_BUTTON': { + 'name': _('Manual button'), + 'description': _('Show the generate button in the stock item panel'), + 'validator': bool, + 'default': True, + }, + 'MANUAL_BUTTON_ROLE': { + 'name': _('Manual button role'), + 'description': _('Who may generate a batch code manually'), + 'default': 'staff', + 'choices': [ + ('all', _('All users')), + ('staff', _('Staff only')), + ('superuser', _('Superuser only')), + ], + }, + } + + # ------------------------------------------------------------------ + # Code construction + # ------------------------------------------------------------------ + def resolve_prefix(self, location=None) -> str: + """Return the prefix to use, honouring USE_LOCATION_PREFIX.""" + prefix = self.get_setting('PREFIX') or '' + + if not self.get_setting('USE_LOCATION_PREFIX') or location is None: + return prefix + + field = self.get_setting('LOCATION_FIELD') or 'name' + value = getattr(location, field, None) + + return str(value) if value else prefix + + def counter_scope(self, part=None, location=None, date=None) -> dict: + """Return the counter scope implied by the current settings.""" + scope = {'part': None, 'location': None, 'period': ''} + + if self.get_setting('PER_PART'): + scope['part'] = part + + if self.get_setting('PER_LOCATION'): + scope['location'] = location + + if self.get_setting('DAILY_RESET') and date is not None: + scope['period'] = date.strftime('%Y%m%d') + + return scope + + def seed_value(self, scope: dict) -> int: + """Highest number already used by existing batch codes in this scope. + + Guards against reissuing codes which predate the persistent counter - + for instance after upgrading from plugin version 1.x, where the counter + was derived from the stock table on every call. + """ + if not self.get_setting('SEED_FROM_EXISTING'): + return 0 + + from stock.models import StockItem + + items = StockItem.objects.exclude(batch__isnull=True).exclude(batch='') + + if scope.get('part'): + items = items.filter(part=scope['part']) + + if scope.get('location'): + items = items.filter(location=scope['location']) + + if scope.get('period'): + items = items.filter(batch__contains=scope['period']) + + # Only recent codes can plausibly hold the highest counter, and the + # number is not necessarily sortable as a string - so scan a window of + # recent codes and take the true maximum of their trailing digits. + codes = items.order_by('-pk').values_list('batch', flat=True)[:250] + + best = 0 + + for code in codes: + match = TRAILING_NUMBER.search(str(code)) + if match: + best = max(best, int(match.group(1))) + + return best + + def format_context(self, prefix: str, number: int, **kwargs) -> dict: + """Build the mapping made available to CODE_FORMAT. + + Only plain strings, integers and the date are exposed. Passing model + instances would let a format string reach into their attributes. + """ + part = kwargs.get('part') + location = kwargs.get('location') + date = kwargs.get('date') + + return { + 'prefix': prefix, + 'num': number, + 'sep': self.get_setting('SEPARATOR') or '', + 'date': date, + 'part': getattr(part, 'name', '') or '', + 'ipn': getattr(part, 'IPN', '') or '', + 'loc': getattr(location, 'name', '') or '', + 'year': kwargs.get('year') or (date.year if date else ''), + 'month': kwargs.get('month') or (date.month if date else ''), + 'day': kwargs.get('day') or (date.day if date else ''), + 'hour': kwargs.get('hour', ''), + 'minute': kwargs.get('minute', ''), + 'week': kwargs.get('week', ''), + } + + def render_code(self, prefix: str, number: int, **kwargs) -> str: + """Render CODE_FORMAT for the given prefix and counter value.""" + fmt = self.get_setting('CODE_FORMAT') or '{prefix}{sep}{num}' + min_digits = int(self.get_setting('MIN_DIGITS') or 4) + + # A bare {num} inherits the MIN_DIGITS padding; an explicit spec wins + fmt = BARE_NUM.sub(f'{{num:0{min_digits}d}}', fmt) + + context = self.format_context(prefix, number, **kwargs) + + try: + code = string.Formatter().vformat(fmt, (), context) + except Exception as exc: + logger.warning( + 'BatchCodePlugin: invalid CODE_FORMAT %r (%s) - using fallback', + fmt, + exc, + ) + code = f'{prefix}{context["sep"]}{str(number).zfill(min_digits)}' + + return code.strip()[:BATCH_CODE_MAX_LENGTH] + + # ------------------------------------------------------------------ + # Generation + # ------------------------------------------------------------------ + def wants_to_generate(self, **kwargs) -> bool: + """Whether TRIGGER_MODE allows responding to this request.""" + if not self.get_setting('ENABLED'): + return False + + # An explicit request through this plugin's own endpoint always applies + if kwargs.get('force'): + return True + + mode = self.get_setting('TRIGGER_MODE') + + if mode == 'manual': + return False + + if mode == 'on_receive': + return kwargs.get('purchase_order') is not None + + return True + + def extract_targets(self, **kwargs) -> tuple: + """Resolve (part, location, date) from the hook context. + + InvenTree passes 'item', 'part' and 'location' independently (see + stock/serializers.py: GenerateBatchCodeSerializer), so fall back to the + stock item's own part and location where they were not given. + """ + item = kwargs.get('item') + + part = kwargs.get('part') or getattr(item, 'part', None) + location = kwargs.get('location') or getattr(item, 'location', None) + + date = kwargs.get('date') + + if date is None: + from InvenTree.helpers import current_time + + date = current_time() + + return part, location, date + + def build_code(self, commit: bool = True, **kwargs) -> str: + """Produce a batch code. + + Args: + commit: When True the counter is advanced, so the code is reserved. + When False the next value is only previewed, leaving the + counter untouched. + **kwargs: Generation context, as described in + :meth:`generate_batch_code`. + + Returns: + The rendered batch code. + """ + part, location, date = self.extract_targets(**kwargs) + + scope = self.counter_scope(part=part, location=location, date=date) + key = BatchCounter.build_key(**scope) + seed = self.seed_value(scope) + + if commit: + number = BatchCounter.advance(key, seed=seed, **scope) + else: + number = BatchCounter.peek(key, seed=seed) + + kwargs['part'] = part + kwargs['location'] = location + kwargs['date'] = date + + return self.render_code(self.resolve_prefix(location), number, **kwargs) + + def preview_code(self, **kwargs) -> str: + """Render the code which would be issued next, without consuming it.""" + return self.build_code(commit=False, **kwargs) + + # ------------------------------------------------------------------ + # Custom data validation (from ValidationMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/validation/ + # ------------------------------------------------------------------ + def generate_batch_code(self, **kwargs): + """Generate a new StockItem batch code. + + Called by stock.generators.generate_batch_code with the context + defined there: date, year, month, day, hour, minute, week, plus the + caller's own kwargs (item, part, location, quantity, build_order, + purchase_order). Returning None hands the request to the next plugin, + and finally to InvenTree's own STOCK_BATCH_CODE_TEMPLATE. + """ + if not self.wants_to_generate(**kwargs): + return None + + code = self.build_code(commit=True, **kwargs) + + if not code: + return None + + logger.info('BatchCodePlugin: generated batch code %s', code) + + return code + + # ------------------------------------------------------------------ + # Custom URL endpoints (from UrlsMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/urls/ + # ------------------------------------------------------------------ + def setup_urls(self): + """Configure custom URL endpoints for this plugin.""" + from django.urls import path + + from .views import GenerateBatchCodeView, PreviewBatchCodeView + + return [ + path('preview/', PreviewBatchCodeView.as_view(), name='batchcode-preview'), + path( + 'generate/', + GenerateBatchCodeView.as_view(), + name='batchcode-generate', + ), + ] + + # ------------------------------------------------------------------ + # User interface elements (from UserInterfaceMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/ui/ + # ------------------------------------------------------------------ + def user_can_generate(self, user) -> bool: + """Whether the given user satisfies MANUAL_BUTTON_ROLE.""" + if not user or not user.is_authenticated: + return False + + if not self.get_setting('MANUAL_BUTTON'): + return False + + role = self.get_setting('MANUAL_BUTTON_ROLE') + + if role == 'superuser': + return bool(user.is_superuser) + + if role == 'staff': + return bool(user.is_staff) + + return True + + def get_ui_panels(self, request, context: dict, **kwargs): + """Return the batch code panel, for stock item detail pages.""" + if context.get('target_model') != 'stockitem': + return [] + + return [ + { + 'key': 'batchcode-panel', + 'title': 'Batch Code', + 'description': 'Preview and generate a batch code for this stock item', + 'icon': 'ti:hash:outline', + 'source': self.plugin_static_file( + 'Panel.js:RenderBatchCodePluginPanel' + ), + 'context': { + 'settings': self.get_settings_dict(), + 'can_generate': self.user_can_generate(request.user), + }, + } + ] diff --git a/batchcode_plugin/migrations/0001_initial.py b/batchcode_plugin/migrations/0001_initial.py new file mode 100644 index 0000000..17ed407 --- /dev/null +++ b/batchcode_plugin/migrations/0001_initial.py @@ -0,0 +1,87 @@ +"""Initial migration for the BatchCodePlugin plugin.""" + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Create the BatchCounter model.""" + + initial = True + + dependencies = [('part', '__first__'), ('stock', '__first__')] + + operations = [ + migrations.CreateModel( + name='BatchCounter', + fields=[ + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'key', + models.CharField( + editable=False, + help_text='Encoded scope this counter applies to', + max_length=250, + unique=True, + verbose_name='Scope Key', + ), + ), + ( + 'value', + models.PositiveIntegerField( + default=0, + help_text='Last value issued for this scope', + verbose_name='Value', + ), + ), + ( + 'period', + models.CharField( + blank=True, + help_text='Reset period this counter belongs to (empty if never reset)', + max_length=16, + verbose_name='Period', + ), + ), + ( + 'updated', + models.DateTimeField(auto_now=True, verbose_name='Updated'), + ), + ( + 'location', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='stock.stocklocation', + verbose_name='Location', + ), + ), + ( + 'part', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='part.part', + verbose_name='Part', + ), + ), + ], + options={ + 'verbose_name': 'Batch Counter', + 'verbose_name_plural': 'Batch Counters', + 'ordering': ['key'], + }, + ) + ] diff --git a/batchcode_plugin/migrations/__init__.py b/batchcode_plugin/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/batchcode_plugin/models.py b/batchcode_plugin/models.py new file mode 100644 index 0000000..334984a --- /dev/null +++ b/batchcode_plugin/models.py @@ -0,0 +1,148 @@ +"""Database models for the BatchCodePlugin plugin. + +A single model is defined: :class:`BatchCounter`, which persists one monotonic +counter per *scope*. A scope is the combination of the settings-driven +discriminators (part, location, reset period), encoded into ``key``. + +Persisting the counter - rather than deriving it from existing batch codes - +means the sequence is independent of the code format, and can be incremented +atomically under concurrent stock creation. +""" + +from django.contrib.auth.models import User +from django.db import IntegrityError, models, transaction +from django.utils.translation import gettext_lazy as _ + +# Maximum length of StockItem.batch in InvenTree core +BATCH_CODE_MAX_LENGTH = 100 + + +class BatchCounter(models.Model): + """A persistent, monotonically increasing counter for one batch code scope.""" + + class Meta: + """Meta options for the model.""" + + app_label = 'batchcode_plugin' + verbose_name = _('Batch Counter') + verbose_name_plural = _('Batch Counters') + ordering = ['key'] + + key = models.CharField( + max_length=250, + unique=True, + editable=False, + verbose_name=_('Scope Key'), + help_text=_('Encoded scope this counter applies to'), + ) + + value = models.PositiveIntegerField( + default=0, + verbose_name=_('Value'), + help_text=_('Last value issued for this scope'), + ) + + # The following fields are denormalized copies of the scope, kept for + # readability in the admin interface. 'key' is the authoritative constraint: + # a unique_together over nullable FKs would not be enforced, as NULL != NULL. + part = models.ForeignKey( + 'part.Part', + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name='+', + verbose_name=_('Part'), + ) + + location = models.ForeignKey( + 'stock.StockLocation', + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name='+', + verbose_name=_('Location'), + ) + + period = models.CharField( + max_length=16, + blank=True, + verbose_name=_('Period'), + help_text=_('Reset period this counter belongs to (empty if never reset)'), + ) + + updated = models.DateTimeField(auto_now=True, verbose_name=_('Updated')) + + def __str__(self): + """Human readable representation.""" + return f'{self.key} = {self.value}' + + @classmethod + def check_user_permission(cls, user: User, permission: str) -> bool: + """Determine whether a user may act on this model. + + InvenTree denies every permission for plugin models which do not + implement this method, so it must be provided explicitly. + + Counters are internal bookkeeping: readable by any authenticated user, + writable only by staff (via the admin interface). + """ + if not user or not user.is_authenticated: + return False + + if permission == 'view': + return True + + return bool(user.is_staff) + + @classmethod + def build_key(cls, part=None, location=None, period: str = '') -> str: + """Encode a scope into a stable, unique key.""" + return '|'.join( + [ + f'part={part.pk if part else ""}', + f'loc={location.pk if location else ""}', + f'period={period or ""}', + ] + ) + + @classmethod + def peek(cls, key: str, seed: int = 0) -> int: + """Return the value the next call to :meth:`advance` would issue. + + Does not modify any state - used for previewing a code. + """ + current = cls.objects.filter(key=key).values_list('value', flat=True).first() + return max(current or 0, seed) + 1 + + @classmethod + def advance(cls, key: str, seed: int = 0, **scope) -> int: + """Atomically issue the next value for the given scope. + + Args: + key: Scope key, as built by :meth:`build_key`. + seed: Floor for the counter, applied on every call. Used to carry + over sequences from batch codes which already exist in the + database, so that an upgrade from a derived counter does not + reissue codes which are already in use. + scope: Denormalized scope fields (part, location, period) stored on + creation for readability. + + Returns: + The newly issued counter value. + """ + with transaction.atomic(): + try: + counter, _created = cls.objects.get_or_create( + key=key, defaults={'value': 0, **scope} + ) + except IntegrityError: + # Concurrent create won the race; the row now exists + counter = cls.objects.get(key=key) + + # Re-read under a row lock, so concurrent writers serialize here + counter = cls.objects.select_for_update().get(pk=counter.pk) + + counter.value = max(counter.value, seed) + 1 + counter.save(update_fields=['value', 'updated']) + + return counter.value diff --git a/batchcode_plugin/plugin.json b/batchcode_plugin/plugin.json deleted file mode 100644 index b361e55..0000000 --- a/batchcode_plugin/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "batchcode", - "version": "1.7.0", - "author": "Simone Amadori", - "description": "Batch Code Generator plugin", - "url": "https://github.com/simoneamadori/inventree_batchcode_plugin", - "public": true -} diff --git a/batchcode_plugin/plugin.py b/batchcode_plugin/plugin.py deleted file mode 100644 index dde898f..0000000 --- a/batchcode_plugin/plugin.py +++ /dev/null @@ -1,209 +0,0 @@ -# batchcode_plugin/plugin.py - -from typing import Optional -import logging -import re - -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.core.validators import MinValueValidator, MaxValueValidator - -from plugin import InvenTreePlugin -from plugin.mixins import SettingsMixin, ValidationMixin -from stock.models import StockItem - -logger = logging.getLogger("inventree") - - -class BatchCodePlugin(SettingsMixin, ValidationMixin, InvenTreePlugin): - """ - Batch Code Plugin - Version 1.7.3 – Stable - Compatible with InvenTree 1.1.3 → 1.2+ - """ - - NAME = "BatchCodePlugin" - SLUG = "batchcode" - TITLE = "Batch Code Generator" - DESCRIPTION = _("Generate progressive batch codes with preview and manual action support.") - VERSION = "1.7.3" - AUTHOR = "Simone Amadori" - - SETTINGS = { - "TARGET_FIELD": { - "name": _("Target Field"), - "description": _("StockItem field where the generated code will be stored"), - "default": "batch", - }, - "CODE_FORMAT": { - "name": _("Code Format"), - "description": _( - "Batch code format. Placeholders: " - "{prefix}, {num}, {date}, {part}, {loc}, {sep}. " - "Example: {prefix}{date:%Y%m%d}{sep}{num:04d}" - ), - "default": "{prefix}{date:%Y%m%d}{sep}{num:04d}", - }, - "PREFIX": { - "name": _("Prefix"), - "description": _("Static prefix used if location prefix is disabled"), - "default": "B", - }, - "SEPARATOR": { - "name": _("Separator"), - "description": _("Separator between components"), - "default": "-", - }, - "MIN_DIGITS": { - "name": _("Minimum digits"), - "description": _("Minimum digits for numeric counter"), - "default": 4, - "validator": [int, MinValueValidator(1), MaxValueValidator(12)], - }, - "DAILY_RESET": { - "name": _("Daily reset"), - "description": _("Reset counter every day (based on date embedded in code)"), - "validator": bool, - "default": False, - }, - "PER_PART": { - "name": _("Per part counter"), - "description": _("Maintain a separate counter for each Part"), - "validator": bool, - "default": False, - }, - "PER_LOCATION": { - "name": _("Per location counter"), - "description": _("Maintain a separate counter for each StockLocation"), - "validator": bool, - "default": False, - }, - "USE_LOCATION_PREFIX": { - "name": _("Use location prefix"), - "description": _("Use a StockLocation field as prefix"), - "validator": bool, - "default": False, - }, - "LOCATION_FIELD": { - "name": _("Location field"), - "description": _("StockLocation field used as prefix (name, code, etc.)"), - "default": "name", - }, - "TRIGGER_MODE": { - "name": _("Trigger mode"), - "description": _("When the batch code should be generated"), - "default": "always", - "choices": [ - ("always", _("Always")), - ("on_receive", _("On purchase receive")), - ("manual", _("Manual only")), - ], - }, - "ENABLED": { - "name": _("Enabled"), - "description": _("Enable automatic batch generation"), - "validator": bool, - "default": True, - }, - "MANUAL_BUTTON": { - "name": _("Manual button"), - "description": _("Show manual generate button in StockItem actions"), - "validator": bool, - "default": True, - }, - "MANUAL_BUTTON_ROLE": { - "name": _("Manual button role"), - "description": _("Who can use the manual button"), - "default": "staff", - "choices": [ - ("all", _("All users")), - ("staff", _("Staff only")), - ("superuser", _("Superuser only")), - ], - }, - } - - # --------------------------------------------------------------------- - # Official InvenTree hook - # --------------------------------------------------------------------- - def generate_batch_code(self, **kwargs) -> Optional[str]: - """ - Called by InvenTree when a batch code is required. - Supports preview, auto-generation and manual generation. - """ - - if not self.get_setting("ENABLED", True): - return None - - trigger = self.get_setting("TRIGGER_MODE", "always") - if trigger == "manual" and not kwargs.get("force", False): - return None - - stock_item = kwargs.get("stock_item") - part = getattr(stock_item, "part", None) if stock_item else None - location = getattr(stock_item, "location", None) if stock_item else None - - prefix = self.get_setting("PREFIX", "B") - if self.get_setting("USE_LOCATION_PREFIX", False) and location: - prefix = getattr(location, self.get_setting("LOCATION_FIELD", "name"), prefix) or prefix - - sep = self.get_setting("SEPARATOR", "-") - fmt = self.get_setting("CODE_FORMAT") - min_digits = int(self.get_setting("MIN_DIGITS", 4)) - target = self.get_setting("TARGET_FIELD", "batch") - - qs = StockItem.objects.exclude(**{f"{target}__isnull": True}).exclude(**{target: ""}) - - if self.get_setting("PER_PART", False) and part: - qs = qs.filter(part=part) - - if self.get_setting("PER_LOCATION", False) and location: - qs = qs.filter(location=location) - - today = timezone.now().strftime("%Y%m%d") - - if self.get_setting("DAILY_RESET", False): - qs = qs.filter(**{f"{target}__contains": today}) - - last_code = qs.order_by(f"-{target}").values_list(target, flat=True).first() - - counter = 1 - if last_code: - m = re.search(r"(\d+)$", str(last_code)) - if m: - counter = int(m.group(1)) + 1 - - now = timezone.now() - - try: - code = fmt.format( - prefix=prefix, - num=counter, - date=now, - part=getattr(part, "name", ""), - loc=getattr(location, "name", ""), - sep=sep, - ) - except Exception as exc: - logger.error("BatchCodePlugin format error: %s", exc) - code = f"{prefix}{sep}{str(counter).zfill(min_digits)}" - - return code - - # --------------------------------------------------------------------- - # Manual action (InvenTree 1.2+) - # --------------------------------------------------------------------- - def plugin_actions(self): - if not self.get_setting("MANUAL_BUTTON", True): - return [] - - return [ - { - "name": "generate_batch_code", - "title": _("Generate batch code"), - "description": _("Generate a batch code for this StockItem"), - "endpoint": "manual_batch_code", - "method": "POST", - "role": self.get_setting("MANUAL_BUTTON_ROLE", "staff"), - } - ] diff --git a/batchcode_plugin/serializers.py b/batchcode_plugin/serializers.py new file mode 100644 index 0000000..8cfd472 --- /dev/null +++ b/batchcode_plugin/serializers.py @@ -0,0 +1,105 @@ +"""API serializers for the BatchCodePlugin plugin. + +Request and response are separate serializers on purpose. A single serializer +with a read_only 'batch_code' field cannot carry the code back out: read_only +fields are excluded from validated_data, so re-serializing the request instance +would silently drop it from the response. +""" + +from rest_framework import serializers + + +class BatchCodeResponseSerializer(serializers.Serializer): + """A generated or previewed batch code.""" + + class Meta: + """Meta options for this serializer.""" + + fields = ['batch_code'] + + batch_code = serializers.CharField( + label='Batch Code', help_text='The generated batch code' + ) + + +class PreviewBatchCodeSerializer(serializers.Serializer): + """Context for previewing the next batch code. + + A preview never consumes a counter value, so the same input renders the + same code until a code is actually generated for that scope. + """ + + class Meta: + """Meta options for this serializer.""" + + fields = ['item', 'part', 'location'] + + item = serializers.PrimaryKeyRelatedField( + queryset=None, + required=False, + allow_null=True, + label='Stock Item', + help_text='Stock item to preview a batch code for', + ) + + part = serializers.PrimaryKeyRelatedField( + queryset=None, + required=False, + allow_null=True, + label='Part', + help_text='Part to preview a batch code for', + ) + + location = serializers.PrimaryKeyRelatedField( + queryset=None, + required=False, + allow_null=True, + label='Location', + help_text='Stock location to preview a batch code for', + ) + + def __init__(self, *args, **kwargs): + """Attach the querysets lazily. + + The InvenTree models cannot be imported at module import time, as this + module is loaded while the plugin registry is still being built. + """ + super().__init__(*args, **kwargs) + + from part.models import Part + from stock.models import StockItem, StockLocation + + self.fields['item'].queryset = StockItem.objects.all() + self.fields['part'].queryset = Part.objects.all() + self.fields['location'].queryset = StockLocation.objects.all() + + +class GenerateBatchCodeSerializer(serializers.Serializer): + """Request to generate a batch code and save it onto a stock item.""" + + class Meta: + """Meta options for this serializer.""" + + fields = ['item', 'overwrite'] + + item = serializers.PrimaryKeyRelatedField( + queryset=None, + required=True, + label='Stock Item', + help_text='Stock item to assign a batch code to', + ) + + overwrite = serializers.BooleanField( + required=False, + default=False, + label='Overwrite', + help_text='Replace an existing batch code on this stock item', + ) + + def __init__(self, *args, **kwargs): + """Attach the stock item queryset lazily.""" + super().__init__(*args, **kwargs) + + from stock.models import StockItem + + self.fields['item'].queryset = StockItem.objects.all() diff --git a/batchcode_plugin/urls.py b/batchcode_plugin/urls.py deleted file mode 100644 index 98d2ae3..0000000 --- a/batchcode_plugin/urls.py +++ /dev/null @@ -1,59 +0,0 @@ -# batchcode_plugin/urls.py -from django.urls import path -from rest_framework.decorators import api_view, permission_classes -from rest_framework.permissions import IsAuthenticated -from rest_framework.response import Response - -from .plugin import BatchCodePlugin -from stock.models import StockItem - -@api_view(["POST"]) -@permission_classes([IsAuthenticated]) -def preview(request): - """ - POST /api/plugins/batchcode/preview/ - body: { part: ?, location: ?, prefix: ?, code_format: ? } - returns: {"batch_code": "..."} - """ - plugin = BatchCodePlugin() - data = request.data or {} - # Allow preview by passing part/location/name etc. - batch = plugin.generate_batch_code(**data) - if batch is None: - return Response({"detail": "Could not generate batch"}, status=400) - return Response({"batch_code": batch}) - -@api_view(["POST"]) -@permission_classes([IsAuthenticated]) -def manual(request): - """ - POST /api/plugins/batchcode/manual/ - body: { id: } - requires permission: user must be allowed by plugin setting (handled on frontend too) - """ - plugin = BatchCodePlugin() - item_id = request.data.get("id") or request.query_params.get("id") - if not item_id: - return Response({"detail": "Missing stockitem id"}, status=400) - try: - stock_item = StockItem.objects.get(pk=item_id) - except StockItem.DoesNotExist: - return Response({"detail": "StockItem not found"}, status=404) - - # check role - role = plugin.get_setting("MANUAL_BUTTON_ROLE", "staff") - user = request.user - if role == "superuser" and not user.is_superuser: - return Response({"detail": "Permission denied"}, status=403) - if role == "staff" and not user.is_staff: - return Response({"detail": "Permission denied"}, status=403) - - code = plugin.manual_generate_and_save(stock_item) - if not code: - return Response({"detail": "Could not generate batch"}, status=400) - return Response({"batch_code": code}) - -urlpatterns = [ - path("preview/", preview, name="batchcode_preview"), - path("manual/", manual, name="batchcode_manual"), -] diff --git a/batchcode_plugin/views.py b/batchcode_plugin/views.py new file mode 100644 index 0000000..2e8c2c7 --- /dev/null +++ b/batchcode_plugin/views.py @@ -0,0 +1,107 @@ +"""API views for the BatchCodePlugin plugin. + +Mounted by :meth:`BatchCodePlugin.setup_urls` under +``/plugin/batchcode/`` - see the UrlsMixin documentation. +""" + +from django.utils.translation import gettext_lazy as _ +from rest_framework import permissions +from rest_framework.exceptions import PermissionDenied, ValidationError +from rest_framework.response import Response +from rest_framework.views import APIView + +from .serializers import ( + BatchCodeResponseSerializer, + GenerateBatchCodeSerializer, + PreviewBatchCodeSerializer, +) + + +def get_plugin(): + """Return the registered plugin instance. + + Instantiating the plugin class directly would bypass the registry, and its + settings would not resolve against the database. + """ + from plugin.registry import registry + + plugin = registry.get_plugin('batchcode') + + if plugin is None: + raise ValidationError(_('The BatchCode plugin is not active')) + + return plugin + + +class PreviewBatchCodeView(APIView): + """Render the batch code which would be issued next. + + This does not advance the counter, so it is safe to call repeatedly - for + instance to show a live preview while settings are being edited. + """ + + permission_classes = [permissions.IsAuthenticated] + serializer_class = PreviewBatchCodeSerializer + + def post(self, request, *args, **kwargs): + """Preview a batch code for the supplied context.""" + plugin = get_plugin() + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + + data = serializer.validated_data + + code = plugin.preview_code( + item=data.get('item'), + part=data.get('part'), + location=data.get('location'), + force=True, + ) + + return Response( + BatchCodeResponseSerializer({'batch_code': code}).data, status=200 + ) + + +class GenerateBatchCodeView(APIView): + """Issue a batch code and save it onto a stock item. + + The counter is advanced, so each successful call returns a distinct code. + """ + + permission_classes = [permissions.IsAuthenticated] + serializer_class = GenerateBatchCodeSerializer + + def post(self, request, *args, **kwargs): + """Generate and store a batch code for the supplied stock item.""" + plugin = get_plugin() + + if not plugin.user_can_generate(request.user): + raise PermissionDenied( + _('You do not have permission to generate batch codes') + ) + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + + data = serializer.validated_data + + item = data['item'] + + if item.batch and not data.get('overwrite'): + raise ValidationError( + {'item': _('This stock item already has a batch code')} + ) + + code = plugin.build_code(commit=True, item=item, force=True) + + if not code: + raise ValidationError(_('Could not generate a batch code')) + + item.batch = code + item.save(update_fields=['batch']) + + return Response( + BatchCodeResponseSerializer({'batch_code': code}).data, status=200 + ) diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..1cfa533 --- /dev/null +++ b/biome.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "files": { + "includes": [ + "**", + "frontend/src/**", + "!frontend/src/locales/**" + ] + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "single", + "trailingCommas": "none", + "indentStyle": "space" + } + }, + "linter": { + "rules": { + "suspicious" : { + "noExplicitAny": "off", + "noDoubleEquals": "off", + "noArrayIndexKey": "off", + "useDefaultSwitchClauseLast": "off" + }, + "style": { + "noUselessElse": "off", + "noNonNullAssertion": "off", + "noParameterAssign": "off" + }, "correctness":{ + "useExhaustiveDependencies": "off", + "useJsxKeyInIterable": "off", + "noUnsafeOptionalChaining": "off", + "noSwitchDeclarations": "off", + "noUnusedImports":"error" + }, "complexity": { + "noBannedTypes": "off", + "noExtraBooleanCast": "off", + "noForEach": "off", + "noUselessSwitchCase": "off", + "useLiteralKeys":"off" + }, "performance": { + "noDelete":"off" + } + } +} +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..0c6253c --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,6 @@ +# Node modules +node_modules +*.tsbuildinfo + +# Compiled static code +static \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..d69ffe4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,79 @@ +# Batch Code Generator- Frontend Code + +This directory contains the frontend code for the Batch Code Generator plugin. + +## Architecture + +The frontend code is designed to integrate natively with the InvenTree user interface. + +### Frameworks + +We use Mantine, running on React, to match the InvenTree stack. + +- [React](https://react.dev/) +- [Mantine](https://mantine.dev/) + +## Project Setup + +This project uses [Vite](https://vitejs.dev/) as the build tool. We followed [this guide](https://vitejs.dev/guide/#scaffolding-your-first-vite-project) to scaffold the project. + +*Note: The following instructions assume you are already in the `frontend` directory.* + +### Install Frontend Libraries + +Install the required frontend libraries: + +```bash +npm install +``` + +### Translate + +If you have translation support enabled, run: + +```bash +npm run translate +``` + +### Building + +To compile the frontend code, run: + +```bash +npm run build +``` + +This will compile the frontend into the `../batchcode_plugin/static` directory (ready for distribution). + +Note: The target directory is intentionally outside of the frontend directory, so that the compiled files are correctly bundled into the python package install. + +### Testing + +To run the frontend code in a test environment, run: + +```bash +npm run dev +``` + +This will start a development server (usually on `localhost:5174`) which will automatically reload when changes are made to the source code. + +Note: You will also need the InvenTree frontend dev server to be running on `localhost:5173` (using `invoke dev.frontend-server` in the InvenTree project). + +### Linting / Formatting + +The frontend code is linted and formatted using [biomejs](https://biomejs.dev/). + +To *check* the code for linting errors, run: + +```bash +npm run lint +``` + +To *fix* any linting errors, run: + +```bash +npm run lint:fix +``` + +Any formatting errors will be automatically fixed when you run the `lint:fix` command. + diff --git a/frontend/lingui.config.ts b/frontend/lingui.config.ts new file mode 100644 index 0000000..900b012 --- /dev/null +++ b/frontend/lingui.config.ts @@ -0,0 +1,31 @@ +import { formatter } from "@lingui/format-po"; + +/** @type {import('@lingui/conf').LinguiConfig} */ +export default { + locales: [ + "de", + "en", + "es", + "fr", + "it", + "ja", + "ru", + "zh_Hans", + "zh_Hant", + "pseudo-LOCALE", + ], + sourceLocale: "en", + fallbackLocales: { + default: "en", + "pseudo-LOCALE": "en", + }, + catalogs: [ + { + path: "src/locales/{locale}/messages", + include: ["src"], + exclude: ["**/node_modules/**", "./dist/**"], + }, + ], + format: formatter({ lineNumbers: false }), + orderBy: "origin", +}; diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..bf3a53e --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,7105 @@ +{ + "name": "inventree-batchcode-plugin", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "inventree-batchcode-plugin", + "version": "2.0.0", + "dependencies": { + "@inventreedb/ui": "latest", + "@mantine/core": ">= 9.2.1", + "@mantine/hooks": ">= 9.2.1", + "@mantine/modals": ">= 9.2.1", + "@mantine/notifications": ">= 9.2.1", + "react": ">= 19.2.4", + "react-dom": ">= 19.2.4" + }, + "devDependencies": { + "@biomejs/biome": "2.0.0", + "@lingui/swc-plugin": "latest", + "@lingui/vite-plugin": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react-swc": "latest", + "globals": "^15.14.0", + "typescript": "~5.6.2", + "vite": "^6.4.2", + "vite-plugin-externals": "^0.6.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.0.tgz", + "integrity": "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.0.0", + "@biomejs/cli-darwin-x64": "2.0.0", + "@biomejs/cli-linux-arm64": "2.0.0", + "@biomejs/cli-linux-arm64-musl": "2.0.0", + "@biomejs/cli-linux-x64": "2.0.0", + "@biomejs/cli-linux-x64-musl": "2.0.0", + "@biomejs/cli-win32-arm64": "2.0.0", + "@biomejs/cli-win32-x64": "2.0.0" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz", + "integrity": "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz", + "integrity": "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz", + "integrity": "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz", + "integrity": "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz", + "integrity": "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz", + "integrity": "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz", + "integrity": "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz", + "integrity": "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", + "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-liquid": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.2.tgz", + "integrity": "sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.1" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.2.tgz", + "integrity": "sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.2.tgz", + "integrity": "sha512-U3RiPX62Wl/Gx4ftQ7UxLlloSfsFTQqKa+7vFBYteZGCzkp6oBqcsD7iSwniWRGobCAmDcwZSY+Six3+3ztdfg==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.10", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.10.tgz", + "integrity": "sha512-vVWLvd4fKWYN/pMcwUrg6dWeublxmSz+V+52ZjW3h64IVN9cRUYLk5Km4JDT9vifxAFfDtNOIFxKYENthcolJQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.20", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", + "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.3.1.tgz", + "integrity": "sha512-k0C0sdHmZtAo6dRDtd1Z/qcpyHbL0CKsjV8seMY/21xGhY5Wsv0XRmiI/xEEH4y2c9b1+jvgNs/3EqhV27yUEA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.3.1.tgz", + "integrity": "sha512-BoxVN3PKnMbgStHhjoaky/oWdxHomDqmBVA24IA3KEmssFGeI7u9YT/BJceOjIum/t6TpPa/vcMKaVYQeIQ/3Q==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.3.1.tgz", + "integrity": "sha512-q1EsmL7Q8DDnkRBUjSvrxbq7c9oVwwVjCn/xa5apKmdp65YSgzUg2y0Ltnd5aDbT6GdAQQdXql5Ha90ArqIReQ==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.3.1.tgz", + "integrity": "sha512-v0BLa0eqg7ubvVWeNSHVBs8fWH/GJicERZoJaxJ3FE/lj67VSqzoMg9pzfZVOfLMX10y0pGwQAuxoRVVH2patg==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3.5.0.tgz", + "integrity": "sha512-63mlRr6fiBbJ0wjr1Cf6dsDGtP2lNvk9lnatKgxs/fIkhslsZT291hIUzJkuUkI9yr69ZvWnWfgb2qXm4QyVaA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~6 || ~7", + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@fullcalendar/core": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.21.tgz", + "integrity": "sha512-t3u/+sqh3Iq7TWtUnVLcGDUE6OWZh0UD3c04bI/l7lSLAgAKr3kngBmhHiQD1QXpwC8ZN5iNqG7a7gOVixhSKQ==", + "license": "MIT", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.21.tgz", + "integrity": "sha512-QYb1y40RGYLlOxKpYWg8O+7njEnKnFG8Tt7qjnubJGR35s1phQg67E+81y2TyAbbm59p2JFOCXGDk9t6KDujIA==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21" + } + }, + "node_modules/@fullcalendar/interaction": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.21.tgz", + "integrity": "sha512-WPYpqtljDWmU0Xm2cOtFrLlocgxv7cgkOppj34Q6OUUat8a6Cnd6kYo2JR+irP223PE5lBYHFNp1qh7SIpJc0w==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21" + } + }, + "node_modules/@fullcalendar/react": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.21.tgz", + "integrity": "sha512-TLpmGUd5k/PMdCh8XbeFC9PW9wuGvMms1oCxWgXyjK3EFPXAAd0PLfcvwKdyxoAS5eK1E4RJFkjMHvsYHpimcg==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21", + "react": "^16.7.0 || ^17 || ^18 || ^19", + "react-dom": "^16.7.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@github/webauthn-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-2.1.1.tgz", + "integrity": "sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==", + "deprecated": "Deprecated: Modern browsers support built-in WebAuthn JSON methods. Please use native browser methods instead. For more information, visit https://github.com/github/webauthn-json", + "license": "MIT", + "bin": { + "webauthn-json": "dist/bin/main.js" + } + }, + "node_modules/@inventreedb/ui": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inventreedb/ui/-/ui-1.5.0.tgz", + "integrity": "sha512-bi3oZKCJuyYEuI1wLloUEyMxwF3r3R/LayOvA/fm54k22D6OMSKQ2O1OLJaGtYascz8OB2d4h6lPIY4NLGPEqw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.20.1", + "@codemirror/lang-liquid": "^6.3.2", + "@codemirror/language": "^6.12.2", + "@codemirror/lint": "^6.9.5", + "@codemirror/search": "^6.6.0", + "@codemirror/state": "^6.6.0", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.40.0", + "@emotion/react": "^11.14.0", + "@fortawesome/fontawesome-svg-core": "^7.2.0", + "@fortawesome/free-regular-svg-icons": "^7.2.0", + "@fortawesome/free-solid-svg-icons": "^7.2.0", + "@fortawesome/react-fontawesome": "^3.3.1", + "@fullcalendar/core": "^6.1.21", + "@fullcalendar/daygrid": "^6.1.21", + "@fullcalendar/interaction": "^6.1.21", + "@fullcalendar/react": "6.1.21", + "@github/webauthn-json": "^2.1.1", + "@lingui/core": "^5.9.2", + "@lingui/react": "^5.9.2", + "@mantine/carousel": "^9.2.1", + "@mantine/charts": "^9.2.1", + "@mantine/core": "^9.2.1", + "@mantine/dates": "^9.2.1", + "@mantine/dropzone": "^9.2.1", + "@mantine/form": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@mantine/modals": "^9.2.1", + "@mantine/notifications": "^9.2.1", + "@mantine/spotlight": "^9.2.1", + "@mantine/vanilla-extract": "^9.2.1", + "@messageformat/date-skeleton": "^1.1.0", + "@sentry/react": "^10.57.0", + "@tabler/icons-react": "^3.44.0", + "@tanstack/react-query": "^5.101.0", + "@uiw/codemirror-theme-vscode": "^4.25.8", + "@uiw/react-codemirror": "^4.25.8", + "@uiw/react-split": "^5.9.4", + "@vanilla-extract/css": "^1.20.1", + "axios": "^1.17.0", + "clsx": "^2.1.1", + "codemirror": "^6.0.2", + "dayjs": "^1.11.21", + "dompurify": "^3.4.8", + "easymde": "^2.21.0", + "embla-carousel": "^8.6.0", + "embla-carousel-react": "^8.6.0", + "fuse.js": "^7.4.2", + "html5-qrcode": "^2.3.8", + "mantine-contextmenu": "^9.2.1", + "mantine-datatable": "^9.2.2", + "qrcode": "^1.5.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-grid-layout": "1.4.4", + "react-hook-form": "^7.78.0", + "react-is": "^19.2.7", + "react-router-dom": "^6.30.4", + "react-select": "^5.10.2", + "react-simplemde-editor": "^5.2.0", + "react-window": "1.8.11", + "recharts": "^3.8.1", + "styled-components": "^6.4.2", + "undici": "^8.4.1", + "zustand": "^5.0.14" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-5.9.5.tgz", + "integrity": "sha512-XOAXMPOkpy45784q5bCNN5PizoAecxkBm8kv8CEusI/f9kR3vMCcpH4kvSchU05JkKAVE8eIsdxb2zM6eDJTeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.9.5.tgz", + "integrity": "sha512-TDIrOa2hAz8kXrZ0JfMGaIiFIE4TEdqI2he4OpkTSCfBh3ec/gSCn1kNW5HdviO7x46Gvy567YOgHNOI9/e4Fg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "5.9.5", + "@lingui/core": "5.9.5", + "@lingui/message-utils": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/cli": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-5.9.5.tgz", + "integrity": "sha512-gonY7U75nzKic8GvEciy1/otQv1WpfwGW5wGMjmBXUMaMnIsycm/wo3t0+2hzqFp+RNfEKZcScoM7aViK3XuLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.22.0", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "5.9.5", + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "@lingui/conf": "5.9.5", + "@lingui/core": "5.9.5", + "@lingui/format-po": "5.9.5", + "@lingui/message-utils": "5.9.5", + "chokidar": "3.5.1", + "cli-table": "^0.3.11", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.25.1", + "glob": "^11.0.0", + "micromatch": "^4.0.7", + "ms": "^2.1.3", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "picocolors": "^1.1.1", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "source-map": "^0.7.6", + "threads": "^1.7.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lingui/cli/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@lingui/conf": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-6.6.0.tgz", + "integrity": "sha512-4NUxQh6VXZSBocAKATuJJ6+dOF/M3OTd5WtbND7eSi5tZtVKF0qFMcKFfx8aiUJFo+KP/wYnBBiDPvPLkJvqcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "lilconfig": "^3.1.3", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@lingui/core": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-5.9.5.tgz", + "integrity": "sha512-Y+iZq9NqnqZOqHNgPomUFP21KH/zs4oTTizWoz0AKAkBbq9T9yb1DSz/ugtBRjF1YLtKMF9tq28v3thMHANSiQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/format-po": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-5.9.5.tgz", + "integrity": "sha512-abawxkaEMhAUCqxrnim2NTTeu2gd55X9tkFN8jfRM0B1LE2KjZLWCA8gSD90J/DblDwej8jK8A2BynXlcQdluQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/conf": "5.9.5", + "@lingui/message-utils": "5.9.5", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/format-po/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/format-po/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/message-utils": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-5.9.5.tgz", + "integrity": "sha512-t3dNbjb1dWkvcpXGMXIEyBDO3l4B8J2ColZXi0NTG1ioAj+sDfFxFB8fepVgd3JAk+AwARlOLvF14oS0mAdgpw==", + "license": "MIT", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/react": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-5.9.5.tgz", + "integrity": "sha512-jzYoA/f4jrTfpOB+jrMhlC835UwqSXJdepr7cfWsmg+Rpp3HBSREtfrogaz1LqLI/AVnkmfp10Mo6VOp/8qeOQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "babel-plugin-macros": "2 || 3", + "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/swc-plugin": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@lingui/swc-plugin/-/swc-plugin-6.7.0.tgz", + "integrity": "sha512-TRLHfeQT/q9JXy0cBGOtbfcEWJFF1szjPCVM4AT1HdZyfGj+dQ0r8hHq+08c4iXZLzlsYilzw+bZJ3TahG5g5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/conf": "5 || 6" + }, + "peerDependencies": { + "@lingui/core": "5 || 6" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "next": { + "optional": true + } + } + }, + "node_modules/@lingui/vite-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-6.6.0.tgz", + "integrity": "sha512-1kZMeGNk5hYQzrEPA3RcXQKb106VC26GqxpXpjVIhS4r2sT4c4gztk70T65VSwyZ7Uyc1pIpXxys3uY2DTfHKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/cli": "6.6.0", + "@lingui/conf": "6.6.0" + }, + "engines": { + "node": ">=22.19.0" + }, + "peerDependencies": { + "@babel/core": "^7.29.0 || ^8.0.0", + "@lingui/babel-plugin-lingui-macro": "^5 || ^6", + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "rolldown": "^1.0.0-rc.5", + "vite": "^6.3.0 || ^7 || ^8" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "@rolldown/plugin-babel": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/@mantine/carousel": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/carousel/-/carousel-9.6.0.tgz", + "integrity": "sha512-+bYTs7XfsRkv+vR+ojL+EKUxY8wBXeirOMIB3d/4YKmKleMiqJh2J3ejEVcINelzLVjvod7+fg+edKDy9N2aSA==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "embla-carousel": ">=8.0.0", + "embla-carousel-react": ">=8.0.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/charts": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/charts/-/charts-9.6.0.tgz", + "integrity": "sha512-xGRzoY0bJSR3r1DrIhpW8k81xtvh2EfYnRiZi2QtgdtkzSXFx9gMDJfr7Jo0i0joj5XuL0O4tPhCg0ZxjGFNrw==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "recharts": ">=3.2.1" + } + }, + "node_modules/@mantine/core": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.0.tgz", + "integrity": "sha512-WpdtSv9q2k4RrAVUxBlABMyEul4vv94EkjoVuQglBBC7jVmLhBBgI64HltE6di/l6zvj9D7k1vgkbVjyxQsn1g==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.20", + "clsx": "^2.1.1", + "react-number-format": "^5.4.5", + "react-remove-scroll": "^2.7.2", + "type-fest": "^5.8.0" + }, + "peerDependencies": { + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/dates": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-9.6.0.tgz", + "integrity": "sha512-fcMGrbwKj7F5KkRtwuKeXz/MBh+l0Y3ljLyJ3eaF7NL0CLJSXO7YJxpeZDXBMDF0w+iUs9c2zilnTTidh9ICPQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "dayjs": ">=1.0.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/dropzone": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-9.6.0.tgz", + "integrity": "sha512-XvUx2Mxl2wKMUB1HoRPc+b6h5WDJ1ZPfYt4g6xDzNI4m8mnyKXmPJSgmEJD1RWzNA1CtxTX6rqRaiOUar4hbAw==", + "license": "MIT", + "dependencies": { + "react-dropzone": "20.1.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/form": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-9.6.0.tgz", + "integrity": "sha512-4TbT/DiixG5uWjgm/HNQlS3Ac0Ov35WVcAW6HQ7Q4+NGuj8mED4gBXHzqVywNi7PhshivdNMox3zADvHIOyUdA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/hooks": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.0.tgz", + "integrity": "sha512-r+1RWxc0F2XK9exKIk3Cxc17eyDTEtRqvomeQMCqI4S2Z3A78ObAGuNS8WXn8aqDGN66MJlO+WV7oCgQn2iQfQ==", + "license": "MIT", + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/modals": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-9.6.0.tgz", + "integrity": "sha512-uNNwdYkk5ZqsPKi6zVe+bHq09RCM/HRbzC+UFGXmmOKq2AgOuCoLPNimvVV3y6GQ+jcPFFlkR4D7wbv4eQKPAQ==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/notifications": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.6.0.tgz", + "integrity": "sha512-1sTE7EaGpr6LX7ykE8DOwpTNxi3U7AHF7Ve/oBd1VEe2k/5RmEYLTWpexxf7WwNpEmHCi99MvG7qUMQJyqc9Fg==", + "license": "MIT", + "dependencies": { + "@mantine/store": "9.6.0", + "react-transition-group": "4.4.5" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/spotlight": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-9.6.0.tgz", + "integrity": "sha512-ZJgdrMWnhZDWSu6/OHcUkk5cXgLhkBnICCWWnHpuaapAKIa+ya3jj0BXDA8fzb3iY6yKCF06bqpKY5rhiuKaCw==", + "license": "MIT", + "dependencies": { + "@mantine/store": "9.6.0" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/store": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.6.0.tgz", + "integrity": "sha512-nYt2tfn1/e6CK35a5TWlPbOL3Xwf7OzBmBElV0l+Ae6mswVaMip1WHm0mCaHAbTKgsOnvL/tooDTVxBBrmm87Q==", + "license": "MIT", + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/vanilla-extract": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/vanilla-extract/-/vanilla-extract-9.6.0.tgz", + "integrity": "sha512-dLTSnwb9+kbe4GmfkJbmnlszHch/MrEkClX6eIimyzzP14YTJEiz7l+U5Wv/hYzFmWPPiSHhBizRYohS0+2zNQ==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", + "license": "MIT" + }, + "node_modules/@messageformat/date-skeleton": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz", + "integrity": "sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A==", + "license": "MIT" + }, + "node_modules/@messageformat/parser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz", + "integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==", + "license": "MIT", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.4.tgz", + "integrity": "sha512-q7j5geK7xs3UJSdm9/iytUNclBnLmYx1EnSeCFXHPeutdqgIMeFeHtUZgS3EhlKxdBEAu8OwtJCwmLrEzpSs7Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sentry/browser": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.73.0.tgz", + "integrity": "sha512-HqTe1S5RrWLufhX2LaFP3yNoMxfNDroh120bq1zdGHZfFDBMJQ0CDXxHO+L4UJfQ5dWdCCzWbXIAiZuWGa/DFQ==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.73.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0", + "@sentry/feedback": "10.73.0", + "@sentry/replay": "10.73.0", + "@sentry/replay-canvas": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/browser-utils": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/browser-utils/-/browser-utils-10.73.0.tgz", + "integrity": "sha512-qQygxJZ+RV779+iL1+lrJ4f4sZLgbgW0/JWPNp0YlcEAE62yCsdKbqoTEjB/EugdS4mSjBMX0chZC6rblu2Ycw==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/conventions": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.16.0.tgz", + "integrity": "sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/core": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.73.0.tgz", + "integrity": "sha512-FLO1UgH19RyasVpofu612WCOgb2nEH0dZy+R72d7p65XU9i0wxlMKm3+sgfwKmiSJp1Qhilaaxs4Jg6BbiM5HA==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/feedback": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/feedback/-/feedback-10.73.0.tgz", + "integrity": "sha512-D6nSngX+e46Mae2/oh2bxBvxNK1z2NERbuMAhB5sx9x4xMBWIyGnYYTECehvEqV9+AqGAgxxhOZoYIG3AmRwww==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.73.0.tgz", + "integrity": "sha512-wJrzS98ddPvhGS/MKNHZyE8X7ecd4KwKdz7fHino2qkqBBrF4cxWr+q/uLTIk5PYWMkeJ4oKMjHAjOqmzGR4tg==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "10.73.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, + "node_modules/@sentry/replay": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-10.73.0.tgz", + "integrity": "sha512-nN2wjN/Y0J5BOJV5hqRHUEBfxwUsipp1PKjcDHh6Fpxnrtfldu3Y99E8cQInseo5heFdzEvrOHBBrqWZXOHVKQ==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.73.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/replay-canvas": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/replay-canvas/-/replay-canvas-10.73.0.tgz", + "integrity": "sha512-sxa2lKkHPfF/j5xFpW7gocthWXRqyoHz8KCPy6yGc8plT477nl57iGSKhQDYsx1Ny10TLjs7YkIuPP1GY/Ax2Q==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.73.0", + "@sentry/replay": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/core": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.16.1.tgz", + "integrity": "sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.28" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.16.1", + "@swc/core-darwin-x64": "1.16.1", + "@swc/core-linux-arm-gnueabihf": "1.16.1", + "@swc/core-linux-arm64-gnu": "1.16.1", + "@swc/core-linux-arm64-musl": "1.16.1", + "@swc/core-linux-ppc64-gnu": "1.16.1", + "@swc/core-linux-s390x-gnu": "1.16.1", + "@swc/core-linux-x64-gnu": "1.16.1", + "@swc/core-linux-x64-musl": "1.16.1", + "@swc/core-win32-arm64-msvc": "1.16.1", + "@swc/core-win32-ia32-msvc": "1.16.1", + "@swc/core-win32-x64-msvc": "1.16.1" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.1.tgz", + "integrity": "sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.16.1.tgz", + "integrity": "sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.1.tgz", + "integrity": "sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.1.tgz", + "integrity": "sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.1.tgz", + "integrity": "sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.1.tgz", + "integrity": "sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.1.tgz", + "integrity": "sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.1.tgz", + "integrity": "sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.1.tgz", + "integrity": "sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.1.tgz", + "integrity": "sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.1.tgz", + "integrity": "sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.1.tgz", + "integrity": "sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz", + "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tabler/icons": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.46.0.tgz", + "integrity": "sha512-f2RYFl3fzPwj5WO82x6en0dmkjefxEfOm16D1ByM6cj/McNiwOkL4VaPUoP9VVIrXAD9WnTSVFr70px703b//A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.46.0.tgz", + "integrity": "sha512-CCm7xJWhDT2PH4ZIFkP6AgYKtVhq0gpYkjUN+GVh1AzmIQaa77OW0bQPBPQiTE0PsXMR9oSxFqA3qBglzPyrVQ==", + "license": "MIT", + "dependencies": { + "@tabler/icons": "3.46.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", + "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", + "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.18", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.18.tgz", + "integrity": "sha512-aSBOPXH2PXRYixxUpVP1sJ5+S0vEfKDvR+lABZ7Kju/9Qb0SSbZk72NihWaKoQbANyibs92q4DBfYasywxnNkA==", + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/marked": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz", + "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.11.tgz", + "integrity": "sha512-otyFa+n9IOYtEjaKOxPedHkj15fTPUF21wdR9pv0GpZPfuGl27cvmcv6+tognbRu9VvEcsHKE+ESoszeo3KfTw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/autocomplete": ">=6.0.0", + "@codemirror/commands": ">=6.0.0", + "@codemirror/language": ">=6.0.0", + "@codemirror/lint": ">=6.0.0", + "@codemirror/search": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/codemirror-theme-vscode": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.25.11.tgz", + "integrity": "sha512-fTQ5676L9iV3Y6UyDBDd8Wt9Gewh55aC5rqnCtIpwyVFb6zJEHJScI4g43lzAD2IKhY7HlozB1ucrS3UqBFNEQ==", + "license": "MIT", + "dependencies": { + "@uiw/codemirror-themes": "4.25.11" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/@uiw/codemirror-themes": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.11.tgz", + "integrity": "sha512-SBNCOgRsCtewGNocRbmjbCkltGXlFcPJsvhxQ351VynQjnWUiPbUrFcEU/haQ3HanROdAAjWXZJPk5bMBxl2jw==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.11.tgz", + "integrity": "sha512-DYVFAKLX+F/4JS9N/7xexh+TICrlncwkX9HKKInrP1bwO0tSfc3k0GB6oawTYhelVKh20cX3TuRx+NJSkVXuMw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@codemirror/commands": "^6.1.0", + "@codemirror/state": "^6.1.1", + "@codemirror/theme-one-dark": "^6.0.0", + "@uiw/codemirror-extensions-basic-setup": "4.25.11", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.11.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/theme-one-dark": ">=6.0.0", + "@codemirror/view": ">=6.0.0", + "codemirror": ">=6.0.0", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@uiw/react-split": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/@uiw/react-split/-/react-split-5.9.4.tgz", + "integrity": "sha512-gZbMMAV9xFDJQ3aKAzMXVvQfrCFWPILvxFGM2DSdIvhKwjSWP+yTl8fNI246Nu3XR4iHyB4Cohh9JJZEbfIXjQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@vanilla-extract/css": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.21.2.tgz", + "integrity": "sha512-ehF/tmv2MxQwOJB1DicALUqnjZTnmY9Y7J2ccKB578JzZpYeL6sLAUqbaXo1taw1Erp0qBq0I4Kejs0uU/pBfg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.9", + "css-what": "^6.1.0", + "csstype": "^3.2.3", + "dedent": "^1.5.3", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "lru-cache": "^10.4.3", + "media-query-parser": "^2.0.2", + "modern-ahocorasick": "^1.0.0", + "picocolors": "^1.0.0" + } + }, + "node_modules/@vanilla-extract/css/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.9.tgz", + "integrity": "sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.3.3.tgz", + "integrity": "sha512-bti8ZAcvz4Lh6/e4Uk2k3aa1TiUXbbMsahuqOHvd3MveFTkKDZOA6wQVkpj7J/+tepX/wGfe+lsGh/t24HTXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1", + "@swc/core": "^1.15.46" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "devOptional": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-4.0.0.tgz", + "integrity": "sha512-hmCnJClmeKNKlsBHgbM8yLZRiQZ4/20UXbLJb6OUT16eWcM5/xNZerr80a/zCYob768KIGq++aLrQNTuwPsIOQ==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "devOptional": 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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "devOptional": 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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/codemirror-spell-checker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", + "integrity": "sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==", + "license": "MIT", + "dependencies": { + "typo-js": "*" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/easymde": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.21.0.tgz", + "integrity": "sha512-5uE7I/DEN8gvGRwxaqAv7h1PMEK2ykNXVX5zL0dK3nCYROGja3AMbdQz8eCEELnfvCfy7tRkTmLuvyJG8uSWjQ==", + "license": "MIT", + "dependencies": { + "@types/codemirror": "^5.60.10", + "@types/marked": "^4.0.7", + "codemirror": "^5.65.15", + "codemirror-spell-checker": "1.1.2", + "marked": "^4.1.0" + } + }, + "node_modules/easymde/node_modules/codemirror": { + "version": "5.65.21", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.21.tgz", + "integrity": "sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", + "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", + "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-5.0.1.tgz", + "integrity": "sha512-v0g/PTeuQgvKCBrVRsfVudvwXlRHSWHEQkVgKawgCGHkEpKA1clp3Om5jvEVhz8G9W/mOYjJH9FhkH4C888PgQ==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immer": { + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz", + "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "devOptional": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mantine-contextmenu": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/mantine-contextmenu/-/mantine-contextmenu-9.4.0.tgz", + "integrity": "sha512-sSlHnGbBkPKg11dLSyRsoZxZPTiBKpuTaNGW/6/sJMbzp7DnlSMFnapDbtL6+eb9qgenwoSodcivr5biXid9bg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/icflorescu" + }, + "peerDependencies": { + "@mantine/core": ">=9", + "@mantine/hooks": ">=9", + "clsx": ">=2", + "react": ">=19", + "react-dom": ">=19" + } + }, + "node_modules/mantine-datatable": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/mantine-datatable/-/mantine-datatable-9.4.0.tgz", + "integrity": "sha512-yFym2vlboGaqSD1bqXVtADMWg8YJtdyc3USQUTSqcLgEWzRPQqK/9WBBU0+XVE2qvMHZfiunuJK+UZV4aa2KmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/icflorescu" + }, + "peerDependencies": { + "@mantine/core": ">=9.0", + "@mantine/hooks": ">=9.0", + "clsx": ">=2", + "react": ">=19", + "react-dom": ">=19" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/modern-ahocorasick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", + "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==", + "license": "MIT" + }, + "node_modules/moo": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", + "license": "BSD-3-Clause" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pseudolocale": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.3.0.tgz", + "integrity": "sha512-2RfZuwSSZ8sopelTIIZ2JhmO4GLnHflJQBmtMPF2APWEtmfKOsvqCIWsi8KQJ6EQ0D0+zVllPnLLGijUauSlqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-draggable": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.1.tgz", + "integrity": "sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-dropzone": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-20.1.1.tgz", + "integrity": "sha512-2cilRFP8bsjDOHpV0sJ6XY8pzJhmz4/cQ6s9yeckOACWYDR+n4MGGtnJh3Rycq/9SLhDWugqDx1z5mtfmOOZhw==", + "license": "MIT", + "dependencies": { + "attr-accept": "^4.0.0", + "file-selector": "^5.0.0" + }, + "engines": { + "node": ">= 22" + }, + "peerDependencies": { + "@types/react": "*", + "react": ">= 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-grid-layout": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.4.4.tgz", + "integrity": "sha512-7+Lg8E8O8HfOH5FrY80GCIR1SHTn2QnAYKh27/5spoz+OHhMmEhU/14gIkRzJOtympDPaXcVRX/nT1FjmeOUmQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.5", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.87.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.87.0.tgz", + "integrity": "sha512-zhFzWvLxNHH+8839OnZcUxgMZw88ah2jZWDWvKWgF3Tpbnd0vKL+dlcuU3nZVWESZQjd81EW8K+wU+cYfYAc0w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" + }, + "node_modules/react-number-format": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", + "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==", + "license": "MIT", + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.2.0.tgz", + "integrity": "sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==", + "license": "MIT", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.5.0" + }, + "peerDependencies": { + "react": ">= 16.3", + "react-dom": ">= 16.3" + } + }, + "node_modules/react-router": { + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.6.tgz", + "integrity": "sha512-5HfK7k5im7LTOB0EqCQmfvy4C13G92Ssj1VTmouTK3AJvyjKTnFuCV0vcMAD/JS+JC4DvDIBRrlAeJIFjh5VWg==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.6.tgz", + "integrity": "sha512-0RHKZz7wwffvkU+2MFVT2NnjK44ssLEV+m0CAJaS2Ksmorrwj7WxH00jO0SOCW26/tINUnJHToXblDs33I38YQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.4", + "react-router": "6.30.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-select": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-simplemde-editor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-simplemde-editor/-/react-simplemde-editor-5.2.0.tgz", + "integrity": "sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==", + "license": "MIT", + "dependencies": { + "@types/codemirror": "~5.60.5" + }, + "peerDependencies": { + "easymde": ">= 2.0.0 < 3.0.0", + "react": ">=16.8.2", + "react-dom": ">=16.8.2" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-window/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^11.1.8", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.2.0", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/styled-components": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.5.3.tgz", + "integrity": "sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "stylis": "4.3.6" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "css-to-react-native": ">= 3.2.0", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-native": ">= 0.68.0" + }, + "peerDependenciesMeta": { + "css-to-react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/styled-components/node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "license": "MIT" + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "esm": "^3.2.25" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", + "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typo-js": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.3.2.tgz", + "integrity": "sha512-Z1YkJ7IIYNrFeOxAlHUercY4Q2I+PhYD/3VkWpJGy/Oqudy3bFpNcQxnv6Oa9fTSXCHPGz1eDoX1bZYm2Z891A==", + "license": "BSD-3-Clause" + }, + "node_modules/undici": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.1.tgz", + "integrity": "sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "devOptional": 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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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, + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-externals": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/vite-plugin-externals/-/vite-plugin-externals-0.6.2.tgz", + "integrity": "sha512-R5oVY8xDJjLXLTs2XDYzvYbc/RTZuIwOx2xcFbYf+/VXB6eJuatDgt8jzQ7kZ+IrgwQhe6tU8U2fTyy72C25CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.4.0", + "es-module-lexer": "^0.4.1", + "fs-extra": "^10.0.0", + "magic-string": "^0.25.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "extraneous": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/zustand": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..2d0c73e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,45 @@ +{ + "name": "inventree-batchcode-plugin", + "private": true, + "version": "2.0.0", + "type": "module", + "scripts": { + "extract": "lingui extract", + "compile": "lingui compile --typescript", + "translate": "lingui extract && lingui compile --typescript", + "lint": "npx @biomejs/biome check ./src", + "lint:fix": "npx @biomejs/biome check ./src --fix", + "build": "tsc -b && vite build --emptyOutDir", + "dev": "vite --config vite.dev.config.ts --host" + }, + "dependencies": { + "@inventreedb/ui": "latest", + "react": ">= 19.2.4", + "react-dom": ">= 19.2.4", + "@mantine/core": ">= 9.2.1", + "@mantine/hooks": ">= 9.2.1", + "@mantine/modals": ">= 9.2.1", + "@mantine/notifications": ">= 9.2.1" + }, + "peerDependencies": {}, + "devDependencies": { + "@biomejs/biome": "2.0.0", + "@lingui/swc-plugin": "latest", + "@lingui/vite-plugin": "latest", + "@vitejs/plugin-react-swc": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@vitejs/plugin-react": "^4.7.0", + "globals": "^15.14.0", + "typescript": "~5.6.2", + "vite": "^6.4.2", + "vite-plugin-externals": "^0.6.2" + }, + "overrides": { + "@lingui/core": "^5.9.2", + "@lingui/cli": "^5.9.2", + "@lingui/macro": "^5.9.2", + "glob": ">= 13.0.0", + "vite": "^6.4.2" + } +} diff --git a/frontend/src/Panel.tsx b/frontend/src/Panel.tsx new file mode 100644 index 0000000..ce2d898 --- /dev/null +++ b/frontend/src/Panel.tsx @@ -0,0 +1,251 @@ +import { + checkPluginVersion, + type InvenTreePluginContext, + LocalizedComponent +} from '@inventreedb/ui'; +import { t } from '@lingui/core/macro'; +import { + Alert, + Badge, + Button, + Code, + Group, + Loader, + Stack, + Switch, + Table, + Text, + Title +} from '@mantine/core'; +import { notifications } from '@mantine/notifications'; +import { useCallback, useEffect, useMemo, useState } from 'react'; + +import { loadLocale } from './locales'; + +const PREVIEW_URL = '/plugin/batchcode/preview/'; +const GENERATE_URL = '/plugin/batchcode/generate/'; + +/** Settings dict provided by BatchCodePlugin.get_ui_panels */ +type BatchCodeSettings = Record; + +/** + * Summary of the settings which decide what a generated code looks like. + */ +function SettingsSummary({ settings }: { settings: BatchCodeSettings }) { + const rows: [string, string][] = useMemo(() => { + const scopes: string[] = []; + + if (settings.PER_PART) scopes.push(t`per part`); + if (settings.PER_LOCATION) scopes.push(t`per location`); + if (settings.DAILY_RESET) scopes.push(t`reset daily`); + + return [ + [t`Format`, String(settings.CODE_FORMAT ?? '')], + [ + t`Prefix`, + settings.USE_LOCATION_PREFIX + ? t`from location field '${String(settings.LOCATION_FIELD)}'` + : String(settings.PREFIX ?? '') + ], + [t`Counter`, scopes.length ? scopes.join(', ') : t`global`], + [t`Trigger`, String(settings.TRIGGER_MODE ?? '')] + ]; + }, [settings]); + + return ( + + + {rows.map(([label, value]) => ( + + + + {label} + + + + {value} + + + ))} + +
+ ); +} + +function BatchCodePanel({ context }: { context: InvenTreePluginContext }) { + const settings: BatchCodeSettings = useMemo( + () => context.context?.settings ?? {}, + [context.context] + ); + + const canGenerate: boolean = useMemo( + () => !!context.context?.can_generate, + [context.context] + ); + + const itemId = useMemo(() => context.id ?? null, [context.id]); + + const currentCode: string = useMemo( + () => context.instance?.batch || '', + [context.instance] + ); + + const [preview, setPreview] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + const [busy, setBusy] = useState(false); + const [overwrite, setOverwrite] = useState(false); + + // Ask the backend which code would be issued next. This is a preview: it + // does not advance the counter, so it can be refreshed freely. + const loadPreview = useCallback(() => { + if (!itemId) { + return; + } + + setLoading(true); + setError(''); + + context.api + .post(PREVIEW_URL, { item: itemId }) + .then((response) => setPreview(response.data?.batch_code ?? '')) + .catch(() => setError(t`Could not load a batch code preview`)) + .finally(() => setLoading(false)); + }, [context.api, itemId]); + + useEffect(() => { + loadPreview(); + }, [loadPreview]); + + const generate = useCallback(() => { + if (!itemId) { + return; + } + + setBusy(true); + + context.api + .post(GENERATE_URL, { item: itemId, overwrite: overwrite }) + .then((response) => { + const code = response.data?.batch_code ?? ''; + + notifications.show({ + title: t`Batch code generated`, + message: code, + color: 'green' + }); + + context.reloadInstance?.(); + loadPreview(); + }) + .catch((e) => { + const detail = + e?.response?.data?.item?.[0] ?? + e?.response?.data?.detail ?? + t`Could not generate a batch code`; + + notifications.show({ + title: t`Batch code not generated`, + message: String(detail), + color: 'red' + }); + }) + .finally(() => setBusy(false)); + }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]); + + if (!settings.ENABLED) { + return ( + + + {t`Enable the plugin setting 'Enabled' to generate batch codes.`} + + + ); + } + + return ( + + + + + {t`Current batch code`} + + {currentCode ? ( + + {currentCode} + + ) : ( + + {t`Not set`} + + )} + + + + {t`Next code`} + + {loading ? ( + + ) : ( + + {preview || '—'} + + )} + + + + {error && ( + + {error} + + )} + + {canGenerate ? ( + + setOverwrite(event.currentTarget.checked)} + label={t`Overwrite the existing batch code`} + disabled={!currentCode} + /> + + + + + + ) : ( + + {t`You do not have permission to generate batch codes.`} + + )} + + + {t`Configuration`} + + + + ); +} + +// This is the function which is called by InvenTree to render the actual panel component +export function RenderBatchCodePluginPanel(context: InvenTreePluginContext) { + checkPluginVersion(context); + + return ( + + + + ); +} diff --git a/frontend/src/Settings.tsx b/frontend/src/Settings.tsx new file mode 100644 index 0000000..97f9959 --- /dev/null +++ b/frontend/src/Settings.tsx @@ -0,0 +1,97 @@ +import type { InvenTreePluginContext } from '@inventreedb/ui'; +import { + Alert, + Badge, + Button, + Code, + Group, + Loader, + Stack, + Text +} from '@mantine/core'; +import { useCallback, useEffect, useState } from 'react'; + +const PREVIEW_URL = '/plugin/batchcode/preview/'; + +/** + * Rendered on the plugin settings page, below the settings themselves. + * + * Shows the code the current settings would produce. The preview endpoint + * does not advance the counter, so this can be refreshed after each settings + * change to check a format before it is used for real. + */ +function PluginSettingsDisplay({ + context +}: { + context: InvenTreePluginContext; +}) { + const [code, setCode] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const loadPreview = useCallback(() => { + setLoading(true); + setError(''); + + context.api + .post(PREVIEW_URL, {}) + .then((response) => setCode(response.data?.batch_code ?? '')) + .catch((e) => { + setError( + String(e?.response?.data?.detail ?? 'Could not render a preview code') + ); + setCode(''); + }) + .finally(() => setLoading(false)); + }, [context.api]); + + useEffect(() => { + loadPreview(); + }, [loadPreview]); + + return ( + + + + + The next batch code for the global counter, using the settings + above. Part, location and date placeholders resolve against the + actual stock item when a code is generated. + + + {loading ? ( + + ) : ( + + {code || '—'} + + )} + + + {error && ( + + {error} + + )} + + + + Placeholders: {'{prefix}'} {'{num}'}{' '} + {'{sep}'} {'{date}'} {'{part}'}{' '} + {'{ipn}'} {'{loc}'} {'{year}'}{' '} + {'{month}'} {'{day}'} {'{week}'} + + + ); +} + +export function RenderPluginSettings(context: InvenTreePluginContext) { + return ; +} diff --git a/frontend/src/locales.tsx b/frontend/src/locales.tsx new file mode 100644 index 0000000..c62adee --- /dev/null +++ b/frontend/src/locales.tsx @@ -0,0 +1,5 @@ +import type { LocaleLoader } from '@inventreedb/ui'; + +// Necessary callback function to dynamically load the locale messages for the plugin +export const loadLocale: LocaleLoader = async (locale: string) => + import(`./locales/${locale}/messages.ts`).catch(() => null); diff --git a/frontend/src/locales/de/messages.d.ts b/frontend/src/locales/de/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/de/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/de/messages.po b/frontend/src/locales/de/messages.po new file mode 100644 index 0000000..a91f697 --- /dev/null +++ b/frontend/src/locales/de/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/de/messages.ts b/frontend/src/locales/de/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/de/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/en/messages.d.ts b/frontend/src/locales/en/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/en/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/en/messages.po b/frontend/src/locales/en/messages.po new file mode 100644 index 0000000..f9a6709 --- /dev/null +++ b/frontend/src/locales/en/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "per part" + +#: src/Panel.tsx +msgid "per location" +msgstr "per location" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "reset daily" + +#: src/Panel.tsx +msgid "Format" +msgstr "Format" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "Prefix" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "from location field '{0}'" + +#: src/Panel.tsx +msgid "Counter" +msgstr "Counter" + +#: src/Panel.tsx +msgid "global" +msgstr "global" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "Trigger" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "Could not load a batch code preview" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "Batch code generated" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "Could not generate a batch code" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "Batch code not generated" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "Batch code generation is disabled" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "Enable the plugin setting 'Enabled' to generate batch codes." + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "Current batch code" + +#: src/Panel.tsx +msgid "Not set" +msgstr "Not set" + +#: src/Panel.tsx +msgid "Next code" +msgstr "Next code" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "Preview unavailable" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "Overwrite the existing batch code" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "Refresh" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "Generate and save" + +#: src/Panel.tsx +msgid "Read only" +msgstr "Read only" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "You do not have permission to generate batch codes." + +#: src/Panel.tsx +msgid "Configuration" +msgstr "Configuration" diff --git a/frontend/src/locales/en/messages.ts b/frontend/src/locales/en/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/en/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/es/messages.d.ts b/frontend/src/locales/es/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/es/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/es/messages.po b/frontend/src/locales/es/messages.po new file mode 100644 index 0000000..8ca26ca --- /dev/null +++ b/frontend/src/locales/es/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: es\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/es/messages.ts b/frontend/src/locales/es/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/es/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/fr/messages.d.ts b/frontend/src/locales/fr/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/fr/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/fr/messages.po b/frontend/src/locales/fr/messages.po new file mode 100644 index 0000000..20cc2c9 --- /dev/null +++ b/frontend/src/locales/fr/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fr\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/fr/messages.ts b/frontend/src/locales/fr/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/fr/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/it/messages.d.ts b/frontend/src/locales/it/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/it/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/it/messages.po b/frontend/src/locales/it/messages.po new file mode 100644 index 0000000..3da41b7 --- /dev/null +++ b/frontend/src/locales/it/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: it\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "per articolo" + +#: src/Panel.tsx +msgid "per location" +msgstr "per ubicazione" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "azzerato ogni giorno" + +#: src/Panel.tsx +msgid "Format" +msgstr "Formato" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "Prefisso" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "dal campo ubicazione '{0}'" + +#: src/Panel.tsx +msgid "Counter" +msgstr "Contatore" + +#: src/Panel.tsx +msgid "global" +msgstr "globale" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "Attivazione" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "Impossibile caricare l'anteprima del codice batch" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "Codice batch generato" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "Impossibile generare il codice batch" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "Codice batch non generato" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "La generazione dei codici batch è disattivata" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "Attiva l'impostazione 'Enabled' del plugin per generare i codici batch." + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "Codice batch attuale" + +#: src/Panel.tsx +msgid "Not set" +msgstr "Non impostato" + +#: src/Panel.tsx +msgid "Next code" +msgstr "Prossimo codice" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "Anteprima non disponibile" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "Sovrascrivi il codice batch esistente" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "Aggiorna" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "Genera e salva" + +#: src/Panel.tsx +msgid "Read only" +msgstr "Sola lettura" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "Non hai i permessi per generare codici batch." + +#: src/Panel.tsx +msgid "Configuration" +msgstr "Configurazione" diff --git a/frontend/src/locales/it/messages.ts b/frontend/src/locales/it/messages.ts new file mode 100644 index 0000000..a89499d --- /dev/null +++ b/frontend/src/locales/it/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Sovrascrivi il codice batch esistente\"],\"B4m81Y\":[\"Non hai i permessi per generare codici batch.\"],\"DKa9ch\":[\"Genera e salva\"],\"DerUtL\":[\"La generazione dei codici batch è disattivata\"],\"H2Sfhg\":[\"Attivazione\"],\"IF5r8v\":[\"Anteprima non disponibile\"],\"MTqQMG\":[\"Non impostato\"],\"NEgaRI\":[\"Impossibile generare il codice batch\"],\"NKnPpU\":[\"Contatore\"],\"O/ICOy\":[\"per articolo\"],\"O8n/gF\":[\"Codice batch non generato\"],\"SLbeKO\":[\"globale\"],\"T0z5Hw\":[\"Codice batch generato\"],\"hPL4I9\":[\"Impossibile caricare l'anteprima del codice batch\"],\"hsSgoQ\":[\"Attiva l'impostazione 'Enabled' del plugin per generare i codici batch.\"],\"iHaxSq\":[\"azzerato ogni giorno\"],\"j1yeuR\":[\"dal campo ubicazione {0}\"],\"kI1qVD\":[\"Formato\"],\"lCF0wC\":[\"Aggiorna\"],\"nyqfpO\":[\"Codice batch attuale\"],\"qt+UdX\":[\"per ubicazione\"],\"rNqTKZ\":[\"Prefisso\"],\"ss5emH\":[\"Prossimo codice\"],\"uNQ6eB\":[\"Sola lettura\"],\"ywFj2D\":[\"Configurazione\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/ja/messages.d.ts b/frontend/src/locales/ja/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/ja/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/ja/messages.po b/frontend/src/locales/ja/messages.po new file mode 100644 index 0000000..76f86ea --- /dev/null +++ b/frontend/src/locales/ja/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ja\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/ja/messages.ts b/frontend/src/locales/ja/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/ja/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/pseudo-LOCALE/messages.d.ts b/frontend/src/locales/pseudo-LOCALE/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/pseudo-LOCALE/messages.po b/frontend/src/locales/pseudo-LOCALE/messages.po new file mode 100644 index 0000000..c502699 --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-13 10:52+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pseudo-LOCALE\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/pseudo-LOCALE/messages.ts b/frontend/src/locales/pseudo-LOCALE/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/ru/messages.d.ts b/frontend/src/locales/ru/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/ru/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/ru/messages.po b/frontend/src/locales/ru/messages.po new file mode 100644 index 0000000..9babe68 --- /dev/null +++ b/frontend/src/locales/ru/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ru\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/ru/messages.ts b/frontend/src/locales/ru/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/ru/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/zh_Hans/messages.d.ts b/frontend/src/locales/zh_Hans/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/zh_Hans/messages.po b/frontend/src/locales/zh_Hans/messages.po new file mode 100644 index 0000000..65c3c78 --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh_Hans\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/zh_Hans/messages.ts b/frontend/src/locales/zh_Hans/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/zh_Hant/messages.d.ts b/frontend/src/locales/zh_Hant/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/zh_Hant/messages.po b/frontend/src/locales/zh_Hant/messages.po new file mode 100644 index 0000000..5f4d65b --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh_Hant\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/zh_Hant/messages.ts b/frontend/src/locales/zh_Hant/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..e249ed9 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2023", + "useDefineForClassFields": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..e9182f2 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,10 @@ +{ + "files": [], + "compilerOptions": { + "jsx": "react-jsx" + }, + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..cc4b779 --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,78 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { viteExternalsPlugin } from 'vite-plugin-externals' +import { lingui } from "@lingui/vite-plugin"; + + +/** + * The following libraries are externalized to avoid bundling them with the plugin. + * These libraries are expected to be provided by the InvenTree core application. + */ +export const externalLibs : Record = { + react: 'React', + 'react-dom': 'ReactDOM', + 'ReactDom': 'ReactDOM', + '@lingui/core': 'LinguiCore', + '@lingui/react': 'LinguiReact', + '@mantine/core': 'MantineCore', + "@mantine/notifications": 'MantineNotifications', +}; + +// Just the keys of the externalLibs object +const externalKeys = Object.keys(externalLibs); + +/** + * Vite config to build the frontend plugin as an exported module. + * This will be distributed in the 'static' directory of the plugin. + */ +export default defineConfig({ + plugins: [ + lingui(), + react({ + jsxRuntime: 'classic', + babel: { + plugins: ['macros'], // Required for @lingui macros + }, + }), + viteExternalsPlugin(externalLibs), + ], + esbuild: { + jsx: 'preserve', + }, + build: { + // minify: false, + target: 'esnext', + cssCodeSplit: false, + manifest: true, + sourcemap: true, + rollupOptions: { + preserveEntrySignatures: "exports-only", + input: [ + './src/Panel.tsx', + + './src/Settings.tsx', + ], + output: [ + // Generate two sets of output files: + // One without hashes - for backwards compatibility + { + dir: '../batchcode_plugin/static', + entryFileNames: '[name].js', + assetFileNames: 'assets/[name].[ext]', + globals: externalLibs, + }, + // And one with hashes for cache busting + { + dir: '../batchcode_plugin/static', + entryFileNames: '[name]-[hash].js', + assetFileNames: 'assets/[name].[ext]', + globals: externalLibs, + } + ], + external: externalKeys, + } + }, + optimizeDeps: { + exclude: externalKeys, + } +}) diff --git a/frontend/vite.dev.config.ts b/frontend/vite.dev.config.ts new file mode 100644 index 0000000..339fada --- /dev/null +++ b/frontend/vite.dev.config.ts @@ -0,0 +1,50 @@ +// Primary vite config - we extend this for dev mode +import { defineConfig } from 'vite' +import { viteExternalsPlugin } from 'vite-plugin-externals' +import viteConfig, { externalLibs } from './vite.config' +import InventreeHmrPlugin from '@inventreedb/ui/vite'; + +import react from "@vitejs/plugin-react-swc" +import { lingui } from "@lingui/vite-plugin" + + +/** + * Vite config to run the frontend plugin in development mode. + * + * This allows the plugin developer to "live reload" their plugin code, + * without having to rebuild and reinstall the plugin each time. + * + * This is a very minimal config, and is not meant to be used for production builds. + * Refer to vite.config.ts for the production build config. + */ +export default defineConfig((cfg) => { + + const config = { + ...viteConfig, + resolve: {}, + server: { + port: 5174, // Default port for plugins + strictPort: true, + cors: { + preflightContinue: true, + origin: '*', // Allow all origins for development + } + }, + }; + + // Override specific options for development + delete config.esbuild; + delete config.optimizeDeps; + + config.plugins = [ + lingui(), + react({ + plugins: [["@lingui/swc-plugin", {}]], + reactRefreshHost: 'http://localhost:5173', + }), + viteExternalsPlugin(externalLibs), + InventreeHmrPlugin(), + ]; + + return config; +}); diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..039d751 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,88 @@ +#This file is used to package the BatchCodePlugin plugin. +# +#- It was generated by the InvenTree Plugin Creator tool - version 1.20.0 +#- Ref: https://github.com/inventree/plugin_creator + +[build-system] +requires = ["setuptools", "twine", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "inventree-batchcode-plugin" +description = "Generate progressive batch codes for StockItems, with a configurable format and persistent per-part / per-location counters." +dynamic = ["version"] +authors = [ + { name = "Simone Amadori",email = "simone@amadori.bs.it" }, +] +readme = "README.md" +license = "MIT" +keywords = ["inventree", "plugin"] +# Matches the Python requirement of InvenTree 1.x +requires-python = ">=3.9" +dependencies = [ + # Everything this plugin imports (Django, DRF, InvenTree itself) is + # provided by the InvenTree instance it is installed into. +] +classifiers = [ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", + "Framework :: InvenTree", +] + +# Tooling only - the plugin has no runtime dependencies of its own. +# Installed into .venv by `uv sync`. +[dependency-groups] +dev = [ + "ruff>=0.12", + "pre-commit>=4.0", + "build>=1.2", + "twine>=6.0", +] + +[project.urls] +Homepage = "https://github.com/Kamaar/inventree-batchcode-plugin" + +[project.entry-points."inventree_plugins"] +BatchCodePlugin = "batchcode_plugin.core:BatchCodePlugin" + +[tool.setuptools.packages.find] +include = ["batchcode_plugin*"] + +[tool.setuptools.dynamic] +version = {attr = "batchcode_plugin.PLUGIN_VERSION"} + +[tool.ruff] +exclude = [ + ".git", + "__pycache__", + "test.py", + "build", + "dist", + "node_modules", + "tests", + "venv", + "env", + ".venv", + ".env", +] + +src = ["batchcode_plugin"] + +[tool.ruff.format] +quote-style = "single" + +[tool.ruff.lint] +select = ["E", "F", "I", "N", "D", "UP", "B", "DJ"] +ignore = [ + # Line length is handled by the formatter + "E501", + # Django model __str__ is defined; the checker misses the classmethods + "DJ012", +] + +[tool.ruff.lint.per-file-ignores] +# Generated migrations are not documented +"batchcode_plugin/migrations/*" = ["D"] + +[tool.ruff.lint.pydocstyle] +convention = "google" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3597d84 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,16 @@ +[flake8] +ignore = + # - W293 - blank lines contain whitespace + W293, + # - E501 - line too long (82 characters) + E501 + N802 +exclude = + .git, + __pycache__, + dist, + build, + src/static, + frontend/node_modules, + test.py +max-complexity = 20 diff --git a/setup.py b/setup.py deleted file mode 100644 index 2aa23a7..0000000 --- a/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name="inventree-batchcode-plugin", - version="1.0", - author="Simone Amadori", - author_email="simone@amadori.bs.it", - url="https://github.com/Kamaar/inventree-batchcode-plugin.git", - description="Plugin InvenTree per generare codici batch progressivi.", - packages=find_packages(), - install_requires=["inventree"], - entry_points={ - "inventree_plugins": ["BatchCodePlugin = batchcode_plugin.plugin:BatchCodePlugin"], - }, - classifiers=[ - "Programming Language :: Python :: 3", - "Operating System :: OS Independent", - "Framework :: InvenTree", - ], -) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..ce87b0b --- /dev/null +++ b/uv.lock @@ -0,0 +1,1398 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "build" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/ec/bf5ae0a7e5ab57abe8aabdd0759c971883895d1a20c49ae99f8146840c3c/build-1.4.4.tar.gz", hash = "sha256:f832ae053061f3fb524af812dc94b8b84bac6880cd587630e3b5d91a6a9c1703", size = 89220, upload-time = "2026-04-22T20:53:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/88/6764e7a109dd84294850741501145da90d13cdeac9d4e614929464a37420/build-1.4.4-py3-none-any.whl", hash = "sha256:8c3f48a6090b39edec1a273d2d57949aaf13723b01e02f9d518396887519f64d", size = 25921, upload-time = "2026-04-22T20:53:43.251Z" }, +] + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.10.2'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "pycparser", version = "2.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, + { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" }, + { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" }, + { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", size = 369072, upload-time = "2026-08-15T08:16:22.964Z" }, + { url = "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", size = 251142, upload-time = "2026-08-15T08:16:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", size = 240714, upload-time = "2026-08-15T08:16:26.392Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", size = 279637, upload-time = "2026-08-15T08:16:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", size = 276543, upload-time = "2026-08-15T08:16:29.399Z" }, + { url = "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", size = 261644, upload-time = "2026-08-15T08:16:30.722Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", size = 259609, upload-time = "2026-08-15T08:16:32.248Z" }, + { url = "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", size = 252457, upload-time = "2026-08-15T08:16:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", size = 242240, upload-time = "2026-08-15T08:16:35.396Z" }, + { url = "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", size = 280308, upload-time = "2026-08-15T08:16:36.825Z" }, + { url = "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", size = 258679, upload-time = "2026-08-15T08:16:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", size = 277221, upload-time = "2026-08-15T08:16:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", size = 263799, upload-time = "2026-08-15T08:16:40.885Z" }, + { url = "https://files.pythonhosted.org/packages/b7/23/b38a20598d5a825f85d9d7636860e56ff0db1479f86497a6e485aa9326f7/charset_normalizer-3.5.1-cp310-cp310-win32.whl", hash = "sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20", size = 182037, upload-time = "2026-08-15T08:16:42.198Z" }, + { url = "https://files.pythonhosted.org/packages/d2/21/83fffb77864408b8bf0fe1ca603926401d6f8775a8e150b39aacc9958f8a/charset_normalizer-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d", size = 206030, upload-time = "2026-08-15T08:16:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/86/2e/b93135b5034b1157fb29554b0d06d4844ce62282f0e0a14036f93d7ee2e7/charset_normalizer-3.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5", size = 185092, upload-time = "2026-08-15T08:16:45.177Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/d0/91/bc145e42f93d6601b9a26f5421af2d7c3093ae6e6d03b8e583c9cebbf530/charset_normalizer-3.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85de3134b5379856e323ba37c19c9256d39425f7b76a63af52b09fb4664c2e8f", size = 368830, upload-time = "2026-08-15T08:20:17.272Z" }, + { url = "https://files.pythonhosted.org/packages/58/67/62df6a907162461f372e95cbbc1bc64c7457e86abcc851feb84409a11eff/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e5e1224c0a6a90e05843e07adfec669edebec17801c67072f51e59561d63c0b", size = 251725, upload-time = "2026-08-15T08:20:18.942Z" }, + { url = "https://files.pythonhosted.org/packages/a4/2d/64a13610fd28c80f97aff0ea5cf31cf255d220a8243ac0c78c66fd3d874d/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5e2d0e146dcb57034f8b97dc58d2d512cb90aba253960ce449f695fec6a82c6f", size = 241254, upload-time = "2026-08-15T08:20:20.641Z" }, + { url = "https://files.pythonhosted.org/packages/84/79/a88c181e7f4a7579696fedb34fa63844ede2ff7caf44c5f321cec57d92fb/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e06efa066f7dbadbc84ebc126a97c452a6451dfcf589d89d788484949e1cf795", size = 281944, upload-time = "2026-08-15T08:20:22.219Z" }, + { url = "https://files.pythonhosted.org/packages/64/60/7c5469f455f4fa65d39da9f088dffc1a586560bfb9e3279441eed78bd469/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:994e883d17c559cdfd38c84003c8b27d25424a1077272a17e7cd27bfe0bf57b2", size = 278350, upload-time = "2026-08-15T08:20:23.744Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cf/7568d8c1c9100b7c8bab9035215a6b36b32b39bb50cabaee9389c4606887/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:789b8982559ae28dad2356519f841655756cdcd96616410590ae0b17454ee64f", size = 262670, upload-time = "2026-08-15T08:20:25.387Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ec/3a616c3806ec3f957337e6bf874ae7d64693185039edfbbf87103b8c8631/charset_normalizer-3.5.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a951ad59cad9145664a730d3036b40b844e74d2d3683da40111463cd3a83845d", size = 260445, upload-time = "2026-08-15T08:20:27.012Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e0/489aa2a33b944077d4c2c705c245d833dc12cd571a52fc67eaf273f5373a/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:55261ac0d2941c42f196dd576f543d87a8ee03cd6f5e30dfb4d807b2e3b9121a", size = 253263, upload-time = "2026-08-15T08:20:28.6Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bc/f528dfb78d3bfdc8ee6aeea81eb22e6918d03e4442d373a79717f17de45e/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5ca0555312ae2fe82715cada7fac375530c2f3349e1eaa1bcb33d0283ac79a18", size = 242879, upload-time = "2026-08-15T08:20:30.186Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8c/58efc6393e405a8d52b241d31dd9118352c247e4017110c3edfdb4618f0d/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2e9cf9253119d8e5d111f05d71626786fd3d6193817316eab1ca088cdb8593cf", size = 282086, upload-time = "2026-08-15T08:20:31.826Z" }, + { url = "https://files.pythonhosted.org/packages/02/fc/0d9ab98fa7a61394353e8acd0f5f60fc6e94a4615f574af8be0eca14a7ef/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:433c5a81eade63b47e522303bad236f59dba55ea6951746f5558355eeed8c75d", size = 259212, upload-time = "2026-08-15T08:20:33.442Z" }, + { url = "https://files.pythonhosted.org/packages/79/71/6ee3a48a21e844e5079d8e9b2e91c641da5a7912a748e9e94c9e3ab9ce1c/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:13e3afe97712e8887cd516e960c63f0b93122971e5b5e4b2622fe7701771e838", size = 278949, upload-time = "2026-08-15T08:20:35.133Z" }, + { url = "https://files.pythonhosted.org/packages/64/77/9ae101cb33bd9f681551e82a2b9e08eec99ff715458340931370f4228de9/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb12fb2ba69ffa05f8695f61c69e591dc4b4a12ac3757ac8af8adb259bf56d17", size = 264513, upload-time = "2026-08-15T08:20:36.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/249943372195935ff7393eae5842c7dae6fd04401e512bbd69dab1aae40b/charset_normalizer-3.5.1-cp39-cp39-win32.whl", hash = "sha256:56490c595a28b1bb27dfc583e816152a9767721ef58b2c03b13f954d2f707420", size = 182431, upload-time = "2026-08-15T08:20:38.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/31/7f79c671d827080d6eecd697fbbeb4f0f6f8507bf4c5625b5f6398ec5876/charset_normalizer-3.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:012a22b88a77ca2e59b98ac5889b0deb604147666032f45e6d6e217634d2550d", size = 206385, upload-time = "2026-08-15T08:20:40.242Z" }, + { url = "https://files.pythonhosted.org/packages/c4/58/c9295c61e3f826ba7d874f0fd1c5e335dbec928d7b9146b33b48d14a25f1/charset_normalizer-3.5.1-cp39-cp39-win_arm64.whl", hash = "sha256:29880d17a8eb0b5cfdfd8944b468322928059aa35f1f5fa8ff22b149ec0b42f8", size = 185470, upload-time = "2026-08-15T08:20:41.765Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "47.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version <= '3.9' and platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version <= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973", size = 4644617, upload-time = "2026-04-24T19:53:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8", size = 4668186, upload-time = "2026-04-24T19:53:09.053Z" }, + { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b", size = 4651244, upload-time = "2026-04-24T19:53:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7", size = 4701842, upload-time = "2026-04-24T19:53:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93", size = 4289313, upload-time = "2026-04-24T19:53:17.755Z" }, + { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac", size = 4650964, upload-time = "2026-04-24T19:53:20.062Z" }, + { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8", size = 4701544, upload-time = "2026-04-24T19:53:24.356Z" }, + { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318", size = 4783536, upload-time = "2026-04-24T19:53:26.665Z" }, + { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001", size = 4926106, upload-time = "2026-04-24T19:53:28.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7", size = 4631180, upload-time = "2026-04-24T19:53:37.517Z" }, + { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1", size = 4653529, upload-time = "2026-04-24T19:53:39.775Z" }, + { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c", size = 4638570, upload-time = "2026-04-24T19:53:42.129Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7", size = 4686832, upload-time = "2026-04-24T19:53:47.015Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923", size = 4269301, upload-time = "2026-04-24T19:53:48.97Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab", size = 4638110, upload-time = "2026-04-24T19:53:51.011Z" }, + { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7", size = 4686563, upload-time = "2026-04-24T19:53:55.274Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52", size = 4770094, upload-time = "2026-04-24T19:53:57.753Z" }, + { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd", size = 4913811, upload-time = "2026-04-24T19:54:00.236Z" }, + { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27", size = 4635767, upload-time = "2026-04-24T19:54:08.519Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10", size = 4654350, upload-time = "2026-04-24T19:54:10.795Z" }, + { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b", size = 4643394, upload-time = "2026-04-24T19:54:13.275Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515", size = 4688771, upload-time = "2026-04-24T19:54:17.835Z" }, + { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc", size = 4270753, upload-time = "2026-04-24T19:54:19.963Z" }, + { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca", size = 4642911, upload-time = "2026-04-24T19:54:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe", size = 4688262, upload-time = "2026-04-24T19:54:26.946Z" }, + { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31", size = 4775506, upload-time = "2026-04-24T19:54:28.926Z" }, + { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7", size = 4912060, upload-time = "2026-04-24T19:54:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/81/75/d691e284750df5d9569f2b1ce4a00a71e1d79566da83b2b3e5549c84917f/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe", size = 4587867, upload-time = "2026-04-24T19:54:40.619Z" }, + { url = "https://files.pythonhosted.org/packages/07/d6/1b90f1a4e453009730b4545286f0b39bb348d805c11181fc31544e4f9a65/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475", size = 4627192, upload-time = "2026-04-24T19:54:42.849Z" }, + { url = "https://files.pythonhosted.org/packages/dc/53/cb358a80e9e359529f496870dd08c102aa8a4b5b9f9064f00f0d6ed5b527/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50", size = 4587486, upload-time = "2026-04-24T19:54:44.908Z" }, + { url = "https://files.pythonhosted.org/packages/8b/57/aaa3d53876467a226f9a7a82fd14dd48058ad2de1948493442dfa16e2ffd/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab", size = 4626327, upload-time = "2026-04-24T19:54:47.813Z" }, +] + +[[package]] +name = "cryptography" +version = "50.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version > '3.9' and python_full_version < '3.10'", +] +dependencies = [ + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version > '3.9' and python_full_version < '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version > '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, + { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, + { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, + { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, + { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, + { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, + { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, + { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, + { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, + { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, + { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, + { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" }, + { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" }, + { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, +] + +[[package]] +name = "docutils" +version = "0.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/a4/5180d9afc57e8fca05601dd652bdff19604c218814037fe90ffc7625a50a/docutils-0.23.tar.gz", hash = "sha256:746f5060322511280a1e50eb76846ed6bf2342984b2ac04dc42caa1a8d78799e", size = 2303823, upload-time = "2026-05-27T17:41:06.934Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/91/30151a39f7570f448ed84529390628a651d7f27c87d73c9b887f8189695e/docutils-0.23-py3-none-any.whl", hash = "sha256:25d013af9bf23bc1c7b2b093dff4208166c53a94786c9e447808335ef1185fea", size = 634701, upload-time = "2026-05-27T17:40:58.442Z" }, +] + +[[package]] +name = "filelock" +version = "3.19.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, +] + +[[package]] +name = "filelock" +version = "3.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/a0/50c2c0ce5e74d7721bbb1b19a26ebd339aac5878553a6e35308c2f31f935/filelock-3.32.5.tar.gz", hash = "sha256:f6a6a28f743f9b95ce19db5abe0f376f75eb56517dff21e1a4751e2657d3e83d", size = 222838, upload-time = "2026-08-31T18:56:34.729Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/d2/b70a31e13d04456d28493f31d2aa087e99eeb2767ef0293b2625727ccb8c/filelock-3.32.5-py3-none-any.whl", hash = "sha256:142cd9fa77a872c5e78c62329a0d15278fadc686eb89e760017968961a4fd6b2", size = 100003, upload-time = "2026-08-31T18:56:33.078Z" }, +] + +[[package]] +name = "id" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", size = 18088, upload-time = "2026-02-04T16:19:41.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca", size = 14689, upload-time = "2026-02-04T16:19:40.051Z" }, +] + +[[package]] +name = "identify" +version = "2.6.15" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, +] + +[[package]] +name = "identify" +version = "2.6.19" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "zipp", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/7e/1e7e8dc30634b93ebb3d58a3dea569ad146e656218d3960ab04f62047b29/importlib_metadata-9.0.1.tar.gz", hash = "sha256:ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99", size = 59124, upload-time = "2026-08-28T15:30:34.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/55/ecca97ae19075f1fac62def77731e7f535e6c1fb8f92ff08160c5e6dade8/importlib_metadata-9.0.1-py3-none-any.whl", hash = "sha256:bba5600596a7e21f3eef53281cf28d6a5195634d2f2b78ff9501a3272c6eaab0", size = 27920, upload-time = "2026-08-28T15:30:33.433Z" }, +] + +[[package]] +name = "inventree-batchcode-plugin" +source = { editable = "." } + +[package.dev-dependencies] +dev = [ + { name = "build", version = "1.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "build", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pre-commit", version = "4.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ruff" }, + { name = "twine", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "twine", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "build", specifier = ">=1.2" }, + { name = "pre-commit", specifier = ">=4.0" }, + { name = "ruff", specifier = ">=0.12" }, + { name = "twine", specifier = ">=6.0" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "more-itertools", version = "11.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/7b/c3081ff1af947915503121c649f26a778e1a2101fd525f74aef997d75b7e/jaraco_context-6.1.1.tar.gz", hash = "sha256:bc046b2dc94f1e5532bd02402684414575cc11f565d929b6563125deb0a6e581", size = 15832, upload-time = "2026-03-07T15:46:04.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/49/c152890d49102b280ecf86ba5f80a8c111c3a155dafa3bd24aeb64fde9e1/jaraco_context-6.1.1-py3-none-any.whl", hash = "sha256:0df6a0287258f3e364072c3e40d5411b20cafa30cb28c4839d24319cecf9f808", size = 7005, upload-time = "2026-03-07T15:46:03.515Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "more-itertools", version = "11.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jaraco-context", version = "6.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jaraco-functools", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jaraco-functools", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and sys_platform == 'linux'" }, + { name = "secretstorage", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "mdurl", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "mdurl", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "nh3" +version = "0.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz", hash = "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", size = 25662, upload-time = "2026-08-23T14:26:30.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", size = 1471147, upload-time = "2026-08-23T14:25:55.259Z" }, + { url = "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", size = 820463, upload-time = "2026-08-23T14:25:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", size = 861456, upload-time = "2026-08-23T14:25:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", size = 1023930, upload-time = "2026-08-23T14:25:59.465Z" }, + { url = "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", size = 1102614, upload-time = "2026-08-23T14:26:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", size = 1059915, upload-time = "2026-08-23T14:26:02.388Z" }, + { url = "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", size = 1047402, upload-time = "2026-08-23T14:26:03.897Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl", hash = "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", size = 619895, upload-time = "2026-08-23T14:26:05.105Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", size = 633456, upload-time = "2026-08-23T14:26:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl", hash = "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", size = 611003, upload-time = "2026-08-23T14:26:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", size = 1493959, upload-time = "2026-08-23T14:26:09.025Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", size = 859615, upload-time = "2026-08-23T14:26:10.606Z" }, + { url = "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", size = 839872, upload-time = "2026-08-23T14:26:12.037Z" }, + { url = "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", size = 1091325, upload-time = "2026-08-23T14:26:13.34Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", size = 1042482, upload-time = "2026-08-23T14:26:14.667Z" }, + { url = "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", size = 946868, upload-time = "2026-08-23T14:26:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", size = 832161, upload-time = "2026-08-23T14:26:17.272Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", size = 849791, upload-time = "2026-08-23T14:26:18.498Z" }, + { url = "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", size = 875473, upload-time = "2026-08-23T14:26:19.908Z" }, + { url = "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", size = 1036463, upload-time = "2026-08-23T14:26:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", size = 1116029, upload-time = "2026-08-23T14:26:22.907Z" }, + { url = "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", size = 1076589, upload-time = "2026-08-23T14:26:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", size = 1058871, upload-time = "2026-08-23T14:26:25.674Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl", hash = "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", size = 630729, upload-time = "2026-08-23T14:26:26.932Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl", hash = "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", size = 644462, upload-time = "2026-08-23T14:26:28.294Z" }, + { url = "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl", hash = "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a", size = 621867, upload-time = "2026-08-23T14:26:29.547Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.11.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/69/b7/802a56eca9f2fac455b8bab5375a2647b0f0e14a2cd63ef077de3c4a7658/platformdirs-4.11.7.tar.gz", hash = "sha256:4f41487eeeeeb07f3a6625e61d9bc0ae6809f92d3386dbd74392fbb76108104d", size = 35127, upload-time = "2026-09-01T13:35:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/6e/80993e10a0482f630cef528635789233224f36b1ffd11592aa15d13ff9ce/platformdirs-4.11.7-py3-none-any.whl", hash = "sha256:8a02cb259042c79d1cd0450facc2fe6dc9d303ae7901afbe33bf8ea0b188cef6", size = 23938, upload-time = "2026-09-01T13:35:09.02Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "identify", version = "2.6.15", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "nodeenv", marker = "python_full_version < '3.10'" }, + { name = "pyyaml", marker = "python_full_version < '3.10'" }, + { name = "virtualenv", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.6.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "cfgv", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "identify", version = "2.6.19", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nodeenv", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "virtualenv", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/89/1f3e8e1fc3e97de0fa963495832f581f025f29471602a309e48808244292/pre_commit-4.6.2.tar.gz", hash = "sha256:8f5d7bfb021ecdbcd9d49d89847082dd24172ccde534390081a679ad046e2441", size = 198670, upload-time = "2026-08-10T22:07:18.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/e2/bbb7129c9e7999a6b8ee9cca3b66486c25c423ab5a75f34071798b74ce94/pre_commit-4.6.2-py2.py3-none-any.whl", hash = "sha256:e2dde9a75d3bce11bd3831c26d134df00a2803c1d818be6a0383c3dcda25dc4e", size = 226202, upload-time = "2026-08-10T22:07:16.942Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "filelock", version = "3.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/96/0f93e27c9f60a650838f2118159aa115fd5732c0716247917b7ba7ede665/python_discovery-1.6.0.tar.gz", hash = "sha256:6393b4eae1be8b2182670635e7baff89ac21cb9f8e86fd1ff40c7b1144febb4c", size = 82849, upload-time = "2026-08-28T17:30:02.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/5e/21abf578182fb15006a57faf3711a1e659e29d600d19b6e557eae908c81d/python_discovery-1.6.0-py3-none-any.whl", hash = "sha256:d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a", size = 38451, upload-time = "2026-08-28T17:30:01.236Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "readme-renderer" +version = "44.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "docutils", marker = "python_full_version < '3.10'" }, + { name = "nh3", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", size = 13310, upload-time = "2024-07-08T15:00:56.577Z" }, +] + +[[package]] +name = "readme-renderer" +version = "46.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "docutils", marker = "python_full_version >= '3.10'" }, + { name = "nh3", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz", hash = "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", size = 38382, upload-time = "2026-08-28T15:18:32.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl", hash = "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560", size = 14239, upload-time = "2026-08-28T15:18:31.132Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.10'" }, + { name = "idna", marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, + { name = "idna", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" }, + { url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" }, + { url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" }, + { url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" }, + { url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" }, + { url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" }, + { url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" }, + { url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "cryptography", version = "47.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version <= '3.9'" }, + { name = "cryptography", version = "50.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version > '3.9' and python_full_version < '3.10'" }, + { name = "jeepney", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739, upload-time = "2022-08-13T16:22:46.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221, upload-time = "2022-08-13T16:22:44.457Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "cryptography", version = "50.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jeepney", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "twine" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "id", marker = "python_full_version < '3.10'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "keyring", marker = "python_full_version < '3.10' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "readme-renderer", version = "44.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "requests-toolbelt", marker = "python_full_version < '3.10'" }, + { name = "rfc3986", marker = "python_full_version < '3.10'" }, + { name = "rich", marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" }, +] + +[[package]] +name = "twine" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "id", marker = "python_full_version >= '3.10'" }, + { name = "keyring", marker = "python_full_version >= '3.10' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "readme-renderer", version = "46.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "requests-toolbelt", marker = "python_full_version >= '3.10'" }, + { name = "rfc3986", marker = "python_full_version >= '3.10'" }, + { name = "rich", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/3c/58f808a359700f39a967dffede33efeac809262c03303fa3eec6afff8f49/twine-7.0.0.tar.gz", hash = "sha256:85cdb29c518efef867360ae4acd4b0dfd61c8654a22fca08e6f8539f05022177", size = 215032, upload-time = "2026-07-27T15:59:00.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/08/ddcdc06225eaad6de0e48e1002b06d919dbde20582d0662c7af51308e5d6/twine-7.0.0-py3-none-any.whl", hash = "sha256:b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7", size = 43204, upload-time = "2026-07-27T15:58:59.26Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.7.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "filelock", version = "3.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "platformdirs", version = "4.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "python-discovery" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/1c/69faa2e6a83484e2a8227bce5cfaa183941c5720f99c48f204931d286b07/virtualenv-21.7.8.tar.gz", hash = "sha256:1dc49c790072a9072cb1803f9bd62aa69cd583077cada32390f75505cdc64c9b", size = 5347580, upload-time = "2026-09-01T13:36:13.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/34/88d507d4a4030fa559788de9c690a214f9a4053aa1d91cfb60e9b36127c2/virtualenv-21.7.8-py3-none-any.whl", hash = "sha256:3040eb3cbf5d32b10ffd57d167e6a162237ad82ba7d8cf1400a1efed593d85ac", size = 5324617, upload-time = "2026-09-01T13:36:11.248Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +] From 224cf67ca1f0530515f3326b598b450d158733cb Mon Sep 17 00:00:00 2001 From: Kamaar Date: Wed, 2 Sep 2026 11:29:30 +0200 Subject: [PATCH 2/3] Add a pytest suite and wire it into CI Cover the parts of the plugin that decide what a batch code looks like: format rendering and padding, counter scoping, the generate_batch_code hook context, trigger modes, prefix resolution, role gating, the panel context and serializer construction. 76 tests, no InvenTree checkout required. tests/conftest.py configures Django minimally, stubs the InvenTree modules and loads the plugin modules by path, then subclasses BatchCodePlugin with a dict-backed get_setting. Only persistence is faked: build_key is delegated to the real BatchCounter, so the scope key under test is the production one. Fix a bug the suite found immediately: the serializers declared PrimaryKeyRelatedField(queryset=None) and filled the queryset in from Serializer.__init__, but DRF validates queryset inside the *field* constructor, which runs when the class body is evaluated. serializers.py therefore raised AssertionError on import, which would have taken down the plugin's whole URL set via setup_urls -> views -> serializers. Replaced with LazyModelField subclasses that override get_queryset(), deferring the model import and suppressing DRF's constructor check. Drop .github/workflows/pypi.yaml: the plugin is not published to PyPI, and the workflow referenced a PYPI_API_TOKEN secret that does not exist, so the first published release would have failed. README documents how to restore it. The install instructions now point at this repository rather than PyPI, and note that a git install omits the uncommitted frontend bundles. Pin the development interpreter with .python-version, and mark the Django and DRF dev dependencies for python_version >= 3.10: the distribution still declares requires-python >=3.9, matching what InvenTree itself claims, while Django 5.2 needs 3.10+. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yaml | 7 +- .github/workflows/pypi.yaml | 44 -- .python-version | 1 + CLAUDE.md | 63 ++- README.md | 54 +- batchcode_plugin/serializers.py | 98 ++-- pyproject.toml | 17 +- tests/conftest.py | 278 +++++++++ tests/test_api_surface.py | 86 +++ tests/test_code_format.py | 84 +++ tests/test_counter_scope.py | 99 ++++ tests/test_hook_contract.py | 220 +++++++ tests/test_permissions.py | 122 ++++ uv.lock | 976 ++++---------------------------- 14 files changed, 1186 insertions(+), 963 deletions(-) delete mode 100644 .github/workflows/pypi.yaml create mode 100644 .python-version create mode 100644 tests/conftest.py create mode 100644 tests/test_api_surface.py create mode 100644 tests/test_code_format.py create mode 100644 tests/test_counter_scope.py create mode 100644 tests/test_hook_contract.py create mode 100644 tests/test_permissions.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f82f5f3..3aac8ac 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,12 +1,12 @@ # Ensure that the plugin meets the required style guidelines -# Ensure that the plugin builds correctly +# Ensure that the tests pass, and that the plugin builds correctly name: CI Checks on: ["push", "pull_request"] jobs: - ci: + backend: runs-on: ubuntu-latest steps: - name: Checkout Code @@ -15,12 +15,15 @@ jobs: uses: astral-sh/setup-uv@v5 with: enable-cache: true + # Honours .python-version - name: Install Deps run: uv sync --locked - name: Style Checks run: | uv run ruff format --check . uv run ruff check . + - name: Tests + run: uv run pytest - name: Build Plugin run: uv run python -m build diff --git a/.github/workflows/pypi.yaml b/.github/workflows/pypi.yaml deleted file mode 100644 index cfaaa5a..0000000 --- a/.github/workflows/pypi.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# Publish to PyPi package index -# Note: Requires a secret named PYPI_API_TOKEN to be set in the repository settings - -name: PIP Publish - -on: - release: - types: [published] - -jobs: - - publish: - name: Publish to PyPi - runs-on: ubuntu-latest - - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install Python Dependencies - run: uv sync --locked - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: "22" - # The static bundles are gitignored, so they must be built here: - # a wheel published without them has no plugin UI. - - name: Build Frontend - run: | - cd frontend - npm install - npm run translate - npm run build - - name: Build Binary - run: uv run python -m build - - name: Publish - run: uv run python -m twine upload dist/* - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - TWINE_REPOSITORY: pypi diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/CLAUDE.md b/CLAUDE.md index 4d1b41b..294558b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,6 +21,8 @@ Python tooling is managed with **uv**; the frontend with **npm**. uv sync # create .venv from pyproject's [dependency-groups] dev uv run ruff format . # format (single quotes, see [tool.ruff.format]) uv run ruff check . # lint — CI runs format --check plus this +uv run pytest # tests +uv run pytest tests/test_hook_contract.py::test_date_defaults_to_current_time uv run python -m build # sdist + wheel into dist/ cd frontend @@ -32,31 +34,47 @@ npm run lint:fix # biome check --fix (also formats) npm run dev # vite dev server on :5174, pairs with INVENTREE_PLUGIN_DEV_HOST ``` -There is **no test suite**. See *Verifying changes* below for what can actually be checked -locally. - ### Release ordering `batchcode_plugin/static/` is gitignored, so `cd frontend && npm run build` must run **before** -`python -m build` or the wheel ships without a UI. `.github/workflows/pypi.yaml` does this in -order; a manual release must too. +`python -m build` or the wheel ships without a UI. There is no publishing workflow — the plugin +is not on PyPI, and `pypi.yaml` was removed from the creator's scaffold. Releases are built by +hand, in that order. ## Verifying changes Nothing in `batchcode_plugin/` can be imported outside a configured InvenTree/Django process — `core.py` imports `from plugin import InvenTreePlugin`, and the views and `seed_value` import -`stock.models` / `part.models`. So: - -- **Backend logic** can be exercised offline by stubbing `plugin`, `plugin.mixins`, - `InvenTree.helpers`, `stock.models` and `batchcode_plugin.models` in `sys.modules`, then - loading `core.py` via `importlib`, subclassing `BatchCodePlugin` and overriding `get_setting` - to read from a dict. This covers `render_code`, `resolve_prefix`, `counter_scope`, - `wants_to_generate`, `extract_targets` and `build_code` — i.e. everything that decides what a - code looks like. Requires `uv run --with django==5.2.17`. -- **Frontend** is genuinely verified by `npm run build` (`tsc -b` typechecks) and `npm run lint`. +`stock.models` / `part.models`. `tests/conftest.py` works around this: it configures Django +minimally, stubs `plugin`, `plugin.mixins`, `InvenTree.helpers`, `stock.models` and `part.models` +in `sys.modules`, loads the plugin modules by path with `importlib`, and subclasses +`BatchCodePlugin` with a dict-backed `get_setting`. So `uv run pytest` needs no InvenTree +checkout. + +Two conventions in that harness are load-bearing: + +- The stub mixins carry working `get_settings_dict` and `plugin_static_file`, so tests exercise + the panel wiring instead of monkeypatching around it. Add a method to the stub when the plugin + starts relying on a new one from the real mixins. +- `InMemoryCounter` fakes only persistence. `build_key` is bound to the **real** + `BatchCounter.build_key`, so the scope key under test is the production one — do not + reimplement it in the fake. + +What the suite does and does not reach: + +- **Covered**: format rendering and padding, counter scoping, hook kwargs resolution, trigger + modes, prefix resolution, role gating, panel context, URL names, serializer construction. +- **Frontend** is genuinely verified by `npm run build` (`tsc -b` typechecks) and `npm run lint`, + not by pytest. - **Packaging** is verified by `python -m build` plus inspecting the wheel for `batchcode_plugin/static/Panel.js` and the `inventree_plugins` entry point. -- **Anything touching the ORM or the registry** needs a real InvenTree instance. +- **Anything touching the ORM or the registry** needs a real InvenTree instance: + `BatchCounter.advance`'s `select_for_update` behaviour, `seed_value`'s queries, the views' + request handling, and migrations. + +When changing generation logic, sanity-check that the suite is not vacuous by reintroducing the +bug you are guarding against (e.g. `kwargs.get('item')` → `kwargs.get('stock_item')`) and +confirming tests fail. ## Architecture @@ -113,6 +131,18 @@ strings/ints (plus the datetime). Model instances are deliberately not exposed can traverse attributes. A bare `{num}` is rewritten to `{num:0d}` before formatting, so an explicit spec like `{num:06d}` wins over `MIN_DIGITS`. +### Serializers: queryset resolution + +The InvenTree models cannot be imported while `serializers.py` loads — the plugin registry is +still being built. But DRF validates `queryset` inside `RelatedField.__init__`, which runs when +the **class body is evaluated**, i.e. at import. So the tempting pattern — declare +`PrimaryKeyRelatedField(queryset=None)` and fill it in from `Serializer.__init__` — raises +`AssertionError` at import and takes the plugin's whole URL set down with it. + +The working pattern is the `LazyModelField` subclasses: drop the `queryset` kwarg and override +`get_queryset()`, which both defers the model import and suppresses DRF's constructor check. +`tests/test_api_surface.py` guards this. + ### Frontend `frontend/src/Panel.tsx` renders the stock item panel (`get_ui_panels`, gated on @@ -152,7 +182,8 @@ There is no separate server flag for app plugins in InvenTree 1.x — only `plug - Code, setting keys and user-facing strings are English; Django strings use `gettext_lazy as _`, frontend strings the lingui `t` macro. Italian is the fully-translated frontend locale. - Ruff formats with **single quotes** and enforces google-style docstrings (`D` rules) on every - module, class and public method. `batchcode_plugin/migrations/` is exempt from `D`. + module, class and public method. `batchcode_plugin/migrations/` is exempt from `D`; `tests/` + is linted but exempt from `D103` and the `N80x` naming rules. - Logging goes through `logging.getLogger('inventree')`, messages prefixed `BatchCodePlugin:`. - Bump the version in **one** place: `batchcode_plugin/__init__.py:PLUGIN_VERSION`. `pyproject.toml` reads it dynamically and `core.py` uses it for `VERSION`. (1.x had three diff --git a/README.md b/README.md index e92ebc7..fc0dde9 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,29 @@ how the code is formatted. ## Installation +> **Not published to PyPI.** Install from this repository. + ### Plugin manager -Install `inventree-batchcode-plugin` from the InvenTree plugin manager -(Settings → Plugins → Install Plugin), then restart the server. +In Settings → Plugins → Install Plugin, install from the source URL: + +``` +git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0 +``` ### Command line +Into the InvenTree instance's own environment: + ```bash -pip install -U inventree-batchcode-plugin +pip install -U git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0 ``` +Installing from git builds the package from source, which does **not** include +the compiled frontend bundles — they are not committed. Without them the plugin +works, but its UI panel and settings preview do not render. To include them, +build a wheel first (see *Building a release* below) and install that. + ### After installing 1. **Enable the plugin** in Settings → Plugins. @@ -128,12 +140,14 @@ fall back to English. ## Development -The Python environment is managed with [uv](https://docs.astral.sh/uv/). +The Python environment is managed with [uv](https://docs.astral.sh/uv/), and +targets the version in `.python-version`. ```bash uv sync # create .venv with the dev tooling uv run ruff format . # format uv run ruff check . # lint +uv run pytest # tests uv run python -m build # build sdist + wheel ``` @@ -147,8 +161,33 @@ npm run build # bundle into batchcode_plugin/static/ npm run lint # biome ``` -The compiled bundles in `batchcode_plugin/static/` are not committed, so -`npm run build` must run before packaging — the release workflow does this. +### Tests + +`tests/` covers the parts of the plugin that decide what a code looks like: +format rendering and padding, counter scoping, the `generate_batch_code` hook +context, trigger modes, role gating, and that the REST serializers import and +construct. Everything that touches the ORM or the plugin registry needs a real +InvenTree instance and is out of scope. + +The InvenTree modules are stubbed in `tests/conftest.py`, so the suite runs +without an InvenTree checkout — `uv run pytest`, nothing else. Persistence is +the only faked part: `BatchCounter.peek` / `.advance` are replaced with an +in-memory store, while `build_key` is delegated to the real model so the tests +cannot drift from the production scope key. + +### Building a release + +The compiled bundles in `batchcode_plugin/static/` are not committed, so the +frontend must be built **before** the package, or the wheel ships without a UI: + +```bash +cd frontend && npm install && npm run translate && npm run build && cd .. +uv run python -m build # -> dist/*.whl +``` + +There is no PyPI publishing workflow. To add one, restore the plugin creator's +`pypi.yaml` (it triggers on `release: published` and needs a `PYPI_API_TOKEN` +repository secret), making sure the frontend build step still runs first. This project was restructured with the [InvenTree plugin creator](https://github.com/inventree/plugin-creator). @@ -194,7 +233,8 @@ Breaking and behavioural changes: - Correct handling of the `generate_batch_code` hook context - React panel for the stock item page and a live preview on the settings page - Preview and generate REST endpoints (`UrlsMixin`) -- uv-managed Python environment, ruff formatting and linting, GitHub Actions CI +- uv-managed Python environment, ruff formatting and linting, pytest suite, + GitHub Actions CI - Removed `TARGET_FIELD`; see *Upgrading from 1.x* ### 1.7 diff --git a/batchcode_plugin/serializers.py b/batchcode_plugin/serializers.py index 8cfd472..38b3bf0 100644 --- a/batchcode_plugin/serializers.py +++ b/batchcode_plugin/serializers.py @@ -1,14 +1,69 @@ """API serializers for the BatchCodePlugin plugin. -Request and response are separate serializers on purpose. A single serializer -with a read_only 'batch_code' field cannot carry the code back out: read_only -fields are excluded from validated_data, so re-serializing the request instance -would silently drop it from the response. +Two things here are deliberate: + +- Request and response are separate serializers. A single serializer with a + read_only 'batch_code' field cannot carry the code back out: read_only fields + are excluded from validated_data, so re-serializing the request would + silently drop it from the response. +- The related fields resolve their queryset in `get_queryset`, not in + `__init__`. The InvenTree models cannot be imported while this module is + loaded (the plugin registry is still being built), and DRF validates + `queryset` inside the *field* constructor - which runs when the class body is + evaluated, i.e. at import time - so passing `queryset=None` and filling it in + later raises an AssertionError before it ever gets the chance. """ from rest_framework import serializers +class LazyModelField(serializers.PrimaryKeyRelatedField): + """Related field whose queryset is resolved on use. + + Overriding `get_queryset` also suppresses DRF's constructor-time check for + a `queryset` argument. + """ + + def __init__(self, **kwargs): + """Drop any queryset argument; `get_queryset` supplies it instead.""" + kwargs.pop('queryset', None) + super().__init__(**kwargs) + + def get_queryset(self): + """Return the queryset for this field. Overridden by subclasses.""" + raise NotImplementedError + + +class StockItemField(LazyModelField): + """Primary key reference to a StockItem.""" + + def get_queryset(self): + """All stock items.""" + from stock.models import StockItem + + return StockItem.objects.all() + + +class PartField(LazyModelField): + """Primary key reference to a Part.""" + + def get_queryset(self): + """All parts.""" + from part.models import Part + + return Part.objects.all() + + +class StockLocationField(LazyModelField): + """Primary key reference to a StockLocation.""" + + def get_queryset(self): + """All stock locations.""" + from stock.models import StockLocation + + return StockLocation.objects.all() + + class BatchCodeResponseSerializer(serializers.Serializer): """A generated or previewed batch code.""" @@ -34,45 +89,27 @@ class Meta: fields = ['item', 'part', 'location'] - item = serializers.PrimaryKeyRelatedField( - queryset=None, + item = StockItemField( required=False, allow_null=True, label='Stock Item', help_text='Stock item to preview a batch code for', ) - part = serializers.PrimaryKeyRelatedField( - queryset=None, + part = PartField( required=False, allow_null=True, label='Part', help_text='Part to preview a batch code for', ) - location = serializers.PrimaryKeyRelatedField( - queryset=None, + location = StockLocationField( required=False, allow_null=True, label='Location', help_text='Stock location to preview a batch code for', ) - def __init__(self, *args, **kwargs): - """Attach the querysets lazily. - - The InvenTree models cannot be imported at module import time, as this - module is loaded while the plugin registry is still being built. - """ - super().__init__(*args, **kwargs) - - from part.models import Part - from stock.models import StockItem, StockLocation - - self.fields['item'].queryset = StockItem.objects.all() - self.fields['part'].queryset = Part.objects.all() - self.fields['location'].queryset = StockLocation.objects.all() - class GenerateBatchCodeSerializer(serializers.Serializer): """Request to generate a batch code and save it onto a stock item.""" @@ -82,8 +119,7 @@ class Meta: fields = ['item', 'overwrite'] - item = serializers.PrimaryKeyRelatedField( - queryset=None, + item = StockItemField( required=True, label='Stock Item', help_text='Stock item to assign a batch code to', @@ -95,11 +131,3 @@ class Meta: label='Overwrite', help_text='Replace an existing batch code on this stock item', ) - - def __init__(self, *args, **kwargs): - """Attach the stock item queryset lazily.""" - super().__init__(*args, **kwargs) - - from stock.models import StockItem - - self.fields['item'].queryset = StockItem.objects.all() diff --git a/pyproject.toml b/pyproject.toml index 039d751..4628b0e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,12 +31,19 @@ classifiers = [ # Tooling only - the plugin has no runtime dependencies of its own. # Installed into .venv by `uv sync`. +# +# Django is a *test* dependency here: at runtime it is provided by the InvenTree +# instance, but the test suite needs it importable to exercise core.py. [dependency-groups] dev = [ "ruff>=0.12", "pre-commit>=4.0", "build>=1.2", - "twine>=6.0", + "pytest>=8.3", + # Marker required because the distribution supports 3.9 (as InvenTree still + # claims) while Django 5.2 needs 3.10+. Development targets .python-version. + "django>=5.2,<6.0; python_version >= '3.10'", + "djangorestframework>=3.15; python_version >= '3.10'", ] [project.urls] @@ -51,15 +58,16 @@ include = ["batchcode_plugin*"] [tool.setuptools.dynamic] version = {attr = "batchcode_plugin.PLUGIN_VERSION"} +[tool.pytest.ini_options] +testpaths = ["tests"] + [tool.ruff] exclude = [ ".git", "__pycache__", - "test.py", "build", "dist", "node_modules", - "tests", "venv", "env", ".venv", @@ -83,6 +91,9 @@ ignore = [ [tool.ruff.lint.per-file-ignores] # Generated migrations are not documented "batchcode_plugin/migrations/*" = ["D"] +# Tests: docstrings on every test function add noise, and the stub classes in +# conftest deliberately mirror InvenTree's naming rather than PEP8's. +"tests/*" = ["D103", "N801", "N802"] [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..fd27fd3 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,278 @@ +"""Load the plugin outside a running InvenTree instance. + +`batchcode_plugin.core` imports `plugin`, `plugin.mixins`, `InvenTree.helpers` +and `stock.models`, none of which exist without a configured InvenTree/Django +process. Those are stubbed here, so the real `core.py` can be imported and its +code construction, scoping and trigger logic driven directly. + +Persistence is the only part that is faked: `BatchCounter.peek` / `.advance` +are replaced with an in-memory store, while `build_key` is delegated to the +real implementation so the tests cannot drift from the production scope key. +""" + +import datetime +import importlib.util +import pathlib +import sys +import types +from types import SimpleNamespace + +import django +import pytest +from django.conf import settings + +ROOT = pathlib.Path(__file__).resolve().parent.parent + +# Fixed clock, so generated codes are deterministic +NOW = datetime.datetime(2026, 9, 2, 14, 35) + + +def _configure_django() -> None: + """Minimal Django setup, enough to import models that reference User.""" + if settings.configured: + return + + settings.configure( + INSTALLED_APPS=['django.contrib.contenttypes', 'django.contrib.auth'], + DATABASES={}, + USE_TZ=True, + ) + django.setup() + + +def _install_inventree_stubs() -> None: + """Register fake `plugin`, `InvenTree` and `stock` modules.""" + plugin_mod = types.ModuleType('plugin') + + class InvenTreePlugin: + """Stand-in for the InvenTree plugin base class.""" + + def plugin_static_file(self, *args, **kwargs): + """Mirror the real helper: build a URL from path components.""" + return '/static/plugins/batchcode/' + '/'.join(str(a) for a in args) + + plugin_mod.InvenTreePlugin = InvenTreePlugin + + mixins_mod = types.ModuleType('plugin.mixins') + for name in ( + 'AppMixin', + 'UrlsMixin', + 'UserInterfaceMixin', + 'ValidationMixin', + ): + setattr(mixins_mod, name, type(name, (), {})) + + class SettingsMixin: + """Stand-in exposing the settings helpers the plugin relies on.""" + + def get_settings_dict(self) -> dict: + """Return {key: value} for every declared setting.""" + return {key: self.get_setting(key) for key in self.SETTINGS} + + mixins_mod.SettingsMixin = SettingsMixin + + sys.modules['plugin'] = plugin_mod + sys.modules['plugin.mixins'] = mixins_mod + + # InvenTree.helpers.current_time is the fallback clock in extract_targets + inventree_mod = types.ModuleType('InvenTree') + helpers_mod = types.ModuleType('InvenTree.helpers') + helpers_mod.current_time = lambda: NOW + inventree_mod.helpers = helpers_mod + sys.modules['InvenTree'] = inventree_mod + sys.modules['InvenTree.helpers'] = helpers_mod + + # stock.models.StockItem is only reached by seed_value, which the tests + # either bypass (SEED_FROM_EXISTING off) or override; this queryset stub + # simply yields no existing codes. + class _EmptyQuerySet: + def all(self): + return self + + def exclude(self, **kwargs): + return self + + def filter(self, **kwargs): + return self + + def order_by(self, *args): + return self + + def values_list(self, *args, **kwargs): + return self + + def __getitem__(self, item): + return [] + + stock_mod = types.ModuleType('stock') + stock_models = types.ModuleType('stock.models') + stock_models.StockItem = SimpleNamespace(objects=_EmptyQuerySet()) + stock_models.StockLocation = SimpleNamespace(objects=_EmptyQuerySet()) + stock_mod.models = stock_models + sys.modules['stock'] = stock_mod + sys.modules['stock.models'] = stock_models + + # part.models is imported by serializers.py, not by core.py + part_mod = types.ModuleType('part') + part_models = types.ModuleType('part.models') + part_models.Part = SimpleNamespace(objects=_EmptyQuerySet()) + part_mod.models = part_models + sys.modules['part'] = part_mod + sys.modules['part.models'] = part_models + + +def _load_module(name: str, relative_path: str): + """Import a plugin module from its file, bypassing the package import.""" + spec = importlib.util.spec_from_file_location(name, ROOT / relative_path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +class InMemoryCounter: + """Counter with the BatchCounter contract, held in a dict. + + `build_key` is bound to the real model's implementation (assigned in + `_bootstrap`), so the scope key under test is the production one. + """ + + store: dict = {} + + @classmethod + def reset(cls) -> None: + """Empty the store between tests.""" + cls.store = {} + + @classmethod + def peek(cls, key, seed=0): + """Return the value advance() would issue, without consuming it.""" + return max(cls.store.get(key, 0), seed) + 1 + + @classmethod + def advance(cls, key, seed=0, **scope): + """Issue and record the next value for this scope.""" + value = max(cls.store.get(key, 0), seed) + 1 + cls.store[key] = value + return value + + +def _bootstrap(): + """Load the real models and core modules, with persistence faked.""" + _configure_django() + _install_inventree_stubs() + + # A package placeholder, so 'from . import PLUGIN_VERSION' resolves + package = types.ModuleType('batchcode_plugin') + package.__path__ = [str(ROOT / 'batchcode_plugin')] + package.PLUGIN_VERSION = '2.0.0' + sys.modules['batchcode_plugin'] = package + + real_models = _load_module( + 'batchcode_plugin._real_models', 'batchcode_plugin/models.py' + ) + + # Reuse the real scope key, fake only the storage + InMemoryCounter.build_key = real_models.BatchCounter.build_key + + stub_models = types.ModuleType('batchcode_plugin.models') + stub_models.BATCH_CODE_MAX_LENGTH = real_models.BATCH_CODE_MAX_LENGTH + stub_models.BatchCounter = InMemoryCounter + sys.modules['batchcode_plugin.models'] = stub_models + + core = _load_module('batchcode_plugin.core', 'batchcode_plugin/core.py') + + return core, real_models + + +CORE, REAL_MODELS = _bootstrap() + + +class PluginUnderTest(CORE.BatchCodePlugin): + """The real plugin class, with settings backed by a plain dict. + + InvenTree resolves settings against the database; here they come from + SETTINGS defaults plus any per-test overrides. + """ + + def __init__(self, **overrides): + """Seed the settings from SETTINGS defaults, then apply overrides.""" + self._values = { + key: config.get('default') for key, config in self.SETTINGS.items() + } + self._values.update(overrides) + + def get_setting(self, key, cache=False, backup_value=None): + """Mirror SettingsMixin.get_setting's signature - note 'cache'.""" + return self._values.get(key, backup_value) + + +@pytest.fixture(autouse=True) +def _clear_counters(): + """Give every test an empty counter store.""" + InMemoryCounter.reset() + yield + InMemoryCounter.reset() + + +@pytest.fixture +def core(): + """The loaded batchcode_plugin.core module.""" + return CORE + + +@pytest.fixture +def models(): + """The real batchcode_plugin.models module.""" + return REAL_MODELS + + +@pytest.fixture +def counters(): + """The in-memory counter store standing in for BatchCounter.""" + return InMemoryCounter + + +@pytest.fixture +def plugin(): + """Factory building a plugin instance with the given setting overrides.""" + + def _build(**overrides): + return PluginUnderTest(**overrides) + + return _build + + +@pytest.fixture +def now(): + """The fixed generation timestamp used across the tests.""" + return NOW + + +@pytest.fixture +def part(): + """A stand-in Part.""" + return SimpleNamespace(pk=12, name='Resistor 10k', IPN='RES-10K') + + +@pytest.fixture +def other_part(): + """A second Part, for per-part counter scoping.""" + return SimpleNamespace(pk=99, name='Capacitor 100n', IPN='CAP-100N') + + +@pytest.fixture +def location(): + """A stand-in StockLocation.""" + return SimpleNamespace( + pk=3, + name='Shelf A', + pathstring='Warehouse/Shelf A', + description='Main shelf', + ) + + +@pytest.fixture +def other_location(): + """A second StockLocation, for per-location counter scoping.""" + return SimpleNamespace(pk=7, name='Shelf B', pathstring='Warehouse/Shelf B') diff --git a/tests/test_api_surface.py b/tests/test_api_surface.py new file mode 100644 index 0000000..44aeb2e --- /dev/null +++ b/tests/test_api_surface.py @@ -0,0 +1,86 @@ +"""The REST surface: URL wiring and serializer construction. + +These are import-time regression guards. `setup_urls` pulls in `views.py`, +which pulls in `serializers.py`, so anything that raises while those class +bodies are evaluated stops the plugin's URLs from loading at all. +""" + +import pytest +from rest_framework import serializers as drf + + +def test_url_endpoints_are_registered(plugin): + """The frontend calls these two paths by name.""" + routes = plugin().setup_urls() + names = {route.name for route in routes} + + assert names == {'batchcode-preview', 'batchcode-generate'} + + +def test_url_paths(plugin): + patterns = {str(route.pattern) for route in plugin().setup_urls()} + assert patterns == {'preview/', 'generate/'} + + +def test_serializers_import_cleanly(): + """Importing the serializers must not raise. + + DRF validates 'queryset' inside the field constructor, which runs when the + class body is evaluated. Declaring a related field with queryset=None and + filling it in from Serializer.__init__ therefore raises at import. + """ + from batchcode_plugin import serializers + + assert serializers.PreviewBatchCodeSerializer is not None + + +@pytest.mark.parametrize( + ('serializer_name', 'expected_fields'), + [ + ('PreviewBatchCodeSerializer', {'item', 'part', 'location'}), + ('GenerateBatchCodeSerializer', {'item', 'overwrite'}), + ('BatchCodeResponseSerializer', {'batch_code'}), + ], +) +def test_serializers_instantiate(serializer_name, expected_fields): + from batchcode_plugin import serializers + + instance = getattr(serializers, serializer_name)() + assert set(instance.fields) == expected_fields + + +def test_related_fields_resolve_their_queryset(): + """get_queryset must not be reached before the models are importable.""" + from batchcode_plugin import serializers + + fields = serializers.PreviewBatchCodeSerializer().fields + + for name in ('item', 'part', 'location'): + assert isinstance(fields[name], drf.PrimaryKeyRelatedField) + assert fields[name].get_queryset() is not None + + +def test_preview_fields_are_all_optional(): + """A preview with no context at all is valid - the settings page uses it.""" + from batchcode_plugin import serializers + + for field in serializers.PreviewBatchCodeSerializer().fields.values(): + assert field.required is False + + +def test_generate_requires_an_item(): + from batchcode_plugin import serializers + + fields = serializers.GenerateBatchCodeSerializer().fields + + assert fields['item'].required is True + assert fields['overwrite'].required is False + + +def test_response_carries_the_code(): + """The response serializer must not drop batch_code (it is not read_only).""" + from batchcode_plugin import serializers + + data = serializers.BatchCodeResponseSerializer({'batch_code': 'B-0001'}).data + + assert data == {'batch_code': 'B-0001'} diff --git a/tests/test_code_format.py b/tests/test_code_format.py new file mode 100644 index 0000000..71f92d2 --- /dev/null +++ b/tests/test_code_format.py @@ -0,0 +1,84 @@ +"""How CODE_FORMAT, PREFIX, SEPARATOR and MIN_DIGITS shape a generated code.""" + +import pytest + + +def test_default_format(plugin, part, location, now): + p = plugin() + assert p.build_code(part=part, location=location, date=now) == 'B20260902-0001' + + +def test_counter_increments(plugin, now): + p = plugin() + assert p.build_code(date=now) == 'B20260902-0001' + assert p.build_code(date=now) == 'B20260902-0002' + assert p.build_code(date=now) == 'B20260902-0003' + + +def test_bare_num_takes_min_digits(plugin, now): + p = plugin(CODE_FORMAT='{prefix}{sep}{num}', MIN_DIGITS=6) + assert p.build_code(date=now) == 'B-000001' + + +def test_explicit_spec_beats_min_digits(plugin, now): + """A format supplying its own padding wins; MIN_DIGITS is ignored.""" + p = plugin(CODE_FORMAT='{prefix}{num:03d}', MIN_DIGITS=8) + assert p.build_code(date=now) == 'B001' + + +def test_part_and_date_placeholders(plugin, part, location, now): + p = plugin( + CODE_FORMAT='{ipn}{sep}{year}{month:02d}{sep}W{week}{sep}{num}', + MIN_DIGITS=3, + ) + code = p.build_code( + part=part, location=location, date=now, year=2026, month=9, week=36 + ) + assert code == 'RES-10K-202609-W36-001' + + +def test_part_and_location_names(plugin, part, location, now): + p = plugin(CODE_FORMAT='{part}{sep}{loc}{sep}{num}', MIN_DIGITS=2) + code = p.build_code(part=part, location=location, date=now) + assert code == 'Resistor 10k-Shelf A-01' + + +def test_missing_part_renders_empty_placeholder(plugin, now): + """Placeholders for absent objects render empty, they do not raise.""" + p = plugin(CODE_FORMAT='{prefix}{part}{ipn}{loc}{sep}{num}', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B-01' + + +def test_custom_separator(plugin, now): + p = plugin(CODE_FORMAT='{prefix}{sep}{num}', SEPARATOR='/', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B/01' + + +@pytest.mark.parametrize( + 'bad_format', + [ + '{nope}{num}', # unknown placeholder + '{prefix}{num:03d', # unbalanced brace + '{prefix}{num:qqq}', # invalid format spec + ], +) +def test_invalid_format_falls_back(plugin, now, bad_format): + """A bad format must not fail the stock operation it was called from. + + InvenTree swallows exceptions raised by the hook, which would mean no + batch code at all; a fallback code is more useful. + """ + p = plugin(CODE_FORMAT=bad_format, MIN_DIGITS=4) + assert p.build_code(date=now) == 'B-0001' + + +def test_code_is_truncated_to_field_length(plugin, models, now): + """StockItem.batch is a CharField(max_length=100).""" + p = plugin(PREFIX='X' * 150, CODE_FORMAT='{prefix}{num}') + code = p.build_code(date=now) + assert len(code) == models.BATCH_CODE_MAX_LENGTH == 100 + + +def test_code_is_stripped(plugin, now): + p = plugin(CODE_FORMAT=' {prefix}{num} ', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B01' diff --git a/tests/test_counter_scope.py b/tests/test_counter_scope.py new file mode 100644 index 0000000..4c62a51 --- /dev/null +++ b/tests/test_counter_scope.py @@ -0,0 +1,99 @@ +"""Counter scoping: PER_PART, PER_LOCATION, DAILY_RESET and the scope key.""" + +import datetime + +NEXT_DAY = datetime.datetime(2026, 9, 3, 9, 0) + +SIMPLE = {'CODE_FORMAT': '{prefix}{sep}{num}'} + + +def test_single_global_counter_by_default(plugin, part, other_part, now): + p = plugin(**SIMPLE) + assert p.build_code(part=part, date=now) == 'B-0001' + assert p.build_code(part=other_part, date=now) == 'B-0002' + + +def test_per_part_counters_are_independent(plugin, part, other_part, now): + p = plugin(PER_PART=True, **SIMPLE) + assert p.build_code(part=part, date=now) == 'B-0001' + assert p.build_code(part=other_part, date=now) == 'B-0001' + assert p.build_code(part=part, date=now) == 'B-0002' + assert p.build_code(part=other_part, date=now) == 'B-0002' + + +def test_per_location_counters_are_independent(plugin, location, other_location, now): + p = plugin(PER_LOCATION=True, **SIMPLE) + assert p.build_code(location=location, date=now) == 'B-0001' + assert p.build_code(location=other_location, date=now) == 'B-0001' + assert p.build_code(location=location, date=now) == 'B-0002' + + +def test_daily_reset(plugin, now): + p = plugin(DAILY_RESET=True, **SIMPLE) + assert p.build_code(date=now) == 'B-0001' + assert p.build_code(date=now) == 'B-0002' + assert p.build_code(date=NEXT_DAY) == 'B-0001' + + +def test_daily_reset_does_not_need_the_date_in_the_code(plugin, now): + """DAILY_RESET works without {date} in the format. + + 1.x filtered existing codes for today's date, so it silently did nothing + unless CODE_FORMAT embedded the date. The counter now carries the period. + """ + p = plugin(DAILY_RESET=True, CODE_FORMAT='{prefix}{sep}{num}') + assert p.build_code(date=now) == 'B-0001' + assert p.build_code(date=NEXT_DAY) == 'B-0001' + + +def test_scope_key_is_empty_when_unscoped(plugin, models, part, location, now): + p = plugin() + scope = p.counter_scope(part=part, location=location, date=now) + assert models.BatchCounter.build_key(**scope) == 'part=|loc=|period=' + + +def test_scope_key_carries_every_dimension(plugin, models, part, location, now): + p = plugin(PER_PART=True, PER_LOCATION=True, DAILY_RESET=True) + scope = p.counter_scope(part=part, location=location, date=now) + assert models.BatchCounter.build_key(**scope) == 'part=12|loc=3|period=20260902' + + +def test_scope_keys_are_distinct_per_dimension(models, part, other_part, location): + """Distinct scopes must not collide onto one counter row.""" + keys = { + models.BatchCounter.build_key(), + models.BatchCounter.build_key(part=part), + models.BatchCounter.build_key(part=other_part), + models.BatchCounter.build_key(location=location), + models.BatchCounter.build_key(part=part, location=location), + models.BatchCounter.build_key(part=part, period='20260902'), + } + assert len(keys) == 6 + + +def test_preview_does_not_consume_a_value(plugin, now): + p = plugin(**SIMPLE) + assert p.build_code(date=now) == 'B-0001' + assert p.preview_code(date=now) == 'B-0002' + assert p.preview_code(date=now) == 'B-0002' + assert p.build_code(date=now) == 'B-0002' + + +def test_seed_carries_over_existing_sequences(plugin, now): + """The counter starts above numbers already in use. + + SEED_FROM_EXISTING must stop the first post-upgrade code reissuing a number + already present in the stock table. + """ + p = plugin(**SIMPLE) + p.seed_value = lambda scope: 41 + + assert p.build_code(date=now) == 'B-0042' + assert p.build_code(date=now) == 'B-0043' + + +def test_seed_is_ignored_when_disabled(plugin, counters, now): + p = plugin(SEED_FROM_EXISTING=False, **SIMPLE) + assert p.seed_value({}) == 0 + assert p.build_code(date=now) == 'B-0001' + assert counters.store == {'part=|loc=|period=': 1} diff --git a/tests/test_hook_contract.py b/tests/test_hook_contract.py new file mode 100644 index 0000000..c60328f --- /dev/null +++ b/tests/test_hook_contract.py @@ -0,0 +1,220 @@ +"""The generate_batch_code hook contract, and the 1.x bugs it hid. + +InvenTree calls the hook from stock/generators.py with: date, year, month, day, +hour, minute, week, plus the caller's kwargs - item, part, location, quantity, +build_order, purchase_order (see GenerateBatchCodeSerializer). +""" + +from types import SimpleNamespace + +import pytest + + +@pytest.fixture +def item(part, location): + """A stock item, as InvenTree passes it under the 'item' keyword.""" + return SimpleNamespace(pk=5, part=part, location=location, batch='') + + +# --- kwargs resolution --------------------------------------------------- + + +def test_part_and_location_come_from_item(plugin, item, part, location): + """Part and location resolve from the 'item' keyword. + + 1.x read kwargs['stock_item'], which InvenTree never sends, so part and + location were always None and the per-part / per-location settings were + silently inert. + """ + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets(item=item) + + assert resolved_part is part + assert resolved_location is location + + +def test_stock_item_keyword_is_not_used(plugin, item): + """Guard against reintroducing the 1.x keyword.""" + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets(stock_item=item) + + assert resolved_part is None + assert resolved_location is None + + +def test_explicit_kwargs_win_over_item(plugin, item, other_part, other_location): + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets( + item=item, part=other_part, location=other_location + ) + + assert resolved_part is other_part + assert resolved_location is other_location + + +def test_date_defaults_to_current_time(plugin, now): + p = plugin() + _, _, date = p.extract_targets() + assert date == now + + +def test_supplied_date_is_used(plugin): + import datetime + + supplied = datetime.datetime(2030, 1, 1, 0, 0) + p = plugin() + _, _, date = p.extract_targets(date=supplied) + assert date == supplied + + +def test_per_part_counter_works_through_item(plugin, item, part, other_part, now): + """End-to-end consequence of the kwargs fix. + + Passing the item must land on the *same* counter as passing its part + explicitly, and on a different one from another part. Reading the wrong + keyword collapses everything onto the global counter instead. + """ + p = plugin(PER_PART=True, CODE_FORMAT='{prefix}{sep}{num}') + + assert p.build_code(item=item, date=now) == 'B-0001' + # Same scope as the item's part, so it continues that sequence + assert p.build_code(part=part, date=now) == 'B-0002' + # A different part starts its own + assert p.build_code(part=other_part, date=now) == 'B-0001' + assert p.build_code(item=item, date=now) == 'B-0003' + + +# --- trigger modes ------------------------------------------------------- + + +def test_always_responds(plugin): + assert plugin(TRIGGER_MODE='always').wants_to_generate() is True + + +def test_manual_ignores_the_hook(plugin): + assert plugin(TRIGGER_MODE='manual').wants_to_generate() is False + + +def test_manual_still_answers_an_explicit_request(plugin): + """The plugin's own generate/ endpoint passes force=True.""" + assert plugin(TRIGGER_MODE='manual').wants_to_generate(force=True) is True + + +def test_on_receive_requires_a_purchase_order(plugin): + p = plugin(TRIGGER_MODE='on_receive') + + assert p.wants_to_generate() is False + assert p.wants_to_generate(purchase_order=SimpleNamespace(pk=1)) is True + + +def test_on_receive_ignores_a_build_order(plugin): + p = plugin(TRIGGER_MODE='on_receive') + assert p.wants_to_generate(build_order=SimpleNamespace(pk=1)) is False + + +def test_disabled_overrides_everything(plugin): + p = plugin(ENABLED=False) + + assert p.wants_to_generate() is False + assert p.wants_to_generate(force=True) is False + + +# --- the hook itself ----------------------------------------------------- + + +def test_hook_returns_a_code(plugin, item, now): + p = plugin() + assert p.generate_batch_code(item=item, date=now) == 'B20260902-0001' + + +def test_hook_returns_none_when_it_should_not_act(plugin, item, now): + """The hook opts out by returning None. + + That hands the request to the next plugin, and finally to InvenTree's own + STOCK_BATCH_CODE_TEMPLATE. + """ + assert plugin(TRIGGER_MODE='manual').generate_batch_code(item=item) is None + assert plugin(ENABLED=False).generate_batch_code(item=item) is None + + +def test_hook_accepts_the_full_inventree_context(plugin, item, part, location, now): + """The real call site passes every one of these at once.""" + p = plugin() + + code = p.generate_batch_code( + date=now, + year=now.year, + month=now.month, + day=now.day, + hour=now.hour, + minute=now.minute, + week=now.isocalendar()[1], + item=item, + part=part, + location=location, + quantity=5, + build_order=None, + purchase_order=None, + ) + + assert code == 'B20260902-0001' + + +def test_hook_signature_exposes_kwargs(core): + """The hook must accept **kwargs. + + stock/generators.py inspects the signature and only passes the context if + 'kwargs' is a parameter; otherwise it calls the hook with no arguments. + """ + from inspect import signature + + sig = signature(core.BatchCodePlugin.generate_batch_code) + assert 'kwargs' in sig.parameters + + +# --- prefix resolution --------------------------------------------------- + + +def test_static_prefix(plugin, location): + assert plugin().resolve_prefix(location) == 'B' + + +@pytest.mark.parametrize( + ('field', 'expected'), + [ + ('name', 'Shelf A'), + ('pathstring', 'Warehouse/Shelf A'), + ('description', 'Main shelf'), + ], +) +def test_location_prefix_fields(plugin, location, field, expected): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD=field) + assert p.resolve_prefix(location) == expected + + +def test_location_prefix_falls_back_without_a_location(plugin): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD='name') + assert p.resolve_prefix(None) == 'B' + + +def test_location_prefix_falls_back_on_an_empty_field(plugin): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD='name') + assert p.resolve_prefix(SimpleNamespace(pk=1, name='')) == 'B' + + +# --- settings access ----------------------------------------------------- + + +def test_get_setting_is_never_called_with_a_positional_default(core): + """No call site passes a default positionally to get_setting. + + Its signature is get_setting(key, cache=False, backup_value=None), so the + second positional argument is the cache flag, not a default. 1.x passed + defaults there throughout. + """ + import re + + source = (core.__file__ and open(core.__file__, encoding='utf-8').read()) or '' + offenders = re.findall(r"get_setting\(\s*'[A-Z_]+'\s*,[^)]", source) + + assert offenders == [] diff --git a/tests/test_permissions.py b/tests/test_permissions.py new file mode 100644 index 0000000..21ba8e1 --- /dev/null +++ b/tests/test_permissions.py @@ -0,0 +1,122 @@ +"""MANUAL_BUTTON_ROLE gating, and the panel context handed to the frontend.""" + +from types import SimpleNamespace + +import pytest + +STAFF = SimpleNamespace(is_authenticated=True, is_staff=True, is_superuser=False) +PLAIN = SimpleNamespace(is_authenticated=True, is_staff=False, is_superuser=False) +ROOT = SimpleNamespace(is_authenticated=True, is_staff=True, is_superuser=True) +ANON = SimpleNamespace(is_authenticated=False, is_staff=False, is_superuser=False) + + +@pytest.mark.parametrize( + ('role', 'user', 'allowed'), + [ + ('all', PLAIN, True), + ('all', STAFF, True), + ('all', ANON, False), + ('staff', PLAIN, False), + ('staff', STAFF, True), + ('staff', ROOT, True), + ('superuser', PLAIN, False), + ('superuser', STAFF, False), + ('superuser', ROOT, True), + ], +) +def test_role_gating(plugin, role, user, allowed): + p = plugin(MANUAL_BUTTON_ROLE=role) + assert p.user_can_generate(user) is allowed + + +def test_no_user_is_denied(plugin): + assert plugin(MANUAL_BUTTON_ROLE='all').user_can_generate(None) is False + + +def test_disabled_button_denies_everyone(plugin): + p = plugin(MANUAL_BUTTON=False, MANUAL_BUTTON_ROLE='all') + assert p.user_can_generate(ROOT) is False + + +# --- UI panel ------------------------------------------------------------ + + +def _panels(p, target_model, user=STAFF): + request = SimpleNamespace(user=user) + return p.get_ui_panels(request, {'target_model': target_model}) + + +def test_panel_only_on_stock_items(plugin): + p = plugin() + + assert _panels(p, 'part') == [] + assert _panels(p, 'stocklocation') == [] + assert len(_panels(p, 'stockitem')) == 1 + + +def test_panel_context(plugin): + """The dict under 'context' reaches the React component as context.context.""" + panel = _panels(plugin(PREFIX='Q'), 'stockitem')[0] + + assert panel['key'] == 'batchcode-panel' + assert panel['context']['settings']['PREFIX'] == 'Q' + assert panel['context']['can_generate'] is True + + +def test_panel_settings_cover_what_the_frontend_reads(plugin): + """Panel.tsx reads these keys off context.context.settings.""" + settings = _panels(plugin(), 'stockitem')[0]['context']['settings'] + + for key in ( + 'ENABLED', + 'CODE_FORMAT', + 'PREFIX', + 'USE_LOCATION_PREFIX', + 'LOCATION_FIELD', + 'PER_PART', + 'PER_LOCATION', + 'DAILY_RESET', + 'TRIGGER_MODE', + ): + assert key in settings + + +def test_panel_reports_permission_per_user(plugin): + p = plugin(MANUAL_BUTTON_ROLE='superuser') + + assert _panels(p, 'stockitem', user=STAFF)[0]['context']['can_generate'] is False + assert _panels(p, 'stockitem', user=ROOT)[0]['context']['can_generate'] is True + + +def test_panel_source_matches_the_exported_component(plugin): + """The source string is wired by name to frontend/src/Panel.tsx.""" + panel = _panels(plugin(), 'stockitem')[0] + assert panel['source'].endswith('Panel.js:RenderBatchCodePluginPanel') + + +def test_admin_source_matches_the_exported_component(core): + assert core.BatchCodePlugin.ADMIN_SOURCE == 'Settings.js:RenderPluginSettings' + + +# --- plugin metadata ----------------------------------------------------- + + +def test_slug_is_stable(core): + """The slug must not change. + + It keys every stored setting value and the plugin API URLs, so changing it + orphans existing installations' configuration. + """ + assert core.BatchCodePlugin.SLUG == 'batchcode' + + +def test_version_comes_from_a_single_source(core): + import pathlib + import re + + init = pathlib.Path(core.__file__).parent / '__init__.py' + declared = re.search( + r"PLUGIN_VERSION\s*=\s*'([^']+)'", init.read_text(encoding='utf-8') + ).group(1) + + assert core.BatchCodePlugin.VERSION == declared diff --git a/uv.lock b/uv.lock index ce87b0b..76cada2 100644 --- a/uv.lock +++ b/uv.lock @@ -8,12 +8,15 @@ resolution-markers = [ ] [[package]] -name = "backports-tarfile" -version = "1.2.0" +name = "asgiref" +version = "3.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, ] [[package]] @@ -55,124 +58,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, ] -[[package]] -name = "certifi" -version = "2026.7.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, -] - -[[package]] -name = "cffi" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "pycparser", version = "2.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, - { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, - { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, - { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, -] - -[[package]] -name = "cffi" -version = "2.1.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" }, - { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" }, - { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, - { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, - { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, - { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, - { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, - { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, - { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, - { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, - { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, - { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, - { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, - { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, - { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, - { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, - { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, - { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, - { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, - { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, - { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, - { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, - { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, -] - [[package]] name = "cfgv" version = "3.4.0" @@ -198,185 +83,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] -[[package]] -name = "charset-normalizer" -version = "3.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", size = 369072, upload-time = "2026-08-15T08:16:22.964Z" }, - { url = "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", size = 251142, upload-time = "2026-08-15T08:16:24.81Z" }, - { url = "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", size = 240714, upload-time = "2026-08-15T08:16:26.392Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", size = 279637, upload-time = "2026-08-15T08:16:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", size = 276543, upload-time = "2026-08-15T08:16:29.399Z" }, - { url = "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", size = 261644, upload-time = "2026-08-15T08:16:30.722Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", size = 259609, upload-time = "2026-08-15T08:16:32.248Z" }, - { url = "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", size = 252457, upload-time = "2026-08-15T08:16:33.849Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", size = 242240, upload-time = "2026-08-15T08:16:35.396Z" }, - { url = "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", size = 280308, upload-time = "2026-08-15T08:16:36.825Z" }, - { url = "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", size = 258679, upload-time = "2026-08-15T08:16:38.22Z" }, - { url = "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", size = 277221, upload-time = "2026-08-15T08:16:39.62Z" }, - { url = "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", size = 263799, upload-time = "2026-08-15T08:16:40.885Z" }, - { url = "https://files.pythonhosted.org/packages/b7/23/b38a20598d5a825f85d9d7636860e56ff0db1479f86497a6e485aa9326f7/charset_normalizer-3.5.1-cp310-cp310-win32.whl", hash = "sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20", size = 182037, upload-time = "2026-08-15T08:16:42.198Z" }, - { url = "https://files.pythonhosted.org/packages/d2/21/83fffb77864408b8bf0fe1ca603926401d6f8775a8e150b39aacc9958f8a/charset_normalizer-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d", size = 206030, upload-time = "2026-08-15T08:16:43.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/2e/b93135b5034b1157fb29554b0d06d4844ce62282f0e0a14036f93d7ee2e7/charset_normalizer-3.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5", size = 185092, upload-time = "2026-08-15T08:16:45.177Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, - { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, - { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, - { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, - { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, - { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, - { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, - { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, - { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, - { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, - { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, - { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, - { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, - { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, - { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, - { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, - { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, - { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, - { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, - { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, - { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, - { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, - { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, - { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, - { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, - { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, - { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, - { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, - { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, - { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, - { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, - { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, - { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, - { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, - { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, - { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, - { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, - { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, - { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, - { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, - { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, - { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, - { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, - { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, - { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, - { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, - { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, - { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, - { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, - { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, - { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, - { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, - { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, - { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, - { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, - { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, - { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, - { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, - { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, - { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, - { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, - { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, - { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, - { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, - { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, - { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, - { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, - { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, - { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, - { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, - { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, - { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, - { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, - { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, - { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, - { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, - { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, - { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, - { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, - { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, - { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, - { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, - { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, - { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, - { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, - { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, - { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, - { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, - { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, - { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, - { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, - { url = "https://files.pythonhosted.org/packages/d0/91/bc145e42f93d6601b9a26f5421af2d7c3093ae6e6d03b8e583c9cebbf530/charset_normalizer-3.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85de3134b5379856e323ba37c19c9256d39425f7b76a63af52b09fb4664c2e8f", size = 368830, upload-time = "2026-08-15T08:20:17.272Z" }, - { url = "https://files.pythonhosted.org/packages/58/67/62df6a907162461f372e95cbbc1bc64c7457e86abcc851feb84409a11eff/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e5e1224c0a6a90e05843e07adfec669edebec17801c67072f51e59561d63c0b", size = 251725, upload-time = "2026-08-15T08:20:18.942Z" }, - { url = "https://files.pythonhosted.org/packages/a4/2d/64a13610fd28c80f97aff0ea5cf31cf255d220a8243ac0c78c66fd3d874d/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5e2d0e146dcb57034f8b97dc58d2d512cb90aba253960ce449f695fec6a82c6f", size = 241254, upload-time = "2026-08-15T08:20:20.641Z" }, - { url = "https://files.pythonhosted.org/packages/84/79/a88c181e7f4a7579696fedb34fa63844ede2ff7caf44c5f321cec57d92fb/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e06efa066f7dbadbc84ebc126a97c452a6451dfcf589d89d788484949e1cf795", size = 281944, upload-time = "2026-08-15T08:20:22.219Z" }, - { url = "https://files.pythonhosted.org/packages/64/60/7c5469f455f4fa65d39da9f088dffc1a586560bfb9e3279441eed78bd469/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:994e883d17c559cdfd38c84003c8b27d25424a1077272a17e7cd27bfe0bf57b2", size = 278350, upload-time = "2026-08-15T08:20:23.744Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cf/7568d8c1c9100b7c8bab9035215a6b36b32b39bb50cabaee9389c4606887/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:789b8982559ae28dad2356519f841655756cdcd96616410590ae0b17454ee64f", size = 262670, upload-time = "2026-08-15T08:20:25.387Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ec/3a616c3806ec3f957337e6bf874ae7d64693185039edfbbf87103b8c8631/charset_normalizer-3.5.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a951ad59cad9145664a730d3036b40b844e74d2d3683da40111463cd3a83845d", size = 260445, upload-time = "2026-08-15T08:20:27.012Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e0/489aa2a33b944077d4c2c705c245d833dc12cd571a52fc67eaf273f5373a/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:55261ac0d2941c42f196dd576f543d87a8ee03cd6f5e30dfb4d807b2e3b9121a", size = 253263, upload-time = "2026-08-15T08:20:28.6Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bc/f528dfb78d3bfdc8ee6aeea81eb22e6918d03e4442d373a79717f17de45e/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5ca0555312ae2fe82715cada7fac375530c2f3349e1eaa1bcb33d0283ac79a18", size = 242879, upload-time = "2026-08-15T08:20:30.186Z" }, - { url = "https://files.pythonhosted.org/packages/c0/8c/58efc6393e405a8d52b241d31dd9118352c247e4017110c3edfdb4618f0d/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2e9cf9253119d8e5d111f05d71626786fd3d6193817316eab1ca088cdb8593cf", size = 282086, upload-time = "2026-08-15T08:20:31.826Z" }, - { url = "https://files.pythonhosted.org/packages/02/fc/0d9ab98fa7a61394353e8acd0f5f60fc6e94a4615f574af8be0eca14a7ef/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:433c5a81eade63b47e522303bad236f59dba55ea6951746f5558355eeed8c75d", size = 259212, upload-time = "2026-08-15T08:20:33.442Z" }, - { url = "https://files.pythonhosted.org/packages/79/71/6ee3a48a21e844e5079d8e9b2e91c641da5a7912a748e9e94c9e3ab9ce1c/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:13e3afe97712e8887cd516e960c63f0b93122971e5b5e4b2622fe7701771e838", size = 278949, upload-time = "2026-08-15T08:20:35.133Z" }, - { url = "https://files.pythonhosted.org/packages/64/77/9ae101cb33bd9f681551e82a2b9e08eec99ff715458340931370f4228de9/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb12fb2ba69ffa05f8695f61c69e591dc4b4a12ac3757ac8af8adb259bf56d17", size = 264513, upload-time = "2026-08-15T08:20:36.887Z" }, - { url = "https://files.pythonhosted.org/packages/d1/91/249943372195935ff7393eae5842c7dae6fd04401e512bbd69dab1aae40b/charset_normalizer-3.5.1-cp39-cp39-win32.whl", hash = "sha256:56490c595a28b1bb27dfc583e816152a9767721ef58b2c03b13f954d2f707420", size = 182431, upload-time = "2026-08-15T08:20:38.498Z" }, - { url = "https://files.pythonhosted.org/packages/53/31/7f79c671d827080d6eecd697fbbeb4f0f6f8507bf4c5625b5f6398ec5876/charset_normalizer-3.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:012a22b88a77ca2e59b98ac5889b0deb604147666032f45e6d6e217634d2550d", size = 206385, upload-time = "2026-08-15T08:20:40.242Z" }, - { url = "https://files.pythonhosted.org/packages/c4/58/c9295c61e3f826ba7d874f0fd1c5e335dbec928d7b9146b33b48d14a25f1/charset_normalizer-3.5.1-cp39-cp39-win_arm64.whl", hash = "sha256:29880d17a8eb0b5cfdfd8944b468322928059aa35f1f5fa8ff22b149ec0b42f8", size = 185470, upload-time = "2026-08-15T08:20:41.765Z" }, - { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -387,115 +93,50 @@ wheels = [ ] [[package]] -name = "cryptography" -version = "47.0.0" +name = "distlib" +version = "0.4.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version <= '3.9' and platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version <= '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973", size = 4644617, upload-time = "2026-04-24T19:53:06.909Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8", size = 4668186, upload-time = "2026-04-24T19:53:09.053Z" }, - { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b", size = 4651244, upload-time = "2026-04-24T19:53:11.217Z" }, - { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7", size = 4701842, upload-time = "2026-04-24T19:53:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93", size = 4289313, upload-time = "2026-04-24T19:53:17.755Z" }, - { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac", size = 4650964, upload-time = "2026-04-24T19:53:20.062Z" }, - { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8", size = 4701544, upload-time = "2026-04-24T19:53:24.356Z" }, - { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318", size = 4783536, upload-time = "2026-04-24T19:53:26.665Z" }, - { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001", size = 4926106, upload-time = "2026-04-24T19:53:28.686Z" }, - { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7", size = 4631180, upload-time = "2026-04-24T19:53:37.517Z" }, - { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1", size = 4653529, upload-time = "2026-04-24T19:53:39.775Z" }, - { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c", size = 4638570, upload-time = "2026-04-24T19:53:42.129Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7", size = 4686832, upload-time = "2026-04-24T19:53:47.015Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923", size = 4269301, upload-time = "2026-04-24T19:53:48.97Z" }, - { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab", size = 4638110, upload-time = "2026-04-24T19:53:51.011Z" }, - { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7", size = 4686563, upload-time = "2026-04-24T19:53:55.274Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52", size = 4770094, upload-time = "2026-04-24T19:53:57.753Z" }, - { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd", size = 4913811, upload-time = "2026-04-24T19:54:00.236Z" }, - { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27", size = 4635767, upload-time = "2026-04-24T19:54:08.519Z" }, - { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10", size = 4654350, upload-time = "2026-04-24T19:54:10.795Z" }, - { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b", size = 4643394, upload-time = "2026-04-24T19:54:13.275Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515", size = 4688771, upload-time = "2026-04-24T19:54:17.835Z" }, - { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc", size = 4270753, upload-time = "2026-04-24T19:54:19.963Z" }, - { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca", size = 4642911, upload-time = "2026-04-24T19:54:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe", size = 4688262, upload-time = "2026-04-24T19:54:26.946Z" }, - { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31", size = 4775506, upload-time = "2026-04-24T19:54:28.926Z" }, - { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7", size = 4912060, upload-time = "2026-04-24T19:54:30.869Z" }, - { url = "https://files.pythonhosted.org/packages/81/75/d691e284750df5d9569f2b1ce4a00a71e1d79566da83b2b3e5549c84917f/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe", size = 4587867, upload-time = "2026-04-24T19:54:40.619Z" }, - { url = "https://files.pythonhosted.org/packages/07/d6/1b90f1a4e453009730b4545286f0b39bb348d805c11181fc31544e4f9a65/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475", size = 4627192, upload-time = "2026-04-24T19:54:42.849Z" }, - { url = "https://files.pythonhosted.org/packages/dc/53/cb358a80e9e359529f496870dd08c102aa8a4b5b9f9064f00f0d6ed5b527/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50", size = 4587486, upload-time = "2026-04-24T19:54:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/8b/57/aaa3d53876467a226f9a7a82fd14dd48058ad2de1948493442dfa16e2ffd/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab", size = 4626327, upload-time = "2026-04-24T19:54:47.813Z" }, + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, ] [[package]] -name = "cryptography" -version = "50.0.1" +name = "django" +version = "5.2.17" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version > '3.9' and python_full_version < '3.10'", -] dependencies = [ - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version > '3.9' and python_full_version < '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version > '3.9' and python_full_version < '3.11'" }, + { name = "asgiref", marker = "python_full_version >= '3.10'" }, + { name = "sqlparse", marker = "python_full_version >= '3.10'" }, + { name = "tzdata", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/d8/43e9d000519adceb189620b6869ff88031e046df91c2e9da72f8f6918399/django-5.2.17.tar.gz", hash = "sha256:9d4d93be539a18ab80d058eb515900e10951e04c537c5a6b394fc49528d3251f", size = 10889740, upload-time = "2026-08-04T15:04:03.173Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, - { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, - { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, - { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, - { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, - { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, - { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, - { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, - { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, - { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, - { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, - { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" }, - { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" }, - { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" }, + { url = "https://files.pythonhosted.org/packages/df/f8/ce120525ca78f12b07daf65786679c5d0b54a75285a8958d3ae55e39da35/django-5.2.17-py3-none-any.whl", hash = "sha256:f04fb3b36ee119e1af4fa1d397d5fd6cf12700f49321e84d4f4c642c5b1973db", size = 8315563, upload-time = "2026-08-04T15:03:59.1Z" }, ] [[package]] -name = "distlib" -version = "0.4.3" +name = "djangorestframework" +version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +dependencies = [ + { name = "django", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/bc/de04e3d4dc65e8b926700956ee70d4f084f2005603d21122d4d0683006fd/djangorestframework-3.18.0.tar.gz", hash = "sha256:2323a5111837e0b784dcb8323abc78ecc54fa2a5af7aff2677cf50cdd849477f", size = 913667, upload-time = "2026-08-07T14:53:33.571Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/51/d7/7461738e819b853275b35fd35712a85806c09a327e1fd5f8ff766bdd317e/djangorestframework-3.18.0-py3-none-any.whl", hash = "sha256:381fc44d3249c9565c5f723850855b734e99030eb30957a49f506d3fe11d7dcb", size = 900032, upload-time = "2026-08-07T14:53:31.881Z" }, ] [[package]] -name = "docutils" -version = "0.23" +name = "exceptiongroup" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/39/a4/5180d9afc57e8fca05601dd652bdff19604c218814037fe90ffc7625a50a/docutils-0.23.tar.gz", hash = "sha256:746f5060322511280a1e50eb76846ed6bf2342984b2ac04dc42caa1a8d78799e", size = 2303823, upload-time = "2026-05-27T17:41:06.934Z" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/91/30151a39f7570f448ed84529390628a651d7f27c87d73c9b887f8189695e/docutils-0.23-py3-none-any.whl", hash = "sha256:25d013af9bf23bc1c7b2b093dff4208166c53a94786c9e447808335ef1185fea", size = 634701, upload-time = "2026-05-27T17:40:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] [[package]] @@ -523,19 +164,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/d2/b70a31e13d04456d28493f31d2aa087e99eeb2767ef0293b2625727ccb8c/filelock-3.32.5-py3-none-any.whl", hash = "sha256:142cd9fa77a872c5e78c62329a0d15278fadc686eb89e760017968961a4fd6b2", size = 100003, upload-time = "2026-08-31T18:56:33.078Z" }, ] -[[package]] -name = "id" -version = "1.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", size = 18088, upload-time = "2026-02-04T16:19:41.26Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca", size = 14689, upload-time = "2026-02-04T16:19:40.051Z" }, -] - [[package]] name = "identify" version = "2.6.15" @@ -561,15 +189,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, ] -[[package]] -name = "idna" -version = "3.19" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, -] - [[package]] name = "importlib-metadata" version = "8.7.1" @@ -602,233 +221,57 @@ wheels = [ ] [[package]] -name = "inventree-batchcode-plugin" -source = { editable = "." } - -[package.dev-dependencies] -dev = [ - { name = "build", version = "1.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "build", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pre-commit", version = "4.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "ruff" }, - { name = "twine", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "twine", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] - -[package.metadata] - -[package.metadata.requires-dev] -dev = [ - { name = "build", specifier = ">=1.2" }, - { name = "pre-commit", specifier = ">=4.0" }, - { name = "ruff", specifier = ">=0.12" }, - { name = "twine", specifier = ">=6.0" }, -] - -[[package]] -name = "jaraco-classes" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "more-itertools", version = "11.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, -] - -[[package]] -name = "jaraco-context" -version = "6.1.1" +name = "iniconfig" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version > '3.9' and python_full_version < '3.10'", "python_full_version <= '3.9'", ] -dependencies = [ - { name = "backports-tarfile", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/27/7b/c3081ff1af947915503121c649f26a778e1a2101fd525f74aef997d75b7e/jaraco_context-6.1.1.tar.gz", hash = "sha256:bc046b2dc94f1e5532bd02402684414575cc11f565d929b6563125deb0a6e581", size = 15832, upload-time = "2026-03-07T15:46:04.63Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/49/c152890d49102b280ecf86ba5f80a8c111c3a155dafa3bd24aeb64fde9e1/jaraco_context-6.1.1-py3-none-any.whl", hash = "sha256:0df6a0287258f3e364072c3e40d5411b20cafa30cb28c4839d24319cecf9f808", size = 7005, upload-time = "2026-03-07T15:46:03.515Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] [[package]] -name = "jaraco-context" -version = "6.1.2" +name = "iniconfig" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.10'", ] -dependencies = [ - { name = "backports-tarfile", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] -name = "jaraco-functools" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, -] - -[[package]] -name = "jaraco-functools" -version = "4.6.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "more-itertools", version = "11.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" }, -] - -[[package]] -name = "jeepney" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, -] - -[[package]] -name = "keyring" -version = "25.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, - { name = "jaraco-classes" }, - { name = "jaraco-context", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "jaraco-context", version = "6.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "jaraco-functools", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "jaraco-functools", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "jeepney", marker = "sys_platform == 'linux'" }, - { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, - { name = "secretstorage", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and sys_platform == 'linux'" }, - { name = "secretstorage", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "mdurl", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, -] - -[[package]] -name = "markdown-it-py" -version = "4.2.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, -] +name = "inventree-batchcode-plugin" +source = { editable = "." } -[[package]] -name = "more-itertools" -version = "10.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +[package.dev-dependencies] +dev = [ + { name = "build", version = "1.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "build", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "django", marker = "python_full_version >= '3.10'" }, + { name = "djangorestframework", marker = "python_full_version >= '3.10'" }, + { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pre-commit", version = "4.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ruff" }, ] -[[package]] -name = "more-itertools" -version = "11.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, -] +[package.metadata] -[[package]] -name = "nh3" -version = "0.3.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz", hash = "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", size = 25662, upload-time = "2026-08-23T14:26:30.728Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", size = 1471147, upload-time = "2026-08-23T14:25:55.259Z" }, - { url = "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", size = 820463, upload-time = "2026-08-23T14:25:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", size = 861456, upload-time = "2026-08-23T14:25:58.087Z" }, - { url = "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", size = 1023930, upload-time = "2026-08-23T14:25:59.465Z" }, - { url = "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", size = 1102614, upload-time = "2026-08-23T14:26:00.869Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", size = 1059915, upload-time = "2026-08-23T14:26:02.388Z" }, - { url = "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", size = 1047402, upload-time = "2026-08-23T14:26:03.897Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl", hash = "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", size = 619895, upload-time = "2026-08-23T14:26:05.105Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", size = 633456, upload-time = "2026-08-23T14:26:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl", hash = "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", size = 611003, upload-time = "2026-08-23T14:26:07.813Z" }, - { url = "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", size = 1493959, upload-time = "2026-08-23T14:26:09.025Z" }, - { url = "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", size = 859615, upload-time = "2026-08-23T14:26:10.606Z" }, - { url = "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", size = 839872, upload-time = "2026-08-23T14:26:12.037Z" }, - { url = "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", size = 1091325, upload-time = "2026-08-23T14:26:13.34Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", size = 1042482, upload-time = "2026-08-23T14:26:14.667Z" }, - { url = "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", size = 946868, upload-time = "2026-08-23T14:26:16.094Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", size = 832161, upload-time = "2026-08-23T14:26:17.272Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", size = 849791, upload-time = "2026-08-23T14:26:18.498Z" }, - { url = "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", size = 875473, upload-time = "2026-08-23T14:26:19.908Z" }, - { url = "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", size = 1036463, upload-time = "2026-08-23T14:26:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", size = 1116029, upload-time = "2026-08-23T14:26:22.907Z" }, - { url = "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", size = 1076589, upload-time = "2026-08-23T14:26:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", size = 1058871, upload-time = "2026-08-23T14:26:25.674Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl", hash = "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", size = 630729, upload-time = "2026-08-23T14:26:26.932Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl", hash = "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", size = 644462, upload-time = "2026-08-23T14:26:28.294Z" }, - { url = "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl", hash = "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a", size = 621867, upload-time = "2026-08-23T14:26:29.547Z" }, +[package.metadata.requires-dev] +dev = [ + { name = "build", specifier = ">=1.2" }, + { name = "django", marker = "python_full_version >= '3.10'", specifier = ">=5.2,<6.0" }, + { name = "djangorestframework", marker = "python_full_version >= '3.10'", specifier = ">=3.15" }, + { name = "pre-commit", specifier = ">=4.0" }, + { name = "pytest", specifier = ">=8.3" }, + { name = "ruff", specifier = ">=0.12" }, ] [[package]] @@ -874,6 +317,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/6e/80993e10a0482f630cef528635789233224f36b1ffd11592aa15d13ff9ce/platformdirs-4.11.7-py3-none-any.whl", hash = "sha256:8a02cb259042c79d1cd0450facc2fe6dc9d303ae7901afbe33bf8ea0b188cef6", size = 23938, upload-time = "2026-09-01T13:35:09.02Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "pre-commit" version = "4.3.0" @@ -914,46 +366,64 @@ wheels = [ ] [[package]] -name = "pycparser" -version = "2.23" +name = "pygments" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, ] [[package]] -name = "pycparser" -version = "3.0" +name = "pyproject-hooks" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, ] [[package]] -name = "pygments" -version = "2.21.0" +name = "pytest" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pluggy", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] [[package]] -name = "pyproject-hooks" -version = "1.2.0" +name = "pytest" +version = "9.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] @@ -969,15 +439,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/5e/21abf578182fb15006a57faf3711a1e659e29d600d19b6e557eae908c81d/python_discovery-1.6.0-py3-none-any.whl", hash = "sha256:d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a", size = 38451, upload-time = "2026-08-28T17:30:01.236Z" }, ] -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" @@ -1051,114 +512,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, ] -[[package]] -name = "readme-renderer" -version = "44.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "docutils", marker = "python_full_version < '3.10'" }, - { name = "nh3", marker = "python_full_version < '3.10'" }, - { name = "pygments", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", size = 13310, upload-time = "2024-07-08T15:00:56.577Z" }, -] - -[[package]] -name = "readme-renderer" -version = "46.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "docutils", marker = "python_full_version >= '3.10'" }, - { name = "nh3", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz", hash = "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", size = 38382, upload-time = "2026-08-28T15:18:32.49Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl", hash = "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560", size = 14239, upload-time = "2026-08-28T15:18:31.132Z" }, -] - -[[package]] -name = "requests" -version = "2.32.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "certifi", marker = "python_full_version < '3.10'" }, - { name = "charset-normalizer", marker = "python_full_version < '3.10'" }, - { name = "idna", marker = "python_full_version < '3.10'" }, - { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, -] - -[[package]] -name = "requests" -version = "2.34.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "certifi", marker = "python_full_version >= '3.10'" }, - { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, - { name = "idna", marker = "python_full_version >= '3.10'" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, -] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, -] - -[[package]] -name = "rfc3986" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, -] - -[[package]] -name = "rich" -version = "15.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, -] - [[package]] name = "ruff" version = "0.16.5" @@ -1185,37 +538,12 @@ wheels = [ ] [[package]] -name = "secretstorage" -version = "3.3.3" +name = "sqlparse" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "cryptography", version = "47.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version <= '3.9'" }, - { name = "cryptography", version = "50.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version > '3.9' and python_full_version < '3.10'" }, - { name = "jeepney", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739, upload-time = "2022-08-13T16:22:46.976Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/d3/3f06a1006f2261d1342aefb3c71eed02f5d4ca5bdbecd86ebc12ad38306e/sqlparse-0.6.0.tar.gz", hash = "sha256:113c35c75365ab9cc9c7231d68c6428fb11c085fc8e9eb1ad659b7ddbf6cd2b9", size = 178477, upload-time = "2026-08-13T19:16:06.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221, upload-time = "2022-08-13T16:22:44.457Z" }, -] - -[[package]] -name = "secretstorage" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "cryptography", version = "50.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "jeepney", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, + { url = "https://files.pythonhosted.org/packages/d9/50/f00935da0ec7cbf325f8dc4f772ae46fbc7b672dd62876e73f0a94adda57/sqlparse-0.6.0-py3-none-any.whl", hash = "sha256:b861c0288ce2fa56209a9a6412d2e066ac664b3873b89c26c9d8415e8e32996f", size = 50070, upload-time = "2026-08-13T19:16:04.062Z" }, ] [[package]] @@ -1272,54 +600,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] -[[package]] -name = "twine" -version = "6.2.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -dependencies = [ - { name = "id", marker = "python_full_version < '3.10'" }, - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "keyring", marker = "python_full_version < '3.10' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "readme-renderer", version = "44.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "requests-toolbelt", marker = "python_full_version < '3.10'" }, - { name = "rfc3986", marker = "python_full_version < '3.10'" }, - { name = "rich", marker = "python_full_version < '3.10'" }, - { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" }, -] - -[[package]] -name = "twine" -version = "7.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "id", marker = "python_full_version >= '3.10'" }, - { name = "keyring", marker = "python_full_version >= '3.10' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "readme-renderer", version = "46.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "requests-toolbelt", marker = "python_full_version >= '3.10'" }, - { name = "rfc3986", marker = "python_full_version >= '3.10'" }, - { name = "rich", marker = "python_full_version >= '3.10'" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/92/3c/58f808a359700f39a967dffede33efeac809262c03303fa3eec6afff8f49/twine-7.0.0.tar.gz", hash = "sha256:85cdb29c518efef867360ae4acd4b0dfd61c8654a22fca08e6f8539f05022177", size = 215032, upload-time = "2026-07-27T15:59:00.825Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/08/ddcdc06225eaad6de0e48e1002b06d919dbde20582d0662c7af51308e5d6/twine-7.0.0-py3-none-any.whl", hash = "sha256:b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7", size = 43204, upload-time = "2026-07-27T15:58:59.26Z" }, -] - [[package]] name = "typing-extensions" version = "4.16.0" @@ -1330,28 +610,12 @@ wheels = [ ] [[package]] -name = "urllib3" -version = "2.6.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version > '3.9' and python_full_version < '3.10'", - "python_full_version <= '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, -] - -[[package]] -name = "urllib3" -version = "2.7.0" +name = "tzdata" +version = "2026.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, ] [[package]] From e3f237f48d8e40a8dd0b275b089f6bb7a198cef0 Mon Sep 17 00:00:00 2001 From: Kamaar Date: Wed, 2 Sep 2026 11:51:09 +0200 Subject: [PATCH 3/3] Commit the frontend bundles so a git install includes the UI InvenTree's plugin installer (plugin/installer.py) only accepts VCS URLs, composed as {packagename}@{url}; a plain https:// URL is handed to pip as a package *index* (-i), not as a package to install, so a link to a release file does not work from that form. A VCS install builds from source, which means a plugin installed through Settings -> Plugins had no user interface at all, because batchcode_plugin/static/ was gitignored. Commit the bundles, and guard them against going stale: the CI frontend job rebuilds both the bundles and the message catalogs and fails if the result differs from what is committed. It stages before diffing, since bundle filenames carry a content hash and a plain `git diff` would not see the new files. Switch CI to `npm ci` - several dependencies are declared as "latest", so only the lockfile makes the output reproducible enough to compare. Fold the translation check into the same job and drop translations.yaml, which was repeating the same npm install and build for one diff. Add .gitattributes pinning line endings to LF. This is load-bearing rather than cosmetic: a sourcemap embeds its sources verbatim in "sourcesContent", line endings included, so a CRLF checkout of frontend/src builds different .js.map files and would fail the artifact check on Windows with no real change. Generated artifacts are marked -text so they stay byte-identical. Document the install procedure properly, which the previous version got wrong in two ways: - Three global settings gate the mixins this plugin uses, and all three default to False: ENABLE_PLUGINS_APP (AppMixin), ENABLE_PLUGINS_URL (UrlsMixin) and ENABLE_PLUGINS_INTERFACE (UserInterfaceMixin). They live in common/setting/system.py as database settings, not in config.yaml, so searching the config template for them finds nothing. CLAUDE.md previously claimed no such flag existed. - Neither the installer nor the container entrypoint runs migrations, so installation cannot be completed from the web interface alone: an admin must run `invoke update` (or `invoke migrate`) once. The README now says so up front and walks through the four steps in order. Co-Authored-By: Claude Opus 5 (1M context) --- .gitattributes | 20 +++ .github/workflows/ci.yaml | 44 +++++- .github/workflows/translations.yaml | 32 ---- CLAUDE.md | 67 ++++++++- README.md | 140 ++++++++++++++---- batchcode_plugin/.gitignore | 11 +- batchcode_plugin/static/.vite/manifest.json | 86 +++++++++++ batchcode_plugin/static/Panel-DT4MHQzh.js | 2 + batchcode_plugin/static/Panel-DT4MHQzh.js.map | 1 + batchcode_plugin/static/Panel.js | 2 + batchcode_plugin/static/Panel.js.map | 1 + batchcode_plugin/static/Settings-D5NnX1mC.js | 2 + .../static/Settings-D5NnX1mC.js.map | 1 + batchcode_plugin/static/Settings.js | 2 + batchcode_plugin/static/Settings.js.map | 1 + .../static/assets/messages-6MO-OwBA.js | 2 + .../static/assets/messages-6MO-OwBA.js.map | 1 + .../static/assets/messages-B19F09LY.js | 2 + .../static/assets/messages-B19F09LY.js.map | 1 + .../static/assets/messages-BVqXLN8V.js | 2 + .../static/assets/messages-BVqXLN8V.js.map | 1 + .../static/assets/messages-BaNfSHmL.js | 2 + .../static/assets/messages-BaNfSHmL.js.map | 1 + .../static/assets/messages-Bs4XYOTm.js | 2 + .../static/assets/messages-Bs4XYOTm.js.map | 1 + .../static/assets/messages-BwzuZfs7.js | 2 + .../static/assets/messages-BwzuZfs7.js.map | 1 + .../static/assets/messages-DtuQFlMQ.js | 2 + .../static/assets/messages-DtuQFlMQ.js.map | 1 + .../static/assets/messages-SySx3VqF.js | 2 + .../static/assets/messages-SySx3VqF.js.map | 1 + .../static/assets/messages-m7AYrdMP.js | 2 + .../static/assets/messages-m7AYrdMP.js.map | 1 + .../static/assets/messages-uDIARWjl.js | 2 + .../static/assets/messages-uDIARWjl.js.map | 1 + 35 files changed, 365 insertions(+), 77 deletions(-) create mode 100644 .gitattributes delete mode 100644 .github/workflows/translations.yaml create mode 100644 batchcode_plugin/static/.vite/manifest.json create mode 100644 batchcode_plugin/static/Panel-DT4MHQzh.js create mode 100644 batchcode_plugin/static/Panel-DT4MHQzh.js.map create mode 100644 batchcode_plugin/static/Panel.js create mode 100644 batchcode_plugin/static/Panel.js.map create mode 100644 batchcode_plugin/static/Settings-D5NnX1mC.js create mode 100644 batchcode_plugin/static/Settings-D5NnX1mC.js.map create mode 100644 batchcode_plugin/static/Settings.js create mode 100644 batchcode_plugin/static/Settings.js.map create mode 100644 batchcode_plugin/static/assets/messages-6MO-OwBA.js create mode 100644 batchcode_plugin/static/assets/messages-6MO-OwBA.js.map create mode 100644 batchcode_plugin/static/assets/messages-B19F09LY.js create mode 100644 batchcode_plugin/static/assets/messages-B19F09LY.js.map create mode 100644 batchcode_plugin/static/assets/messages-BVqXLN8V.js create mode 100644 batchcode_plugin/static/assets/messages-BVqXLN8V.js.map create mode 100644 batchcode_plugin/static/assets/messages-BaNfSHmL.js create mode 100644 batchcode_plugin/static/assets/messages-BaNfSHmL.js.map create mode 100644 batchcode_plugin/static/assets/messages-Bs4XYOTm.js create mode 100644 batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map create mode 100644 batchcode_plugin/static/assets/messages-BwzuZfs7.js create mode 100644 batchcode_plugin/static/assets/messages-BwzuZfs7.js.map create mode 100644 batchcode_plugin/static/assets/messages-DtuQFlMQ.js create mode 100644 batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map create mode 100644 batchcode_plugin/static/assets/messages-SySx3VqF.js create mode 100644 batchcode_plugin/static/assets/messages-SySx3VqF.js.map create mode 100644 batchcode_plugin/static/assets/messages-m7AYrdMP.js create mode 100644 batchcode_plugin/static/assets/messages-m7AYrdMP.js.map create mode 100644 batchcode_plugin/static/assets/messages-uDIARWjl.js create mode 100644 batchcode_plugin/static/assets/messages-uDIARWjl.js.map diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..46cbfe7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,20 @@ +# Normalise line endings to LF in the repository, and check out LF on every +# platform - including Windows, where core.autocrlf would otherwise produce +# CRLF working copies. +# +# This is not cosmetic. The compiled bundles in batchcode_plugin/static/ are +# committed, and a sourcemap embeds its sources verbatim in "sourcesContent", +# line endings included. A CRLF checkout of frontend/src therefore builds +# different .js.map files than a LF one, which would make the CI check for +# up-to-date artifacts fail on Windows even when nothing had changed. +* text=auto eol=lf + +# Generated artifacts: never transform them, so they stay byte-identical to +# whatever the build produced. +batchcode_plugin/static/** -text +frontend/src/locales/**/messages.ts -text +frontend/src/locales/**/messages.d.ts -text + +# Lockfiles are generated; keep them out of diff review noise +frontend/package-lock.json -diff linguist-generated +uv.lock -diff linguist-generated diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3aac8ac..b10d92b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,5 +1,6 @@ # Ensure that the plugin meets the required style guidelines -# Ensure that the tests pass, and that the plugin builds correctly +# Ensure that the tests pass, that the plugin builds, and that the committed +# frontend artifacts match their sources name: CI Checks @@ -36,10 +37,43 @@ jobs: uses: actions/setup-node@v4 with: node-version: "22" - - name: Build Frontend + cache: npm + cache-dependency-path: frontend/package-lock.json + # `npm ci`, not `npm install`: several dependencies are declared as + # "latest", so only the lockfile makes the build reproducible - and the + # artifact checks below depend on that. + - name: Install Deps + run: npm ci + working-directory: frontend + - name: Lint + run: npm run lint + working-directory: frontend + - name: Build run: | - cd frontend - npm install npm run translate npm run build - npm run lint + working-directory: frontend + + # Both the message catalogs and the compiled bundles are committed, so a + # change to a source file must come with its rebuilt artifacts. Staging + # first, because `git diff` alone would not notice new files - and the + # bundle filenames carry a content hash, so they change with the content. + - name: Check Committed Artifacts Are Up To Date + run: | + git add -A frontend/src/locales batchcode_plugin/static + + if ! git diff --cached --exit-code --stat -- frontend/src/locales; then + echo "" + echo "ERROR: Translation catalogs are out of date." + echo "Run 'cd frontend && npm run translate' and commit the result." + exit 1 + fi + + if ! git diff --cached --exit-code --stat -- batchcode_plugin/static; then + echo "" + echo "ERROR: Compiled frontend bundles are out of date." + echo "Run 'cd frontend && npm run build' and commit the result." + echo "The bundles are committed so that installing this plugin" + echo "from a git URL includes the user interface." + exit 1 + fi diff --git a/.github/workflows/translations.yaml b/.github/workflows/translations.yaml deleted file mode 100644 index 0342534..0000000 --- a/.github/workflows/translations.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# Check that compiled translation catalogs are up-to-date with source strings - -name: Translation Check - -on: ["push", "pull_request"] - -jobs: - translations: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: "22" - - name: Install Dependencies - run: | - cd frontend - npm install - - name: Compile Translations - run: | - cd frontend - npm run translate - - name: Check for Uncommitted Changes - run: | - if ! git diff --exit-code frontend/src/locales; then - echo "" - echo "ERROR: Translation catalogs are out of date." - echo "Run 'cd frontend && npm run translate' and commit the updated files in src/locales." - exit 1 - fi diff --git a/CLAUDE.md b/CLAUDE.md index 294558b..08c45f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,12 +34,40 @@ npm run lint:fix # biome check --fix (also formats) npm run dev # vite dev server on :5174, pairs with INVENTREE_PLUGIN_DEV_HOST ``` -### Release ordering +### Committed build artifacts -`batchcode_plugin/static/` is gitignored, so `cd frontend && npm run build` must run **before** -`python -m build` or the wheel ships without a UI. There is no publishing workflow — the plugin -is not on PyPI, and `pypi.yaml` was removed from the creator's scaffold. Releases are built by -hand, in that order. +Unlike the creator's scaffold, `batchcode_plugin/static/` is **committed** (its `.gitignore` +explains why): the plugin installer only accepts VCS URLs, which build from source, so an +uncommitted bundle means no UI for anyone installing from git. `frontend/src/locales/` is +committed for the same class of reason. + +So a change under `frontend/src/` is only half-done until the artifacts are rebuilt and staged: + +```bash +cd frontend && npm run translate && npm run build && cd .. +git add frontend/src/locales batchcode_plugin/static +``` + +The CI `frontend` job rebuilds both and fails on any difference. It stages before diffing +(`git add -A` then `git diff --cached`) because bundle filenames carry a content hash, so a +change *renames* files and a plain `git diff` would miss the new ones. Use `npm ci`, never +`npm install`: several dependencies are pinned to `"latest"`, and only the lockfile keeps the +output reproducible enough for that check. + +Two traps that make that check misfire, both already handled — don't undo either: + +- **`.gitattributes` pins everything to `eol=lf`.** A sourcemap embeds its sources verbatim in + `sourcesContent`, line endings included, so a CRLF checkout of `frontend/src/` builds different + `.js.map` files. On Windows with `core.autocrlf=true` that alone fails the check. If bundles + ever "change" with no source edit, compare `sourcesContent`, not `mappings`. +- **`npm run translate` does not delete removed strings**, it marks them obsolete (`#~`). Use + `npx lingui extract --clean && npm run compile` after removing or renaming a UI string, + otherwise the catalogs accumulate dead entries. + +Because the bundles are committed, `python -m build` on a clean checkout already yields a +complete wheel. There is no publishing workflow — the plugin is not on PyPI, and `pypi.yaml` was +removed from the scaffold. `translations.yaml` was removed too: its check is now one step of the +`frontend` job, which was already doing the same build. ## Verifying changes @@ -174,8 +202,33 @@ model that does not implement it. Migrations here are hand-written (`0001_initia generating them with `makemigrations` requires a full InvenTree checkout. `DEFAULT_AUTO_FIELD` in InvenTree is plain `AutoField`, so use that, not `BigAutoField`. -There is no separate server flag for app plugins in InvenTree 1.x — only `plugins_enabled` / -`INVENTREE_PLUGINS_ENABLED`. +### Three integrations must be switched on + +Beyond the server-side `plugins_enabled` / `INVENTREE_PLUGINS_ENABLED`, each mixin this plugin +uses is gated by a **global database setting, all of which default to `False`** (defined in +InvenTree's `common/setting/system.py`, surfaced under Settings → Plugins): + +| Setting | Gates | Symptom when off | +| --- | --- | --- | +| `ENABLE_PLUGINS_APP` | `AppMixin` | The app is never loaded; the counter table is unreachable | +| `ENABLE_PLUGINS_URL` | `UrlsMixin` | `preview/` and `generate/` return 404 | +| `ENABLE_PLUGINS_INTERFACE` | `UserInterfaceMixin` | No panel, no settings preview | + +These are *not* in `config.yaml` or `settings.py` — searching there finds nothing, which is +misleading. When a report says "the plugin does nothing", check these before the code. + +### Installation cannot be completed from the web UI + +`plugin/installer.py` runs pip and reloads the registry; it does **not** run migrations, and +neither does the container entrypoint (`contrib/container/init.sh` only prepares directories and +`exec`s the command). Applying `0001_initial` needs `invoke update` (which includes `migrate`) or +`invoke migrate` from a shell. This is an accepted consequence of the `AppMixin` design — see the +README's install steps. If it ever needs to become UI-installable, the counter has to stop being +a model. + +The installer also only accepts **VCS URLs** (`git+https://…`, composed as `{packagename}@{url}`). +A plain `https://` URL is passed to pip as a package *index* (`-i`), so a link to a release wheel +does not work from that form. ## Conventions diff --git a/README.md b/README.md index fc0dde9..4e4ef65 100644 --- a/README.md +++ b/README.md @@ -25,42 +25,82 @@ how the code is formatted. ## Installation -> **Not published to PyPI.** Install from this repository. +> **Not published to PyPI** — install from this repository. Everything needed, +> including the compiled user interface, is committed here, so there is nothing +> to build first. +> +> **One step needs server access.** This plugin adds a database table, and +> InvenTree's plugin installer does not run migrations. Installation cannot be +> completed from the web interface alone — see step 4. -### Plugin manager +### Before you start -In Settings → Plugins → Install Plugin, install from the source URL: +Plugins must be enabled server-side: set `plugins_enabled: True` in +`config.yaml`, or the environment variable `INVENTREE_PLUGINS_ENABLED=true`. +The server also needs `git` available for an installation from a git URL (the +official Docker images have it). -``` -git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0 -``` +### 1. Install the package + +In **Settings → Plugins → Install Plugin**, fill in: + +| Field | Value | +| --- | --- | +| Package name | `inventree-batchcode-plugin` | +| Source URL | `git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0` | -### Command line +Drop the `@v2.0.0` to follow the default branch instead of a fixed release. -Into the InvenTree instance's own environment: +Equivalently, from a shell in the InvenTree environment: ```bash pip install -U git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0 ``` -Installing from git builds the package from source, which does **not** include -the compiled frontend bundles — they are not committed. Without them the plugin -works, but its UI panel and settings preview do not render. To include them, -build a wheel first (see *Building a release* below) and install that. +Note that a plain `https://` URL is not an alternative here: InvenTree passes +such URLs to pip as a *package index* (`-i`), not as a package to install, so a +link to a release file will not work. + +### 2. Enable the plugin + +Activate **BatchCodePlugin** in Settings → Plugins. + +### 3. Enable the three integrations it needs + +Still under Settings → Plugins, in the *Plugin Settings* section. **All three +default to off**, and the plugin is inert without them: -### After installing +| Setting | Without it | +| --- | --- | +| Enable app integration | The counter table is never loaded — nothing works | +| Enable URL integration | The preview and generate endpoints return 404 | +| Enable interface integration | The stock item panel and format preview never appear | + +### 4. Restart, and apply the migration + +From a shell on the server — this is the step that cannot be done from the web +interface: -1. **Enable the plugin** in Settings → Plugins. -2. **Restart the InvenTree server.** The plugin uses `AppMixin`, so it is loaded - as a Django application; this only happens at startup. -3. **Apply the database migration** that creates the counter table: - ```bash - invoke migrate - ``` - (or `python manage.py migrate batchcode_plugin` in a manual installation). +```bash +invoke update # includes the database migration +``` + +Or, to migrate without a full update: + +```bash +invoke migrate +``` -Plugins must be enabled server-side for any of this to work — set -`plugins_enabled: True` in `config.yaml`, or `INVENTREE_PLUGINS_ENABLED=true`. +In a manual installation: `python manage.py migrate batchcode_plugin`. + +A restart is required in any case: the plugin is loaded as a Django +application, which only happens at startup. + +### Checking it worked + +Open any stock item — there should be a **Batch Code** panel showing the +current code and a preview of the next one. If the panel is missing, revisit +step 3; if it loads but reports an error, the migration in step 4 has not run. ## Configuration @@ -155,12 +195,46 @@ Frontend (see `frontend/README.md` for details): ```bash cd frontend -npm install +npm ci # not `npm install` — several deps are "latest" npm run translate # extract + compile message catalogs -npm run build # bundle into batchcode_plugin/static/ +npm run build # bundle into ../batchcode_plugin/static/ npm run lint # biome ``` +### Committed build artifacts + +Both the message catalogs (`frontend/src/locales/`) and the compiled bundles +(`batchcode_plugin/static/`) are **committed**. InvenTree's plugin installer +only accepts VCS URLs, which build from source, so a plugin installed from this +repository would have no user interface otherwise. + +That means **any change under `frontend/src/` must be followed by**: + +```bash +cd frontend && npm run translate && npm run build && cd .. +git add frontend/src/locales batchcode_plugin/static +``` + +CI rebuilds both and fails if the result differs from what is committed, so a +forgotten rebuild is caught rather than silently shipped. `npm ci` matters here: +several dependencies are declared as `"latest"`, and only the lockfile makes +the output reproducible. + +When a UI string is **removed or renamed**, `npm run translate` leaves the old +entry behind as an obsolete `#~` comment rather than deleting it. Clear those +out with: + +```bash +cd frontend && npx lingui extract --clean && npm run compile && npm run build +``` + +Line endings are pinned to LF by `.gitattributes`, and this matters more than +it looks: a sourcemap embeds its sources verbatim, so a CRLF checkout of +`frontend/src/` produces different `.js.map` files and the CI check above would +fail on Windows for no real reason. + +Nothing under `batchcode_plugin/static/` should ever be edited by hand. + ### Tests `tests/` covers the parts of the plugin that decide what a code looks like: @@ -177,17 +251,21 @@ cannot drift from the production scope key. ### Building a release -The compiled bundles in `batchcode_plugin/static/` are not committed, so the -frontend must be built **before** the package, or the wheel ships without a UI: +Because the bundles are committed, `uv run python -m build` on a clean checkout +already produces a complete wheel — no frontend build needed first. Tag the +release so installations can pin it: ```bash -cd frontend && npm install && npm run translate && npm run build && cd .. -uv run python -m build # -> dist/*.whl +git tag -a vX.Y.Z -m "BatchCodePlugin X.Y.Z" +git push origin vX.Y.Z ``` +Then bump `PLUGIN_VERSION` in `batchcode_plugin/__init__.py` (the single source +of the version) and the install URL in this README. + There is no PyPI publishing workflow. To add one, restore the plugin creator's -`pypi.yaml` (it triggers on `release: published` and needs a `PYPI_API_TOKEN` -repository secret), making sure the frontend build step still runs first. +`pypi.yaml` — it triggers on `release: published` and needs a `PYPI_API_TOKEN` +repository secret. This project was restructured with the [InvenTree plugin creator](https://github.com/inventree/plugin-creator). diff --git a/batchcode_plugin/.gitignore b/batchcode_plugin/.gitignore index f99b298..83c5165 100644 --- a/batchcode_plugin/.gitignore +++ b/batchcode_plugin/.gitignore @@ -1,2 +1,9 @@ -# static files are generated from ../frontend directory -static +# The compiled frontend bundles ARE committed, deliberately. +# +# InvenTree's plugin installer only supports VCS URLs (git+https://...), which +# build from source - so a plugin installed through Settings -> Plugins from +# this repository would ship without any UI unless the bundles are in git. +# +# They are generated by `cd frontend && npm run build`. The CI 'bundles' job +# rebuilds them and fails if the result differs from what is committed, so +# never hand-edit anything in static/. diff --git a/batchcode_plugin/static/.vite/manifest.json b/batchcode_plugin/static/.vite/manifest.json new file mode 100644 index 0000000..fe61fb8 --- /dev/null +++ b/batchcode_plugin/static/.vite/manifest.json @@ -0,0 +1,86 @@ +{ + "src/Panel.tsx": { + "file": "Panel-DT4MHQzh.js", + "name": "Panel", + "src": "src/Panel.tsx", + "isEntry": true, + "dynamicImports": [ + "src/locales/de/messages.ts", + "src/locales/en/messages.ts", + "src/locales/es/messages.ts", + "src/locales/fr/messages.ts", + "src/locales/it/messages.ts", + "src/locales/ja/messages.ts", + "src/locales/pseudo-LOCALE/messages.ts", + "src/locales/ru/messages.ts", + "src/locales/zh_Hans/messages.ts", + "src/locales/zh_Hant/messages.ts" + ] + }, + "src/Settings.tsx": { + "file": "Settings-D5NnX1mC.js", + "name": "Settings", + "src": "src/Settings.tsx", + "isEntry": true + }, + "src/locales/de/messages.ts": { + "file": "assets/messages-SySx3VqF.js", + "name": "messages", + "src": "src/locales/de/messages.ts", + "isDynamicEntry": true + }, + "src/locales/en/messages.ts": { + "file": "assets/messages-BVqXLN8V.js", + "name": "messages", + "src": "src/locales/en/messages.ts", + "isDynamicEntry": true + }, + "src/locales/es/messages.ts": { + "file": "assets/messages-B19F09LY.js", + "name": "messages", + "src": "src/locales/es/messages.ts", + "isDynamicEntry": true + }, + "src/locales/fr/messages.ts": { + "file": "assets/messages-DtuQFlMQ.js", + "name": "messages", + "src": "src/locales/fr/messages.ts", + "isDynamicEntry": true + }, + "src/locales/it/messages.ts": { + "file": "assets/messages-m7AYrdMP.js", + "name": "messages", + "src": "src/locales/it/messages.ts", + "isDynamicEntry": true + }, + "src/locales/ja/messages.ts": { + "file": "assets/messages-BwzuZfs7.js", + "name": "messages", + "src": "src/locales/ja/messages.ts", + "isDynamicEntry": true + }, + "src/locales/pseudo-LOCALE/messages.ts": { + "file": "assets/messages-6MO-OwBA.js", + "name": "messages", + "src": "src/locales/pseudo-LOCALE/messages.ts", + "isDynamicEntry": true + }, + "src/locales/ru/messages.ts": { + "file": "assets/messages-BaNfSHmL.js", + "name": "messages", + "src": "src/locales/ru/messages.ts", + "isDynamicEntry": true + }, + "src/locales/zh_Hans/messages.ts": { + "file": "assets/messages-uDIARWjl.js", + "name": "messages", + "src": "src/locales/zh_Hans/messages.ts", + "isDynamicEntry": true + }, + "src/locales/zh_Hant/messages.ts": { + "file": "assets/messages-Bs4XYOTm.js", + "name": "messages", + "src": "src/locales/zh_Hant/messages.ts", + "isDynamicEntry": true + } +} \ No newline at end of file diff --git a/batchcode_plugin/static/Panel-DT4MHQzh.js b/batchcode_plugin/static/Panel-DT4MHQzh.js new file mode 100644 index 0000000..896b2fd --- /dev/null +++ b/batchcode_plugin/static/Panel-DT4MHQzh.js @@ -0,0 +1,2 @@ +const ue="1.5.0";var u=(e=>(e.api_server_info="",e.user_list="user/",e.user_set_password="user/:id/set-password/",e.user_tokens="user/tokens/",e.user_simple_login="email/generate/",e.user_me_profile="user/me/profile/",e.user_me_roles="user/me/roles/",e.user_me_token="user/me/token/",e.user_me="user/me/",e.auth_base="/auth/",e.user_reset="auth/v1/auth/password/request",e.user_reset_set="auth/v1/auth/password/reset",e.auth_pwd_change="auth/v1/account/password/change",e.auth_login="auth/v1/auth/login",e.auth_login_2fa="auth/v1/auth/2fa/authenticate",e.auth_session="auth/v1/auth/session",e.auth_signup="auth/v1/auth/signup",e.auth_authenticators="auth/v1/account/authenticators",e.auth_recovery="auth/v1/account/authenticators/recovery-codes",e.auth_mfa_reauthenticate="auth/v1/auth/2fa/reauthenticate",e.auth_totp="auth/v1/account/authenticators/totp",e.auth_trust="auth/v1/auth/2fa/trust",e.auth_webauthn="auth/v1/account/authenticators/webauthn",e.auth_webauthn_login="auth/v1/auth/webauthn/authenticate",e.auth_reauthenticate="auth/v1/auth/reauthenticate",e.auth_email="auth/v1/account/email",e.auth_email_verify="auth/v1/auth/email/verify",e.auth_providers="auth/v1/account/providers",e.auth_provider_redirect="auth/v1/auth/provider/redirect",e.auth_config="auth/v1/config",e.currency_list="currency/exchange/",e.currency_refresh="currency/refresh/",e.all_units="units/all/",e.task_overview="background-task/",e.task_pending_list="background-task/pending/",e.task_scheduled_list="background-task/scheduled/",e.task_failed_list="background-task/failed/",e.api_search="search/",e.settings_global_list="settings/global/",e.settings_user_list="settings/user/",e.news="news/",e.global_status="generic/status/",e.custom_state_list="generic/status/custom/",e.version="version/",e.license="license/",e.group_list="user/group/",e.owner_list="user/owner/",e.ruleset_list="user/ruleset/",e.content_type_list="contenttype/",e.icons="icons/",e.selectionlist_list="selection/",e.selectionentry_list="selection/:id/entry/",e.barcode="barcode/",e.barcode_history="barcode/history/",e.barcode_link="barcode/link/",e.barcode_unlink="barcode/unlink/",e.barcode_generate="barcode/generate/",e.data_output="data-output/",e.import_session_list="importer/session/",e.import_session_accept_fields="importer/session/:id/accept_fields/",e.import_session_accept_rows="importer/session/:id/accept_rows/",e.import_session_column_mapping_list="importer/column-mapping/",e.import_session_row_list="importer/row/",e.notifications_list="notifications/",e.notifications_readall="notifications/readall/",e.build_order_list="build/",e.build_order_issue="build/:id/issue/",e.build_order_cancel="build/:id/cancel/",e.build_order_hold="build/:id/hold/",e.build_order_complete="build/:id/finish/",e.build_output_complete="build/:id/complete/",e.build_output_create="build/:id/create-output/",e.build_output_scrap="build/:id/scrap-outputs/",e.build_output_delete="build/:id/delete-outputs/",e.build_order_auto_allocate="build/:id/auto-allocate/",e.build_order_allocate="build/:id/allocate/",e.build_order_consume="build/:id/consume/",e.build_order_deallocate="build/:id/unallocate/",e.build_line_list="build/line/",e.build_item_list="build/item/",e.bom_list="bom/",e.bom_item_validate="bom/:id/validate/",e.bom_validate="part/:id/bom-validate/",e.bom_substitute_list="bom/substitute/",e.part_list="part/",e.part_thumbs_list="part/thumbs/",e.part_pricing="part/:id/pricing/",e.part_requirements="part/:id/requirements/",e.part_serial_numbers="part/:id/serial-numbers/",e.part_scheduling="part/:id/scheduling/",e.part_pricing_internal="part/internal-price/",e.part_pricing_sale="part/sale-price/",e.part_stocktake_list="part/stocktake/",e.part_stocktake_generate="part/stocktake/generate/",e.category_list="part/category/",e.category_tree="part/category/tree/",e.category_parameter_list="part/category/parameters/",e.related_part_list="part/related/",e.part_test_template_list="part/test-template/",e.company_list="company/",e.contact_list="company/contact/",e.address_list="company/address/",e.supplier_part_list="company/part/",e.supplier_part_pricing_list="company/price-break/",e.manufacturer_part_list="company/part/manufacturer/",e.stock_location_list="stock/location/",e.stock_location_type_list="stock/location-type/",e.stock_location_tree="stock/location/tree/",e.stock_item_list="stock/",e.stock_tracking_list="stock/track/",e.stock_test_result_list="stock/test/",e.stock_transfer="stock/transfer/",e.stock_remove="stock/remove/",e.stock_return="stock/return/",e.stock_add="stock/add/",e.stock_count="stock/count/",e.stock_change_status="stock/change_status/",e.stock_merge="stock/merge/",e.stock_assign="stock/assign/",e.stock_status="stock/status/",e.stock_convert="stock/:id/convert/",e.stock_disassemble="stock/:id/disassemble/",e.stock_install="stock/:id/install/",e.stock_uninstall="stock/:id/uninstall/",e.stock_serialize="stock/:id/serialize/",e.stock_serial_info="stock/:id/serial-numbers/",e.generate_batch_code="generate/batch-code/",e.generate_serial_number="generate/serial-number/",e.purchase_order_list="order/po/",e.purchase_order_issue="order/po/:id/issue/",e.purchase_order_hold="order/po/:id/hold/",e.purchase_order_cancel="order/po/:id/cancel/",e.purchase_order_complete="order/po/:id/complete/",e.purchase_order_line_list="order/po-line/",e.purchase_order_extra_line_list="order/po-extra-line/",e.purchase_order_receive="order/po/:id/receive/",e.sales_order_list="order/so/",e.sales_order_issue="order/so/:id/issue/",e.sales_order_hold="order/so/:id/hold/",e.sales_order_cancel="order/so/:id/cancel/",e.sales_order_ship="order/so/:id/ship/",e.sales_order_complete="order/so/:id/complete/",e.sales_order_allocate="order/so/:id/allocate/",e.sales_order_allocate_serials="order/so/:id/allocate-serials/",e.sales_order_auto_allocate="order/so/:id/auto-allocate/",e.sales_order_line_list="order/so-line/",e.sales_order_extra_line_list="order/so-extra-line/",e.sales_order_allocation_list="order/so-allocation/",e.sales_order_shipment_list="order/so/shipment/",e.sales_order_shipment_complete="order/so/shipment/:id/ship/",e.return_order_list="order/ro/",e.return_order_issue="order/ro/:id/issue/",e.return_order_hold="order/ro/:id/hold/",e.return_order_cancel="order/ro/:id/cancel/",e.return_order_complete="order/ro/:id/complete/",e.return_order_receive="order/ro/:id/receive/",e.return_order_line_list="order/ro-line/",e.return_order_extra_line_list="order/ro-extra-line/",e.transfer_order_list="order/transfer-order/",e.transfer_order_issue="order/transfer-order/:id/issue/",e.transfer_order_hold="order/transfer-order/:id/hold/",e.transfer_order_cancel="order/transfer-order/:id/cancel/",e.transfer_order_complete="order/transfer-order/:id/complete/",e.transfer_order_allocate="order/transfer-order/:id/allocate/",e.transfer_order_allocate_serials="order/transfer-order/:id/allocate-serials/",e.transfer_order_line_list="order/transfer-order-line/",e.transfer_order_allocation_list="order/transfer-order-allocation/",e.label_list="label/template/",e.label_print="label/print/",e.report_list="report/template/",e.report_print="report/print/",e.report_snippet="report/snippet/",e.report_asset="report/asset/",e.plugin_list="plugins/",e.plugin_setting_list="plugins/:plugin/settings/",e.plugin_user_setting_list="plugins/:plugin/user-settings/",e.plugin_registry_status="plugins/status/",e.plugin_install="plugins/install/",e.plugin_reload="plugins/reload/",e.plugin_activate="plugins/:key/activate/",e.plugin_uninstall="plugins/:key/uninstall/",e.plugin_admin="plugins/:key/admin/",e.plugin_ui_features_list="plugins/ui/features/:feature_type/",e.plugin_locate_item="locate/",e.plugin_supplier_list="supplier/list/",e.plugin_supplier_search="supplier/search/",e.plugin_supplier_import="supplier/import/",e.machine_types_list="machine/types/",e.machine_driver_list="machine/drivers/",e.machine_registry_status="machine/status/",e.machine_list="machine/",e.machine_restart="machine/:machine/restart/",e.machine_setting_list="machine/:machine/settings/",e.machine_setting_detail="machine/:machine/settings/:config_type/",e.attachment_list="attachment/",e.error_report_list="error-report/",e.project_code_list="project-code/",e.custom_unit_list="units/",e.notes_image_upload="notes-image-upload/",e.email_list="admin/email/",e.email_test="admin/email/test/",e.config_list="admin/config/",e.parameter_list="parameter/",e.parameter_template_list="parameter/template/",e.tag_list="tag/",e.system_internal_trace_end="system-internal/observability/end",e))(u||{});window.LinguiCore.i18n;window.LinguiCore.i18n;u.part_list,u.parameter_list,u.parameter_template_list,u.part_test_template_list,u.supplier_part_list,u.manufacturer_part_list,u.category_list,u.stock_item_list,u.stock_location_list,u.stock_location_type_list,u.stock_tracking_list,u.build_order_list,u.build_line_list,u.build_item_list,u.company_list,u.project_code_list,u.purchase_order_list,u.purchase_order_line_list,u.sales_order_list,u.sales_order_shipment_list,u.return_order_list,u.return_order_line_list,u.transfer_order_list,u.transfer_order_line_list,u.address_list,u.contact_list,u.owner_list,u.user_list,u.group_list,u.import_session_list,u.label_list,u.report_list,u.plugin_list,u.content_type_list,u.selectionlist_list,u.selectionentry_list,u.error_report_list,u.tag_list;window.React.useEffect;window.React.useEffectEvent;window.LinguiCore.i18n;window.MantineNotifications.notifications;var J={exports:{}},$={},de;function Xe(){if(de)return $;de=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function r(n,o,s){var i=null;if(s!==void 0&&(i=""+s),o.key!==void 0&&(i=""+o.key),"key"in o){s={};for(var a in o)a!=="key"&&(s[a]=o[a])}else s=o;return o=s.ref,{$$typeof:e,type:n,key:i,ref:o!==void 0?o:null,props:s}}return $.Fragment=t,$.jsx=r,$.jsxs=r,$}var _e;function Ke(){return _e||(_e=1,J.exports=Xe()),J.exports}var he=Ke();window.MantineCore.ActionIcon;window.MantineCore.Group;window.MantineCore.Tooltip;const Qe=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,$e=Object.prototype.toString;function Ze(e){switch($e.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return rt(e,Error)}}function Ae(e,t){return $e.call(e)===`[object ${t}]`}function et(e){return Ae(e,"Object")}function tt(e){return!!(e?.then&&typeof e.then=="function")}function rt(e,t){try{return e instanceof t}catch{return!1}}const E="10.70.0",k=globalThis;function Y(){return oe(k),k}function oe(e){const t=e.__SENTRY__=e.__SENTRY__||{};return t.version=t.version||E,t[E]=t[E]||{}}function se(e,t,r=k){const n=r.__SENTRY__=r.__SENTRY__||{},o=n[E]=n[E]||{};return o[e]||(o[e]=t())}const T=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;let N;function W(e){if(N!==void 0)return N?N(e):e();const t=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),r=k;return t in r&&typeof r[t]=="function"?(N=r[t],N(e)):(N=null,e())}function te(){return W(()=>Math.random())}function nt(){return W(()=>Date.now())}function ot(){const e=k;return e.crypto||e.msCrypto}let X;function st(){return te()*16}function F(e=ot()){try{if(e?.randomUUID)return W(()=>e.randomUUID()).replace(/-/g,"")}catch{}return X||(X="10000000100040008000"+1e11),X.replace(/[018]/g,t=>(t^(st()&15)>>t/4).toString(16))}const Oe=1e3;function Ue(){return nt()/Oe}function it(){const{performance:e}=k;if(!e?.now||!e.timeOrigin)return Ue;const t=e.timeOrigin;return()=>(t+W(()=>e.now()))/Oe}let fe;function at(){return(fe??(fe=it()))()}function ct(e,t={}){if(t.user&&(!e.ipAddress&&t.user.ip_address&&(e.ipAddress=t.user.ip_address),!e.did&&!t.did&&(e.did=t.user.id||t.user.email||t.user.username)),e.timestamp=t.timestamp||at(),t.abnormal_mechanism&&(e.abnormal_mechanism=t.abnormal_mechanism),t.ignoreDuration&&(e.ignoreDuration=t.ignoreDuration),t.sid&&(e.sid=t.sid.length===32?t.sid:F()),t.init!==void 0&&(e.init=t.init),!e.did&&t.did&&(e.did=`${t.did}`),typeof t.started=="number"&&(e.started=t.started),e.ignoreDuration)e.duration=void 0;else if(typeof t.duration=="number")e.duration=t.duration;else{const r=e.timestamp-e.started;e.duration=r>=0?r:0}t.release&&(e.release=t.release),t.environment&&(e.environment=t.environment),!e.ipAddress&&t.ipAddress&&(e.ipAddress=t.ipAddress),!e.userAgent&&t.userAgent&&(e.userAgent=t.userAgent),typeof t.errors=="number"&&(e.errors=t.errors),t.status&&(e.status=t.status)}const lt="Sentry Logger ",me={};function je(e){if(!("console"in k))return e();const t=k.console,r={},n=Object.keys(me);n.forEach(o=>{const s=me[o];r[o]=t[o],t[o]=s});try{return e()}finally{n.forEach(o=>{t[o]=r[o]})}}function ut(){ae().enabled=!0}function dt(){ae().enabled=!1}function Ee(){return ae().enabled}function _t(...e){ie("log",...e)}function ht(...e){ie("warn",...e)}function ft(...e){ie("error",...e)}function ie(e,...t){T&&Ee()&&je(()=>{k.console[e](`${lt}[${e}]:`,...t)})}function ae(){return T?se("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:ut,disable:dt,isEnabled:Ee,log:_t,warn:ht,error:ft};function Fe(e,t,r=2){if(!t||typeof t!="object"||r<=0)return t;if(e&&Object.keys(t).length===0)return e;const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=Fe(n[o],t[o],r-1));return n}function ge(){return F()}function mt(e,t,r){try{Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0})}catch{T&&S.log(`Failed to add non-enumerable property "${String(t)}" to object`,e)}}function gt(e){try{const t=k.WeakRef;if(typeof t=="function")return new t(e)}catch{}return e}function pt(e){if(e){if(typeof e=="object"&&"deref"in e&&typeof e.deref=="function")try{return e.deref()}catch{return}return e}}const re="_sentrySpan";function pe(e,t){t?mt(e,re,gt(t)):delete e[re]}function we(e){return pt(e[re])}function wt(e,t=0){return typeof e!="string"||t===0||e.length<=t?e:`${e.slice(0,t)}...`}const vt=100;class L{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._attributes={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext={traceId:ge(),sampleRand:te()}}clone(){const t=new L;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._attributes={...this._attributes},t._extra={...this._extra},t._contexts={...this._contexts},this._contexts.flags&&(t._contexts.flags={values:[...this._contexts.flags.values]}),t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,t._conversationId=this._conversationId,pe(t,we(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&ct(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}setConversationId(t){return this._conversationId=t||void 0,this._notifyScopeListeners(),this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,r){return this.setTags({[t]:r})}setAttributes(t){return this._attributes={...this._attributes,...t},this._notifyScopeListeners(),this}setAttribute(t,r){return this.setAttributes({[t]:r})}removeAttribute(t){return t in this._attributes&&(delete this._attributes[t],this._notifyScopeListeners()),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,r){return this._extra={...this._extra,[t]:r},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,r){return r===null?delete this._contexts[t]:this._contexts[t]=r,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const r=typeof t=="function"?t(this):t,n=r instanceof L?r.getScopeData():et(r)?t:void 0,{tags:o,attributes:s,extra:i,user:a,contexts:d,level:c,fingerprint:l=[],propagationContext:_,conversationId:m}=n||{};return this._tags={...this._tags,...o},this._attributes={...this._attributes,...s},this._extra={...this._extra,...i},this._contexts={...this._contexts,...d},a&&Object.keys(a).length&&(this._user=a),c&&(this._level=c),l.length&&(this._fingerprint=l),_&&(this._propagationContext=_),m&&(this._conversationId=m),this}clear(){return this._breadcrumbs=[],this._tags={},this._attributes={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._session=void 0,this._conversationId=void 0,pe(this,void 0),this._attachments=[],this.setPropagationContext({traceId:ge(),sampleRand:te()}),this._notifyScopeListeners(),this}addBreadcrumb(t,r){const n=typeof r=="number"?r:vt;if(n<=0)return this;const o={timestamp:Ue(),...t,message:t.message?wt(t.message,2048):t.message};return this._breadcrumbs.push(o),this._breadcrumbs.length>n&&(this._breadcrumbs=this._breadcrumbs.slice(-n),this._client?.recordDroppedEvent("buffer_overflow","log_item")),this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,attributes:this._attributes,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:we(this),conversationId:this._conversationId}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata=Fe(this._sdkProcessingMetadata,t,2),this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,r){const n=r?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture exception!"),n;const o=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:o,...r,event_id:n},this),n}captureMessage(t,r,n){const o=n?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture message!"),o;const s=n?.syntheticException??new Error(t);return this._client.captureMessage(t,r,{originalException:t,syntheticException:s,...n,event_id:o},this),o}captureEvent(t,r){const n=t.event_id||r?.event_id||F();return this._client?(this._client.captureEvent(t,{...r,event_id:n},this),n):(T&&S.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(t=>{t(this)}),this._notifyingListeners=!1)}}function bt(){return se("defaultCurrentScope",()=>new L)}function yt(){return se("defaultIsolationScope",()=>new L)}const ve=e=>e instanceof Promise&&!e[Be],Be=Symbol("chained PromiseLike"),St=(e,t,r)=>{const n=e.then(o=>(t(o),o),o=>{throw r(o),o});return ve(n)&&ve(e)?n:kt(e,n)},kt=(e,t)=>{if(!t)return e;let r=!1;for(const n in e){if(n in t)continue;r=!0;const o=e[n];typeof o=="function"?Object.defineProperty(t,n,{value:(...s)=>o.apply(e,s),enumerable:!0,configurable:!0,writable:!0}):t[n]=o}return r&&Object.assign(t,{[Be]:!0}),t};class Rt{constructor(t,r){let n;t?n=t:n=new L;let o;r?o=r:o=new L,this._stack=[{scope:n}],this._isolationScope=o}withScope(t){const r=this._pushScope();let n;try{n=t(r)}catch(o){throw this._popScope(),o}return tt(n)?St(n,()=>this._popScope(),()=>this._popScope()):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return this._stack.length<=1?!1:!!this._stack.pop()}}function x(){const e=Y(),t=oe(e);return t.stack=t.stack||new Rt(bt(),yt())}function Ct(e){return x().withScope(e)}function Mt(e,t){const r=x();return r.withScope(()=>(r.getStackTop().scope=e,t(e)))}function be(e){return x().withScope(()=>e(x().getIsolationScope()))}function It(){return{withIsolationScope:be,withScope:Ct,withSetScope:Mt,withSetIsolationScope:(e,t)=>be(t),getCurrentScope:()=>x().getScope(),getIsolationScope:()=>x().getIsolationScope()}}function ce(e){const t=oe(e);return t.acs?t.acs:It()}function le(){const e=Y();return ce(e).getCurrentScope()}function Lt(){const e=Y();return ce(e).getIsolationScope()}function Pt(...e){const t=Y(),r=ce(t);if(e.length===2){const[n,o]=e;return n?r.withSetScope(n,o):r.withScope(o)}return r.withScope(e[0])}function Ge(){return le().getClient()}function Tt(e){if(e)return Nt(e)?{captureContext:e}:xt(e)?{captureContext:e}:e}function Nt(e){return e instanceof L||typeof e=="function"}const Dt=["user","level","extra","contexts","tags","fingerprint","propagationContext"];function xt(e){return Object.keys(e).some(t=>Dt.includes(t))}function $t(e,t){return le().captureException(e,Tt(t))}function Ot(){return Lt().lastEventId()}const Ut=window.React.version;function jt(e){const t=e.match(/^([^.]+)/);return t!==null&&parseInt(t[0])>=17}function Et(e,t){const r=new WeakSet;function n(o,s){if(!r.has(o)){if(o.cause)return r.add(o),n(o.cause,s);o.cause=s}}n(e,t)}function Ft(e,{componentStack:t},r){if(jt(Ut)&&Ze(e)&&t){const n=new Error(e.message);n.name=`React ErrorBoundary ${e.name}`,n.stack=t,Et(e,n)}return $t(e,r)}const ye=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,G=k,Bt=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)((?:\[[:.%\w]+\]|[\w.-]+))(?::(\d+))?\/(.+)/;function Gt(e){return e==="http"||e==="https"}function Ht(e,t=!1){const{host:r,path:n,pass:o,port:s,projectId:i,protocol:a,publicKey:d}=e;return`${a}://${d}${t&&o?`:${o}`:""}@${r}${s?`:${s}`:""}/${n&&`${n}/`}${i}`}function Vt(e){const t=Bt.exec(e);if(!t){je(()=>{console.error(`Invalid Sentry Dsn: ${e}`)});return}const[r,n,o="",s="",i="",a=""]=t.slice(1);let d="",c=a;const l=c.split("/");if(l.length>1&&(d=l.slice(0,-1).join("/"),c=l.pop()),c){const _=c.match(/^\d+/);_&&(c=_[0])}return He({host:s,pass:o,path:d,projectId:c,port:i,protocol:r,publicKey:n})}function He(e){return{protocol:e.protocol,publicKey:e.publicKey||"",pass:e.pass||"",host:e.host,port:e.port||"",path:e.path||"",projectId:e.projectId}}function qt(e){if(!T)return!0;const{port:t,projectId:r,protocol:n}=e;return["protocol","publicKey","host","projectId"].find(i=>e[i]?!1:(S.error(`Invalid Sentry Dsn: ${i} missing`),!0))?!1:r.match(/^\d+$/)?Gt(n)?t&&isNaN(parseInt(t,10))?(S.error(`Invalid Sentry Dsn: Invalid port ${t}`),!1):!0:(S.error(`Invalid Sentry Dsn: Invalid protocol ${n}`),!1):(S.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),!1)}function Yt(e){const t=typeof e=="string"?Vt(e):He(e);if(!(!t||!qt(t)))return t}function Wt(e){const t=e.protocol?`${e.protocol}:`:"",r=e.port?`:${e.port}`:"";return`${t}//${e.host}${r}${e.path?`/${e.path}`:""}/api/`}function zt(e,t){const r=Yt(e);if(!r)return"";const n=`${Wt(r)}embed/error-page/`;let o=`dsn=${Ht(r)}`;for(const s in t)if(s!=="dsn"&&s!=="onClose")if(s==="user"){const i=t.user;if(!i)continue;i.name&&(o+=`&name=${encodeURIComponent(i.name)}`),i.email&&(o+=`&email=${encodeURIComponent(i.email)}`)}else o+=`&${encodeURIComponent(s)}=${encodeURIComponent(t[s])}`;return`${n}?${o}`}function Se(e={}){const t=G.document,r=t?.head||t?.body;if(!r){ye&&S.error("[showReportDialog] Global document not defined");return}const n=le(),s=Ge()?.getDsn();if(!s){ye&&S.error("[showReportDialog] DSN not configured");return}const i={...e,user:{...n.getUser(),...e.user},eventId:e.eventId||Ot()},a=G.document.createElement("script");a.async=!0,a.crossOrigin="anonymous",a.src=zt(s,i);const{onLoad:d,onClose:c}=i;if(d&&(a.onload=d),c){const l=_=>{if(_.data==="__sentry_reportdialog_closed__")try{c()}finally{G.removeEventListener("message",l)}};G.addEventListener("message",l)}r.appendChild(a)}const K=window.React,Q={componentStack:null,error:null,eventId:null};class nn extends K.Component{constructor(t){super(t),this.state=Q,this._openFallbackReportDialog=!0;const r=Ge();r&&t.showDialog&&(this._openFallbackReportDialog=!1,this._cleanupHook=r.on("afterSendEvent",n=>{!n.type&&this._lastEventId&&n.event_id===this._lastEventId&&Se({...t.dialogOptions,eventId:this._lastEventId})}))}componentDidCatch(t,r){const{componentStack:n}=r,{beforeCapture:o,onError:s,showDialog:i,dialogOptions:a}=this.props;Pt(d=>{o&&o(d,t,n);const c=this.props.handled!=null?this.props.handled:!!this.props.fallback,l=Ft(t,r,{mechanism:{handled:c,type:"auto.function.react.error_boundary"}});s&&s(t,n,l),i&&(this._lastEventId=l,this._openFallbackReportDialog&&Se({...a,eventId:l})),this.setState({error:t,componentStack:n,eventId:l})})}componentDidMount(){const{onMount:t}=this.props;t&&t()}componentWillUnmount(){const{error:t,componentStack:r,eventId:n}=this.state,{onUnmount:o}=this.props;o&&(this.state===Q?o(null,null,null):o(t,r,n)),this._cleanupHook&&(this._cleanupHook(),this._cleanupHook=void 0)}resetErrorBoundary(){const{onReset:t}=this.props,{error:r,componentStack:n,eventId:o}=this.state;t&&t(r,n,o),this.setState(Q)}render(){const{fallback:t,children:r}=this.props,n=this.state;if(n.componentStack===null)return typeof r=="function"?r():r;const o=typeof t=="function"?K.createElement(t,{error:n.error,componentStack:n.componentStack,resetError:()=>this.resetErrorBoundary(),eventId:n.eventId}):t;return K.isValidElement(o)?o:(t&&Qe&&S.warn("fallback did not produce a valid ReactElement"),null)}}var Jt={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};const Xt=window.React.forwardRef,Z=window.React.createElement,w=(e,t,r,n)=>{const o=Xt(({color:s="currentColor",size:i=24,stroke:a=2,title:d,className:c,children:l,..._},m)=>Z("svg",{ref:m,...Jt[e],width:i,height:i,className:["tabler-icon",`tabler-icon-${t}`,c].join(" "),strokeWidth:a,stroke:s,..._},[d&&Z("title",{key:"svg-title"},d),...n.map(([g,y])=>Z(g,y)),...Array.isArray(l)?l:[l]]));return o.displayName=`${r}`,o},Kt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M12 9v4",key:"svg-1"}],["path",{d:"M12 16v.01",key:"svg-2"}]];w("outline","exclamation-circle","ExclamationCircle",Kt);const Qt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 9h.01",key:"svg-1"}],["path",{d:"M11 12h1v4h1",key:"svg-2"}]];w("outline","info-circle","InfoCircle",Qt);window.LinguiCore.i18n;window.MantineCore.Alert;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useState;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;const Zt=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]];w("outline","check","Check",Zt);const At=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]];w("outline","copy","Copy",At);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Button;window.MantineCore.CopyButton;window.MantineCore.Text;window.MantineCore.Tooltip;window.MantineCore.Group;window.React.useState;window.MantineCore.Group;window.MantineCore.Progress;window.MantineCore.Stack;window.MantineCore.Text;window.React.useMemo;window.LinguiCore.i18n;window.MantineCore.Badge;window.MantineCore.Skeleton;window.React.useCallback;window.React.useEffect;window.React.useRef;window.React.useState;const er=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]];w("outline","search","Search",er);window.LinguiCore.i18n;window.MantineCore.CloseButton;window.MantineCore.TextInput;window.React.useEffect;window.React.useState;const tr=[["path",{d:"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M6 4v4",key:"svg-1"}],["path",{d:"M6 12v8",key:"svg-2"}],["path",{d:"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-3"}],["path",{d:"M12 4v10",key:"svg-4"}],["path",{d:"M12 18v2",key:"svg-5"}],["path",{d:"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-6"}],["path",{d:"M18 4v1",key:"svg-7"}],["path",{d:"M18 9v11",key:"svg-8"}]];w("outline","adjustments","Adjustments",tr);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Checkbox;window.MantineCore.Divider;window.MantineCore.Menu;window.MantineCore.Tooltip;const rr=[["path",{d:"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3",key:"svg-1"}]];w("outline","tag","Tag",rr);window.MantineCore.ActionIcon;window.MantineCore.Badge;window.MantineCore.Group;window.MantineCore.Paper;window.MantineCore.Alert;const nr=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]];w("outline","dots","Dots",nr);const or=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M10 10l4 4m0 -4l-4 4",key:"svg-1"}]];w("outline","circle-x","CircleX",or);const sr=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]];w("outline","trash","Trash",sr);const ir=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]];w("outline","edit","Edit",ir);const ar=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]];w("outline","arrow-right","ArrowRight",ar);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;window.React.useMemo;window.React.useState;window.React.useEffect;window.React.useState;var Ve=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},cr=class extends Ve{#t;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e();return window.addEventListener("visibilitychange",t,!1),()=>{window.removeEventListener("visibilitychange",t)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(t=>{typeof t=="boolean"?this.setFocused(t):this.onFocus()})}setFocused(e){this.#t!==e&&(this.#t=e,this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#t=="boolean"?this.#t:globalThis.document?.visibilityState!=="hidden"}};new cr;var lr=class extends Ve{#t=!0;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",t,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",r)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(this.setOnline.bind(this))}setOnline(e){this.#t!==e&&(this.#t=e,this.listeners.forEach(r=>{r(e)}))}isOnline(){return this.#t}};new lr;const ur=window.React;ur.createContext(void 0);const dr=window.React;function _r(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}dr.createContext(_r());const hr=window.React;var fr=hr.createContext(!1);fr.Provider;const mr=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l2 2l4 -4",key:"svg-1"}]];w("outline","circle-check","CircleCheck",mr);window.LinguiCore.i18n;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.React.useEffect;window.React.useEffectEvent;window.React.useCallback;window.React.useEffect;window.React.useState;window.React.useCallback;window.React.useEffect;window.React.useMemo;window.React.useCallback;window.React.useMemo;window.React.useState;var ke;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(ke||(ke={}));var Re;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Re||(Re={}));class gr extends Error{}const qe=["post","put","patch","delete"];new Set(qe);const pr=["get",...qe];new Set(pr);const C=window.React,Ce=C.createContext(null),wr=C.createContext({outlet:null,matches:[],isDataRoute:!1}),vr=C.createContext(null);class on extends C.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?C.createElement(wr.Provider,{value:this.props.routeContext},C.createElement(vr.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}const br="startTransition";C[br];var b=(function(e){return e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error",e})(b||{});const yr=new Promise(()=>{});class sn extends C.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error(" caught the following error during render",t,r)}render(){let{children:t,errorElement:r,resolve:n}=this.props,o=null,s=b.pending;if(!(n instanceof Promise))s=b.success,o=Promise.resolve(),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_data",{get:()=>n});else if(this.state.error){s=b.error;let i=this.state.error;o=Promise.reject().catch(()=>{}),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_error",{get:()=>i})}else n._tracked?(o=n,s="_error"in o?b.error:"_data"in o?b.success:b.pending):(s=b.pending,Object.defineProperty(n,"_tracked",{get:()=>!0}),o=n.then(i=>Object.defineProperty(n,"_data",{get:()=>i}),i=>Object.defineProperty(n,"_error",{get:()=>i})));if(s===b.error&&o._error instanceof gr)throw yr;if(s===b.error&&!r)throw o._error;if(s===b.error)return C.createElement(Ce.Provider,{value:o,children:r});if(s===b.success)return C.createElement(Ce.Provider,{value:o,children:t});throw o}}const Ye=window.React,Sr=window.ReactDOM,kr="6";try{window.__reactRouterVersion=kr}catch{}const Rr="startTransition";Ye[Rr];const Cr="flushSync";Sr[Cr];const Mr="useId";Ye[Mr];var Me;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Me||(Me={}));var Ie;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ie||(Ie={}));function Ir(e,t){let r;try{r=e()}catch{return}return{getItem:o=>{var s;const i=d=>d===null?null:JSON.parse(d,void 0),a=(s=r.getItem(o))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(o,s)=>r.setItem(o,JSON.stringify(s,void 0)),removeItem:o=>r.removeItem(o)}}const ne=e=>t=>{try{const r=e(t);return r instanceof Promise?r:{then(n){return ne(n)(r)},catch(n){return this}}}catch(r){return{then(n){return this},catch(n){return ne(n)(r)}}}},Lr=(e,t)=>(r,n,o)=>{let s={storage:Ir(()=>window.localStorage),partialize:h=>h,version:0,merge:(h,p)=>({...p,...h}),...t},i=!1,a=0;const d=new Set,c=new Set;let l=s.storage;if(!l)return e((...h)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),r(...h)},n,o);const _=()=>{const h=s.partialize({...n()});return l.setItem(s.name,{state:h,version:s.version})},m=o.setState;o.setState=(h,p)=>(m(h,p),_());const g=e((...h)=>(r(...h),_()),n,o);o.getInitialState=()=>g;let y;const I=()=>{var h,p;if(!l)return;const P=++a;i=!1,d.forEach(v=>{var M;return v((M=n())!=null?M:g)});const B=((p=s.onRehydrateStorage)==null?void 0:p.call(s,(h=n())!=null?h:g))||void 0;return ne(l.getItem.bind(l))(s.name).then(v=>{if(v)if(typeof v.version=="number"&&v.version!==s.version){if(s.migrate){const M=s.migrate(v.state,v.version);return M instanceof Promise?M.then(z=>[!0,z]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,v.state];return[!1,void 0]}).then(v=>{var M;if(P!==a)return;const[z,Je]=v;if(y=s.merge(Je,(M=n())!=null?M:g),r(y,!0),z)return _()}).then(()=>{P===a&&(B?.(n(),void 0),y=n(),i=!0,c.forEach(v=>v(y)))}).catch(v=>{P===a&&B?.(void 0,v)})};return o.persist={setOptions:h=>{s={...s,...h},h.storage&&(l=h.storage)},clearStorage:()=>{l?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>I(),hasHydrated:()=>i,onHydrate:h=>(d.add(h),()=>{d.delete(h)}),onFinishHydration:h=>(c.add(h),()=>{c.delete(h)})},s.skipHydration||I(),y||g},We=Lr,Le=e=>{let t;const r=new Set,n=(c,l)=>{const _=typeof c=="function"?c(t):c;if(!Object.is(_,t)){const m=t;t=l??(typeof _!="object"||_===null)?_:Object.assign({},t,_),r.forEach(g=>g(t,m))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>d,subscribe:c=>(r.add(c),()=>r.delete(c))},d=t=e(n,o,a);return a},Pr=(e=>e?Le(e):Le),H=window.React,Tr=e=>e;function Nr(e,t=Tr){const r=H.useSyncExternalStore(e.subscribe,H.useCallback(()=>t(e.getState()),[e,t]),H.useCallback(()=>t(e.getInitialState()),[e,t]));return H.useDebugValue(r),r}const Dr=e=>{const t=Pr(e),r=n=>Nr(t,n);return Object.assign(r,t),r},ze=(e=>Dr);ze()(We((e,t)=>({detailDrawerStack:0,addDetailDrawer:r=>{e({detailDrawerStack:r===!1?0:t().detailDrawerStack+r})},hotkeys:{},addHotkeys:r=>{const n={...t().hotkeys};for(const[o,s]of r)n[o]=s;e({hotkeys:n})},removeHotkeys:r=>{const n={...t().hotkeys};for(const o of r)delete n[o];e({hotkeys:n})}}),{name:"session-settings-inventreedb_lib"}));window.MantineCore.Text;window.MantineCore.darken;window.MantineCore.getThemeColor;window.MantineCore.useMantineTheme;window.React.useMemo;const xr=[["path",{d:"M15 6l-6 6l6 6",key:"svg-0"}]];w("outline","chevron-left","ChevronLeft",xr);window.MantineCore.ActionIcon;window.MantineCore.Divider;window.MantineCore.Drawer;window.MantineCore.Group;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useMemo;const $r=25;ze()(We((e,t)=>({pageSize:$r,setPageSize:r=>{e(n=>({pageSize:r}))},tableSorting:{},getTableSorting:r=>t().tableSorting[r]||{},setTableSorting:r=>n=>{e({tableSorting:{...t().tableSorting,[r]:n}})},tableColumnNames:{},getTableColumnNames:r=>t().tableColumnNames[r]||null,setTableColumnNames:r=>n=>{e({tableColumnNames:{...t().tableColumnNames,[r]:n}})},clearTableColumnNames:()=>{e({tableColumnNames:{}})},hiddenColumns:{},getHiddenColumns:r=>t().hiddenColumns?.[r]??null,setHiddenColumns:r=>n=>{e({hiddenColumns:{...t().hiddenColumns,[r]:n}})}}),{name:"inventree-table-state"}));const Or=window.LinguiReact.I18nProvider,Ur=window.MantineCore.Skeleton,jr=window.React.useEffect,Er=window.React.useState;async function V(e,t){try{return await t(e)}catch{return console.warn(`Failed to load locale ${e}`),null}}async function Fr(e,t,r){let n=null;if(n=await V(t,r),!n&&t.includes("-")){const o=t.split("-")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}if(!n&&t.includes("_")){const o=t.split("_")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}!n&&t!=="en"&&(console.debug(`Locale ${t} not found, trying fallback locale en`),n=await V("en",r)),n?.messages?(e.load(t,n.messages),e.activate(t)):console.error(`Failed to load any locale for ${t}`)}const Br=async e=>null;function Gr({i18n:e,locale:t,loadLocale:r,children:n}){const[o,s]=Er(!1);return jr(()=>{s(!1),Fr(e,t,r??Br).then(()=>{s(!0)})},[e,t,r]),o?he.jsx(Or,{i18n:e,children:n}):he.jsx(Ur,{w:"100%",animate:!0})}window.React.useEffect;function Hr(e){const t=e?.version?.inventree||"";ue!=t&&console.info(`Plugin version mismatch! Expected version ${ue}, got ${t}`)}const Vr=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]];w("outline","plus","Plus",Vr);const qr="modulepreload",Yr=function(e){return"/"+e},Pe={},R=function(t,r,n){let o=Promise.resolve();if(r&&r.length>0){let i=function(c){return Promise.all(c.map(l=>Promise.resolve(l).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),d=a?.nonce||a?.getAttribute("nonce");o=i(r.map(c=>{if(c=Yr(c),c in Pe)return;Pe[c]=!0;const l=c.endsWith(".css"),_=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${_}`))return;const m=document.createElement("link");if(m.rel=l?"stylesheet":qr,l||(m.as="script"),m.crossOrigin="",m.href=c,d&&m.setAttribute("nonce",d),document.head.appendChild(m),l)return new Promise((g,y)=>{m.addEventListener("load",g),m.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return o.then(i=>{for(const a of i||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})},Wr=(e,t,r)=>{const n=e[t];return n?typeof n=="function"?n():Promise.resolve(n):new Promise((o,s)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(s.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==r?". Note that variables only represent file names one level deep.":""))))})},zr=async e=>Wr(Object.assign({"./locales/de/messages.ts":()=>R(()=>import("./assets/messages-SySx3VqF.js"),[]),"./locales/en/messages.ts":()=>R(()=>import("./assets/messages-BVqXLN8V.js"),[]),"./locales/es/messages.ts":()=>R(()=>import("./assets/messages-B19F09LY.js"),[]),"./locales/fr/messages.ts":()=>R(()=>import("./assets/messages-DtuQFlMQ.js"),[]),"./locales/it/messages.ts":()=>R(()=>import("./assets/messages-m7AYrdMP.js"),[]),"./locales/ja/messages.ts":()=>R(()=>import("./assets/messages-BwzuZfs7.js"),[]),"./locales/pseudo-LOCALE/messages.ts":()=>R(()=>import("./assets/messages-6MO-OwBA.js"),[]),"./locales/ru/messages.ts":()=>R(()=>import("./assets/messages-BaNfSHmL.js"),[]),"./locales/zh_Hans/messages.ts":()=>R(()=>import("./assets/messages-uDIARWjl.js"),[]),"./locales/zh_Hant/messages.ts":()=>R(()=>import("./assets/messages-Bs4XYOTm.js"),[])}),`./locales/${e}/messages.ts`,4).catch(()=>null),f=window.LinguiCore.i18n,A=window.MantineCore.Alert,Te=window.MantineCore.Badge,Ne=window.MantineCore.Button,Jr=window.MantineCore.Code,ee=window.MantineCore.Group,Xr=window.MantineCore.Loader,q=window.MantineCore.Stack,Kr=window.MantineCore.Switch,O=window.MantineCore.Table,D=window.MantineCore.Text,Qr=window.MantineCore.Title,De=window.MantineNotifications.notifications,xe=window.React.useCallback,Zr=window.React.useEffect,j=window.React.useMemo,U=window.React.useState,Ar="/plugin/batchcode/preview/",en="/plugin/batchcode/generate/";function tn({settings:e}){const t=j(()=>{const r=[];return e.PER_PART&&r.push(f._({id:"O/ICOy"})),e.PER_LOCATION&&r.push(f._({id:"qt+UdX"})),e.DAILY_RESET&&r.push(f._({id:"iHaxSq"})),[[f._({id:"kI1qVD"}),String(e.CODE_FORMAT??"")],[f._({id:"rNqTKZ"}),e.USE_LOCATION_PREFIX?f._({id:"j1yeuR",values:{0:String(e.LOCATION_FIELD)}}):String(e.PREFIX??"")],[f._({id:"NKnPpU"}),r.length?r.join(", "):f._({id:"SLbeKO"})],[f._({id:"H2Sfhg"}),String(e.TRIGGER_MODE??"")]]},[e]);return React.createElement(O,{withRowBorders:!1,verticalSpacing:"xs"},React.createElement(O.Tbody,null,t.map(([r,n])=>React.createElement(O.Tr,{key:r},React.createElement(O.Td,null,React.createElement(D,{size:"sm",c:"dimmed"},r)),React.createElement(O.Td,null,React.createElement(Jr,null,n))))))}function rn({context:e}){const t=j(()=>e.context?.settings??{},[e.context]),r=j(()=>!!e.context?.can_generate,[e.context]),n=j(()=>e.id??null,[e.id]),o=j(()=>e.instance?.batch||"",[e.instance]),[s,i]=U(""),[a,d]=U(""),[c,l]=U(!1),[_,m]=U(!1),[g,y]=U(!1),I=xe(()=>{n&&(l(!0),d(""),e.api.post(Ar,{item:n}).then(p=>i(p.data?.batch_code??"")).catch(()=>d(f._({id:"hPL4I9"}))).finally(()=>l(!1)))},[e.api,n]);Zr(()=>{I()},[I]);const h=xe(()=>{n&&(m(!0),e.api.post(en,{item:n,overwrite:g}).then(p=>{const P=p.data?.batch_code??"";De.show({title:f._({id:"T0z5Hw"}),message:P,color:"green"}),e.reloadInstance?.(),I()}).catch(p=>{const P=p?.response?.data?.item?.[0]??p?.response?.data?.detail??f._({id:"NEgaRI"});De.show({title:f._({id:"O8n/gF"}),message:String(P),color:"red"})}).finally(()=>m(!1)))},[e.api,e.reloadInstance,n,I,g]);return t.ENABLED?React.createElement(q,{gap:"md"},React.createElement(ee,{justify:"space-between",align:"flex-start"},React.createElement(q,{gap:2},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"nyqfpO"})),o?React.createElement(Te,{size:"lg",variant:"light",color:e.theme.primaryColor},o):React.createElement(D,{size:"sm",fs:"italic"},f._({id:"MTqQMG"}))),React.createElement(q,{gap:2,align:"flex-end"},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"ss5emH"})),c?React.createElement(Xr,{size:"sm"}):React.createElement(Te,{size:"lg",variant:"outline"},s||"—"))),a&&React.createElement(A,{color:"red",title:f._({id:"IF5r8v"})},a),r?React.createElement(ee,{justify:"space-between"},React.createElement(Kr,{checked:g,onChange:p=>y(p.currentTarget.checked),label:f._({id:"4tMAUR"}),disabled:!o}),React.createElement(ee,{gap:"xs"},React.createElement(Ne,{variant:"default",onClick:I,disabled:c},f._({id:"lCF0wC"})),React.createElement(Ne,{onClick:h,loading:_,disabled:!!o&&!g},f._({id:"DKa9ch"})))):React.createElement(A,{color:"blue",title:f._({id:"uNQ6eB"})},React.createElement(D,null,f._({id:"B4m81Y"}))),React.createElement(q,{gap:4},React.createElement(Qr,{order:5},f._({id:"ywFj2D"})),React.createElement(tn,{settings:t}))):React.createElement(A,{color:"yellow",title:f._({id:"DerUtL"})},React.createElement(D,null,f._({id:"hsSgoQ"})))}function an(e){return Hr(e),React.createElement(Gr,{i18n:e.i18n,locale:e.locale,loadLocale:zr},React.createElement(rn,{context:e}))}export{an as RenderBatchCodePluginPanel}; +//# sourceMappingURL=Panel-DT4MHQzh.js.map diff --git a/batchcode_plugin/static/Panel-DT4MHQzh.js.map b/batchcode_plugin/static/Panel-DT4MHQzh.js.map new file mode 100644 index 0000000..0881e7d --- /dev/null +++ b/batchcode_plugin/static/Panel-DT4MHQzh.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["INVENTREE_PLUGIN_VERSION","ApiEndpoints","ApiEndpoints2","jsxRuntime","reactJsxRuntime_production","hasRequiredReactJsxRuntime_production","requireReactJsxRuntime_production","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","hasRequiredJsxRuntime","requireJsxRuntime","jsxRuntimeExports","DEBUG_BUILD","objectToString","isError","wat","isInstanceOf","isBuiltin","className","isPlainObject","isThenable","base","SDK_VERSION","GLOBAL_OBJ","getMainCarrier","getSentryCarrier","carrier","__SENTRY__","getGlobalSingleton","name","creator","obj","RESOLVED_RUNNER","withRandomSafeContext","cb","sym","globalWithSymbol","safeMathRandom","safeDateNow","getCrypto","gbl","emptyUuid","getRandomByte","uuid4","crypto","c","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","timeOrigin","_cachedTimestampInSeconds","timestampInSeconds","updateSession","session","context","duration","PREFIX","originalConsoleMethods","consoleSandbox","callback","console","wrappedFuncs","wrappedLevels","level","originalConsoleMethod","enable","_getLoggerSettings","disable","isEnabled","log","args","_maybeLog","warn","error","debug","merge","initialObj","mergeObj","levels","output","generateTraceId","addNonEnumerableProperty","value","makeWeakRef","WeakRefImpl","derefWeakRef","ref","SCOPE_SPAN_FIELD","_setSpanForScope","scope","span","_getSpanForScope","truncate","str","max","DEFAULT_MAX_BREADCRUMBS","Scope","newScope","client","lastEventId","user","conversationId","tags","newAttributes","extras","extra","fingerprint","captureContext","scopeToMerge","scopeInstance","attributes","contexts","propagationContext","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","attachment","newData","exception","hint","eventId","syntheticException","message","event","getDefaultCurrentScope","getDefaultIsolationScope","isActualPromise","p","kChainedCopy","chainAndCopyPromiseLike","original","onSuccess","onError","chained","err","copyProps","mutated","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","maybePromiseResult","e","getAsyncContextStack","registry","sentry","withScope","withSetScope","stack","withIsolationScope","getStackAsyncContextStrategy","_isolationScope","getAsyncContextStrategy","getCurrentScope","getIsolationScope","rest","acs","getClient","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","version","isAtLeastReact17","reactVersion","reactMajor","setCause","cause","seenErrors","recurse","error2","cause2","captureReactException","componentStack","errorBoundaryError","WINDOW","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","path","pass","port","projectId","publicKey","dsnFromString","match","lastPath","split","projectMatch","dsnFromComponents","components","validateDsn","component","makeDsn","from","getBaseApiEndpoint","getReportDialogEndpoint","dsnLike","dialogOptions","endpoint","encodedOptions","showReportDialog","options","optionalDocument","injectionPoint","mergedOptions","script","onLoad","onClose","reportDialogClosedMessageHandler","React","INITIAL_STATE","ErrorBoundary","props","errorInfo","beforeCapture","showDialog","handled","onMount","onUnmount","onReset","fallback","children","state","element","defaultAttributes","forwardRef","createElement","createReactComponent","iconName","iconNamePascal","iconNode","Component","color","size","stroke","title","tag","attrs","__iconNode","Subscribable","listener","FocusManager","#focused","#cleanup","#setup","onFocus","setup","focused","isFocused","OnlineManager","#online","onOnline","onlineListener","offlineListener","online","createValue","isReset","IsRestoringContext","Action","Action2","ResultType","ResultType2","AbortedDeferredError","validMutationMethodsArr","validRequestMethodsArr","AwaitContext","RouteContext","RouteErrorContext","RenderErrorBoundary","START_TRANSITION","AwaitRenderStatus","AwaitRenderStatus2","neverSettledPromise","AwaitErrorBoundary","errorElement","resolve","promise","status","renderError","data","ReactDOM","REACT_ROUTER_VERSION","FLUSH_SYNC","USE_ID","DataRouterHook","DataRouterHook2","DataRouterStateHook","DataRouterStateHook2","createJSONStorage","getStorage","storage","_a","parse","str2","newValue","toThenable","fn","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","baseOptions","set","get","api","persistedState","currentState","hasHydrated","hydrationVersion","hydrationListeners","finishHydrationListeners","setItem","savedSetState","replace","configResult","stateFromStorage","hydrate","_b","currentVersion","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","createStoreImpl","createState","listeners","setState","partial","nextState","previousState","getState","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","hotkeys","newHotkeys","details","DEFAULT_PAGE_SIZE","tableKey","sorting","names","columns","I18nProvider","Skeleton","useEffect","useState","tryLoadLocale","locale","loader","loadPluginLocale","i18n","messages","fallbackLocale","defaultLocaleLoader","_locale","LocalizedComponent","loadLocale","loaded","setLoaded","checkPluginVersion","systemVersion","__variableDynamicImportRuntimeHelper","__vitePreload","catch","_i18n","Alert","notifications","useCallback","PREVIEW_URL","GENERATE_URL","SettingsSummary","settings","rows","useMemo","scopes","PER_PART","push","_","id","PER_LOCATION","DAILY_RESET","String","CODE_FORMAT","USE_LOCATION_PREFIX","values","0","LOCATION_FIELD","length","join","TRIGGER_MODE","Table","map","label","Text","Code","BatchCodePanel","canGenerate","can_generate","itemId","currentCode","instance","batch","preview","setPreview","setError","loading","setLoading","busy","setBusy","overwrite","setOverwrite","loadPreview","post","item","then","response","batch_code","finally","generate","code","show","reloadInstance","detail","ENABLED","Stack","Group","Badge","theme","primaryColor","Loader","Switch","currentTarget","checked","Button","Title","RenderBatchCodePluginPanel"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],"sources":["../../frontend/node_modules/@inventreedb/ui/dist/types/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ApiEndpoints.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/Roles.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ModelInformation.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Notification.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime2.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/cjs/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ActionButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/is.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/version.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/worldwide.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/carrier.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/randomSafeContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/misc.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/time.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/session.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/debug-logger.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/merge.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/propagationContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/object.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/weakRef.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/spanOnScope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/string.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/scope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/defaultScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/chain-and-copy-promiselike.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/stackStrategy.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/currentScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/prepareEvent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/exports.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/error.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/helpers.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/dsn.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/api.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/report-dialog.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/errorboundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/components/Boundary.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ButtonMenu.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyButton.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyableCell.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ProgressBar.js","../../frontend/node_modules/@inventreedb/ui/dist/components/YesNoButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js","../../frontend/node_modules/@inventreedb/ui/dist/components/SearchInput.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TableColumnSelect.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TagsList.js","../../frontend/node_modules/@inventreedb/ui/dist/components/InvenTreeTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js","../../frontend/node_modules/@inventreedb/ui/dist/components/RowActions.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorDataOutput.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorBackgroundTask.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-window-event/use-window-event.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-local-storage/create-storage.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseFilterSet.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@remix-run/router/dist/router.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router-dom/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/middleware.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/vanilla.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/react.js","../../frontend/node_modules/@inventreedb/ui/dist/states/LocalLibState.js","../../frontend/node_modules/@inventreedb/ui/dist/components/StylishText.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js","../../frontend/node_modules/@inventreedb/ui/dist/components/nav/DetailDrawer.js","../../frontend/node_modules/@inventreedb/ui/dist/states/StoredTableState.js","../../frontend/node_modules/@inventreedb/ui/dist/plugin/LocalizedComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Events.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.js","../../frontend/src/locales.tsx","../../frontend/src/Panel.tsx"],"sourcesContent":["const INVENTREE_PLUGIN_VERSION = \"1.5.0\";\nconst INVENTREE_REACT_VERSION = \"19.2.7\";\nconst INVENTREE_REACT_DOM_VERSION = (\n // @ts-ignore\n \"19.2.7\"\n);\nconst INVENTREE_MANTINE_VERSION = \"9.2.1\";\nexport {\n INVENTREE_MANTINE_VERSION,\n INVENTREE_PLUGIN_VERSION,\n INVENTREE_REACT_DOM_VERSION,\n INVENTREE_REACT_VERSION\n};\n//# sourceMappingURL=Plugins.js.map\n","var ApiEndpoints = /* @__PURE__ */ ((ApiEndpoints2) => {\n ApiEndpoints2[\"api_server_info\"] = \"\";\n ApiEndpoints2[\"user_list\"] = \"user/\";\n ApiEndpoints2[\"user_set_password\"] = \"user/:id/set-password/\";\n ApiEndpoints2[\"user_tokens\"] = \"user/tokens/\";\n ApiEndpoints2[\"user_simple_login\"] = \"email/generate/\";\n ApiEndpoints2[\"user_me_profile\"] = \"user/me/profile/\";\n ApiEndpoints2[\"user_me_roles\"] = \"user/me/roles/\";\n ApiEndpoints2[\"user_me_token\"] = \"user/me/token/\";\n ApiEndpoints2[\"user_me\"] = \"user/me/\";\n ApiEndpoints2[\"auth_base\"] = \"/auth/\";\n ApiEndpoints2[\"user_reset\"] = \"auth/v1/auth/password/request\";\n ApiEndpoints2[\"user_reset_set\"] = \"auth/v1/auth/password/reset\";\n ApiEndpoints2[\"auth_pwd_change\"] = \"auth/v1/account/password/change\";\n ApiEndpoints2[\"auth_login\"] = \"auth/v1/auth/login\";\n ApiEndpoints2[\"auth_login_2fa\"] = \"auth/v1/auth/2fa/authenticate\";\n ApiEndpoints2[\"auth_session\"] = \"auth/v1/auth/session\";\n ApiEndpoints2[\"auth_signup\"] = \"auth/v1/auth/signup\";\n ApiEndpoints2[\"auth_authenticators\"] = \"auth/v1/account/authenticators\";\n ApiEndpoints2[\"auth_recovery\"] = \"auth/v1/account/authenticators/recovery-codes\";\n ApiEndpoints2[\"auth_mfa_reauthenticate\"] = \"auth/v1/auth/2fa/reauthenticate\";\n ApiEndpoints2[\"auth_totp\"] = \"auth/v1/account/authenticators/totp\";\n ApiEndpoints2[\"auth_trust\"] = \"auth/v1/auth/2fa/trust\";\n ApiEndpoints2[\"auth_webauthn\"] = \"auth/v1/account/authenticators/webauthn\";\n ApiEndpoints2[\"auth_webauthn_login\"] = \"auth/v1/auth/webauthn/authenticate\";\n ApiEndpoints2[\"auth_reauthenticate\"] = \"auth/v1/auth/reauthenticate\";\n ApiEndpoints2[\"auth_email\"] = \"auth/v1/account/email\";\n ApiEndpoints2[\"auth_email_verify\"] = \"auth/v1/auth/email/verify\";\n ApiEndpoints2[\"auth_providers\"] = \"auth/v1/account/providers\";\n ApiEndpoints2[\"auth_provider_redirect\"] = \"auth/v1/auth/provider/redirect\";\n ApiEndpoints2[\"auth_config\"] = \"auth/v1/config\";\n ApiEndpoints2[\"currency_list\"] = \"currency/exchange/\";\n ApiEndpoints2[\"currency_refresh\"] = \"currency/refresh/\";\n ApiEndpoints2[\"all_units\"] = \"units/all/\";\n ApiEndpoints2[\"task_overview\"] = \"background-task/\";\n ApiEndpoints2[\"task_pending_list\"] = \"background-task/pending/\";\n ApiEndpoints2[\"task_scheduled_list\"] = \"background-task/scheduled/\";\n ApiEndpoints2[\"task_failed_list\"] = \"background-task/failed/\";\n ApiEndpoints2[\"api_search\"] = \"search/\";\n ApiEndpoints2[\"settings_global_list\"] = \"settings/global/\";\n ApiEndpoints2[\"settings_user_list\"] = \"settings/user/\";\n ApiEndpoints2[\"news\"] = \"news/\";\n ApiEndpoints2[\"global_status\"] = \"generic/status/\";\n ApiEndpoints2[\"custom_state_list\"] = \"generic/status/custom/\";\n ApiEndpoints2[\"version\"] = \"version/\";\n ApiEndpoints2[\"license\"] = \"license/\";\n ApiEndpoints2[\"group_list\"] = \"user/group/\";\n ApiEndpoints2[\"owner_list\"] = \"user/owner/\";\n ApiEndpoints2[\"ruleset_list\"] = \"user/ruleset/\";\n ApiEndpoints2[\"content_type_list\"] = \"contenttype/\";\n ApiEndpoints2[\"icons\"] = \"icons/\";\n ApiEndpoints2[\"selectionlist_list\"] = \"selection/\";\n ApiEndpoints2[\"selectionentry_list\"] = \"selection/:id/entry/\";\n ApiEndpoints2[\"barcode\"] = \"barcode/\";\n ApiEndpoints2[\"barcode_history\"] = \"barcode/history/\";\n ApiEndpoints2[\"barcode_link\"] = \"barcode/link/\";\n ApiEndpoints2[\"barcode_unlink\"] = \"barcode/unlink/\";\n ApiEndpoints2[\"barcode_generate\"] = \"barcode/generate/\";\n ApiEndpoints2[\"data_output\"] = \"data-output/\";\n ApiEndpoints2[\"import_session_list\"] = \"importer/session/\";\n ApiEndpoints2[\"import_session_accept_fields\"] = \"importer/session/:id/accept_fields/\";\n ApiEndpoints2[\"import_session_accept_rows\"] = \"importer/session/:id/accept_rows/\";\n ApiEndpoints2[\"import_session_column_mapping_list\"] = \"importer/column-mapping/\";\n ApiEndpoints2[\"import_session_row_list\"] = \"importer/row/\";\n ApiEndpoints2[\"notifications_list\"] = \"notifications/\";\n ApiEndpoints2[\"notifications_readall\"] = \"notifications/readall/\";\n ApiEndpoints2[\"build_order_list\"] = \"build/\";\n ApiEndpoints2[\"build_order_issue\"] = \"build/:id/issue/\";\n ApiEndpoints2[\"build_order_cancel\"] = \"build/:id/cancel/\";\n ApiEndpoints2[\"build_order_hold\"] = \"build/:id/hold/\";\n ApiEndpoints2[\"build_order_complete\"] = \"build/:id/finish/\";\n ApiEndpoints2[\"build_output_complete\"] = \"build/:id/complete/\";\n ApiEndpoints2[\"build_output_create\"] = \"build/:id/create-output/\";\n ApiEndpoints2[\"build_output_scrap\"] = \"build/:id/scrap-outputs/\";\n ApiEndpoints2[\"build_output_delete\"] = \"build/:id/delete-outputs/\";\n ApiEndpoints2[\"build_order_auto_allocate\"] = \"build/:id/auto-allocate/\";\n ApiEndpoints2[\"build_order_allocate\"] = \"build/:id/allocate/\";\n ApiEndpoints2[\"build_order_consume\"] = \"build/:id/consume/\";\n ApiEndpoints2[\"build_order_deallocate\"] = \"build/:id/unallocate/\";\n ApiEndpoints2[\"build_line_list\"] = \"build/line/\";\n ApiEndpoints2[\"build_item_list\"] = \"build/item/\";\n ApiEndpoints2[\"bom_list\"] = \"bom/\";\n ApiEndpoints2[\"bom_item_validate\"] = \"bom/:id/validate/\";\n ApiEndpoints2[\"bom_validate\"] = \"part/:id/bom-validate/\";\n ApiEndpoints2[\"bom_substitute_list\"] = \"bom/substitute/\";\n ApiEndpoints2[\"part_list\"] = \"part/\";\n ApiEndpoints2[\"part_thumbs_list\"] = \"part/thumbs/\";\n ApiEndpoints2[\"part_pricing\"] = \"part/:id/pricing/\";\n ApiEndpoints2[\"part_requirements\"] = \"part/:id/requirements/\";\n ApiEndpoints2[\"part_serial_numbers\"] = \"part/:id/serial-numbers/\";\n ApiEndpoints2[\"part_scheduling\"] = \"part/:id/scheduling/\";\n ApiEndpoints2[\"part_pricing_internal\"] = \"part/internal-price/\";\n ApiEndpoints2[\"part_pricing_sale\"] = \"part/sale-price/\";\n ApiEndpoints2[\"part_stocktake_list\"] = \"part/stocktake/\";\n ApiEndpoints2[\"part_stocktake_generate\"] = \"part/stocktake/generate/\";\n ApiEndpoints2[\"category_list\"] = \"part/category/\";\n ApiEndpoints2[\"category_tree\"] = \"part/category/tree/\";\n ApiEndpoints2[\"category_parameter_list\"] = \"part/category/parameters/\";\n ApiEndpoints2[\"related_part_list\"] = \"part/related/\";\n ApiEndpoints2[\"part_test_template_list\"] = \"part/test-template/\";\n ApiEndpoints2[\"company_list\"] = \"company/\";\n ApiEndpoints2[\"contact_list\"] = \"company/contact/\";\n ApiEndpoints2[\"address_list\"] = \"company/address/\";\n ApiEndpoints2[\"supplier_part_list\"] = \"company/part/\";\n ApiEndpoints2[\"supplier_part_pricing_list\"] = \"company/price-break/\";\n ApiEndpoints2[\"manufacturer_part_list\"] = \"company/part/manufacturer/\";\n ApiEndpoints2[\"stock_location_list\"] = \"stock/location/\";\n ApiEndpoints2[\"stock_location_type_list\"] = \"stock/location-type/\";\n ApiEndpoints2[\"stock_location_tree\"] = \"stock/location/tree/\";\n ApiEndpoints2[\"stock_item_list\"] = \"stock/\";\n ApiEndpoints2[\"stock_tracking_list\"] = \"stock/track/\";\n ApiEndpoints2[\"stock_test_result_list\"] = \"stock/test/\";\n ApiEndpoints2[\"stock_transfer\"] = \"stock/transfer/\";\n ApiEndpoints2[\"stock_remove\"] = \"stock/remove/\";\n ApiEndpoints2[\"stock_return\"] = \"stock/return/\";\n ApiEndpoints2[\"stock_add\"] = \"stock/add/\";\n ApiEndpoints2[\"stock_count\"] = \"stock/count/\";\n ApiEndpoints2[\"stock_change_status\"] = \"stock/change_status/\";\n ApiEndpoints2[\"stock_merge\"] = \"stock/merge/\";\n ApiEndpoints2[\"stock_assign\"] = \"stock/assign/\";\n ApiEndpoints2[\"stock_status\"] = \"stock/status/\";\n ApiEndpoints2[\"stock_convert\"] = \"stock/:id/convert/\";\n ApiEndpoints2[\"stock_disassemble\"] = \"stock/:id/disassemble/\";\n ApiEndpoints2[\"stock_install\"] = \"stock/:id/install/\";\n ApiEndpoints2[\"stock_uninstall\"] = \"stock/:id/uninstall/\";\n ApiEndpoints2[\"stock_serialize\"] = \"stock/:id/serialize/\";\n ApiEndpoints2[\"stock_serial_info\"] = \"stock/:id/serial-numbers/\";\n ApiEndpoints2[\"generate_batch_code\"] = \"generate/batch-code/\";\n ApiEndpoints2[\"generate_serial_number\"] = \"generate/serial-number/\";\n ApiEndpoints2[\"purchase_order_list\"] = \"order/po/\";\n ApiEndpoints2[\"purchase_order_issue\"] = \"order/po/:id/issue/\";\n ApiEndpoints2[\"purchase_order_hold\"] = \"order/po/:id/hold/\";\n ApiEndpoints2[\"purchase_order_cancel\"] = \"order/po/:id/cancel/\";\n ApiEndpoints2[\"purchase_order_complete\"] = \"order/po/:id/complete/\";\n ApiEndpoints2[\"purchase_order_line_list\"] = \"order/po-line/\";\n ApiEndpoints2[\"purchase_order_extra_line_list\"] = \"order/po-extra-line/\";\n ApiEndpoints2[\"purchase_order_receive\"] = \"order/po/:id/receive/\";\n ApiEndpoints2[\"sales_order_list\"] = \"order/so/\";\n ApiEndpoints2[\"sales_order_issue\"] = \"order/so/:id/issue/\";\n ApiEndpoints2[\"sales_order_hold\"] = \"order/so/:id/hold/\";\n ApiEndpoints2[\"sales_order_cancel\"] = \"order/so/:id/cancel/\";\n ApiEndpoints2[\"sales_order_ship\"] = \"order/so/:id/ship/\";\n ApiEndpoints2[\"sales_order_complete\"] = \"order/so/:id/complete/\";\n ApiEndpoints2[\"sales_order_allocate\"] = \"order/so/:id/allocate/\";\n ApiEndpoints2[\"sales_order_allocate_serials\"] = \"order/so/:id/allocate-serials/\";\n ApiEndpoints2[\"sales_order_auto_allocate\"] = \"order/so/:id/auto-allocate/\";\n ApiEndpoints2[\"sales_order_line_list\"] = \"order/so-line/\";\n ApiEndpoints2[\"sales_order_extra_line_list\"] = \"order/so-extra-line/\";\n ApiEndpoints2[\"sales_order_allocation_list\"] = \"order/so-allocation/\";\n ApiEndpoints2[\"sales_order_shipment_list\"] = \"order/so/shipment/\";\n ApiEndpoints2[\"sales_order_shipment_complete\"] = \"order/so/shipment/:id/ship/\";\n ApiEndpoints2[\"return_order_list\"] = \"order/ro/\";\n ApiEndpoints2[\"return_order_issue\"] = \"order/ro/:id/issue/\";\n ApiEndpoints2[\"return_order_hold\"] = \"order/ro/:id/hold/\";\n ApiEndpoints2[\"return_order_cancel\"] = \"order/ro/:id/cancel/\";\n ApiEndpoints2[\"return_order_complete\"] = \"order/ro/:id/complete/\";\n ApiEndpoints2[\"return_order_receive\"] = \"order/ro/:id/receive/\";\n ApiEndpoints2[\"return_order_line_list\"] = \"order/ro-line/\";\n ApiEndpoints2[\"return_order_extra_line_list\"] = \"order/ro-extra-line/\";\n ApiEndpoints2[\"transfer_order_list\"] = \"order/transfer-order/\";\n ApiEndpoints2[\"transfer_order_issue\"] = \"order/transfer-order/:id/issue/\";\n ApiEndpoints2[\"transfer_order_hold\"] = \"order/transfer-order/:id/hold/\";\n ApiEndpoints2[\"transfer_order_cancel\"] = \"order/transfer-order/:id/cancel/\";\n ApiEndpoints2[\"transfer_order_complete\"] = \"order/transfer-order/:id/complete/\";\n ApiEndpoints2[\"transfer_order_allocate\"] = \"order/transfer-order/:id/allocate/\";\n ApiEndpoints2[\"transfer_order_allocate_serials\"] = \"order/transfer-order/:id/allocate-serials/\";\n ApiEndpoints2[\"transfer_order_line_list\"] = \"order/transfer-order-line/\";\n ApiEndpoints2[\"transfer_order_allocation_list\"] = \"order/transfer-order-allocation/\";\n ApiEndpoints2[\"label_list\"] = \"label/template/\";\n ApiEndpoints2[\"label_print\"] = \"label/print/\";\n ApiEndpoints2[\"report_list\"] = \"report/template/\";\n ApiEndpoints2[\"report_print\"] = \"report/print/\";\n ApiEndpoints2[\"report_snippet\"] = \"report/snippet/\";\n ApiEndpoints2[\"report_asset\"] = \"report/asset/\";\n ApiEndpoints2[\"plugin_list\"] = \"plugins/\";\n ApiEndpoints2[\"plugin_setting_list\"] = \"plugins/:plugin/settings/\";\n ApiEndpoints2[\"plugin_user_setting_list\"] = \"plugins/:plugin/user-settings/\";\n ApiEndpoints2[\"plugin_registry_status\"] = \"plugins/status/\";\n ApiEndpoints2[\"plugin_install\"] = \"plugins/install/\";\n ApiEndpoints2[\"plugin_reload\"] = \"plugins/reload/\";\n ApiEndpoints2[\"plugin_activate\"] = \"plugins/:key/activate/\";\n ApiEndpoints2[\"plugin_uninstall\"] = \"plugins/:key/uninstall/\";\n ApiEndpoints2[\"plugin_admin\"] = \"plugins/:key/admin/\";\n ApiEndpoints2[\"plugin_ui_features_list\"] = \"plugins/ui/features/:feature_type/\";\n ApiEndpoints2[\"plugin_locate_item\"] = \"locate/\";\n ApiEndpoints2[\"plugin_supplier_list\"] = \"supplier/list/\";\n ApiEndpoints2[\"plugin_supplier_search\"] = \"supplier/search/\";\n ApiEndpoints2[\"plugin_supplier_import\"] = \"supplier/import/\";\n ApiEndpoints2[\"machine_types_list\"] = \"machine/types/\";\n ApiEndpoints2[\"machine_driver_list\"] = \"machine/drivers/\";\n ApiEndpoints2[\"machine_registry_status\"] = \"machine/status/\";\n ApiEndpoints2[\"machine_list\"] = \"machine/\";\n ApiEndpoints2[\"machine_restart\"] = \"machine/:machine/restart/\";\n ApiEndpoints2[\"machine_setting_list\"] = \"machine/:machine/settings/\";\n ApiEndpoints2[\"machine_setting_detail\"] = \"machine/:machine/settings/:config_type/\";\n ApiEndpoints2[\"attachment_list\"] = \"attachment/\";\n ApiEndpoints2[\"error_report_list\"] = \"error-report/\";\n ApiEndpoints2[\"project_code_list\"] = \"project-code/\";\n ApiEndpoints2[\"custom_unit_list\"] = \"units/\";\n ApiEndpoints2[\"notes_image_upload\"] = \"notes-image-upload/\";\n ApiEndpoints2[\"email_list\"] = \"admin/email/\";\n ApiEndpoints2[\"email_test\"] = \"admin/email/test/\";\n ApiEndpoints2[\"config_list\"] = \"admin/config/\";\n ApiEndpoints2[\"parameter_list\"] = \"parameter/\";\n ApiEndpoints2[\"parameter_template_list\"] = \"parameter/template/\";\n ApiEndpoints2[\"tag_list\"] = \"tag/\";\n ApiEndpoints2[\"system_internal_trace_end\"] = \"system-internal/observability/end\";\n return ApiEndpoints2;\n})(ApiEndpoints || {});\nexport {\n ApiEndpoints\n};\n//# sourceMappingURL=ApiEndpoints.js.map\n","window[\"LinguiCore\"].i18n;\nvar UserRoles = /* @__PURE__ */ ((UserRoles2) => {\n UserRoles2[\"admin\"] = \"admin\";\n UserRoles2[\"bom\"] = \"bom\";\n UserRoles2[\"build\"] = \"build\";\n UserRoles2[\"part\"] = \"part\";\n UserRoles2[\"part_category\"] = \"part_category\";\n UserRoles2[\"purchase_order\"] = \"purchase_order\";\n UserRoles2[\"return_order\"] = \"return_order\";\n UserRoles2[\"transfer_order\"] = \"transfer_order\";\n UserRoles2[\"sales_order\"] = \"sales_order\";\n UserRoles2[\"stock\"] = \"stock\";\n UserRoles2[\"stock_location\"] = \"stock_location\";\n return UserRoles2;\n})(UserRoles || {});\nvar UserPermissions = /* @__PURE__ */ ((UserPermissions2) => {\n UserPermissions2[\"view\"] = \"view\";\n UserPermissions2[\"add\"] = \"add\";\n UserPermissions2[\"change\"] = \"change\";\n UserPermissions2[\"delete\"] = \"delete\";\n return UserPermissions2;\n})(UserPermissions || {});\nexport {\n UserPermissions,\n UserRoles\n};\n//# sourceMappingURL=Roles.js.map\n","import { ApiEndpoints } from \"./ApiEndpoints.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ModelInformationDict = {\n part: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"vgP+9p\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"pmRbKZ\"\n }\n ),\n url_overview: \"/part/category/index/parts\",\n url_detail: \"/part/:pk/\",\n api_endpoint: ApiEndpoints.part_list,\n admin_url: \"/part/part/\",\n supports_barcode: true,\n icon: \"part\"\n },\n parameter: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"T/87By\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F18WP3\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_list,\n icon: \"list_details\"\n },\n parametertemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"+nwoLk\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"ciZG57\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_template_list,\n admin_url: \"/common/parametertemplate/\",\n icon: \"list\"\n },\n parttesttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"75lDy5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"KevMsQ\"\n }\n ),\n url_detail: \"/parttesttemplate/:pk/\",\n api_endpoint: ApiEndpoints.part_test_template_list,\n icon: \"test\"\n },\n supplierpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"nne72x\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"FcNRrt\"\n }\n ),\n url_overview: \"/purchasing/index/supplier-parts\",\n url_detail: \"/purchasing/supplier-part/:pk/\",\n api_endpoint: ApiEndpoints.supplier_part_list,\n admin_url: \"/company/supplierpart/\",\n supports_barcode: true,\n icon: \"supplier_part\",\n default_query_params: {\n part_detail: true,\n supplier_detail: true,\n manufacturer_detail: true\n }\n },\n manufacturerpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"bisS0I\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"d0fBfb\"\n }\n ),\n url_overview: \"/purchasing/index/manufacturer-parts\",\n url_detail: \"/purchasing/manufacturer-part/:pk/\",\n api_endpoint: ApiEndpoints.manufacturer_part_list,\n admin_url: \"/company/manufacturerpart/\",\n supports_barcode: true,\n icon: \"manufacturers\",\n default_query_params: {\n part_detail: true,\n manufacturer_detail: true\n }\n },\n partcategory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"QXANxH\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2GkbLI\"\n }\n ),\n url_overview: \"/part/category/parts/subcategories\",\n url_detail: \"/part/category/:pk/\",\n api_endpoint: ApiEndpoints.category_list,\n admin_url: \"/part/partcategory/\",\n icon: \"category\"\n },\n stockitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"igx8Og\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Jbck4N\"\n }\n ),\n url_overview: \"/stock/location/index/stock-items\",\n url_detail: \"/stock/item/:pk/\",\n api_endpoint: ApiEndpoints.stock_item_list,\n admin_url: \"/stock/stockitem/\",\n supports_barcode: true,\n icon: \"stock\",\n default_query_params: {\n part_detail: true\n }\n },\n stocklocation: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"adXdas\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1eBWAw\"\n }\n ),\n url_overview: \"/stock/location\",\n url_detail: \"/stock/location/:pk/\",\n api_endpoint: ApiEndpoints.stock_location_list,\n admin_url: \"/stock/stocklocation/\",\n supports_barcode: true,\n icon: \"location\"\n },\n stocklocationtype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"DjwC2f\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"vkPSyZ\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_location_type_list,\n icon: \"location\"\n },\n stockhistory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"cE4TWF\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"rewkgt\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_tracking_list,\n icon: \"history\"\n },\n build: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"YxwWvi\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"RCVhIP\"\n }\n ),\n url_overview: \"/manufacturing/index/buildorders/\",\n url_detail: \"/manufacturing/build-order/:pk/\",\n api_endpoint: ApiEndpoints.build_order_list,\n admin_url: \"/build/build/\",\n supports_barcode: true,\n icon: \"build_order\",\n default_query_params: {\n part_detail: true\n }\n },\n buildline: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"9TLpo1\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CRYIQ0\"\n }\n ),\n url_overview: \"/build/line\",\n url_detail: \"/build/line/:pk/\",\n api_endpoint: ApiEndpoints.build_line_list,\n icon: \"build_order\"\n },\n builditem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LN2ON5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"A7FuwR\"\n }\n ),\n api_endpoint: ApiEndpoints.build_item_list,\n icon: \"build_order\"\n },\n company: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7i8j3G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"s2QZS6\"\n }\n ),\n url_detail: \"/company/:pk/\",\n api_endpoint: ApiEndpoints.company_list,\n admin_url: \"/company/company/\",\n icon: \"building\"\n },\n projectcode: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Sdfr6G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"AklCpf\"\n }\n ),\n url_detail: \"/project-code/:pk/\",\n api_endpoint: ApiEndpoints.project_code_list,\n icon: \"list_details\"\n },\n purchaseorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"KxySMG\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"85Yvr2\"\n }\n ),\n url_overview: \"/purchasing/index/purchaseorders\",\n url_detail: \"/purchasing/purchase-order/:pk/\",\n api_endpoint: ApiEndpoints.purchase_order_list,\n admin_url: \"/order/purchaseorder/\",\n supports_barcode: true,\n icon: \"purchase_orders\",\n default_query_params: {\n supplier_detail: true\n }\n },\n purchaseorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Enr0Pf\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"MXjnQS\"\n }\n ),\n api_endpoint: ApiEndpoints.purchase_order_line_list,\n icon: \"purchase_orders\"\n },\n salesorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LozYBo\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"B1TL+X\"\n }\n ),\n url_overview: \"/sales/index/salesorders\",\n url_detail: \"/sales/sales-order/:pk/\",\n api_endpoint: ApiEndpoints.sales_order_list,\n admin_url: \"/order/salesorder/\",\n supports_barcode: true,\n icon: \"sales_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n salesordershipment: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"qGSobR\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"D/EkfS\"\n }\n ),\n url_overview: \"/sales/index/shipments\",\n url_detail: \"/sales/shipment/:pk/\",\n admin_url: \"/order/salesordershipment/\",\n api_endpoint: ApiEndpoints.sales_order_shipment_list,\n supports_barcode: true,\n icon: \"shipment\",\n default_query_params: {\n order_detail: true\n }\n },\n returnorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Z6ve1w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"LlTg8M\"\n }\n ),\n url_overview: \"/sales/index/returnorders\",\n url_detail: \"/sales/return-order/:pk/\",\n api_endpoint: ApiEndpoints.return_order_list,\n admin_url: \"/order/returnorder/\",\n supports_barcode: true,\n icon: \"return_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n returnorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Frsz7D\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"4dCpFa\"\n }\n ),\n api_endpoint: ApiEndpoints.return_order_line_list,\n icon: \"return_orders\"\n },\n transferorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"8P0cA/\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"IxhZtQ\"\n }\n ),\n url_overview: \"/stock/location/index/transfer-orders\",\n url_detail: \"/stock/transfer-order/:pk/\",\n api_endpoint: ApiEndpoints.transfer_order_list,\n admin_url: \"/order/transferorder/\",\n supports_barcode: true,\n icon: \"transfer_orders\"\n },\n transferorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"VKydzB\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"VkSETm\"\n }\n ),\n api_endpoint: ApiEndpoints.transfer_order_line_list,\n icon: \"transfer-orders\"\n },\n address: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Du6bPw\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"bYmAV1\"\n }\n ),\n url_detail: \"/address/:pk/\",\n api_endpoint: ApiEndpoints.address_list,\n icon: \"address\"\n },\n contact: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"jfC/xh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"gVfVfe\"\n }\n ),\n url_detail: \"/contact/:pk/\",\n api_endpoint: ApiEndpoints.contact_list,\n icon: \"group\"\n },\n owner: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LtI9AS\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CYRJEX\"\n }\n ),\n url_detail: \"/owner/:pk/\",\n api_endpoint: ApiEndpoints.owner_list,\n icon: \"group\"\n },\n user: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7PzzBU\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Sxm8rQ\"\n }\n ),\n url_detail: \"/core/user/:pk/\",\n api_endpoint: ApiEndpoints.user_list,\n icon: \"user\"\n },\n group: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"L8fEEm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"zhrjek\"\n }\n ),\n url_detail: \"/core/group/:pk/\",\n api_endpoint: ApiEndpoints.group_list,\n admin_url: \"/auth/group/\",\n icon: \"group\"\n },\n importsession: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"e5WBGh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1dn8uK\"\n }\n ),\n url_overview: \"/settings/admin/import\",\n url_detail: \"/import/:pk/\",\n api_endpoint: ApiEndpoints.import_session_list,\n icon: \"import\"\n },\n labeltemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"aKf3M5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"0qHiFS\"\n }\n ),\n url_overview: \"/settings/admin/labels\",\n url_detail: \"/settings/admin/labels/:pk/\",\n api_endpoint: ApiEndpoints.label_list,\n icon: \"labels\"\n },\n reporttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"F/A+39\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"SX006I\"\n }\n ),\n url_overview: \"/settings/admin/reports\",\n url_detail: \"/settings/admin/reports/:pk/\",\n api_endpoint: ApiEndpoints.report_list,\n icon: \"reports\"\n },\n pluginconfig: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"BFm1Jm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"7ybWp/\"\n }\n ),\n url_overview: \"/settings/admin/plugin\",\n url_detail: \"/settings/admin/plugin/:pk/\",\n api_endpoint: ApiEndpoints.plugin_list,\n icon: \"plugin\"\n },\n contenttype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"f9cDxV\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F7Jcuy\"\n }\n ),\n api_endpoint: ApiEndpoints.content_type_list,\n icon: \"list_details\"\n },\n selectionlist: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"ifEZiy\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2q2/qs\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionlist_list,\n icon: \"list_details\"\n },\n selectionentry: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"0Mx1/T\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"jDVRSq\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionentry_list,\n icon: \"list_details\"\n },\n error: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"SlfejT\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"UirGxE\"\n }\n ),\n api_endpoint: ApiEndpoints.error_report_list,\n url_overview: \"/settings/admin/errors\",\n url_detail: \"/settings/admin/errors/:pk/\",\n icon: \"exclamation\"\n },\n tag: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"UL8A9w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"OYHzN1\"\n }\n ),\n api_endpoint: ApiEndpoints.tag_list,\n icon: \"tag\"\n }\n};\nexport {\n ModelInformationDict\n};\n//# sourceMappingURL=ModelInformation.js.map\n","import { getHotkeyMatcher } from \"./parse-hotkey.js\";\nconst useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable = false) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) return !tagsToIgnore.includes(event.target.tagName);\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n return true;\n}\nfunction useHotkeys(hotkeys, tagsToIgnore = [\n \"INPUT\",\n \"TEXTAREA\",\n \"SELECT\"\n], triggerOnContentEditable = false) {\n const handleKeydown = useEffectEvent((event) => {\n hotkeys.forEach(([hotkey, handler, options = {\n preventDefault: true,\n usePhysicalKeys: false\n }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) && shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)) {\n if (options.preventDefault) event.preventDefault();\n handler(event);\n }\n });\n });\n useEffect(() => {\n document.documentElement.addEventListener(\"keydown\", handleKeydown);\n return () => document.documentElement.removeEventListener(\"keydown\", handleKeydown);\n }, []);\n}\nexport {\n useHotkeys\n};\n//# sourceMappingURL=use-hotkeys.js.map\n","const _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nfunction notYetImplemented() {\n notifications.hide(\"not-implemented\");\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"ipE2p4\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"WvSApV\"\n }\n ),\n color: \"red\",\n id: \"not-implemented\"\n });\n}\nfunction permissionDenied() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"JUwB5j\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"3WjGlZ\"\n }\n ),\n color: \"red\"\n });\n}\nfunction invalidResponse(returnCode) {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"J7PX+R\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"78bD8l\",\n values: {\n returnCode\n }\n }\n ),\n color: \"red\"\n });\n}\nfunction showTimeoutNotification() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"xY9s5E\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"g/KPkG\"\n }\n ),\n color: \"red\"\n });\n}\nexport {\n invalidResponse,\n notYetImplemented,\n permissionDenied,\n showTimeoutNotification\n};\n//# sourceMappingURL=Notification.js.map\n","var jsxRuntime = { exports: {} };\nexport {\n jsxRuntime as __module\n};\n//# sourceMappingURL=jsx-runtime2.js.map\n","var reactJsxRuntime_production = {};\nexport {\n reactJsxRuntime_production as __exports\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __exports as reactJsxRuntime_production } from \"../../../_virtual/react-jsx-runtime.production.js\";\nvar hasRequiredReactJsxRuntime_production;\nfunction requireReactJsxRuntime_production() {\n if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production;\n hasRequiredReactJsxRuntime_production = 1;\n var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.transitional.element\"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.fragment\");\n function jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n }\n reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE;\n reactJsxRuntime_production.jsx = jsxProd;\n reactJsxRuntime_production.jsxs = jsxProd;\n return reactJsxRuntime_production;\n}\nexport {\n requireReactJsxRuntime_production as __require\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __module as jsxRuntime } from \"../../_virtual/jsx-runtime2.js\";\nimport { __require as requireReactJsxRuntime_production } from \"./cjs/react-jsx-runtime.production.js\";\nvar hasRequiredJsxRuntime;\nfunction requireJsxRuntime() {\n if (hasRequiredJsxRuntime) return jsxRuntime.exports;\n hasRequiredJsxRuntime = 1;\n {\n jsxRuntime.exports = requireReactJsxRuntime_production();\n }\n return jsxRuntime.exports;\n}\nexport {\n requireJsxRuntime as __require\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { __require as requireJsxRuntime } from \"../node_modules/react/jsx-runtime.js\";\nvar jsxRuntimeExports = requireJsxRuntime();\nexport {\n jsxRuntimeExports as j\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { identifierString } from \"../functions/Conversion.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Group = window[\"MantineCore\"].Group;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ActionButton(props) {\n const hidden = props.hidden ?? false;\n return !hidden && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { disabled: !props.tooltip && !props.text, label: props.tooltip ?? props.text, position: props.tooltipAlignment ?? \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { disabled: props.disabled, p: 17, radius: props.radius ?? \"xs\", color: props.color, size: props.size, \"aria-label\": `action-button-${identifierString(props.tooltip ?? props.text ?? \"\")}`, onClick: (event) => {\n props.onClick(event);\n }, variant: props.variant ?? \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Group, { gap: \"xs\", wrap: \"nowrap\", children: props.icon }) }, `action-icon-${props.tooltip ?? props.text}`) }, `tooltip-${props.tooltip ?? props.text}`);\n}\nexport {\n ActionButton\n};\n//# sourceMappingURL=ActionButton.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","const objectToString = Object.prototype.toString;\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case \"[object Error]\":\n case \"[object Exception]\":\n case \"[object DOMException]\":\n case \"[object WebAssembly.Exception]\":\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\nfunction isPlainObject(wat) {\n return isBuiltin(wat, \"Object\");\n}\nfunction isThenable(wat) {\n return Boolean(wat?.then && typeof wat.then === \"function\");\n}\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch {\n return false;\n }\n}\nexport {\n isError,\n isInstanceOf,\n isPlainObject,\n isThenable\n};\n//# sourceMappingURL=is.js.map\n","const SDK_VERSION = \"10.70.0\";\nexport {\n SDK_VERSION\n};\n//# sourceMappingURL=version.js.map\n","const GLOBAL_OBJ = globalThis;\nexport {\n GLOBAL_OBJ\n};\n//# sourceMappingURL=worldwide.js.map\n","import { SDK_VERSION } from \"./utils/version.js\";\nimport { GLOBAL_OBJ } from \"./utils/worldwide.js\";\nfunction getMainCarrier() {\n getSentryCarrier(GLOBAL_OBJ);\n return GLOBAL_OBJ;\n}\nfunction getSentryCarrier(carrier) {\n const __SENTRY__ = carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n return __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n}\nfunction getGlobalSingleton(name, creator, obj = GLOBAL_OBJ) {\n const __SENTRY__ = obj.__SENTRY__ = obj.__SENTRY__ || {};\n const carrier = __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n return carrier[name] || (carrier[name] = creator());\n}\nexport {\n getGlobalSingleton,\n getMainCarrier,\n getSentryCarrier\n};\n//# sourceMappingURL=carrier.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nlet RESOLVED_RUNNER;\nfunction withRandomSafeContext(cb) {\n if (RESOLVED_RUNNER !== void 0) {\n return RESOLVED_RUNNER ? RESOLVED_RUNNER(cb) : cb();\n }\n const sym = /* @__PURE__ */ Symbol.for(\"__SENTRY_SAFE_RANDOM_ID_WRAPPER__\");\n const globalWithSymbol = GLOBAL_OBJ;\n if (sym in globalWithSymbol && typeof globalWithSymbol[sym] === \"function\") {\n RESOLVED_RUNNER = globalWithSymbol[sym];\n return RESOLVED_RUNNER(cb);\n }\n RESOLVED_RUNNER = null;\n return cb();\n}\nfunction safeMathRandom() {\n return withRandomSafeContext(() => Math.random());\n}\nfunction safeDateNow() {\n return withRandomSafeContext(() => Date.now());\n}\nexport {\n safeDateNow,\n safeMathRandom,\n withRandomSafeContext\n};\n//# sourceMappingURL=randomSafeContext.js.map\n","import { withRandomSafeContext, safeMathRandom } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction getCrypto() {\n const gbl = GLOBAL_OBJ;\n return gbl.crypto || gbl.msCrypto;\n}\nlet emptyUuid;\nfunction getRandomByte() {\n return safeMathRandom() * 16;\n}\nfunction uuid4(crypto = getCrypto()) {\n try {\n if (crypto?.randomUUID) {\n return withRandomSafeContext(() => crypto.randomUUID()).replace(/-/g, \"\");\n }\n } catch {\n }\n if (!emptyUuid) {\n emptyUuid = \"10000000100040008000\" + 1e11;\n }\n return emptyUuid.replace(\n /[018]/g,\n (c) => (\n // eslint-disable-next-line no-bitwise\n (c ^ (getRandomByte() & 15) >> c / 4).toString(16)\n )\n );\n}\nexport {\n uuid4\n};\n//# sourceMappingURL=misc.js.map\n","import { safeDateNow, withRandomSafeContext } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst ONE_SECOND_IN_MS = 1e3;\nfunction dateTimestampInSeconds() {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\nfunction createUnixTimestampInSecondsFunc() {\n const { performance } = GLOBAL_OBJ;\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n const timeOrigin = performance.timeOrigin;\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\nlet _cachedTimestampInSeconds;\nfunction timestampInSeconds() {\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\nexport {\n dateTimestampInSeconds,\n timestampInSeconds\n};\n//# sourceMappingURL=time.js.map\n","import { uuid4 } from \"./utils/misc.js\";\nimport { timestampInSeconds } from \"./utils/time.js\";\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n session.timestamp = context.timestamp || timestampInSeconds();\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== void 0) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === \"number\") {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = void 0;\n } else if (typeof context.duration === \"number\") {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === \"number\") {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\nexport {\n updateSession\n};\n//# sourceMappingURL=session.js.map\n","import { getGlobalSingleton } from \"../carrier.js\";\nimport { DEBUG_BUILD } from \"../debug-build.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst PREFIX = \"Sentry Logger \";\nconst originalConsoleMethods = {};\nfunction consoleSandbox(callback) {\n if (!(\"console\" in GLOBAL_OBJ)) {\n return callback();\n }\n const console = GLOBAL_OBJ.console;\n const wrappedFuncs = {};\n const wrappedLevels = Object.keys(originalConsoleMethods);\n wrappedLevels.forEach((level) => {\n const originalConsoleMethod = originalConsoleMethods[level];\n wrappedFuncs[level] = console[level];\n console[level] = originalConsoleMethod;\n });\n try {\n return callback();\n } finally {\n wrappedLevels.forEach((level) => {\n console[level] = wrappedFuncs[level];\n });\n }\n}\nfunction enable() {\n _getLoggerSettings().enabled = true;\n}\nfunction disable() {\n _getLoggerSettings().enabled = false;\n}\nfunction isEnabled() {\n return _getLoggerSettings().enabled;\n}\nfunction log(...args) {\n _maybeLog(\"log\", ...args);\n}\nfunction warn(...args) {\n _maybeLog(\"warn\", ...args);\n}\nfunction error(...args) {\n _maybeLog(\"error\", ...args);\n}\nfunction _maybeLog(level, ...args) {\n if (!DEBUG_BUILD) {\n return;\n }\n if (isEnabled()) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[level](`${PREFIX}[${level}]:`, ...args);\n });\n }\n}\nfunction _getLoggerSettings() {\n if (!DEBUG_BUILD) {\n return { enabled: false };\n }\n return getGlobalSingleton(\"loggerSettings\", () => ({ enabled: false }));\n}\nconst debug = {\n /** Enable logging. */\n enable,\n /** Disable logging. */\n disable,\n /** Check if logging is enabled. */\n isEnabled,\n /** Log a message. */\n log,\n /** Log a warning. */\n warn,\n /** Log an error. */\n error\n};\nexport {\n consoleSandbox,\n debug,\n originalConsoleMethods\n};\n//# sourceMappingURL=debug-logger.js.map\n","function merge(initialObj, mergeObj, levels = 2) {\n if (!mergeObj || typeof mergeObj !== \"object\" || levels <= 0) {\n return mergeObj;\n }\n if (initialObj && Object.keys(mergeObj).length === 0) {\n return initialObj;\n }\n const output = { ...initialObj };\n for (const key in mergeObj) {\n if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n output[key] = merge(output[key], mergeObj[key], levels - 1);\n }\n }\n return output;\n}\nexport {\n merge\n};\n//# sourceMappingURL=merge.js.map\n","import { uuid4 } from \"./misc.js\";\nfunction generateTraceId() {\n return uuid4();\n}\nexport {\n generateTraceId\n};\n//# sourceMappingURL=propagationContext.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { debug } from \"./debug-logger.js\";\nfunction addNonEnumerableProperty(obj, name, value) {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value,\n writable: true,\n configurable: true\n });\n } catch {\n DEBUG_BUILD && debug.log(`Failed to add non-enumerable property \"${String(name)}\" to object`, obj);\n }\n}\nexport {\n addNonEnumerableProperty\n};\n//# sourceMappingURL=object.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction makeWeakRef(value) {\n try {\n const WeakRefImpl = GLOBAL_OBJ.WeakRef;\n if (typeof WeakRefImpl === \"function\") {\n return new WeakRefImpl(value);\n }\n } catch {\n }\n return value;\n}\nfunction derefWeakRef(ref) {\n if (!ref) {\n return void 0;\n }\n if (typeof ref === \"object\" && \"deref\" in ref && typeof ref.deref === \"function\") {\n try {\n return ref.deref();\n } catch {\n return void 0;\n }\n }\n return ref;\n}\nexport {\n derefWeakRef,\n makeWeakRef\n};\n//# sourceMappingURL=weakRef.js.map\n","import { addNonEnumerableProperty } from \"./object.js\";\nimport { makeWeakRef, derefWeakRef } from \"./weakRef.js\";\nconst SCOPE_SPAN_FIELD = \"_sentrySpan\";\nfunction _setSpanForScope(scope, span) {\n if (span) {\n addNonEnumerableProperty(scope, SCOPE_SPAN_FIELD, makeWeakRef(span));\n } else {\n delete scope[SCOPE_SPAN_FIELD];\n }\n}\nfunction _getSpanForScope(scope) {\n return derefWeakRef(scope[SCOPE_SPAN_FIELD]);\n}\nexport {\n _getSpanForScope,\n _setSpanForScope\n};\n//# sourceMappingURL=spanOnScope.js.map\n","function truncate(str, max = 0) {\n if (typeof str !== \"string\" || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nexport {\n truncate\n};\n//# sourceMappingURL=string.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { updateSession } from \"./session.js\";\nimport { debug } from \"./utils/debug-logger.js\";\nimport { isPlainObject } from \"./utils/is.js\";\nimport { merge } from \"./utils/merge.js\";\nimport { uuid4 } from \"./utils/misc.js\";\nimport { generateTraceId } from \"./utils/propagationContext.js\";\nimport { safeMathRandom } from \"./utils/randomSafeContext.js\";\nimport { _setSpanForScope, _getSpanForScope } from \"./utils/spanOnScope.js\";\nimport { truncate } from \"./utils/string.js\";\nimport { dateTimestampInSeconds } from \"./utils/time.js\";\nconst DEFAULT_MAX_BREADCRUMBS = 100;\nclass Scope {\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = {\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n };\n }\n /**\n * Clone all data from this scope into a new scope.\n */\n clone() {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._attributes = { ...this._attributes };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n if (this._contexts.flags) {\n newScope._contexts.flags = {\n values: [...this._contexts.flags.values]\n };\n }\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n newScope._lastEventId = this._lastEventId;\n newScope._conversationId = this._conversationId;\n _setSpanForScope(newScope, _getSpanForScope(this));\n return newScope;\n }\n /**\n * Update the client assigned to this scope.\n * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n * as well as manually created scopes.\n */\n setClient(client) {\n this._client = client;\n }\n /**\n * Set the ID of the last captured error event.\n * This is generally only captured on the isolation scope.\n */\n setLastEventId(lastEventId) {\n this._lastEventId = lastEventId;\n }\n /**\n * Get the client assigned to this scope.\n */\n getClient() {\n return this._client;\n }\n /**\n * Get the ID of the last captured error event.\n * This is generally only available on the isolation scope.\n */\n lastEventId() {\n return this._lastEventId;\n }\n /**\n * @inheritDoc\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n /**\n * Add an event processor that will be called before an event is sent.\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n /**\n * Set the user for this scope.\n * Set to `null` to unset the user.\n */\n setUser(user) {\n this._user = user || {\n email: void 0,\n id: void 0,\n ip_address: void 0,\n username: void 0\n };\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the user from this scope.\n */\n getUser() {\n return this._user;\n }\n /**\n * Set the conversation ID for this scope.\n * Set to `null` to unset the conversation ID.\n */\n setConversationId(conversationId) {\n this._conversationId = conversationId || void 0;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set an object that will be merged into existing tags on the scope,\n * and will be sent as tags data with the event.\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single tag that will be sent as tags data with the event.\n */\n setTag(key, value) {\n return this.setTags({ [key]: value });\n }\n /**\n * Sets attributes onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param newAttributes - The attributes to set on the scope, as key-value pairs.\n *\n * @example\n * ```typescript\n * scope.setAttributes({\n * is_admin: true,\n * payment_selection: 'credit_card',\n * render_duration: 150,\n * });\n * ```\n */\n setAttributes(newAttributes) {\n this._attributes = {\n ...this._attributes,\n ...newAttributes\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets an attribute onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param key - The attribute key.\n * @param value - The attribute value.\n *\n * @example\n * ```typescript\n * scope.setAttribute('is_admin', true);\n * scope.setAttribute('render_duration', 150);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAttribute(key, value) {\n return this.setAttributes({ [key]: value });\n }\n /**\n * Removes the attribute with the given key from the scope.\n *\n * @param key - The attribute key.\n *\n * @example\n * ```typescript\n * scope.removeAttribute('is_admin');\n * ```\n */\n removeAttribute(key) {\n if (key in this._attributes) {\n delete this._attributes[key];\n this._notifyScopeListeners();\n }\n return this;\n }\n /**\n * Set an object that will be merged into existing extra on the scope,\n * and will be sent as extra data with the event.\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single key:value extra entry that will be sent as extra data with the event.\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the fingerprint on the scope to send with the events.\n * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the level on the scope for future events.\n */\n setLevel(level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the transaction name on the scope so that the name of e.g. taken server route or\n * the page location is attached to future events.\n *\n * IMPORTANT: Calling this function does NOT change the name of the currently active\n * root span. If you want to change the name of the active root span, use\n * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n *\n * By default, the SDK updates the scope's transaction name automatically on sensible\n * occasions, such as a page navigation or when handling a new request on the server.\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets context data with the given name.\n * Data passed as context will be normalized. You can also pass `null` to unset the context.\n * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n */\n setContext(key, context) {\n if (context === null) {\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set the session for the scope.\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the session from the scope.\n */\n getSession() {\n return this._session;\n }\n /**\n * Updates the scope with provided data. Can work in three variations:\n * - plain object containing updatable attributes\n * - Scope instance that'll extract the attributes from\n * - callback function that'll receive the current scope as an argument and allow for modifications\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n const scopeToMerge = typeof captureContext === \"function\" ? captureContext(this) : captureContext;\n const scopeInstance = scopeToMerge instanceof Scope ? scopeToMerge.getScopeData() : isPlainObject(scopeToMerge) ? captureContext : void 0;\n const {\n tags,\n attributes,\n extra,\n user,\n contexts,\n level,\n fingerprint = [],\n propagationContext,\n conversationId\n } = scopeInstance || {};\n this._tags = { ...this._tags, ...tags };\n this._attributes = { ...this._attributes, ...attributes };\n this._extra = { ...this._extra, ...extra };\n this._contexts = { ...this._contexts, ...contexts };\n if (user && Object.keys(user).length) {\n this._user = user;\n }\n if (level) {\n this._level = level;\n }\n if (fingerprint.length) {\n this._fingerprint = fingerprint;\n }\n if (propagationContext) {\n this._propagationContext = propagationContext;\n }\n if (conversationId) {\n this._conversationId = conversationId;\n }\n return this;\n }\n /**\n * Clears the current scope and resets its properties.\n * Note: The client will not be cleared.\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = void 0;\n this._transactionName = void 0;\n this._fingerprint = void 0;\n this._session = void 0;\n this._conversationId = void 0;\n _setSpanForScope(this, void 0);\n this._attachments = [];\n this.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n });\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Adds a breadcrumb to the scope.\n * By default, the last 100 breadcrumbs are kept.\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === \"number\" ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n if (maxCrumbs <= 0) {\n return this;\n }\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n // Breadcrumb messages can theoretically be infinitely large and they're held in memory so we truncate them not to leak (too much) memory\n message: breadcrumb.message ? truncate(breadcrumb.message, 2048) : breadcrumb.message\n };\n this._breadcrumbs.push(mergedBreadcrumb);\n if (this._breadcrumbs.length > maxCrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n this._client?.recordDroppedEvent(\"buffer_overflow\", \"log_item\");\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the last breadcrumb of the scope.\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n /**\n * Clear all breadcrumbs from the scope.\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Add an attachment to the scope.\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n /**\n * Clear all attachments from the scope.\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n /**\n * Get the data of this scope, which should be applied to an event during processing.\n */\n getScopeData() {\n return {\n breadcrumbs: this._breadcrumbs,\n attachments: this._attachments,\n contexts: this._contexts,\n tags: this._tags,\n attributes: this._attributes,\n extra: this._extra,\n user: this._user,\n level: this._level,\n fingerprint: this._fingerprint || [],\n eventProcessors: this._eventProcessors,\n propagationContext: this._propagationContext,\n sdkProcessingMetadata: this._sdkProcessingMetadata,\n transactionName: this._transactionName,\n span: _getSpanForScope(this),\n conversationId: this._conversationId\n };\n }\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry.\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n return this;\n }\n /**\n * Add propagation context to the scope, used for distributed tracing\n */\n setPropagationContext(context) {\n this._propagationContext = context;\n return this;\n }\n /**\n * Get propagation context from the scope, used for distributed tracing\n */\n getPropagationContext() {\n return this._propagationContext;\n }\n /**\n * Capture an exception for this scope.\n *\n * @returns {string} The id of the captured Sentry event.\n */\n captureException(exception, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture exception!\");\n return eventId;\n }\n const syntheticException = new Error(\"Sentry syntheticException\");\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a message for this scope.\n *\n * @returns {string} The id of the captured message.\n */\n captureMessage(message, level, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture message!\");\n return eventId;\n }\n const syntheticException = hint?.syntheticException ?? new Error(message);\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a Sentry event for this scope.\n *\n * @returns {string} The id of the captured event.\n */\n captureEvent(event, hint) {\n const eventId = event.event_id || hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture event!\");\n return eventId;\n }\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n return eventId;\n }\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach((callback) => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\nexport {\n Scope\n};\n//# sourceMappingURL=scope.js.map\n","import { getGlobalSingleton } from \"./carrier.js\";\nimport { Scope } from \"./scope.js\";\nfunction getDefaultCurrentScope() {\n return getGlobalSingleton(\"defaultCurrentScope\", () => new Scope());\n}\nfunction getDefaultIsolationScope() {\n return getGlobalSingleton(\"defaultIsolationScope\", () => new Scope());\n}\nexport {\n getDefaultCurrentScope,\n getDefaultIsolationScope\n};\n//# sourceMappingURL=defaultScopes.js.map\n","const isActualPromise = (p) => p instanceof Promise && !p[kChainedCopy];\nconst kChainedCopy = /* @__PURE__ */ Symbol(\"chained PromiseLike\");\nconst chainAndCopyPromiseLike = (original, onSuccess, onError) => {\n const chained = original.then(\n (value) => {\n onSuccess(value);\n return value;\n },\n (err) => {\n onError(err);\n throw err;\n }\n );\n return isActualPromise(chained) && isActualPromise(original) ? chained : copyProps(original, chained);\n};\nconst copyProps = (original, chained) => {\n if (!chained) return original;\n let mutated = false;\n for (const key in original) {\n if (key in chained) continue;\n mutated = true;\n const value = original[key];\n if (typeof value === \"function\") {\n Object.defineProperty(chained, key, {\n value: (...args) => value.apply(original, args),\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n chained[key] = value;\n }\n }\n if (mutated) Object.assign(chained, { [kChainedCopy]: true });\n return chained;\n};\nexport {\n chainAndCopyPromiseLike\n};\n//# sourceMappingURL=chain-and-copy-promiselike.js.map\n","import { getDefaultCurrentScope, getDefaultIsolationScope } from \"../defaultScopes.js\";\nimport { Scope } from \"../scope.js\";\nimport { chainAndCopyPromiseLike } from \"../utils/chain-and-copy-promiselike.js\";\nimport { isThenable } from \"../utils/is.js\";\nimport { getMainCarrier, getSentryCarrier } from \"../carrier.js\";\nclass AsyncContextStack {\n constructor(scope, isolationScope) {\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n } else {\n assignedScope = scope;\n }\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n } else {\n assignedIsolationScope = isolationScope;\n }\n this._stack = [{ scope: assignedScope }];\n this._isolationScope = assignedIsolationScope;\n }\n /**\n * Fork a scope for the stack.\n */\n withScope(callback) {\n const scope = this._pushScope();\n let maybePromiseResult;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n this._popScope();\n throw e;\n }\n if (isThenable(maybePromiseResult)) {\n return chainAndCopyPromiseLike(\n maybePromiseResult,\n () => this._popScope(),\n () => this._popScope()\n );\n }\n this._popScope();\n return maybePromiseResult;\n }\n /**\n * Get the client of the stack.\n */\n getClient() {\n return this.getStackTop().client;\n }\n /**\n * Returns the scope of the top stack.\n */\n getScope() {\n return this.getStackTop().scope;\n }\n /**\n * Get the isolation scope for the stack.\n */\n getIsolationScope() {\n return this._isolationScope;\n }\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n /**\n * Push a scope to the stack.\n */\n _pushScope() {\n const scope = this.getScope().clone();\n this._stack.push({\n client: this.getClient(),\n scope\n });\n return scope;\n }\n /**\n * Pop a scope from the stack.\n */\n _popScope() {\n if (this._stack.length <= 1) return false;\n return !!this._stack.pop();\n }\n}\nfunction getAsyncContextStack() {\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n return sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope());\n}\nfunction withScope(callback) {\n return getAsyncContextStack().withScope(callback);\n}\nfunction withSetScope(scope, callback) {\n const stack = getAsyncContextStack();\n return stack.withScope(() => {\n stack.getStackTop().scope = scope;\n return callback(scope);\n });\n}\nfunction withIsolationScope(callback) {\n return getAsyncContextStack().withScope(() => {\n return callback(getAsyncContextStack().getIsolationScope());\n });\n}\nfunction getStackAsyncContextStrategy() {\n return {\n withIsolationScope,\n withScope,\n withSetScope,\n withSetIsolationScope: (_isolationScope, callback) => {\n return withIsolationScope(callback);\n },\n getCurrentScope: () => getAsyncContextStack().getScope(),\n getIsolationScope: () => getAsyncContextStack().getIsolationScope()\n };\n}\nexport {\n AsyncContextStack,\n getStackAsyncContextStrategy\n};\n//# sourceMappingURL=stackStrategy.js.map\n","import { getSentryCarrier } from \"../carrier.js\";\nimport { getStackAsyncContextStrategy } from \"./stackStrategy.js\";\nfunction getAsyncContextStrategy(carrier) {\n const sentry = getSentryCarrier(carrier);\n if (sentry.acs) {\n return sentry.acs;\n }\n return getStackAsyncContextStrategy();\n}\nexport {\n getAsyncContextStrategy\n};\n//# sourceMappingURL=index.js.map\n","import { getAsyncContextStrategy } from \"./asyncContext/index.js\";\nimport { getMainCarrier } from \"./carrier.js\";\nfunction getCurrentScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getCurrentScope();\n}\nfunction getIsolationScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getIsolationScope();\n}\nfunction withScope(...rest) {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (rest.length === 2) {\n const [scope, callback] = rest;\n if (!scope) {\n return acs.withScope(callback);\n }\n return acs.withSetScope(scope, callback);\n }\n return acs.withScope(rest[0]);\n}\nfunction getClient() {\n return getCurrentScope().getClient();\n}\nexport {\n getClient,\n getCurrentScope,\n getIsolationScope,\n withScope\n};\n//# sourceMappingURL=currentScopes.js.map\n","import { Scope } from \"../scope.js\";\nfunction parseEventHintOrCaptureContext(hint) {\n if (!hint) {\n return void 0;\n }\n if (hintIsScopeOrFunction(hint)) {\n return { captureContext: hint };\n }\n if (hintIsScopeContext(hint)) {\n return {\n captureContext: hint\n };\n }\n return hint;\n}\nfunction hintIsScopeOrFunction(hint) {\n return hint instanceof Scope || typeof hint === \"function\";\n}\nconst captureContextKeys = [\n \"user\",\n \"level\",\n \"extra\",\n \"contexts\",\n \"tags\",\n \"fingerprint\",\n \"propagationContext\"\n];\nfunction hintIsScopeContext(hint) {\n return Object.keys(hint).some((key) => captureContextKeys.includes(key));\n}\nexport {\n parseEventHintOrCaptureContext\n};\n//# sourceMappingURL=prepareEvent.js.map\n","import { getIsolationScope, getCurrentScope } from \"./currentScopes.js\";\nimport { parseEventHintOrCaptureContext } from \"./utils/prepareEvent.js\";\nfunction captureException(exception, hint) {\n return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\nfunction lastEventId() {\n return getIsolationScope().lastEventId();\n}\nexport {\n captureException,\n lastEventId\n};\n//# sourceMappingURL=exports.js.map\n","import { isError } from \"../../../core/build/esm/utils/is.js\";\nimport { captureException } from \"../../../core/build/esm/exports.js\";\nconst version = window[\"React\"].version;\nfunction isAtLeastReact17(reactVersion) {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\nfunction setCause(error, cause) {\n const seenErrors = /* @__PURE__ */ new WeakSet();\n function recurse(error2, cause2) {\n if (seenErrors.has(error2)) {\n return;\n }\n if (error2.cause) {\n seenErrors.add(error2);\n return recurse(error2.cause, cause2);\n }\n error2.cause = cause2;\n }\n recurse(error, cause);\n}\nfunction captureReactException(error, { componentStack }, hint) {\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n setCause(error, errorBoundaryError);\n }\n return captureException(error, hint);\n}\nexport {\n captureReactException,\n isAtLeastReact17,\n setCause\n};\n//# sourceMappingURL=error.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"../../../../../core/build/esm/utils/worldwide.js\";\nconst WINDOW = GLOBAL_OBJ;\nexport {\n WINDOW\n};\n//# sourceMappingURL=helpers.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { consoleSandbox, debug } from \"./debug-logger.js\";\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)((?:\\[[:.%\\w]+\\]|[\\w.-]+))(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n return protocol === \"http\" || protocol === \"https\";\n}\nfunction dsnToString(dsn, withPassword = false) {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : \"\"}@${host}${port ? `:${port}` : \"\"}/${path ? `${path}/` : path}${projectId}`;\n}\nfunction dsnFromString(str) {\n const match = DSN_REGEX.exec(str);\n if (!match) {\n consoleSandbox(() => {\n console.error(`Invalid Sentry Dsn: ${str}`);\n });\n return void 0;\n }\n const [protocol, publicKey, pass = \"\", host = \"\", port = \"\", lastPath = \"\"] = match.slice(1);\n let path = \"\";\n let projectId = lastPath;\n const split = projectId.split(\"/\");\n if (split.length > 1) {\n path = split.slice(0, -1).join(\"/\");\n projectId = split.pop();\n }\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n return dsnFromComponents({ host, pass, path, projectId, port, protocol, publicKey });\n}\nfunction dsnFromComponents(components) {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || \"\",\n pass: components.pass || \"\",\n host: components.host,\n port: components.port || \"\",\n path: components.path || \"\",\n projectId: components.projectId\n };\n}\nfunction validateDsn(dsn) {\n if (!DEBUG_BUILD) {\n return true;\n }\n const { port, projectId, protocol } = dsn;\n const requiredComponents = [\"protocol\", \"publicKey\", \"host\", \"projectId\"];\n const hasMissingRequiredComponent = requiredComponents.find((component) => {\n if (!dsn[component]) {\n debug.error(`Invalid Sentry Dsn: ${component} missing`);\n return true;\n }\n return false;\n });\n if (hasMissingRequiredComponent) {\n return false;\n }\n if (!projectId.match(/^\\d+$/)) {\n debug.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n return false;\n }\n if (!isValidProtocol(protocol)) {\n debug.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n return false;\n }\n if (port && isNaN(parseInt(port, 10))) {\n debug.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n return false;\n }\n return true;\n}\nfunction makeDsn(from) {\n const components = typeof from === \"string\" ? dsnFromString(from) : dsnFromComponents(from);\n if (!components || !validateDsn(components)) {\n return void 0;\n }\n return components;\n}\nexport {\n dsnFromString,\n dsnToString,\n makeDsn\n};\n//# sourceMappingURL=dsn.js.map\n","import { makeDsn, dsnToString } from \"./utils/dsn.js\";\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : \"\";\n const port = dsn.port ? `:${dsn.port}` : \"\";\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : \"\"}/api/`;\n}\nfunction getReportDialogEndpoint(dsnLike, dialogOptions) {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return \"\";\n }\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === \"dsn\") {\n continue;\n }\n if (key === \"onClose\") {\n continue;\n }\n if (key === \"user\") {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key])}`;\n }\n }\n return `${endpoint}?${encodedOptions}`;\n}\nexport {\n getReportDialogEndpoint\n};\n//# sourceMappingURL=api.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { WINDOW } from \"./helpers.js\";\nimport { debug } from \"../../../../../core/build/esm/utils/debug-logger.js\";\nimport { getCurrentScope, getClient } from \"../../../../../core/build/esm/currentScopes.js\";\nimport { lastEventId } from \"../../../../../core/build/esm/exports.js\";\nimport { getReportDialogEndpoint } from \"../../../../../core/build/esm/api.js\";\nfunction showReportDialog(options = {}) {\n const optionalDocument = WINDOW.document;\n const injectionPoint = optionalDocument?.head || optionalDocument?.body;\n if (!injectionPoint) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] Global document not defined\");\n return;\n }\n const scope = getCurrentScope();\n const client = getClient();\n const dsn = client?.getDsn();\n if (!dsn) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] DSN not configured\");\n return;\n }\n const mergedOptions = {\n ...options,\n user: {\n ...scope.getUser(),\n ...options.user\n },\n eventId: options.eventId || lastEventId()\n };\n const script = WINDOW.document.createElement(\"script\");\n script.async = true;\n script.crossOrigin = \"anonymous\";\n script.src = getReportDialogEndpoint(dsn, mergedOptions);\n const { onLoad, onClose } = mergedOptions;\n if (onLoad) {\n script.onload = onLoad;\n }\n if (onClose) {\n const reportDialogClosedMessageHandler = (event) => {\n if (event.data === \"__sentry_reportdialog_closed__\") {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n injectionPoint.appendChild(script);\n}\nexport {\n showReportDialog\n};\n//# sourceMappingURL=report-dialog.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { captureReactException } from \"./error.js\";\nimport { getClient, withScope } from \"../../../core/build/esm/currentScopes.js\";\nimport { showReportDialog } from \"../../../browser/build/npm/esm/prod/report-dialog.js\";\nimport { debug } from \"../../../core/build/esm/utils/debug-logger.js\";\nconst React = window[\"React\"];\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null\n};\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on(\"afterSendEvent\", (event) => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope((scope) => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: \"auto.function.react.error_boundary\" }\n });\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n this.setState({ error, componentStack, eventId });\n });\n }\n componentDidMount() {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n componentWillUnmount() {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n onUnmount(null, null, null);\n } else {\n onUnmount(error, componentStack, eventId);\n }\n }\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = void 0;\n }\n }\n resetErrorBoundary() {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n this.setState(INITIAL_STATE);\n }\n render() {\n const { fallback, children } = this.props;\n const state = this.state;\n if (state.componentStack === null) {\n return typeof children === \"function\" ? children() : children;\n }\n const element = typeof fallback === \"function\" ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId\n }) : fallback;\n if (React.isValidElement(element)) {\n return element;\n }\n if (fallback) {\n DEBUG_BUILD && debug.warn(\"fallback did not produce a valid ReactElement\");\n }\n return null;\n }\n}\nexport {\n ErrorBoundary\n};\n//# sourceMappingURL=errorboundary.js.map\n","var defaultAttributes = {\n outline: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n },\n filled: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n stroke: \"none\"\n }\n};\nexport {\n defaultAttributes as default\n};\n//# sourceMappingURL=defaultAttributes.js.map\n","import defaultAttributes from \"./defaultAttributes.js\";\nconst forwardRef = window[\"React\"].forwardRef;\nconst createElement = window[\"React\"].createElement;\nconst createReactComponent = (type, iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = \"currentColor\", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(\" \"),\n ...{\n strokeWidth: stroke,\n stroke: color\n },\n ...rest\n },\n [\n title && createElement(\"title\", { key: \"svg-title\" }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n );\n Component.displayName = `${iconNamePascal}`;\n return Component;\n};\nexport {\n createReactComponent as default\n};\n//# sourceMappingURL=createReactComponent.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M12 16v.01\", \"key\": \"svg-2\" }]];\nconst IconExclamationCircle = createReactComponent(\"outline\", \"exclamation-circle\", \"ExclamationCircle\", __iconNode);\nexport {\n __iconNode,\n IconExclamationCircle as default\n};\n//# sourceMappingURL=IconExclamationCircle.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9h.01\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M11 12h1v4h1\", \"key\": \"svg-2\" }]];\nconst IconInfoCircle = createReactComponent(\"outline\", \"info-circle\", \"InfoCircle\", __iconNode);\nexport {\n __iconNode,\n IconInfoCircle as default\n};\n//# sourceMappingURL=IconInfoCircle.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { ErrorBoundary } from \"../node_modules/@sentry/react/build/esm/errorboundary.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconInfoCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Alert = window[\"MantineCore\"].Alert;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useState = window[\"React\"].useState;\nfunction DefaultFallback({\n title,\n error\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}), title: `INVE-E17: ${_i18n._(\n /*i18n*/\n {\n id: \"qwCNwv\"\n }\n )}: ${title}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"iqWQW8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"pz0nW1\"\n }\n ) })\n ] }) }),\n error && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconInfoCircle, {}), title: _i18n._(\n /*i18n*/\n {\n id: \"7Jw/XW\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: error }) })\n ] });\n}\nfunction Boundary({\n children,\n label,\n fallback\n}) {\n const [errorMessage, setErrorMessage] = useState(null);\n const onError = useCallback((error, componentStack, eventId) => {\n console.error(`ERR: Error rendering component: ${label}`);\n console.error(error);\n setErrorMessage(error instanceof Error ? error.message : String(error));\n }, []);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { fallback: fallback ?? /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultFallback, { title: label, error: errorMessage }), onError, children });\n}\nexport {\n Boundary,\n DefaultFallback\n};\n//# sourceMappingURL=Boundary.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ButtonMenu({\n icon,\n actions,\n tooltip = \"\",\n label = \"\"\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"default\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: tooltip, children: icon }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { children: [\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: label }),\n actions.map((action, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: action }, `${i}-${action}`))\n ] })\n ] });\n}\nexport {\n ButtonMenu\n};\n//# sourceMappingURL=ButtonMenu.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l5 5l10 -10\", \"key\": \"svg-0\" }]];\nconst IconCheck = createReactComponent(\"outline\", \"check\", \"Check\", __iconNode);\nexport {\n __iconNode,\n IconCheck as default\n};\n//# sourceMappingURL=IconCheck.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\", \"key\": \"svg-1\" }]];\nconst IconCopy = createReactComponent(\"outline\", \"copy\", \"Copy\", __iconNode);\nexport {\n __iconNode,\n IconCopy as default\n};\n//# sourceMappingURL=IconCopy.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Button = window[\"MantineCore\"].Button;\nconst MantineCopyButton = window[\"MantineCore\"].CopyButton;\nconst Text = window[\"MantineCore\"].Text;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction CopyButton({\n value,\n label,\n tooltip,\n disabled,\n tooltipPosition,\n content,\n size,\n color = \"gray\",\n variant = \"transparent\"\n}) {\n const ButtonComponent = label ? Button : ActionIcon;\n if (!window.isSecureContext) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(MantineCopyButton, { value, children: ({\n copied,\n copy\n }) => /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: copied ? _i18n._(\n /*i18n*/\n {\n id: \"6V3Ea3\"\n }\n ) : tooltip ?? _i18n._(\n /*i18n*/\n {\n id: \"he3ygx\"\n }\n ), withArrow: true, position: tooltipPosition, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ButtonComponent, { disabled, color: copied ? \"teal\" : color, onClick: (e) => {\n e.stopPropagation();\n e.preventDefault();\n copy();\n }, variant: copied ? \"transparent\" : variant ?? \"transparent\", size: size ?? \"sm\", children: [\n copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {}),\n content,\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { p: size ?? \"sm\", size: size ?? \"sm\", children: label })\n ] }) }) });\n}\nexport {\n CopyButton\n};\n//# sourceMappingURL=CopyButton.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { CopyButton } from \"./CopyButton.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst useState = window[\"React\"].useState;\nfunction CopyableCell({\n children,\n value\n}) {\n const [isHovered, setIsHovered] = useState(false);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: 0, p: 0, wrap: \"nowrap\", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), justify: \"space-between\", align: \"center\", children: [\n children,\n window.isSecureContext && isHovered && value != null && /* @__PURE__ */ jsxRuntimeExports.jsx(\"span\", { style: {\n position: \"relative\"\n }, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntimeExports.jsx(\"div\", { style: {\n position: \"absolute\",\n right: 0,\n transform: \"translateY(-50%)\"\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(CopyButton, { value, variant: \"default\" }) }) })\n ] });\n}\nexport {\n CopyableCell\n};\n//# sourceMappingURL=CopyableCell.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { formatDecimal } from \"../functions/Formatting.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst Progress = window[\"MantineCore\"].Progress;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useMemo = window[\"React\"].useMemo;\nfunction ProgressBar(props) {\n const progress = useMemo(() => {\n const maximum = props.maximum ?? 100;\n const value = Math.max(props.value, 0);\n if (maximum == 0) {\n return 0;\n }\n return value / maximum * 100;\n }, [props]);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: 2, style: {\n flexGrow: 1,\n minWidth: \"100px\"\n }, children: [\n props.progressLabel && /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", justify: \"center\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { ta: \"center\", size: \"xs\", children: [\n formatDecimal(props.value),\n \" / \",\n formatDecimal(props.maximum)\n ] }),\n props.units && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { size: \"xs\", children: [\n \"[\",\n props.units,\n \"]\"\n ] })\n ] }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Progress, { value: progress, color: progress < 100 ? \"orange\" : progress > 100 ? \"blue\" : \"green\", size: props.size ?? \"md\", radius: \"sm\", animated: props.animated })\n ] });\n}\nexport {\n ProgressBar\n};\n//# sourceMappingURL=ProgressBar.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { isTrue } from \"../functions/Conversion.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Badge = window[\"MantineCore\"].Badge;\nwindow[\"MantineCore\"].Skeleton;\nfunction PassFailButton({\n value,\n passText,\n failText,\n passColor,\n failColor\n}) {\n const v = isTrue(value);\n const pass = passText ?? _i18n._(\n /*i18n*/\n {\n id: \"wFwgKk\"\n }\n );\n const fail = failText ?? _i18n._(\n /*i18n*/\n {\n id: \"qcloGZ\"\n }\n );\n const pColor = passColor ?? \"green\";\n const fColor = failColor ?? \"red\";\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { color: v ? pColor : fColor, variant: \"filled\", radius: \"lg\", size: \"sm\", style: {\n maxWidth: \"50px\"\n }, children: v ? pass : fail });\n}\nfunction YesNoButton({\n value\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(PassFailButton, { value, passText: _i18n._(\n /*i18n*/\n {\n id: \"l75CjT\"\n }\n ), failText: _i18n._(\n /*i18n*/\n {\n id: \"1UzENP\"\n }\n ), failColor: \"orange.6\" });\n}\nexport {\n PassFailButton,\n YesNoButton\n};\n//# sourceMappingURL=YesNoButton.js.map\n","const useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useRef = window[\"React\"].useRef;\nconst useState = window[\"React\"].useState;\nfunction useDebouncedValue(value, wait, options = { leading: false }) {\n const [_value, setValue] = useState(value);\n const mountedRef = useRef(false);\n const timeoutRef = useRef(null);\n const cooldownRef = useRef(false);\n const latestValueRef = useRef(value);\n latestValueRef.current = value;\n const cancel = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n cooldownRef.current = false;\n }, []);\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n cancel();\n cooldownRef.current = false;\n setValue(latestValueRef.current);\n }\n }, []);\n useEffect(() => {\n if (mountedRef.current) if (!cooldownRef.current && options.leading) {\n cooldownRef.current = true;\n setValue(value);\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n }, wait);\n } else {\n cancel();\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n setValue(value);\n }, wait);\n }\n }, [\n value,\n options.leading,\n wait\n ]);\n useEffect(() => {\n mountedRef.current = true;\n return cancel;\n }, []);\n return [\n _value,\n cancel,\n {\n cancel,\n flush\n }\n ];\n}\nexport {\n useDebouncedValue\n};\n//# sourceMappingURL=use-debounced-value.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 21l-6 -6\", \"key\": \"svg-1\" }]];\nconst IconSearch = createReactComponent(\"outline\", \"search\", \"Search\", __iconNode);\nexport {\n __iconNode,\n IconSearch as default\n};\n//# sourceMappingURL=IconSearch.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDebouncedValue } from \"../node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js\";\nimport IconSearch from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst CloseButton = window[\"MantineCore\"].CloseButton;\nconst TextInput = window[\"MantineCore\"].TextInput;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction SearchInput({\n disabled,\n debounce,\n placeholder,\n searchCallback\n}) {\n const [value, setValue] = useState(\"\");\n const [searchText] = useDebouncedValue(value, debounce ?? 500);\n useEffect(() => {\n searchCallback(searchText);\n }, [searchText]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(TextInput, { value, disabled, \"aria-label\": \"table-search-input\", leftSection: /* @__PURE__ */ jsxRuntimeExports.jsx(IconSearch, {}), placeholder: placeholder ?? _i18n._(\n /*i18n*/\n {\n id: \"A1taO8\"\n }\n ), onChange: (event) => setValue(event.target.value), rightSection: value.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(CloseButton, { size: \"xs\", onClick: () => {\n setValue(\"\");\n searchCallback(\"\");\n } }) : null });\n}\nexport {\n SearchInput\n};\n//# sourceMappingURL=SearchInput.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M6 4v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M6 12v8\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M12 4v10\", \"key\": \"svg-4\" }], [\"path\", { \"d\": \"M12 18v2\", \"key\": \"svg-5\" }], [\"path\", { \"d\": \"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-6\" }], [\"path\", { \"d\": \"M18 4v1\", \"key\": \"svg-7\" }], [\"path\", { \"d\": \"M18 9v11\", \"key\": \"svg-8\" }]];\nconst IconAdjustments = createReactComponent(\"outline\", \"adjustments\", \"Adjustments\", __iconNode);\nexport {\n __iconNode,\n IconAdjustments as default\n};\n//# sourceMappingURL=IconAdjustments.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconAdjustments from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Checkbox = window[\"MantineCore\"].Checkbox;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction TableColumnSelect({\n columns,\n onToggleColumn\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", closeOnItemClick: false, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"transparent\", \"aria-label\": \"table-select-columns\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ), position: \"top-end\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconAdjustments, {}) }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { style: {\n maxHeight: \"400px\",\n overflowY: \"auto\"\n }, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n columns.filter((col) => (col.switchable ?? true) && !col.propHidden).map((col) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { checked: !col.hidden, label: col.title || col.accessor, onChange: () => onToggleColumn(col.accessor), radius: \"sm\" }) }, col.accessor))\n ] })\n ] });\n}\nexport {\n TableColumnSelect\n};\n//# sourceMappingURL=TableColumnSelect.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3\", \"key\": \"svg-1\" }]];\nconst IconTag = createReactComponent(\"outline\", \"tag\", \"Tag\", __iconNode);\nexport {\n __iconNode,\n IconTag as default\n};\n//# sourceMappingURL=IconTag.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconTag from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Badge = window[\"MantineCore\"].Badge;\nconst Group = window[\"MantineCore\"].Group;\nconst Paper = window[\"MantineCore\"].Paper;\nfunction TagsList({\n tags\n}) {\n if (!tags || tags.length === 0) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Paper, { p: \"xs\", shadow: \"xs\", withBorder: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { size: \"sm\", variant: \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTag, {}) }),\n tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: \"outline\", size: \"sm\", children: tag }, tag))\n ] }) });\n}\nexport {\n TagsList as default\n};\n//# sourceMappingURL=TagsList.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nconst Alert = window[\"MantineCore\"].Alert;\nfunction InvenTreeTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n context\n}) {\n if (!context?.tables?.renderTable) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { title: \"Plugin Version Error\", color: \"red\", children: [\n 'The component cannot be rendered because the plugin context is missing the \"renderTable\" function.',\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n \"This means that the InvenTree UI library version is incompatible with this plugin version.\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"Plugin Version:\" }),\n \" \",\n INVENTREE_PLUGIN_VERSION,\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"UI Version:\" }),\n \" \",\n context?.version?.inventree || \"unknown\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {})\n ] });\n }\n return context?.tables.renderTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n api: context.api,\n navigate: context.navigate\n });\n}\nexport {\n InvenTreeTable as default\n};\n//# sourceMappingURL=InvenTreeTable.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-2\" }]];\nconst IconDots = createReactComponent(\"outline\", \"dots\", \"Dots\", __iconNode);\nexport {\n __iconNode,\n IconDots as default\n};\n//# sourceMappingURL=IconDots.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 10l4 4m0 -4l-4 4\", \"key\": \"svg-1\" }]];\nconst IconCircleX = createReactComponent(\"outline\", \"circle-x\", \"CircleX\", __iconNode);\nexport {\n __iconNode,\n IconCircleX as default\n};\n//# sourceMappingURL=IconCircleX.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 7l16 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 11l0 6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M14 11l0 6\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\", \"key\": \"svg-4\" }]];\nconst IconTrash = createReactComponent(\"outline\", \"trash\", \"Trash\", __iconNode);\nexport {\n __iconNode,\n IconTrash as default\n};\n//# sourceMappingURL=IconTrash.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M16 5l3 3\", \"key\": \"svg-2\" }]];\nconst IconEdit = createReactComponent(\"outline\", \"edit\", \"Edit\", __iconNode);\nexport {\n __iconNode,\n IconEdit as default\n};\n//# sourceMappingURL=IconEdit.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M13 18l6 -6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M13 6l6 6\", \"key\": \"svg-2\" }]];\nconst IconArrowRight = createReactComponent(\"outline\", \"arrow-right\", \"ArrowRight\", __iconNode);\nexport {\n __iconNode,\n IconArrowRight as default\n};\n//# sourceMappingURL=IconArrowRight.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { cancelEvent } from \"../functions/Events.js\";\nimport { eventModified, getDetailUrl, navigateToLink } from \"../functions/Navigation.js\";\nimport IconDots from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconTrash from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nimport IconEdit from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js\";\nimport IconArrowRight from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction RowViewAction(props) {\n return {\n ...props,\n color: void 0,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowRight, {}),\n onClick: (event) => {\n const showPreviewPanel = props.isPreviewEnabled?.() ?? false;\n if (!showPreviewPanel || eventModified(event) || !props.openPreview) {\n const url = getDetailUrl(props.modelType, props.modelId);\n navigateToLink(url, props.navigate, event);\n } else {\n props.openPreview(props.modelType, props.modelId);\n }\n }\n };\n}\nfunction RowDuplicateAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"euc6Ns\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {})\n };\n}\nfunction RowEditAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"ePK91l\"\n }\n ),\n color: \"blue\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconEdit, {})\n };\n}\nfunction RowDeleteAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"cnGeoo\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTrash, {})\n };\n}\nfunction RowCancelAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"dEgA5A\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {})\n };\n}\nfunction RowActions({\n title,\n actions,\n disabled = false,\n index\n}) {\n function openMenu(event) {\n cancelEvent(event);\n setOpened(!opened);\n }\n const [opened, setOpened] = useState(false);\n const visibleActions = useMemo(() => {\n return actions.filter((action) => !action.hidden);\n }, [actions]);\n function RowActionIcon(action) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: action.tooltip ?? action.title, position: \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { color: action.color, leftSection: action.icon, onClick: (event) => {\n cancelEvent(event);\n action.onClick?.(event);\n setOpened(false);\n }, disabled: action.disabled || false, children: action.title }) }, action.title);\n }\n return visibleActions.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { withinPortal: true, disabled, position: \"bottom-end\", opened, onChange: setOpened, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: title || _i18n._(\n /*i18n*/\n {\n id: \"7L01XJ\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { \"aria-label\": `row-action-menu-${index ?? \"\"}`, onClick: openMenu, disabled, variant: \"transparent\", size: \"sm\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconDots, {}) }, `row-action-menu-${index ?? \"\"}`) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Dropdown, { children: visibleActions.map((action) => /* @__PURE__ */ jsxRuntimeExports.jsx(RowActionIcon, { ...action }, action.title)) })\n ] });\n}\nexport {\n RowActions,\n RowCancelAction,\n RowDeleteAction,\n RowDuplicateAction,\n RowEditAction,\n RowViewAction\n};\n//# sourceMappingURL=RowActions.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useDocumentVisibility() {\n const [documentVisibility, setDocumentVisibility] = useState(\"visible\");\n useEffect(() => {\n setDocumentVisibility(document.visibilityState);\n const listener = () => setDocumentVisibility(document.visibilityState);\n document.addEventListener(\"visibilitychange\", listener);\n return () => document.removeEventListener(\"visibilitychange\", listener);\n }, []);\n return documentVisibility;\n}\nexport {\n useDocumentVisibility\n};\n//# sourceMappingURL=use-document-visibility.js.map\n","var Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nexport {\n QueryClientContext,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nexport {\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map\n","const React = window[\"React\"];\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nIsRestoringContext.Provider;\nexport {\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M9 12l2 2l4 -4\", \"key\": \"svg-1\" }]];\nconst IconCircleCheck = createReactComponent(\"outline\", \"circle-check\", \"CircleCheck\", __iconNode);\nexport {\n __iconNode,\n IconCircleCheck as default\n};\n//# sourceMappingURL=IconCircleCheck.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ProgressBar } from \"../components/ProgressBar.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorDataOutput(props) {\n const visibility = useDocumentVisibility();\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (!!props.id) {\n setLoading(true);\n showNotification({\n id: `data-output-${props.id}`,\n title: props.title,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", value: 0, progressLabel: true })\n });\n } else setLoading(false);\n }, [props.id, props.title]);\n useQuery({\n enabled: !!props.id && loading && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"data-output\", props.id, props.title],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.data_output, props.id)).then((response) => {\n const data = response?.data ?? {};\n if (!!data.errors || !!data.error) {\n setLoading(false);\n const error = data?.error ?? data?.errors?.error ?? _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n );\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}),\n autoClose: 2500,\n title: props.title,\n message: error,\n color: \"red\"\n });\n } else if (data.complete) {\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: _i18n._(\n /*i18n*/\n {\n id: \"TCOQbo\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {})\n });\n if (data.output) {\n const url = data.output;\n const base = props.hostname ?? window.location.origin;\n const downloadUrl = new URL(url, base);\n window.open(downloadUrl.toString(), \"_blank\");\n }\n } else {\n notifications.update({\n id: `data-output-${props.id}`,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", maximum: data.total, value: data.progress, progressLabel: data.total > 0, animated: true })\n });\n }\n return data;\n }).catch((error) => {\n console.error(\"Error in useMonitorDataOutput:\", error);\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: error.message || _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n ),\n color: \"red\"\n });\n return {};\n })\n }, props.queryClient);\n}\nexport {\n useMonitorDataOutput as default\n};\n//# sourceMappingURL=MonitorDataOutput.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorBackgroundTask(props) {\n const visibility = useDocumentVisibility();\n const [tracking, setTracking] = useState(false);\n useEffect(() => {\n if (!!props.taskId) {\n setTracking(true);\n showNotification({\n id: `background-task-${props.taskId}`,\n title: props.title,\n message: props.message,\n loading: true,\n autoClose: false,\n withCloseButton: false\n });\n } else {\n setTracking(false);\n }\n }, [props.taskId]);\n useQuery({\n enabled: !!props.taskId && tracking && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"background-task\", props.taskId],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.task_overview, props.taskId)).then((response) => {\n const data = response?.data ?? {};\n if (data.complete) {\n setTracking(false);\n props.onComplete?.();\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: data.success ? \"green\" : \"red\",\n message: response.data?.success ? props.successMessage ?? props.message : props.failureMessage ?? props.message,\n icon: response.data?.success ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {}),\n autoClose: 1e3,\n withCloseButton: true\n });\n if (data.success) {\n props.onSuccess?.();\n } else {\n props.onFailure?.();\n }\n }\n return response;\n }).catch((error) => {\n console.error(`Error fetching background task status for task ${props.taskId}:`, error);\n setTracking(false);\n props.onError?.(error);\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: \"red\",\n message: props.errorMessage ?? props.message,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, { color: \"red\" }),\n autoClose: 5e3,\n withCloseButton: true\n });\n })\n }, props.queryClient);\n}\nexport {\n useMonitorBackgroundTask as default\n};\n//# sourceMappingURL=MonitorBackgroundTask.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction useWindowEvent(type, listener, options) {\n const stableListener = useEffectEvent(listener);\n useEffect(() => {\n window.addEventListener(type, stableListener, options);\n return () => window.removeEventListener(type, stableListener, options);\n }, [type]);\n}\nexport {\n useWindowEvent\n};\n//# sourceMappingURL=use-window-event.js.map\n","import { useWindowEvent } from \"../use-window-event/use-window-event.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction serializeJSON(value, hookName = \"use-local-storage\") {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\nfunction deserializeJSON(value) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\nfunction createStorageHandler(type) {\n const getItem = (key) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to get value from storage, localStorage is blocked\");\n return null;\n }\n };\n const setItem = (key, value) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to set value to storage, localStorage is blocked\");\n }\n };\n const removeItem = (key) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to remove value from storage, localStorage is blocked\");\n }\n };\n return {\n getItem,\n setItem,\n removeItem\n };\n}\nfunction createStorage(type, hookName) {\n const eventName = \"mantine-local-storage\";\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n return function useStorage({ key, defaultValue, getInitialValueInEffect = true, sync = true, deserialize = deserializeJSON, serialize = (value) => serializeJSON(value, hookName) }) {\n const readStorageValue = useCallback((skipStorage) => {\n let storageBlockedOrSkipped;\n try {\n storageBlockedOrSkipped = typeof window === \"undefined\" || !(type in window) || window[type] === null || !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n if (storageBlockedOrSkipped) return defaultValue;\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : defaultValue;\n }, [key, defaultValue]);\n const [value, setValue] = useState(readStorageValue(getInitialValueInEffect));\n const setStorageValue = useCallback((val) => {\n if (val instanceof Function) setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: result\n } }));\n });\n return result;\n });\n else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: val\n } }));\n setValue(val);\n }\n }, [key]);\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue);\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: defaultValue\n } }));\n }, [key, defaultValue]);\n useWindowEvent(\"storage\", (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) setValue(deserialize(event.newValue ?? void 0));\n }\n });\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) setValue(event.detail.value);\n }\n });\n useEffect(() => {\n if (defaultValue !== void 0 && value === void 0) setStorageValue(defaultValue);\n }, [\n defaultValue,\n value,\n setStorageValue\n ]);\n useEffect(() => {\n const val = readStorageValue();\n val !== void 0 && setStorageValue(val);\n }, [key]);\n return [\n value === void 0 ? defaultValue : value,\n setStorageValue,\n removeStorageValue\n ];\n };\n}\nexport {\n createStorage\n};\n//# sourceMappingURL=create-storage.js.map\n","import { useLocalStorage } from \"../node_modules/@mantine/hooks/esm/use-local-storage/use-local-storage.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useMemo = window[\"React\"].useMemo;\nfunction useFilterSet(filterKey, initialFilters) {\n const [storedFilters, setStoredFilters] = useLocalStorage({\n key: `inventree-filterset-${filterKey}`,\n defaultValue: null,\n sync: false,\n getInitialValueInEffect: false\n });\n const [storedNamedSets, setStoredNamedSets] = useLocalStorage({\n key: `inventree-filtersets-${filterKey}`,\n defaultValue: [],\n sync: false,\n getInitialValueInEffect: false\n });\n useEffect(() => {\n if (storedFilters == null) {\n setStoredFilters(initialFilters || []);\n }\n }, [storedFilters, initialFilters, setStoredFilters]);\n const activeFilters = useMemo(() => {\n return storedFilters ?? initialFilters ?? [];\n }, [storedFilters, initialFilters]);\n const clearActiveFilters = useCallback(() => {\n setStoredFilters([]);\n }, []);\n const setActiveFilters = useCallback((filters) => {\n setStoredFilters(filters);\n }, [setStoredFilters]);\n const saveFilterSet = useCallback((name) => {\n const snapshot = activeFilters.map(({\n name: n,\n value,\n displayValue\n }) => ({\n name: n,\n value,\n displayValue\n }));\n setStoredNamedSets((prev) => {\n const without = (prev ?? []).filter((s) => s.name !== name);\n return [...without, {\n name,\n filters: snapshot\n }];\n });\n }, [activeFilters, setStoredNamedSets]);\n const loadFilterSet = useCallback((name) => {\n const saved = (storedNamedSets ?? []).find((s) => s.name === name);\n if (saved) {\n setStoredFilters(saved.filters);\n }\n }, [storedNamedSets, setStoredFilters]);\n const deleteFilterSet = useCallback((name) => {\n setStoredNamedSets((prev) => (prev ?? []).filter((s) => s.name !== name));\n }, [setStoredNamedSets]);\n return {\n filterKey,\n activeFilters,\n setActiveFilters,\n clearActiveFilters,\n savedFilterSets: storedNamedSets ?? [],\n saveFilterSet,\n loadFilterSet,\n deleteFilterSet\n };\n}\nexport {\n useFilterSet as default\n};\n//# sourceMappingURL=UseFilterSet.js.map\n","import { randomId } from \"../node_modules/@mantine/hooks/esm/utils/random-id/random-id.js\";\nimport useFilterSet from \"./UseFilterSet.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction useTable(tableName, tableProps = {\n idAccessor: \"pk\",\n initialFilters: []\n}) {\n function generateTableName() {\n return `${tableName.replaceAll(\"-\", \"\")}-${randomId()}`;\n }\n const [tableKey, setTableKey] = useState(generateTableName());\n const refreshTable = useCallback((clearSelection) => {\n setTableKey(generateTableName());\n if (clearSelection) {\n clearSelectedRecords();\n }\n }, [generateTableName]);\n const filterSet = useFilterSet(`table-${tableName}`, tableProps.initialFilters);\n const [expandedRecords, setExpandedRecords] = useState([]);\n const isRowExpanded = useCallback((pk) => {\n return expandedRecords.includes(pk);\n }, [expandedRecords]);\n const [hiddenColumns, setHiddenColumns] = useState([]);\n const [selectedRecords, setSelectedRecords] = useState([]);\n const selectedIds = useMemo(() => selectedRecords.map((r) => r[tableProps.idAccessor || \"pk\"]), [selectedRecords]);\n const clearSelectedRecords = useCallback(() => {\n setSelectedRecords([]);\n }, []);\n const hasSelectedRecords = useMemo(() => {\n return selectedRecords.length > 0;\n }, [selectedRecords]);\n const [recordCount, setRecordCount] = useState(0);\n const [page, setPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [records, setRecords] = useState([]);\n const updateRecord = useCallback((record) => {\n const _records = [...records];\n const index = _records.findIndex((r) => r[tableProps.idAccessor || \"pk\"] === record.pk);\n if (index >= 0) {\n _records[index] = {\n ..._records[index],\n ...record\n };\n } else {\n _records.push(record);\n }\n setRecords(_records);\n }, [records]);\n const idAccessor = useMemo(() => tableProps.idAccessor || \"pk\", [tableProps.idAccessor]);\n const [isLoading, setIsLoading] = useState(false);\n return {\n tableKey,\n refreshTable,\n isLoading,\n setIsLoading,\n filterSet,\n expandedRecords,\n setExpandedRecords,\n isRowExpanded,\n selectedRecords,\n selectedIds,\n setSelectedRecords,\n clearSelectedRecords,\n hasSelectedRecords,\n searchTerm,\n setSearchTerm,\n recordCount,\n setRecordCount,\n hiddenColumns,\n setHiddenColumns,\n page,\n setPage,\n records,\n setRecords,\n updateRecord,\n idAccessor\n };\n}\nexport {\n useTable as default\n};\n//# sourceMappingURL=UseTable.js.map\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nvar Action;\n(function(Action2) {\n Action2[\"Pop\"] = \"POP\";\n Action2[\"Push\"] = \"PUSH\";\n Action2[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n throw new Error(message);\n } catch (e) {\n }\n }\n}\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nvar ResultType;\n(function(ResultType2) {\n ResultType2[\"data\"] = \"data\";\n ResultType2[\"deferred\"] = \"deferred\";\n ResultType2[\"redirect\"] = \"redirect\";\n ResultType2[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n return matchRoutesImpl(routes, locationArg, basename);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n let decoded = decodePath(pathname);\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], decoded);\n }\n return matches;\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === void 0 ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), 'Absolute route path \"' + meta.relativePath + '\" nested under path ' + ('\"' + parentPath + '\" is not valid. An absolute child route path ') + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n \"Index routes must not have child routes. Please remove \" + ('all child routes from route path \"' + path + '\".')\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n let isOptional = first.endsWith(\"?\");\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n result.push(...restExploded.map((subpath) => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n if (isOptional) {\n result.push(...restExploded);\n }\n return result.map((exploded) => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(a.routesMeta.map((meta) => meta.childrenIndex), b.routesMeta.map((meta) => meta.childrenIndex)));\n}\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s) => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? (\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n ) : (\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0\n );\n}\nfunction matchRouteBranch(branch, pathname, allowPartial) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n let route = meta.route;\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = void 0;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), 'Route path \"' + path + '\" will be treated as if it were ' + ('\"' + path.replace(/\\*$/, \"/*\") + '\" because the `*` character must ') + \"always follow a `/` in the pattern. To get rid of this warning, \" + ('please change the route path to \"' + path.replace(/\\*$/, \"/*\") + '\".'));\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\").replace(/^\\/*/, \"/\").replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\").replace(/\\/:([\\w-]+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n if (path.endsWith(\"*\")) {\n params.push({\n paramName: \"*\"\n });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" : \"(?:\\\\/(.+)|\\\\/*)$\";\n } else if (end) {\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(false, 'The URL path \"' + value + '\" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent ' + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\nconst ABSOLUTE_URL_REGEX$1 = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX$1.test(url);\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname;\n if (toPathname) {\n if (isAbsoluteUrl(toPathname)) {\n pathname = toPathname;\n } else {\n if (toPathname.includes(\"//\")) {\n let oldPathname = toPathname;\n toPathname = removeDoubleSlashes(toPathname);\n warning(false, \"Pathnames cannot have embedded double slashes - normalizing \" + (oldPathname + \" -> \" + toPathname));\n }\n if (toPathname.startsWith(\"/\")) {\n pathname = resolvePathname(toPathname.substring(1), \"/\");\n } else {\n pathname = resolvePathname(toPathname, fromPathname);\n }\n }\n } else {\n pathname = fromPathname;\n }\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + 'a string in and the router will parse it for you.';\n}\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n let pathMatches = getPathContributingMatches(matches);\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n }\n return pathMatches.map((match) => match.pathnameBase);\n}\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\nconst removeDoubleSlashes = (path) => path.replace(/\\/\\/+/g, \"/\");\nconst joinPaths = (paths) => removeDoubleSlashes(paths.join(\"/\"));\nconst normalizePathname = (pathname) => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\nconst normalizeSearch = (search) => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\nconst normalizeHash = (hash) => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\nclass AbortedDeferredError extends Error {\n}\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nnew Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nnew Set(validRequestMethodsArr);\nexport {\n AbortedDeferredError,\n Action,\n decodePath as UNSAFE_decodePath,\n getResolveToMatches as UNSAFE_getResolveToMatches,\n invariant as UNSAFE_invariant,\n warning as UNSAFE_warning,\n createPath,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n normalizePathname,\n parsePath,\n resolvePath,\n resolveTo,\n stripBasename\n};\n//# sourceMappingURL=router.js.map\n","import { UNSAFE_invariant as invariant, UNSAFE_getResolveToMatches as getResolveToMatches, resolveTo, joinPaths, parsePath, matchRoutes, Action, isRouteErrorResponse, AbortedDeferredError } from \"../../@remix-run/router/dist/router.js\";\nimport { createPath, matchPath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nconst DataRouterContext = /* @__PURE__ */ React.createContext(null);\nconst DataRouterStateContext = /* @__PURE__ */ React.createContext(null);\nconst AwaitContext = /* @__PURE__ */ React.createContext(null);\nconst NavigationContext = /* @__PURE__ */ React.createContext(null);\nconst LocationContext = /* @__PURE__ */ React.createContext(null);\nconst RouteContext = /* @__PURE__ */ React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nconst RouteErrorContext = /* @__PURE__ */ React.createContext(null);\nfunction useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\nfunction useInRouterContext() {\n return React.useContext(LocationContext) != null;\n}\nfunction useLocation() {\n !useInRouterContext() ? invariant(false) : void 0;\n return React.useContext(LocationContext).location;\n}\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n React.useLayoutEffect(cb);\n }\n}\nfunction useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext);\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n future,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\nfunction useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n future\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\nfunction useRoutesImpl(routes, locationArg, dataRouterState, future) {\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n routeMatch && routeMatch.route;\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n let renderedMatches = _renderMatches(matches && matches.map((match) => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase\n ])\n })), parentMatches, dataRouterState, future);\n if (locationArg && renderedMatches) {\n return /* @__PURE__ */ React.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /* @__PURE__ */ React.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /* @__PURE__ */ React.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /* @__PURE__ */ React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n return {\n error: props.error !== void 0 ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n render() {\n return this.state.error !== void 0 ? /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /* @__PURE__ */ React.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = React.useContext(DataRouterContext);\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState, future) {\n var _dataRouterState;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (future === void 0) {\n future = null;\n }\n if (matches == null) {\n var _future;\n if (!dataRouterState) {\n return null;\n }\n if (dataRouterState.errors) {\n matches = dataRouterState.matches;\n } else if ((_future = future) != null && _future.v7_partialHydration && parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n let errors = (_dataRouterState = dataRouterState) == null ? void 0 : _dataRouterState.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex((m) => m.route.id && (errors == null ? void 0 : errors[m.route.id]) !== void 0);\n !(errorIndex >= 0) ? invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n if (match.route.id) {\n let {\n loaderData,\n errors: errors2\n } = dataRouterState;\n let needsToRunLoader = match.route.loader && loaderData[match.route.id] === void 0 && (!errors2 || errors2[match.route.id] === void 0);\n if (match.route.lazy || needsToRunLoader) {\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error;\n let shouldRenderHydrateFallback = false;\n let errorElement = null;\n let hydrateFallbackElement = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : void 0;\n errorElement = match.route.errorElement || defaultErrorElement;\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\"route-fallback\");\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n children = /* @__PURE__ */ React.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /* @__PURE__ */ React.createElement(RenderedRoute, {\n match,\n routeContext: {\n outlet,\n matches: matches2,\n isDataRoute: dataRouterState != null\n },\n children\n });\n };\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches: matches2,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /* @__PURE__ */ (function(DataRouterHook2) {\n DataRouterHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook2[\"UseNavigateStable\"] = \"useNavigate\";\n return DataRouterHook2;\n})(DataRouterHook || {});\nvar DataRouterStateHook = /* @__PURE__ */ (function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook2[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook2[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook2[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook2[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook2[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook2[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook2[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook2[\"UseRouteId\"] = \"useRouteId\";\n return DataRouterStateHook2;\n})(DataRouterStateHook || {});\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? invariant(false) : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = React.useContext(DataRouterStateContext);\n !state ? invariant(false) : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = React.useContext(RouteContext);\n !route ? invariant(false) : void 0;\n return route;\n}\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext();\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? invariant(false) : void 0;\n return thisRoute.route.id;\n}\nfunction useRouteError() {\n var _state$errors;\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState();\n let routeId = useCurrentRouteId();\n if (error !== void 0) {\n return error;\n }\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\nconst alreadyWarned$1 = {};\nfunction warningOnce(key, cond, message) {\n if (!alreadyWarned$1[key]) {\n alreadyWarned$1[key] = true;\n }\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nfunction Route(_props) {\n invariant(false);\n}\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\nvar AwaitRenderStatus = /* @__PURE__ */ (function(AwaitRenderStatus2) {\n AwaitRenderStatus2[AwaitRenderStatus2[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"success\"] = 1] = \"success\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"error\"] = 2] = \"error\";\n return AwaitRenderStatus2;\n})(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(() => {\n});\nclass AwaitErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\" caught the following error during render\", error, errorInfo);\n }\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_data\", {\n get: () => resolve\n });\n } else if (this.state.error) {\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {\n });\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_error\", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n promise = resolve;\n status = \"_error\" in promise ? AwaitRenderStatus.error : \"_data\" in promise ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: () => true\n });\n promise = resolve.then((data) => Object.defineProperty(resolve, \"_data\", {\n get: () => data\n }), (error) => Object.defineProperty(resolve, \"_error\", {\n get: () => error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children\n });\n }\n throw promise;\n }\n}\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (!/* @__PURE__ */ React.isValidElement(element)) {\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React.Fragment) {\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\nexport {\n AbortedDeferredError,\n Action as NavigationType,\n Route,\n Routes,\n DataRouterContext as UNSAFE_DataRouterContext,\n DataRouterStateContext as UNSAFE_DataRouterStateContext,\n LocationContext as UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n RouteContext as UNSAFE_RouteContext,\n useRoutesImpl as UNSAFE_useRoutesImpl,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","import { UNSAFE_NavigationContext as NavigationContext, useHref, useNavigate, useLocation, useResolvedPath } from \"../../react-router/dist/index.js\";\nimport { Route, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_RouteContext, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromChildren2, useInRouterContext, useParams, useRouteError, useRoutes } from \"../../react-router/dist/index.js\";\nimport { stripBasename, createPath } from \"../../@remix-run/router/dist/router.js\";\nimport { AbortedDeferredError, Action, isRouteErrorResponse, matchPath, matchRoutes, parsePath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nconst ReactDOM = window[\"ReactDOM\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event);\n}\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\", \"viewTransition\"];\nconst REACT_ROUTER_VERSION = \"6\";\ntry {\n window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nReact[USE_ID];\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst Link = /* @__PURE__ */ React.forwardRef(function LinkWithRef(_ref7, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace: replace2,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition\n } = _ref7, rest = _objectWithoutPropertiesLoose(_ref7, _excluded);\n let {\n basename\n } = React.useContext(NavigationContext);\n let absoluteHref;\n let isExternal = false;\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n absoluteHref = to;\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n }\n }\n }\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace: replace2,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n /* @__PURE__ */ React.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref,\n target\n }))\n );\n});\nvar DataRouterHook;\n(function(DataRouterHook2) {\n DataRouterHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook2[\"UseSubmit\"] = \"useSubmit\";\n DataRouterHook2[\"UseSubmitFetcher\"] = \"useSubmitFetcher\";\n DataRouterHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterHook2[\"useViewTransitionState\"] = \"useViewTransitionState\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterStateHook2[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n viewTransition\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback((event) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace: replace2,\n state,\n preventScrollReset,\n relative,\n viewTransition\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative, viewTransition]);\n}\nexport {\n AbortedDeferredError,\n Link,\n Action as NavigationType,\n Route,\n Routes,\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n UNSAFE_RouteContext,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren2 as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLinkClickHandler,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","function createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, void 0);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, void 0)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\nexport {\n createJSONStorage,\n persist\n};\n//# sourceMappingURL=middleware.js.map\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\nexport {\n createStore\n};\n//# sourceMappingURL=vanilla.js.map\n","import { createStore } from \"./vanilla.js\";\nconst React = window[\"React\"];\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createImpl);\nexport {\n create,\n useStore\n};\n//# sourceMappingURL=react.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst useLocalLibState = create()(persist((set, get) => ({\n detailDrawerStack: 0,\n addDetailDrawer: (value) => {\n set({\n detailDrawerStack: value === false ? 0 : get().detailDrawerStack + value\n });\n },\n hotkeys: {},\n addHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const [ref, details] of hotkeys) {\n newHotkeys[ref] = details;\n }\n set({\n hotkeys: newHotkeys\n });\n },\n removeHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const ref of hotkeys) {\n delete newHotkeys[ref];\n }\n set({\n hotkeys: newHotkeys\n });\n }\n}), {\n name: \"session-settings-inventreedb_lib\"\n}));\nexport {\n useLocalLibState\n};\n//# sourceMappingURL=LocalLibState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst Text = window[\"MantineCore\"].Text;\nconst darken = window[\"MantineCore\"].darken;\nconst getThemeColor = window[\"MantineCore\"].getThemeColor;\nconst useMantineTheme = window[\"MantineCore\"].useMantineTheme;\nconst useMemo = window[\"React\"].useMemo;\nconst useThematicGradient = () => {\n const theme = useMantineTheme();\n const primary = useMemo(() => {\n return getThemeColor(theme.primaryColor, theme);\n }, [theme]);\n const secondary = useMemo(() => darken(primary, 0.25), [primary]);\n return useMemo(() => {\n return {\n primary,\n secondary\n };\n }, [primary, secondary]);\n};\nfunction StylishText({\n children,\n size\n}) {\n const {\n primary,\n secondary\n } = useThematicGradient();\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { fw: 700, size: size ?? \"xl\", variant: \"gradient\", gradient: {\n from: primary.toString(),\n to: secondary.toString()\n }, children });\n}\nexport {\n StylishText\n};\n//# sourceMappingURL=StylishText.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M15 6l-6 6l6 6\", \"key\": \"svg-0\" }]];\nconst IconChevronLeft = createReactComponent(\"outline\", \"chevron-left\", \"ChevronLeft\", __iconNode);\nexport {\n __iconNode,\n IconChevronLeft as default\n};\n//# sourceMappingURL=IconChevronLeft.js.map\n","import { j as jsxRuntimeExports } from \"../../_virtual/jsx-runtime.js\";\nimport { Link } from \"../../node_modules/react-router-dom/dist/index.js\";\nimport { useShallow } from \"../../node_modules/zustand/esm/react/shallow.js\";\nimport { useLocalLibState } from \"../../states/LocalLibState.js\";\nimport { StylishText } from \"../StylishText.js\";\nimport { flex } from \"./DetailDrawer.css.js\";\nimport { Routes, Route, useNavigate, useParams } from \"../../node_modules/react-router/dist/index.js\";\nimport IconChevronLeft from \"../../node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Drawer = window[\"MantineCore\"].Drawer;\nconst Group = window[\"MantineCore\"].Group;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nfunction DetailDrawerComponent({\n title,\n position = \"right\",\n size,\n closeOnEscape = true,\n renderContent\n}) {\n const navigate = useNavigate();\n const {\n id\n } = useParams();\n const content = renderContent(id);\n const opened = useMemo(() => !!id && !!content, [id, content]);\n const [detailDrawerStack, addDetailDrawer] = useLocalLibState(useShallow((state) => [state.detailDrawerStack, state.addDetailDrawer]));\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Drawer, { opened, onClose: () => {\n navigate(\"../\");\n addDetailDrawer(false);\n }, position, closeOnEscape, size, classNames: {\n root: flex,\n body: flex\n }, scrollAreaComponent: Stack, title: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { children: [\n detailDrawerStack > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"outline\", onClick: () => {\n navigate(-1);\n addDetailDrawer(-1);\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconChevronLeft, {}) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(StylishText, { size: \"xl\", children: title })\n ] }), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", className: flex, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n content\n ] }) });\n}\nfunction DetailDrawer(props) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Routes, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: \":id?/\", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DetailDrawerComponent, { ...props }) }) });\n}\nfunction DetailDrawerLink({\n to,\n text\n}) {\n const addDetailDrawer = useLocalLibState(useShallow((state) => state.addDetailDrawer));\n const onNavigate = useCallback(() => {\n addDetailDrawer(1);\n }, [addDetailDrawer]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to, onClick: onNavigate, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { children: text }) });\n}\nexport {\n DetailDrawer,\n DetailDrawerComponent,\n DetailDrawerLink\n};\n//# sourceMappingURL=DetailDrawer.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst DEFAULT_PAGE_SIZE = 25;\nconst useStoredTableState = create()(persist((set, get) => ({\n pageSize: DEFAULT_PAGE_SIZE,\n setPageSize: (size) => {\n set((state) => ({\n pageSize: size\n }));\n },\n tableSorting: {},\n getTableSorting: (tableKey) => {\n return get().tableSorting[tableKey] || {};\n },\n setTableSorting: (tableKey) => (sorting) => {\n set({\n tableSorting: {\n ...get().tableSorting,\n [tableKey]: sorting\n }\n });\n },\n tableColumnNames: {},\n getTableColumnNames: (tableKey) => {\n return get().tableColumnNames[tableKey] || null;\n },\n setTableColumnNames: (tableKey) => (names) => {\n set({\n tableColumnNames: {\n ...get().tableColumnNames,\n [tableKey]: names\n }\n });\n },\n clearTableColumnNames: () => {\n set({\n tableColumnNames: {}\n });\n },\n hiddenColumns: {},\n getHiddenColumns: (tableKey) => {\n return get().hiddenColumns?.[tableKey] ?? null;\n },\n setHiddenColumns: (tableKey) => (columns) => {\n set({\n hiddenColumns: {\n ...get().hiddenColumns,\n [tableKey]: columns\n }\n });\n }\n}), {\n name: \"inventree-table-state\"\n}));\nexport {\n useStoredTableState\n};\n//# sourceMappingURL=StoredTableState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst I18nProvider = window[\"LinguiReact\"].I18nProvider;\nconst Skeleton = window[\"MantineCore\"].Skeleton;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nasync function tryLoadLocale(locale, loader) {\n try {\n return await loader(locale);\n } catch (error) {\n console.warn(`Failed to load locale ${locale}`);\n return null;\n }\n}\nasync function loadPluginLocale(i18n, locale, loader) {\n let messages = null;\n messages = await tryLoadLocale(locale, loader);\n if (!messages && locale.includes(\"-\")) {\n const fallbackLocale = locale.split(\"-\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale.includes(\"_\")) {\n const fallbackLocale = locale.split(\"_\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale !== \"en\") {\n console.debug(`Locale ${locale} not found, trying fallback locale en`);\n messages = await tryLoadLocale(\"en\", loader);\n }\n if (messages?.messages) {\n i18n.load(locale, messages.messages);\n i18n.activate(locale);\n } else {\n console.error(`Failed to load any locale for ${locale}`);\n }\n}\nconst defaultLocaleLoader = async (_locale) => null;\nfunction LocalizedComponent({\n i18n,\n locale,\n loadLocale,\n children\n}) {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n setLoaded(false);\n loadPluginLocale(i18n, locale, loadLocale ?? defaultLocaleLoader).then(() => {\n setLoaded(true);\n });\n }, [i18n, locale, loadLocale]);\n return loaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(I18nProvider, { i18n, children }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { w: \"100%\", animate: true });\n}\nexport {\n LocalizedComponent as default\n};\n//# sourceMappingURL=LocalizedComponent.js.map\n","import { useHotkeys } from \"../node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js\";\nimport \"../enums/Roles.js\";\nimport \"../enums/ModelInformation.js\";\nimport \"./Notification.js\";\nimport \"../components/ActionButton.js\";\nimport \"../_virtual/jsx-runtime.js\";\nimport \"../components/Boundary.js\";\nimport \"../components/ButtonMenu.js\";\nimport \"../components/CopyButton.js\";\nimport \"../components/CopyableCell.js\";\nimport \"../components/ProgressBar.js\";\nimport \"../components/YesNoButton.js\";\nimport \"../components/SearchInput.js\";\nimport \"../components/TableColumnSelect.js\";\nimport \"../components/TagsList.js\";\nimport \"../components/InvenTreeTable.js\";\nimport \"../components/RowActions.js\";\nimport \"../hooks/MonitorDataOutput.js\";\nimport \"../hooks/MonitorBackgroundTask.js\";\nimport \"../hooks/UseFilterSet.js\";\nimport \"../hooks/UseTable.js\";\nimport \"../components/nav/DetailDrawer.js\";\nimport \"../components/StylishText.js\";\nimport \"../states/StoredTableState.js\";\nimport { useLocalLibState } from \"../states/LocalLibState.js\";\nimport \"../plugin/LocalizedComponent.js\";\nconst useEffect = window[\"React\"].useEffect;\nfunction cancelEvent(event) {\n event?.preventDefault();\n event?.stopPropagation();\n event?.nativeEvent?.stopImmediatePropagation();\n}\nfunction useInvenTreeHotkeys(_keys, tagsToIgnore) {\n const keyelems = _keys.map(([key, description]) => [key, description]);\n const mappedHotkeys = _keys.map(([key, _, handler, options]) => [key, handler, options]);\n useHotkeys(mappedHotkeys, tagsToIgnore);\n useEffect(() => {\n useLocalLibState.getState().addHotkeys(keyelems);\n return () => useLocalLibState.getState().removeHotkeys(keyelems.map(([key]) => key));\n }, []);\n}\nexport {\n cancelEvent,\n useInvenTreeHotkeys\n};\n//# sourceMappingURL=Events.js.map\n","import { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nfunction checkPluginVersion(context) {\n const systemVersion = context?.version?.inventree || \"\";\n if (INVENTREE_PLUGIN_VERSION != systemVersion) {\n console.info(`Plugin version mismatch! Expected version ${INVENTREE_PLUGIN_VERSION}, got ${systemVersion}`);\n }\n}\nfunction initPlugin(context) {\n checkPluginVersion(context);\n context.i18n?.activate?.(context.locale);\n}\nexport {\n checkPluginVersion,\n initPlugin\n};\n//# sourceMappingURL=Plugins.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M12 5l0 14\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-1\" }]];\nconst IconPlus = createReactComponent(\"outline\", \"plus\", \"Plus\", __iconNode);\nexport {\n __iconNode,\n IconPlus as default\n};\n//# sourceMappingURL=IconPlus.js.map\n","import type { LocaleLoader } from '@inventreedb/ui';\n\n// Necessary callback function to dynamically load the locale messages for the plugin\nexport const loadLocale: LocaleLoader = async (locale: string) =>\n import(`./locales/${locale}/messages.ts`).catch(() => null);\n","import {\n checkPluginVersion,\n type InvenTreePluginContext,\n LocalizedComponent\n} from '@inventreedb/ui';\nimport { t } from '@lingui/core/macro';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Switch,\n Table,\n Text,\n Title\n} from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { loadLocale } from './locales';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\nconst GENERATE_URL = '/plugin/batchcode/generate/';\n\n/** Settings dict provided by BatchCodePlugin.get_ui_panels */\ntype BatchCodeSettings = Record;\n\n/**\n * Summary of the settings which decide what a generated code looks like.\n */\nfunction SettingsSummary({ settings }: { settings: BatchCodeSettings }) {\n const rows: [string, string][] = useMemo(() => {\n const scopes: string[] = [];\n\n if (settings.PER_PART) scopes.push(t`per part`);\n if (settings.PER_LOCATION) scopes.push(t`per location`);\n if (settings.DAILY_RESET) scopes.push(t`reset daily`);\n\n return [\n [t`Format`, String(settings.CODE_FORMAT ?? '')],\n [\n t`Prefix`,\n settings.USE_LOCATION_PREFIX\n ? t`from location field '${String(settings.LOCATION_FIELD)}'`\n : String(settings.PREFIX ?? '')\n ],\n [t`Counter`, scopes.length ? scopes.join(', ') : t`global`],\n [t`Trigger`, String(settings.TRIGGER_MODE ?? '')]\n ];\n }, [settings]);\n\n return (\n \n \n {rows.map(([label, value]) => (\n \n \n \n {label}\n \n \n \n {value}\n \n \n ))}\n \n
\n );\n}\n\nfunction BatchCodePanel({ context }: { context: InvenTreePluginContext }) {\n const settings: BatchCodeSettings = useMemo(\n () => context.context?.settings ?? {},\n [context.context]\n );\n\n const canGenerate: boolean = useMemo(\n () => !!context.context?.can_generate,\n [context.context]\n );\n\n const itemId = useMemo(() => context.id ?? null, [context.id]);\n\n const currentCode: string = useMemo(\n () => context.instance?.batch || '',\n [context.instance]\n );\n\n const [preview, setPreview] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [busy, setBusy] = useState(false);\n const [overwrite, setOverwrite] = useState(false);\n\n // Ask the backend which code would be issued next. This is a preview: it\n // does not advance the counter, so it can be refreshed freely.\n const loadPreview = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, { item: itemId })\n .then((response) => setPreview(response.data?.batch_code ?? ''))\n .catch(() => setError(t`Could not load a batch code preview`))\n .finally(() => setLoading(false));\n }, [context.api, itemId]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n const generate = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setBusy(true);\n\n context.api\n .post(GENERATE_URL, { item: itemId, overwrite: overwrite })\n .then((response) => {\n const code = response.data?.batch_code ?? '';\n\n notifications.show({\n title: t`Batch code generated`,\n message: code,\n color: 'green'\n });\n\n context.reloadInstance?.();\n loadPreview();\n })\n .catch((e) => {\n const detail =\n e?.response?.data?.item?.[0] ??\n e?.response?.data?.detail ??\n t`Could not generate a batch code`;\n\n notifications.show({\n title: t`Batch code not generated`,\n message: String(detail),\n color: 'red'\n });\n })\n .finally(() => setBusy(false));\n }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]);\n\n if (!settings.ENABLED) {\n return (\n \n \n {t`Enable the plugin setting 'Enabled' to generate batch codes.`}\n \n \n );\n }\n\n return (\n \n \n \n \n {t`Current batch code`}\n \n {currentCode ? (\n \n {currentCode}\n \n ) : (\n \n {t`Not set`}\n \n )}\n \n \n \n {t`Next code`}\n \n {loading ? (\n \n ) : (\n \n {preview || '—'}\n \n )}\n \n \n\n {error && (\n \n {error}\n \n )}\n\n {canGenerate ? (\n \n setOverwrite(event.currentTarget.checked)}\n label={t`Overwrite the existing batch code`}\n disabled={!currentCode}\n />\n \n \n \n {t`Generate and save`}\n \n \n \n ) : (\n \n {t`You do not have permission to generate batch codes.`}\n \n )}\n\n \n {t`Configuration`}\n \n \n \n );\n}\n\n// This is the function which is called by InvenTree to render the actual panel component\nexport function RenderBatchCodePluginPanel(context: InvenTreePluginContext) {\n checkPluginVersion(context);\n\n return (\n \n \n \n );\n}\n"],"file":"Panel-DT4MHQzh.js"} \ No newline at end of file diff --git a/batchcode_plugin/static/Panel.js b/batchcode_plugin/static/Panel.js new file mode 100644 index 0000000..c07725b --- /dev/null +++ b/batchcode_plugin/static/Panel.js @@ -0,0 +1,2 @@ +const ue="1.5.0";var u=(e=>(e.api_server_info="",e.user_list="user/",e.user_set_password="user/:id/set-password/",e.user_tokens="user/tokens/",e.user_simple_login="email/generate/",e.user_me_profile="user/me/profile/",e.user_me_roles="user/me/roles/",e.user_me_token="user/me/token/",e.user_me="user/me/",e.auth_base="/auth/",e.user_reset="auth/v1/auth/password/request",e.user_reset_set="auth/v1/auth/password/reset",e.auth_pwd_change="auth/v1/account/password/change",e.auth_login="auth/v1/auth/login",e.auth_login_2fa="auth/v1/auth/2fa/authenticate",e.auth_session="auth/v1/auth/session",e.auth_signup="auth/v1/auth/signup",e.auth_authenticators="auth/v1/account/authenticators",e.auth_recovery="auth/v1/account/authenticators/recovery-codes",e.auth_mfa_reauthenticate="auth/v1/auth/2fa/reauthenticate",e.auth_totp="auth/v1/account/authenticators/totp",e.auth_trust="auth/v1/auth/2fa/trust",e.auth_webauthn="auth/v1/account/authenticators/webauthn",e.auth_webauthn_login="auth/v1/auth/webauthn/authenticate",e.auth_reauthenticate="auth/v1/auth/reauthenticate",e.auth_email="auth/v1/account/email",e.auth_email_verify="auth/v1/auth/email/verify",e.auth_providers="auth/v1/account/providers",e.auth_provider_redirect="auth/v1/auth/provider/redirect",e.auth_config="auth/v1/config",e.currency_list="currency/exchange/",e.currency_refresh="currency/refresh/",e.all_units="units/all/",e.task_overview="background-task/",e.task_pending_list="background-task/pending/",e.task_scheduled_list="background-task/scheduled/",e.task_failed_list="background-task/failed/",e.api_search="search/",e.settings_global_list="settings/global/",e.settings_user_list="settings/user/",e.news="news/",e.global_status="generic/status/",e.custom_state_list="generic/status/custom/",e.version="version/",e.license="license/",e.group_list="user/group/",e.owner_list="user/owner/",e.ruleset_list="user/ruleset/",e.content_type_list="contenttype/",e.icons="icons/",e.selectionlist_list="selection/",e.selectionentry_list="selection/:id/entry/",e.barcode="barcode/",e.barcode_history="barcode/history/",e.barcode_link="barcode/link/",e.barcode_unlink="barcode/unlink/",e.barcode_generate="barcode/generate/",e.data_output="data-output/",e.import_session_list="importer/session/",e.import_session_accept_fields="importer/session/:id/accept_fields/",e.import_session_accept_rows="importer/session/:id/accept_rows/",e.import_session_column_mapping_list="importer/column-mapping/",e.import_session_row_list="importer/row/",e.notifications_list="notifications/",e.notifications_readall="notifications/readall/",e.build_order_list="build/",e.build_order_issue="build/:id/issue/",e.build_order_cancel="build/:id/cancel/",e.build_order_hold="build/:id/hold/",e.build_order_complete="build/:id/finish/",e.build_output_complete="build/:id/complete/",e.build_output_create="build/:id/create-output/",e.build_output_scrap="build/:id/scrap-outputs/",e.build_output_delete="build/:id/delete-outputs/",e.build_order_auto_allocate="build/:id/auto-allocate/",e.build_order_allocate="build/:id/allocate/",e.build_order_consume="build/:id/consume/",e.build_order_deallocate="build/:id/unallocate/",e.build_line_list="build/line/",e.build_item_list="build/item/",e.bom_list="bom/",e.bom_item_validate="bom/:id/validate/",e.bom_validate="part/:id/bom-validate/",e.bom_substitute_list="bom/substitute/",e.part_list="part/",e.part_thumbs_list="part/thumbs/",e.part_pricing="part/:id/pricing/",e.part_requirements="part/:id/requirements/",e.part_serial_numbers="part/:id/serial-numbers/",e.part_scheduling="part/:id/scheduling/",e.part_pricing_internal="part/internal-price/",e.part_pricing_sale="part/sale-price/",e.part_stocktake_list="part/stocktake/",e.part_stocktake_generate="part/stocktake/generate/",e.category_list="part/category/",e.category_tree="part/category/tree/",e.category_parameter_list="part/category/parameters/",e.related_part_list="part/related/",e.part_test_template_list="part/test-template/",e.company_list="company/",e.contact_list="company/contact/",e.address_list="company/address/",e.supplier_part_list="company/part/",e.supplier_part_pricing_list="company/price-break/",e.manufacturer_part_list="company/part/manufacturer/",e.stock_location_list="stock/location/",e.stock_location_type_list="stock/location-type/",e.stock_location_tree="stock/location/tree/",e.stock_item_list="stock/",e.stock_tracking_list="stock/track/",e.stock_test_result_list="stock/test/",e.stock_transfer="stock/transfer/",e.stock_remove="stock/remove/",e.stock_return="stock/return/",e.stock_add="stock/add/",e.stock_count="stock/count/",e.stock_change_status="stock/change_status/",e.stock_merge="stock/merge/",e.stock_assign="stock/assign/",e.stock_status="stock/status/",e.stock_convert="stock/:id/convert/",e.stock_disassemble="stock/:id/disassemble/",e.stock_install="stock/:id/install/",e.stock_uninstall="stock/:id/uninstall/",e.stock_serialize="stock/:id/serialize/",e.stock_serial_info="stock/:id/serial-numbers/",e.generate_batch_code="generate/batch-code/",e.generate_serial_number="generate/serial-number/",e.purchase_order_list="order/po/",e.purchase_order_issue="order/po/:id/issue/",e.purchase_order_hold="order/po/:id/hold/",e.purchase_order_cancel="order/po/:id/cancel/",e.purchase_order_complete="order/po/:id/complete/",e.purchase_order_line_list="order/po-line/",e.purchase_order_extra_line_list="order/po-extra-line/",e.purchase_order_receive="order/po/:id/receive/",e.sales_order_list="order/so/",e.sales_order_issue="order/so/:id/issue/",e.sales_order_hold="order/so/:id/hold/",e.sales_order_cancel="order/so/:id/cancel/",e.sales_order_ship="order/so/:id/ship/",e.sales_order_complete="order/so/:id/complete/",e.sales_order_allocate="order/so/:id/allocate/",e.sales_order_allocate_serials="order/so/:id/allocate-serials/",e.sales_order_auto_allocate="order/so/:id/auto-allocate/",e.sales_order_line_list="order/so-line/",e.sales_order_extra_line_list="order/so-extra-line/",e.sales_order_allocation_list="order/so-allocation/",e.sales_order_shipment_list="order/so/shipment/",e.sales_order_shipment_complete="order/so/shipment/:id/ship/",e.return_order_list="order/ro/",e.return_order_issue="order/ro/:id/issue/",e.return_order_hold="order/ro/:id/hold/",e.return_order_cancel="order/ro/:id/cancel/",e.return_order_complete="order/ro/:id/complete/",e.return_order_receive="order/ro/:id/receive/",e.return_order_line_list="order/ro-line/",e.return_order_extra_line_list="order/ro-extra-line/",e.transfer_order_list="order/transfer-order/",e.transfer_order_issue="order/transfer-order/:id/issue/",e.transfer_order_hold="order/transfer-order/:id/hold/",e.transfer_order_cancel="order/transfer-order/:id/cancel/",e.transfer_order_complete="order/transfer-order/:id/complete/",e.transfer_order_allocate="order/transfer-order/:id/allocate/",e.transfer_order_allocate_serials="order/transfer-order/:id/allocate-serials/",e.transfer_order_line_list="order/transfer-order-line/",e.transfer_order_allocation_list="order/transfer-order-allocation/",e.label_list="label/template/",e.label_print="label/print/",e.report_list="report/template/",e.report_print="report/print/",e.report_snippet="report/snippet/",e.report_asset="report/asset/",e.plugin_list="plugins/",e.plugin_setting_list="plugins/:plugin/settings/",e.plugin_user_setting_list="plugins/:plugin/user-settings/",e.plugin_registry_status="plugins/status/",e.plugin_install="plugins/install/",e.plugin_reload="plugins/reload/",e.plugin_activate="plugins/:key/activate/",e.plugin_uninstall="plugins/:key/uninstall/",e.plugin_admin="plugins/:key/admin/",e.plugin_ui_features_list="plugins/ui/features/:feature_type/",e.plugin_locate_item="locate/",e.plugin_supplier_list="supplier/list/",e.plugin_supplier_search="supplier/search/",e.plugin_supplier_import="supplier/import/",e.machine_types_list="machine/types/",e.machine_driver_list="machine/drivers/",e.machine_registry_status="machine/status/",e.machine_list="machine/",e.machine_restart="machine/:machine/restart/",e.machine_setting_list="machine/:machine/settings/",e.machine_setting_detail="machine/:machine/settings/:config_type/",e.attachment_list="attachment/",e.error_report_list="error-report/",e.project_code_list="project-code/",e.custom_unit_list="units/",e.notes_image_upload="notes-image-upload/",e.email_list="admin/email/",e.email_test="admin/email/test/",e.config_list="admin/config/",e.parameter_list="parameter/",e.parameter_template_list="parameter/template/",e.tag_list="tag/",e.system_internal_trace_end="system-internal/observability/end",e))(u||{});window.LinguiCore.i18n;window.LinguiCore.i18n;u.part_list,u.parameter_list,u.parameter_template_list,u.part_test_template_list,u.supplier_part_list,u.manufacturer_part_list,u.category_list,u.stock_item_list,u.stock_location_list,u.stock_location_type_list,u.stock_tracking_list,u.build_order_list,u.build_line_list,u.build_item_list,u.company_list,u.project_code_list,u.purchase_order_list,u.purchase_order_line_list,u.sales_order_list,u.sales_order_shipment_list,u.return_order_list,u.return_order_line_list,u.transfer_order_list,u.transfer_order_line_list,u.address_list,u.contact_list,u.owner_list,u.user_list,u.group_list,u.import_session_list,u.label_list,u.report_list,u.plugin_list,u.content_type_list,u.selectionlist_list,u.selectionentry_list,u.error_report_list,u.tag_list;window.React.useEffect;window.React.useEffectEvent;window.LinguiCore.i18n;window.MantineNotifications.notifications;var J={exports:{}},$={},de;function Xe(){if(de)return $;de=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function r(n,o,s){var i=null;if(s!==void 0&&(i=""+s),o.key!==void 0&&(i=""+o.key),"key"in o){s={};for(var a in o)a!=="key"&&(s[a]=o[a])}else s=o;return o=s.ref,{$$typeof:e,type:n,key:i,ref:o!==void 0?o:null,props:s}}return $.Fragment=t,$.jsx=r,$.jsxs=r,$}var _e;function Ke(){return _e||(_e=1,J.exports=Xe()),J.exports}var he=Ke();window.MantineCore.ActionIcon;window.MantineCore.Group;window.MantineCore.Tooltip;const Qe=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,$e=Object.prototype.toString;function Ze(e){switch($e.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return rt(e,Error)}}function Ae(e,t){return $e.call(e)===`[object ${t}]`}function et(e){return Ae(e,"Object")}function tt(e){return!!(e?.then&&typeof e.then=="function")}function rt(e,t){try{return e instanceof t}catch{return!1}}const E="10.70.0",k=globalThis;function Y(){return oe(k),k}function oe(e){const t=e.__SENTRY__=e.__SENTRY__||{};return t.version=t.version||E,t[E]=t[E]||{}}function se(e,t,r=k){const n=r.__SENTRY__=r.__SENTRY__||{},o=n[E]=n[E]||{};return o[e]||(o[e]=t())}const T=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;let N;function W(e){if(N!==void 0)return N?N(e):e();const t=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),r=k;return t in r&&typeof r[t]=="function"?(N=r[t],N(e)):(N=null,e())}function te(){return W(()=>Math.random())}function nt(){return W(()=>Date.now())}function ot(){const e=k;return e.crypto||e.msCrypto}let X;function st(){return te()*16}function F(e=ot()){try{if(e?.randomUUID)return W(()=>e.randomUUID()).replace(/-/g,"")}catch{}return X||(X="10000000100040008000"+1e11),X.replace(/[018]/g,t=>(t^(st()&15)>>t/4).toString(16))}const Oe=1e3;function Ue(){return nt()/Oe}function it(){const{performance:e}=k;if(!e?.now||!e.timeOrigin)return Ue;const t=e.timeOrigin;return()=>(t+W(()=>e.now()))/Oe}let fe;function at(){return(fe??(fe=it()))()}function ct(e,t={}){if(t.user&&(!e.ipAddress&&t.user.ip_address&&(e.ipAddress=t.user.ip_address),!e.did&&!t.did&&(e.did=t.user.id||t.user.email||t.user.username)),e.timestamp=t.timestamp||at(),t.abnormal_mechanism&&(e.abnormal_mechanism=t.abnormal_mechanism),t.ignoreDuration&&(e.ignoreDuration=t.ignoreDuration),t.sid&&(e.sid=t.sid.length===32?t.sid:F()),t.init!==void 0&&(e.init=t.init),!e.did&&t.did&&(e.did=`${t.did}`),typeof t.started=="number"&&(e.started=t.started),e.ignoreDuration)e.duration=void 0;else if(typeof t.duration=="number")e.duration=t.duration;else{const r=e.timestamp-e.started;e.duration=r>=0?r:0}t.release&&(e.release=t.release),t.environment&&(e.environment=t.environment),!e.ipAddress&&t.ipAddress&&(e.ipAddress=t.ipAddress),!e.userAgent&&t.userAgent&&(e.userAgent=t.userAgent),typeof t.errors=="number"&&(e.errors=t.errors),t.status&&(e.status=t.status)}const lt="Sentry Logger ",me={};function je(e){if(!("console"in k))return e();const t=k.console,r={},n=Object.keys(me);n.forEach(o=>{const s=me[o];r[o]=t[o],t[o]=s});try{return e()}finally{n.forEach(o=>{t[o]=r[o]})}}function ut(){ae().enabled=!0}function dt(){ae().enabled=!1}function Ee(){return ae().enabled}function _t(...e){ie("log",...e)}function ht(...e){ie("warn",...e)}function ft(...e){ie("error",...e)}function ie(e,...t){T&&Ee()&&je(()=>{k.console[e](`${lt}[${e}]:`,...t)})}function ae(){return T?se("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:ut,disable:dt,isEnabled:Ee,log:_t,warn:ht,error:ft};function Fe(e,t,r=2){if(!t||typeof t!="object"||r<=0)return t;if(e&&Object.keys(t).length===0)return e;const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=Fe(n[o],t[o],r-1));return n}function ge(){return F()}function mt(e,t,r){try{Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0})}catch{T&&S.log(`Failed to add non-enumerable property "${String(t)}" to object`,e)}}function gt(e){try{const t=k.WeakRef;if(typeof t=="function")return new t(e)}catch{}return e}function pt(e){if(e){if(typeof e=="object"&&"deref"in e&&typeof e.deref=="function")try{return e.deref()}catch{return}return e}}const re="_sentrySpan";function pe(e,t){t?mt(e,re,gt(t)):delete e[re]}function we(e){return pt(e[re])}function wt(e,t=0){return typeof e!="string"||t===0||e.length<=t?e:`${e.slice(0,t)}...`}const vt=100;class L{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._attributes={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext={traceId:ge(),sampleRand:te()}}clone(){const t=new L;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._attributes={...this._attributes},t._extra={...this._extra},t._contexts={...this._contexts},this._contexts.flags&&(t._contexts.flags={values:[...this._contexts.flags.values]}),t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,t._conversationId=this._conversationId,pe(t,we(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&ct(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}setConversationId(t){return this._conversationId=t||void 0,this._notifyScopeListeners(),this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,r){return this.setTags({[t]:r})}setAttributes(t){return this._attributes={...this._attributes,...t},this._notifyScopeListeners(),this}setAttribute(t,r){return this.setAttributes({[t]:r})}removeAttribute(t){return t in this._attributes&&(delete this._attributes[t],this._notifyScopeListeners()),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,r){return this._extra={...this._extra,[t]:r},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,r){return r===null?delete this._contexts[t]:this._contexts[t]=r,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const r=typeof t=="function"?t(this):t,n=r instanceof L?r.getScopeData():et(r)?t:void 0,{tags:o,attributes:s,extra:i,user:a,contexts:d,level:c,fingerprint:l=[],propagationContext:_,conversationId:m}=n||{};return this._tags={...this._tags,...o},this._attributes={...this._attributes,...s},this._extra={...this._extra,...i},this._contexts={...this._contexts,...d},a&&Object.keys(a).length&&(this._user=a),c&&(this._level=c),l.length&&(this._fingerprint=l),_&&(this._propagationContext=_),m&&(this._conversationId=m),this}clear(){return this._breadcrumbs=[],this._tags={},this._attributes={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._session=void 0,this._conversationId=void 0,pe(this,void 0),this._attachments=[],this.setPropagationContext({traceId:ge(),sampleRand:te()}),this._notifyScopeListeners(),this}addBreadcrumb(t,r){const n=typeof r=="number"?r:vt;if(n<=0)return this;const o={timestamp:Ue(),...t,message:t.message?wt(t.message,2048):t.message};return this._breadcrumbs.push(o),this._breadcrumbs.length>n&&(this._breadcrumbs=this._breadcrumbs.slice(-n),this._client?.recordDroppedEvent("buffer_overflow","log_item")),this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,attributes:this._attributes,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:we(this),conversationId:this._conversationId}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata=Fe(this._sdkProcessingMetadata,t,2),this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,r){const n=r?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture exception!"),n;const o=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:o,...r,event_id:n},this),n}captureMessage(t,r,n){const o=n?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture message!"),o;const s=n?.syntheticException??new Error(t);return this._client.captureMessage(t,r,{originalException:t,syntheticException:s,...n,event_id:o},this),o}captureEvent(t,r){const n=t.event_id||r?.event_id||F();return this._client?(this._client.captureEvent(t,{...r,event_id:n},this),n):(T&&S.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(t=>{t(this)}),this._notifyingListeners=!1)}}function bt(){return se("defaultCurrentScope",()=>new L)}function yt(){return se("defaultIsolationScope",()=>new L)}const ve=e=>e instanceof Promise&&!e[Be],Be=Symbol("chained PromiseLike"),St=(e,t,r)=>{const n=e.then(o=>(t(o),o),o=>{throw r(o),o});return ve(n)&&ve(e)?n:kt(e,n)},kt=(e,t)=>{if(!t)return e;let r=!1;for(const n in e){if(n in t)continue;r=!0;const o=e[n];typeof o=="function"?Object.defineProperty(t,n,{value:(...s)=>o.apply(e,s),enumerable:!0,configurable:!0,writable:!0}):t[n]=o}return r&&Object.assign(t,{[Be]:!0}),t};class Rt{constructor(t,r){let n;t?n=t:n=new L;let o;r?o=r:o=new L,this._stack=[{scope:n}],this._isolationScope=o}withScope(t){const r=this._pushScope();let n;try{n=t(r)}catch(o){throw this._popScope(),o}return tt(n)?St(n,()=>this._popScope(),()=>this._popScope()):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return this._stack.length<=1?!1:!!this._stack.pop()}}function x(){const e=Y(),t=oe(e);return t.stack=t.stack||new Rt(bt(),yt())}function Ct(e){return x().withScope(e)}function Mt(e,t){const r=x();return r.withScope(()=>(r.getStackTop().scope=e,t(e)))}function be(e){return x().withScope(()=>e(x().getIsolationScope()))}function It(){return{withIsolationScope:be,withScope:Ct,withSetScope:Mt,withSetIsolationScope:(e,t)=>be(t),getCurrentScope:()=>x().getScope(),getIsolationScope:()=>x().getIsolationScope()}}function ce(e){const t=oe(e);return t.acs?t.acs:It()}function le(){const e=Y();return ce(e).getCurrentScope()}function Lt(){const e=Y();return ce(e).getIsolationScope()}function Pt(...e){const t=Y(),r=ce(t);if(e.length===2){const[n,o]=e;return n?r.withSetScope(n,o):r.withScope(o)}return r.withScope(e[0])}function Ge(){return le().getClient()}function Tt(e){if(e)return Nt(e)?{captureContext:e}:xt(e)?{captureContext:e}:e}function Nt(e){return e instanceof L||typeof e=="function"}const Dt=["user","level","extra","contexts","tags","fingerprint","propagationContext"];function xt(e){return Object.keys(e).some(t=>Dt.includes(t))}function $t(e,t){return le().captureException(e,Tt(t))}function Ot(){return Lt().lastEventId()}const Ut=window.React.version;function jt(e){const t=e.match(/^([^.]+)/);return t!==null&&parseInt(t[0])>=17}function Et(e,t){const r=new WeakSet;function n(o,s){if(!r.has(o)){if(o.cause)return r.add(o),n(o.cause,s);o.cause=s}}n(e,t)}function Ft(e,{componentStack:t},r){if(jt(Ut)&&Ze(e)&&t){const n=new Error(e.message);n.name=`React ErrorBoundary ${e.name}`,n.stack=t,Et(e,n)}return $t(e,r)}const ye=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,G=k,Bt=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)((?:\[[:.%\w]+\]|[\w.-]+))(?::(\d+))?\/(.+)/;function Gt(e){return e==="http"||e==="https"}function Ht(e,t=!1){const{host:r,path:n,pass:o,port:s,projectId:i,protocol:a,publicKey:d}=e;return`${a}://${d}${t&&o?`:${o}`:""}@${r}${s?`:${s}`:""}/${n&&`${n}/`}${i}`}function Vt(e){const t=Bt.exec(e);if(!t){je(()=>{console.error(`Invalid Sentry Dsn: ${e}`)});return}const[r,n,o="",s="",i="",a=""]=t.slice(1);let d="",c=a;const l=c.split("/");if(l.length>1&&(d=l.slice(0,-1).join("/"),c=l.pop()),c){const _=c.match(/^\d+/);_&&(c=_[0])}return He({host:s,pass:o,path:d,projectId:c,port:i,protocol:r,publicKey:n})}function He(e){return{protocol:e.protocol,publicKey:e.publicKey||"",pass:e.pass||"",host:e.host,port:e.port||"",path:e.path||"",projectId:e.projectId}}function qt(e){if(!T)return!0;const{port:t,projectId:r,protocol:n}=e;return["protocol","publicKey","host","projectId"].find(i=>e[i]?!1:(S.error(`Invalid Sentry Dsn: ${i} missing`),!0))?!1:r.match(/^\d+$/)?Gt(n)?t&&isNaN(parseInt(t,10))?(S.error(`Invalid Sentry Dsn: Invalid port ${t}`),!1):!0:(S.error(`Invalid Sentry Dsn: Invalid protocol ${n}`),!1):(S.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),!1)}function Yt(e){const t=typeof e=="string"?Vt(e):He(e);if(!(!t||!qt(t)))return t}function Wt(e){const t=e.protocol?`${e.protocol}:`:"",r=e.port?`:${e.port}`:"";return`${t}//${e.host}${r}${e.path?`/${e.path}`:""}/api/`}function zt(e,t){const r=Yt(e);if(!r)return"";const n=`${Wt(r)}embed/error-page/`;let o=`dsn=${Ht(r)}`;for(const s in t)if(s!=="dsn"&&s!=="onClose")if(s==="user"){const i=t.user;if(!i)continue;i.name&&(o+=`&name=${encodeURIComponent(i.name)}`),i.email&&(o+=`&email=${encodeURIComponent(i.email)}`)}else o+=`&${encodeURIComponent(s)}=${encodeURIComponent(t[s])}`;return`${n}?${o}`}function Se(e={}){const t=G.document,r=t?.head||t?.body;if(!r){ye&&S.error("[showReportDialog] Global document not defined");return}const n=le(),s=Ge()?.getDsn();if(!s){ye&&S.error("[showReportDialog] DSN not configured");return}const i={...e,user:{...n.getUser(),...e.user},eventId:e.eventId||Ot()},a=G.document.createElement("script");a.async=!0,a.crossOrigin="anonymous",a.src=zt(s,i);const{onLoad:d,onClose:c}=i;if(d&&(a.onload=d),c){const l=_=>{if(_.data==="__sentry_reportdialog_closed__")try{c()}finally{G.removeEventListener("message",l)}};G.addEventListener("message",l)}r.appendChild(a)}const K=window.React,Q={componentStack:null,error:null,eventId:null};class nn extends K.Component{constructor(t){super(t),this.state=Q,this._openFallbackReportDialog=!0;const r=Ge();r&&t.showDialog&&(this._openFallbackReportDialog=!1,this._cleanupHook=r.on("afterSendEvent",n=>{!n.type&&this._lastEventId&&n.event_id===this._lastEventId&&Se({...t.dialogOptions,eventId:this._lastEventId})}))}componentDidCatch(t,r){const{componentStack:n}=r,{beforeCapture:o,onError:s,showDialog:i,dialogOptions:a}=this.props;Pt(d=>{o&&o(d,t,n);const c=this.props.handled!=null?this.props.handled:!!this.props.fallback,l=Ft(t,r,{mechanism:{handled:c,type:"auto.function.react.error_boundary"}});s&&s(t,n,l),i&&(this._lastEventId=l,this._openFallbackReportDialog&&Se({...a,eventId:l})),this.setState({error:t,componentStack:n,eventId:l})})}componentDidMount(){const{onMount:t}=this.props;t&&t()}componentWillUnmount(){const{error:t,componentStack:r,eventId:n}=this.state,{onUnmount:o}=this.props;o&&(this.state===Q?o(null,null,null):o(t,r,n)),this._cleanupHook&&(this._cleanupHook(),this._cleanupHook=void 0)}resetErrorBoundary(){const{onReset:t}=this.props,{error:r,componentStack:n,eventId:o}=this.state;t&&t(r,n,o),this.setState(Q)}render(){const{fallback:t,children:r}=this.props,n=this.state;if(n.componentStack===null)return typeof r=="function"?r():r;const o=typeof t=="function"?K.createElement(t,{error:n.error,componentStack:n.componentStack,resetError:()=>this.resetErrorBoundary(),eventId:n.eventId}):t;return K.isValidElement(o)?o:(t&&Qe&&S.warn("fallback did not produce a valid ReactElement"),null)}}var Jt={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};const Xt=window.React.forwardRef,Z=window.React.createElement,w=(e,t,r,n)=>{const o=Xt(({color:s="currentColor",size:i=24,stroke:a=2,title:d,className:c,children:l,..._},m)=>Z("svg",{ref:m,...Jt[e],width:i,height:i,className:["tabler-icon",`tabler-icon-${t}`,c].join(" "),strokeWidth:a,stroke:s,..._},[d&&Z("title",{key:"svg-title"},d),...n.map(([g,y])=>Z(g,y)),...Array.isArray(l)?l:[l]]));return o.displayName=`${r}`,o},Kt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M12 9v4",key:"svg-1"}],["path",{d:"M12 16v.01",key:"svg-2"}]];w("outline","exclamation-circle","ExclamationCircle",Kt);const Qt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 9h.01",key:"svg-1"}],["path",{d:"M11 12h1v4h1",key:"svg-2"}]];w("outline","info-circle","InfoCircle",Qt);window.LinguiCore.i18n;window.MantineCore.Alert;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useState;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;const Zt=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]];w("outline","check","Check",Zt);const At=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]];w("outline","copy","Copy",At);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Button;window.MantineCore.CopyButton;window.MantineCore.Text;window.MantineCore.Tooltip;window.MantineCore.Group;window.React.useState;window.MantineCore.Group;window.MantineCore.Progress;window.MantineCore.Stack;window.MantineCore.Text;window.React.useMemo;window.LinguiCore.i18n;window.MantineCore.Badge;window.MantineCore.Skeleton;window.React.useCallback;window.React.useEffect;window.React.useRef;window.React.useState;const er=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]];w("outline","search","Search",er);window.LinguiCore.i18n;window.MantineCore.CloseButton;window.MantineCore.TextInput;window.React.useEffect;window.React.useState;const tr=[["path",{d:"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M6 4v4",key:"svg-1"}],["path",{d:"M6 12v8",key:"svg-2"}],["path",{d:"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-3"}],["path",{d:"M12 4v10",key:"svg-4"}],["path",{d:"M12 18v2",key:"svg-5"}],["path",{d:"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-6"}],["path",{d:"M18 4v1",key:"svg-7"}],["path",{d:"M18 9v11",key:"svg-8"}]];w("outline","adjustments","Adjustments",tr);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Checkbox;window.MantineCore.Divider;window.MantineCore.Menu;window.MantineCore.Tooltip;const rr=[["path",{d:"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3",key:"svg-1"}]];w("outline","tag","Tag",rr);window.MantineCore.ActionIcon;window.MantineCore.Badge;window.MantineCore.Group;window.MantineCore.Paper;window.MantineCore.Alert;const nr=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]];w("outline","dots","Dots",nr);const or=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M10 10l4 4m0 -4l-4 4",key:"svg-1"}]];w("outline","circle-x","CircleX",or);const sr=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]];w("outline","trash","Trash",sr);const ir=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]];w("outline","edit","Edit",ir);const ar=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]];w("outline","arrow-right","ArrowRight",ar);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;window.React.useMemo;window.React.useState;window.React.useEffect;window.React.useState;var Ve=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},cr=class extends Ve{#t;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e();return window.addEventListener("visibilitychange",t,!1),()=>{window.removeEventListener("visibilitychange",t)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(t=>{typeof t=="boolean"?this.setFocused(t):this.onFocus()})}setFocused(e){this.#t!==e&&(this.#t=e,this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#t=="boolean"?this.#t:globalThis.document?.visibilityState!=="hidden"}};new cr;var lr=class extends Ve{#t=!0;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",t,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",r)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(this.setOnline.bind(this))}setOnline(e){this.#t!==e&&(this.#t=e,this.listeners.forEach(r=>{r(e)}))}isOnline(){return this.#t}};new lr;const ur=window.React;ur.createContext(void 0);const dr=window.React;function _r(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}dr.createContext(_r());const hr=window.React;var fr=hr.createContext(!1);fr.Provider;const mr=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l2 2l4 -4",key:"svg-1"}]];w("outline","circle-check","CircleCheck",mr);window.LinguiCore.i18n;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.React.useEffect;window.React.useEffectEvent;window.React.useCallback;window.React.useEffect;window.React.useState;window.React.useCallback;window.React.useEffect;window.React.useMemo;window.React.useCallback;window.React.useMemo;window.React.useState;var ke;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(ke||(ke={}));var Re;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Re||(Re={}));class gr extends Error{}const qe=["post","put","patch","delete"];new Set(qe);const pr=["get",...qe];new Set(pr);const C=window.React,Ce=C.createContext(null),wr=C.createContext({outlet:null,matches:[],isDataRoute:!1}),vr=C.createContext(null);class on extends C.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?C.createElement(wr.Provider,{value:this.props.routeContext},C.createElement(vr.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}const br="startTransition";C[br];var b=(function(e){return e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error",e})(b||{});const yr=new Promise(()=>{});class sn extends C.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error(" caught the following error during render",t,r)}render(){let{children:t,errorElement:r,resolve:n}=this.props,o=null,s=b.pending;if(!(n instanceof Promise))s=b.success,o=Promise.resolve(),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_data",{get:()=>n});else if(this.state.error){s=b.error;let i=this.state.error;o=Promise.reject().catch(()=>{}),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_error",{get:()=>i})}else n._tracked?(o=n,s="_error"in o?b.error:"_data"in o?b.success:b.pending):(s=b.pending,Object.defineProperty(n,"_tracked",{get:()=>!0}),o=n.then(i=>Object.defineProperty(n,"_data",{get:()=>i}),i=>Object.defineProperty(n,"_error",{get:()=>i})));if(s===b.error&&o._error instanceof gr)throw yr;if(s===b.error&&!r)throw o._error;if(s===b.error)return C.createElement(Ce.Provider,{value:o,children:r});if(s===b.success)return C.createElement(Ce.Provider,{value:o,children:t});throw o}}const Ye=window.React,Sr=window.ReactDOM,kr="6";try{window.__reactRouterVersion=kr}catch{}const Rr="startTransition";Ye[Rr];const Cr="flushSync";Sr[Cr];const Mr="useId";Ye[Mr];var Me;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Me||(Me={}));var Ie;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ie||(Ie={}));function Ir(e,t){let r;try{r=e()}catch{return}return{getItem:o=>{var s;const i=d=>d===null?null:JSON.parse(d,void 0),a=(s=r.getItem(o))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(o,s)=>r.setItem(o,JSON.stringify(s,void 0)),removeItem:o=>r.removeItem(o)}}const ne=e=>t=>{try{const r=e(t);return r instanceof Promise?r:{then(n){return ne(n)(r)},catch(n){return this}}}catch(r){return{then(n){return this},catch(n){return ne(n)(r)}}}},Lr=(e,t)=>(r,n,o)=>{let s={storage:Ir(()=>window.localStorage),partialize:h=>h,version:0,merge:(h,p)=>({...p,...h}),...t},i=!1,a=0;const d=new Set,c=new Set;let l=s.storage;if(!l)return e((...h)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),r(...h)},n,o);const _=()=>{const h=s.partialize({...n()});return l.setItem(s.name,{state:h,version:s.version})},m=o.setState;o.setState=(h,p)=>(m(h,p),_());const g=e((...h)=>(r(...h),_()),n,o);o.getInitialState=()=>g;let y;const I=()=>{var h,p;if(!l)return;const P=++a;i=!1,d.forEach(v=>{var M;return v((M=n())!=null?M:g)});const B=((p=s.onRehydrateStorage)==null?void 0:p.call(s,(h=n())!=null?h:g))||void 0;return ne(l.getItem.bind(l))(s.name).then(v=>{if(v)if(typeof v.version=="number"&&v.version!==s.version){if(s.migrate){const M=s.migrate(v.state,v.version);return M instanceof Promise?M.then(z=>[!0,z]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,v.state];return[!1,void 0]}).then(v=>{var M;if(P!==a)return;const[z,Je]=v;if(y=s.merge(Je,(M=n())!=null?M:g),r(y,!0),z)return _()}).then(()=>{P===a&&(B?.(n(),void 0),y=n(),i=!0,c.forEach(v=>v(y)))}).catch(v=>{P===a&&B?.(void 0,v)})};return o.persist={setOptions:h=>{s={...s,...h},h.storage&&(l=h.storage)},clearStorage:()=>{l?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>I(),hasHydrated:()=>i,onHydrate:h=>(d.add(h),()=>{d.delete(h)}),onFinishHydration:h=>(c.add(h),()=>{c.delete(h)})},s.skipHydration||I(),y||g},We=Lr,Le=e=>{let t;const r=new Set,n=(c,l)=>{const _=typeof c=="function"?c(t):c;if(!Object.is(_,t)){const m=t;t=l??(typeof _!="object"||_===null)?_:Object.assign({},t,_),r.forEach(g=>g(t,m))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>d,subscribe:c=>(r.add(c),()=>r.delete(c))},d=t=e(n,o,a);return a},Pr=(e=>e?Le(e):Le),H=window.React,Tr=e=>e;function Nr(e,t=Tr){const r=H.useSyncExternalStore(e.subscribe,H.useCallback(()=>t(e.getState()),[e,t]),H.useCallback(()=>t(e.getInitialState()),[e,t]));return H.useDebugValue(r),r}const Dr=e=>{const t=Pr(e),r=n=>Nr(t,n);return Object.assign(r,t),r},ze=(e=>Dr);ze()(We((e,t)=>({detailDrawerStack:0,addDetailDrawer:r=>{e({detailDrawerStack:r===!1?0:t().detailDrawerStack+r})},hotkeys:{},addHotkeys:r=>{const n={...t().hotkeys};for(const[o,s]of r)n[o]=s;e({hotkeys:n})},removeHotkeys:r=>{const n={...t().hotkeys};for(const o of r)delete n[o];e({hotkeys:n})}}),{name:"session-settings-inventreedb_lib"}));window.MantineCore.Text;window.MantineCore.darken;window.MantineCore.getThemeColor;window.MantineCore.useMantineTheme;window.React.useMemo;const xr=[["path",{d:"M15 6l-6 6l6 6",key:"svg-0"}]];w("outline","chevron-left","ChevronLeft",xr);window.MantineCore.ActionIcon;window.MantineCore.Divider;window.MantineCore.Drawer;window.MantineCore.Group;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useMemo;const $r=25;ze()(We((e,t)=>({pageSize:$r,setPageSize:r=>{e(n=>({pageSize:r}))},tableSorting:{},getTableSorting:r=>t().tableSorting[r]||{},setTableSorting:r=>n=>{e({tableSorting:{...t().tableSorting,[r]:n}})},tableColumnNames:{},getTableColumnNames:r=>t().tableColumnNames[r]||null,setTableColumnNames:r=>n=>{e({tableColumnNames:{...t().tableColumnNames,[r]:n}})},clearTableColumnNames:()=>{e({tableColumnNames:{}})},hiddenColumns:{},getHiddenColumns:r=>t().hiddenColumns?.[r]??null,setHiddenColumns:r=>n=>{e({hiddenColumns:{...t().hiddenColumns,[r]:n}})}}),{name:"inventree-table-state"}));const Or=window.LinguiReact.I18nProvider,Ur=window.MantineCore.Skeleton,jr=window.React.useEffect,Er=window.React.useState;async function V(e,t){try{return await t(e)}catch{return console.warn(`Failed to load locale ${e}`),null}}async function Fr(e,t,r){let n=null;if(n=await V(t,r),!n&&t.includes("-")){const o=t.split("-")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}if(!n&&t.includes("_")){const o=t.split("_")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}!n&&t!=="en"&&(console.debug(`Locale ${t} not found, trying fallback locale en`),n=await V("en",r)),n?.messages?(e.load(t,n.messages),e.activate(t)):console.error(`Failed to load any locale for ${t}`)}const Br=async e=>null;function Gr({i18n:e,locale:t,loadLocale:r,children:n}){const[o,s]=Er(!1);return jr(()=>{s(!1),Fr(e,t,r??Br).then(()=>{s(!0)})},[e,t,r]),o?he.jsx(Or,{i18n:e,children:n}):he.jsx(Ur,{w:"100%",animate:!0})}window.React.useEffect;function Hr(e){const t=e?.version?.inventree||"";ue!=t&&console.info(`Plugin version mismatch! Expected version ${ue}, got ${t}`)}const Vr=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]];w("outline","plus","Plus",Vr);const qr="modulepreload",Yr=function(e){return"/"+e},Pe={},R=function(t,r,n){let o=Promise.resolve();if(r&&r.length>0){let i=function(c){return Promise.all(c.map(l=>Promise.resolve(l).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),d=a?.nonce||a?.getAttribute("nonce");o=i(r.map(c=>{if(c=Yr(c),c in Pe)return;Pe[c]=!0;const l=c.endsWith(".css"),_=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${_}`))return;const m=document.createElement("link");if(m.rel=l?"stylesheet":qr,l||(m.as="script"),m.crossOrigin="",m.href=c,d&&m.setAttribute("nonce",d),document.head.appendChild(m),l)return new Promise((g,y)=>{m.addEventListener("load",g),m.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return o.then(i=>{for(const a of i||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})},Wr=(e,t,r)=>{const n=e[t];return n?typeof n=="function"?n():Promise.resolve(n):new Promise((o,s)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(s.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==r?". Note that variables only represent file names one level deep.":""))))})},zr=async e=>Wr(Object.assign({"./locales/de/messages.ts":()=>R(()=>import("./assets/messages-SySx3VqF.js"),[]),"./locales/en/messages.ts":()=>R(()=>import("./assets/messages-BVqXLN8V.js"),[]),"./locales/es/messages.ts":()=>R(()=>import("./assets/messages-B19F09LY.js"),[]),"./locales/fr/messages.ts":()=>R(()=>import("./assets/messages-DtuQFlMQ.js"),[]),"./locales/it/messages.ts":()=>R(()=>import("./assets/messages-m7AYrdMP.js"),[]),"./locales/ja/messages.ts":()=>R(()=>import("./assets/messages-BwzuZfs7.js"),[]),"./locales/pseudo-LOCALE/messages.ts":()=>R(()=>import("./assets/messages-6MO-OwBA.js"),[]),"./locales/ru/messages.ts":()=>R(()=>import("./assets/messages-BaNfSHmL.js"),[]),"./locales/zh_Hans/messages.ts":()=>R(()=>import("./assets/messages-uDIARWjl.js"),[]),"./locales/zh_Hant/messages.ts":()=>R(()=>import("./assets/messages-Bs4XYOTm.js"),[])}),`./locales/${e}/messages.ts`,4).catch(()=>null),f=window.LinguiCore.i18n,A=window.MantineCore.Alert,Te=window.MantineCore.Badge,Ne=window.MantineCore.Button,Jr=window.MantineCore.Code,ee=window.MantineCore.Group,Xr=window.MantineCore.Loader,q=window.MantineCore.Stack,Kr=window.MantineCore.Switch,O=window.MantineCore.Table,D=window.MantineCore.Text,Qr=window.MantineCore.Title,De=window.MantineNotifications.notifications,xe=window.React.useCallback,Zr=window.React.useEffect,j=window.React.useMemo,U=window.React.useState,Ar="/plugin/batchcode/preview/",en="/plugin/batchcode/generate/";function tn({settings:e}){const t=j(()=>{const r=[];return e.PER_PART&&r.push(f._({id:"O/ICOy"})),e.PER_LOCATION&&r.push(f._({id:"qt+UdX"})),e.DAILY_RESET&&r.push(f._({id:"iHaxSq"})),[[f._({id:"kI1qVD"}),String(e.CODE_FORMAT??"")],[f._({id:"rNqTKZ"}),e.USE_LOCATION_PREFIX?f._({id:"j1yeuR",values:{0:String(e.LOCATION_FIELD)}}):String(e.PREFIX??"")],[f._({id:"NKnPpU"}),r.length?r.join(", "):f._({id:"SLbeKO"})],[f._({id:"H2Sfhg"}),String(e.TRIGGER_MODE??"")]]},[e]);return React.createElement(O,{withRowBorders:!1,verticalSpacing:"xs"},React.createElement(O.Tbody,null,t.map(([r,n])=>React.createElement(O.Tr,{key:r},React.createElement(O.Td,null,React.createElement(D,{size:"sm",c:"dimmed"},r)),React.createElement(O.Td,null,React.createElement(Jr,null,n))))))}function rn({context:e}){const t=j(()=>e.context?.settings??{},[e.context]),r=j(()=>!!e.context?.can_generate,[e.context]),n=j(()=>e.id??null,[e.id]),o=j(()=>e.instance?.batch||"",[e.instance]),[s,i]=U(""),[a,d]=U(""),[c,l]=U(!1),[_,m]=U(!1),[g,y]=U(!1),I=xe(()=>{n&&(l(!0),d(""),e.api.post(Ar,{item:n}).then(p=>i(p.data?.batch_code??"")).catch(()=>d(f._({id:"hPL4I9"}))).finally(()=>l(!1)))},[e.api,n]);Zr(()=>{I()},[I]);const h=xe(()=>{n&&(m(!0),e.api.post(en,{item:n,overwrite:g}).then(p=>{const P=p.data?.batch_code??"";De.show({title:f._({id:"T0z5Hw"}),message:P,color:"green"}),e.reloadInstance?.(),I()}).catch(p=>{const P=p?.response?.data?.item?.[0]??p?.response?.data?.detail??f._({id:"NEgaRI"});De.show({title:f._({id:"O8n/gF"}),message:String(P),color:"red"})}).finally(()=>m(!1)))},[e.api,e.reloadInstance,n,I,g]);return t.ENABLED?React.createElement(q,{gap:"md"},React.createElement(ee,{justify:"space-between",align:"flex-start"},React.createElement(q,{gap:2},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"nyqfpO"})),o?React.createElement(Te,{size:"lg",variant:"light",color:e.theme.primaryColor},o):React.createElement(D,{size:"sm",fs:"italic"},f._({id:"MTqQMG"}))),React.createElement(q,{gap:2,align:"flex-end"},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"ss5emH"})),c?React.createElement(Xr,{size:"sm"}):React.createElement(Te,{size:"lg",variant:"outline"},s||"—"))),a&&React.createElement(A,{color:"red",title:f._({id:"IF5r8v"})},a),r?React.createElement(ee,{justify:"space-between"},React.createElement(Kr,{checked:g,onChange:p=>y(p.currentTarget.checked),label:f._({id:"4tMAUR"}),disabled:!o}),React.createElement(ee,{gap:"xs"},React.createElement(Ne,{variant:"default",onClick:I,disabled:c},f._({id:"lCF0wC"})),React.createElement(Ne,{onClick:h,loading:_,disabled:!!o&&!g},f._({id:"DKa9ch"})))):React.createElement(A,{color:"blue",title:f._({id:"uNQ6eB"})},React.createElement(D,null,f._({id:"B4m81Y"}))),React.createElement(q,{gap:4},React.createElement(Qr,{order:5},f._({id:"ywFj2D"})),React.createElement(tn,{settings:t}))):React.createElement(A,{color:"yellow",title:f._({id:"DerUtL"})},React.createElement(D,null,f._({id:"hsSgoQ"})))}function an(e){return Hr(e),React.createElement(Gr,{i18n:e.i18n,locale:e.locale,loadLocale:zr},React.createElement(rn,{context:e}))}export{an as RenderBatchCodePluginPanel}; +//# sourceMappingURL=Panel.js.map diff --git a/batchcode_plugin/static/Panel.js.map b/batchcode_plugin/static/Panel.js.map new file mode 100644 index 0000000..43c356c --- /dev/null +++ b/batchcode_plugin/static/Panel.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["INVENTREE_PLUGIN_VERSION","ApiEndpoints","ApiEndpoints2","jsxRuntime","reactJsxRuntime_production","hasRequiredReactJsxRuntime_production","requireReactJsxRuntime_production","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","hasRequiredJsxRuntime","requireJsxRuntime","jsxRuntimeExports","DEBUG_BUILD","objectToString","isError","wat","isInstanceOf","isBuiltin","className","isPlainObject","isThenable","base","SDK_VERSION","GLOBAL_OBJ","getMainCarrier","getSentryCarrier","carrier","__SENTRY__","getGlobalSingleton","name","creator","obj","RESOLVED_RUNNER","withRandomSafeContext","cb","sym","globalWithSymbol","safeMathRandom","safeDateNow","getCrypto","gbl","emptyUuid","getRandomByte","uuid4","crypto","c","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","timeOrigin","_cachedTimestampInSeconds","timestampInSeconds","updateSession","session","context","duration","PREFIX","originalConsoleMethods","consoleSandbox","callback","console","wrappedFuncs","wrappedLevels","level","originalConsoleMethod","enable","_getLoggerSettings","disable","isEnabled","log","args","_maybeLog","warn","error","debug","merge","initialObj","mergeObj","levels","output","generateTraceId","addNonEnumerableProperty","value","makeWeakRef","WeakRefImpl","derefWeakRef","ref","SCOPE_SPAN_FIELD","_setSpanForScope","scope","span","_getSpanForScope","truncate","str","max","DEFAULT_MAX_BREADCRUMBS","Scope","newScope","client","lastEventId","user","conversationId","tags","newAttributes","extras","extra","fingerprint","captureContext","scopeToMerge","scopeInstance","attributes","contexts","propagationContext","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","attachment","newData","exception","hint","eventId","syntheticException","message","event","getDefaultCurrentScope","getDefaultIsolationScope","isActualPromise","p","kChainedCopy","chainAndCopyPromiseLike","original","onSuccess","onError","chained","err","copyProps","mutated","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","maybePromiseResult","e","getAsyncContextStack","registry","sentry","withScope","withSetScope","stack","withIsolationScope","getStackAsyncContextStrategy","_isolationScope","getAsyncContextStrategy","getCurrentScope","getIsolationScope","rest","acs","getClient","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","version","isAtLeastReact17","reactVersion","reactMajor","setCause","cause","seenErrors","recurse","error2","cause2","captureReactException","componentStack","errorBoundaryError","WINDOW","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","path","pass","port","projectId","publicKey","dsnFromString","match","lastPath","split","projectMatch","dsnFromComponents","components","validateDsn","component","makeDsn","from","getBaseApiEndpoint","getReportDialogEndpoint","dsnLike","dialogOptions","endpoint","encodedOptions","showReportDialog","options","optionalDocument","injectionPoint","mergedOptions","script","onLoad","onClose","reportDialogClosedMessageHandler","React","INITIAL_STATE","ErrorBoundary","props","errorInfo","beforeCapture","showDialog","handled","onMount","onUnmount","onReset","fallback","children","state","element","defaultAttributes","forwardRef","createElement","createReactComponent","iconName","iconNamePascal","iconNode","Component","color","size","stroke","title","tag","attrs","__iconNode","Subscribable","listener","FocusManager","#focused","#cleanup","#setup","onFocus","setup","focused","isFocused","OnlineManager","#online","onOnline","onlineListener","offlineListener","online","createValue","isReset","IsRestoringContext","Action","Action2","ResultType","ResultType2","AbortedDeferredError","validMutationMethodsArr","validRequestMethodsArr","AwaitContext","RouteContext","RouteErrorContext","RenderErrorBoundary","START_TRANSITION","AwaitRenderStatus","AwaitRenderStatus2","neverSettledPromise","AwaitErrorBoundary","errorElement","resolve","promise","status","renderError","data","ReactDOM","REACT_ROUTER_VERSION","FLUSH_SYNC","USE_ID","DataRouterHook","DataRouterHook2","DataRouterStateHook","DataRouterStateHook2","createJSONStorage","getStorage","storage","_a","parse","str2","newValue","toThenable","fn","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","baseOptions","set","get","api","persistedState","currentState","hasHydrated","hydrationVersion","hydrationListeners","finishHydrationListeners","setItem","savedSetState","replace","configResult","stateFromStorage","hydrate","_b","currentVersion","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","createStoreImpl","createState","listeners","setState","partial","nextState","previousState","getState","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","hotkeys","newHotkeys","details","DEFAULT_PAGE_SIZE","tableKey","sorting","names","columns","I18nProvider","Skeleton","useEffect","useState","tryLoadLocale","locale","loader","loadPluginLocale","i18n","messages","fallbackLocale","defaultLocaleLoader","_locale","LocalizedComponent","loadLocale","loaded","setLoaded","checkPluginVersion","systemVersion","__variableDynamicImportRuntimeHelper","__vitePreload","catch","_i18n","Alert","notifications","useCallback","PREVIEW_URL","GENERATE_URL","SettingsSummary","settings","rows","useMemo","scopes","PER_PART","push","_","id","PER_LOCATION","DAILY_RESET","String","CODE_FORMAT","USE_LOCATION_PREFIX","values","0","LOCATION_FIELD","length","join","TRIGGER_MODE","Table","map","label","Text","Code","BatchCodePanel","canGenerate","can_generate","itemId","currentCode","instance","batch","preview","setPreview","setError","loading","setLoading","busy","setBusy","overwrite","setOverwrite","loadPreview","post","item","then","response","batch_code","finally","generate","code","show","reloadInstance","detail","ENABLED","Stack","Group","Badge","theme","primaryColor","Loader","Switch","currentTarget","checked","Button","Title","RenderBatchCodePluginPanel"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],"sources":["../../frontend/node_modules/@inventreedb/ui/dist/types/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ApiEndpoints.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/Roles.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ModelInformation.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Notification.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime2.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/cjs/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ActionButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/is.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/version.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/worldwide.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/carrier.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/randomSafeContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/misc.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/time.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/session.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/debug-logger.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/merge.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/propagationContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/object.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/weakRef.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/spanOnScope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/string.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/scope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/defaultScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/chain-and-copy-promiselike.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/stackStrategy.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/currentScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/prepareEvent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/exports.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/error.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/helpers.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/dsn.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/api.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/report-dialog.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/errorboundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/components/Boundary.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ButtonMenu.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyButton.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyableCell.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ProgressBar.js","../../frontend/node_modules/@inventreedb/ui/dist/components/YesNoButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js","../../frontend/node_modules/@inventreedb/ui/dist/components/SearchInput.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TableColumnSelect.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TagsList.js","../../frontend/node_modules/@inventreedb/ui/dist/components/InvenTreeTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js","../../frontend/node_modules/@inventreedb/ui/dist/components/RowActions.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorDataOutput.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorBackgroundTask.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-window-event/use-window-event.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-local-storage/create-storage.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseFilterSet.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@remix-run/router/dist/router.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router-dom/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/middleware.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/vanilla.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/react.js","../../frontend/node_modules/@inventreedb/ui/dist/states/LocalLibState.js","../../frontend/node_modules/@inventreedb/ui/dist/components/StylishText.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js","../../frontend/node_modules/@inventreedb/ui/dist/components/nav/DetailDrawer.js","../../frontend/node_modules/@inventreedb/ui/dist/states/StoredTableState.js","../../frontend/node_modules/@inventreedb/ui/dist/plugin/LocalizedComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Events.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.js","../../frontend/src/locales.tsx","../../frontend/src/Panel.tsx"],"sourcesContent":["const INVENTREE_PLUGIN_VERSION = \"1.5.0\";\nconst INVENTREE_REACT_VERSION = \"19.2.7\";\nconst INVENTREE_REACT_DOM_VERSION = (\n // @ts-ignore\n \"19.2.7\"\n);\nconst INVENTREE_MANTINE_VERSION = \"9.2.1\";\nexport {\n INVENTREE_MANTINE_VERSION,\n INVENTREE_PLUGIN_VERSION,\n INVENTREE_REACT_DOM_VERSION,\n INVENTREE_REACT_VERSION\n};\n//# sourceMappingURL=Plugins.js.map\n","var ApiEndpoints = /* @__PURE__ */ ((ApiEndpoints2) => {\n ApiEndpoints2[\"api_server_info\"] = \"\";\n ApiEndpoints2[\"user_list\"] = \"user/\";\n ApiEndpoints2[\"user_set_password\"] = \"user/:id/set-password/\";\n ApiEndpoints2[\"user_tokens\"] = \"user/tokens/\";\n ApiEndpoints2[\"user_simple_login\"] = \"email/generate/\";\n ApiEndpoints2[\"user_me_profile\"] = \"user/me/profile/\";\n ApiEndpoints2[\"user_me_roles\"] = \"user/me/roles/\";\n ApiEndpoints2[\"user_me_token\"] = \"user/me/token/\";\n ApiEndpoints2[\"user_me\"] = \"user/me/\";\n ApiEndpoints2[\"auth_base\"] = \"/auth/\";\n ApiEndpoints2[\"user_reset\"] = \"auth/v1/auth/password/request\";\n ApiEndpoints2[\"user_reset_set\"] = \"auth/v1/auth/password/reset\";\n ApiEndpoints2[\"auth_pwd_change\"] = \"auth/v1/account/password/change\";\n ApiEndpoints2[\"auth_login\"] = \"auth/v1/auth/login\";\n ApiEndpoints2[\"auth_login_2fa\"] = \"auth/v1/auth/2fa/authenticate\";\n ApiEndpoints2[\"auth_session\"] = \"auth/v1/auth/session\";\n ApiEndpoints2[\"auth_signup\"] = \"auth/v1/auth/signup\";\n ApiEndpoints2[\"auth_authenticators\"] = \"auth/v1/account/authenticators\";\n ApiEndpoints2[\"auth_recovery\"] = \"auth/v1/account/authenticators/recovery-codes\";\n ApiEndpoints2[\"auth_mfa_reauthenticate\"] = \"auth/v1/auth/2fa/reauthenticate\";\n ApiEndpoints2[\"auth_totp\"] = \"auth/v1/account/authenticators/totp\";\n ApiEndpoints2[\"auth_trust\"] = \"auth/v1/auth/2fa/trust\";\n ApiEndpoints2[\"auth_webauthn\"] = \"auth/v1/account/authenticators/webauthn\";\n ApiEndpoints2[\"auth_webauthn_login\"] = \"auth/v1/auth/webauthn/authenticate\";\n ApiEndpoints2[\"auth_reauthenticate\"] = \"auth/v1/auth/reauthenticate\";\n ApiEndpoints2[\"auth_email\"] = \"auth/v1/account/email\";\n ApiEndpoints2[\"auth_email_verify\"] = \"auth/v1/auth/email/verify\";\n ApiEndpoints2[\"auth_providers\"] = \"auth/v1/account/providers\";\n ApiEndpoints2[\"auth_provider_redirect\"] = \"auth/v1/auth/provider/redirect\";\n ApiEndpoints2[\"auth_config\"] = \"auth/v1/config\";\n ApiEndpoints2[\"currency_list\"] = \"currency/exchange/\";\n ApiEndpoints2[\"currency_refresh\"] = \"currency/refresh/\";\n ApiEndpoints2[\"all_units\"] = \"units/all/\";\n ApiEndpoints2[\"task_overview\"] = \"background-task/\";\n ApiEndpoints2[\"task_pending_list\"] = \"background-task/pending/\";\n ApiEndpoints2[\"task_scheduled_list\"] = \"background-task/scheduled/\";\n ApiEndpoints2[\"task_failed_list\"] = \"background-task/failed/\";\n ApiEndpoints2[\"api_search\"] = \"search/\";\n ApiEndpoints2[\"settings_global_list\"] = \"settings/global/\";\n ApiEndpoints2[\"settings_user_list\"] = \"settings/user/\";\n ApiEndpoints2[\"news\"] = \"news/\";\n ApiEndpoints2[\"global_status\"] = \"generic/status/\";\n ApiEndpoints2[\"custom_state_list\"] = \"generic/status/custom/\";\n ApiEndpoints2[\"version\"] = \"version/\";\n ApiEndpoints2[\"license\"] = \"license/\";\n ApiEndpoints2[\"group_list\"] = \"user/group/\";\n ApiEndpoints2[\"owner_list\"] = \"user/owner/\";\n ApiEndpoints2[\"ruleset_list\"] = \"user/ruleset/\";\n ApiEndpoints2[\"content_type_list\"] = \"contenttype/\";\n ApiEndpoints2[\"icons\"] = \"icons/\";\n ApiEndpoints2[\"selectionlist_list\"] = \"selection/\";\n ApiEndpoints2[\"selectionentry_list\"] = \"selection/:id/entry/\";\n ApiEndpoints2[\"barcode\"] = \"barcode/\";\n ApiEndpoints2[\"barcode_history\"] = \"barcode/history/\";\n ApiEndpoints2[\"barcode_link\"] = \"barcode/link/\";\n ApiEndpoints2[\"barcode_unlink\"] = \"barcode/unlink/\";\n ApiEndpoints2[\"barcode_generate\"] = \"barcode/generate/\";\n ApiEndpoints2[\"data_output\"] = \"data-output/\";\n ApiEndpoints2[\"import_session_list\"] = \"importer/session/\";\n ApiEndpoints2[\"import_session_accept_fields\"] = \"importer/session/:id/accept_fields/\";\n ApiEndpoints2[\"import_session_accept_rows\"] = \"importer/session/:id/accept_rows/\";\n ApiEndpoints2[\"import_session_column_mapping_list\"] = \"importer/column-mapping/\";\n ApiEndpoints2[\"import_session_row_list\"] = \"importer/row/\";\n ApiEndpoints2[\"notifications_list\"] = \"notifications/\";\n ApiEndpoints2[\"notifications_readall\"] = \"notifications/readall/\";\n ApiEndpoints2[\"build_order_list\"] = \"build/\";\n ApiEndpoints2[\"build_order_issue\"] = \"build/:id/issue/\";\n ApiEndpoints2[\"build_order_cancel\"] = \"build/:id/cancel/\";\n ApiEndpoints2[\"build_order_hold\"] = \"build/:id/hold/\";\n ApiEndpoints2[\"build_order_complete\"] = \"build/:id/finish/\";\n ApiEndpoints2[\"build_output_complete\"] = \"build/:id/complete/\";\n ApiEndpoints2[\"build_output_create\"] = \"build/:id/create-output/\";\n ApiEndpoints2[\"build_output_scrap\"] = \"build/:id/scrap-outputs/\";\n ApiEndpoints2[\"build_output_delete\"] = \"build/:id/delete-outputs/\";\n ApiEndpoints2[\"build_order_auto_allocate\"] = \"build/:id/auto-allocate/\";\n ApiEndpoints2[\"build_order_allocate\"] = \"build/:id/allocate/\";\n ApiEndpoints2[\"build_order_consume\"] = \"build/:id/consume/\";\n ApiEndpoints2[\"build_order_deallocate\"] = \"build/:id/unallocate/\";\n ApiEndpoints2[\"build_line_list\"] = \"build/line/\";\n ApiEndpoints2[\"build_item_list\"] = \"build/item/\";\n ApiEndpoints2[\"bom_list\"] = \"bom/\";\n ApiEndpoints2[\"bom_item_validate\"] = \"bom/:id/validate/\";\n ApiEndpoints2[\"bom_validate\"] = \"part/:id/bom-validate/\";\n ApiEndpoints2[\"bom_substitute_list\"] = \"bom/substitute/\";\n ApiEndpoints2[\"part_list\"] = \"part/\";\n ApiEndpoints2[\"part_thumbs_list\"] = \"part/thumbs/\";\n ApiEndpoints2[\"part_pricing\"] = \"part/:id/pricing/\";\n ApiEndpoints2[\"part_requirements\"] = \"part/:id/requirements/\";\n ApiEndpoints2[\"part_serial_numbers\"] = \"part/:id/serial-numbers/\";\n ApiEndpoints2[\"part_scheduling\"] = \"part/:id/scheduling/\";\n ApiEndpoints2[\"part_pricing_internal\"] = \"part/internal-price/\";\n ApiEndpoints2[\"part_pricing_sale\"] = \"part/sale-price/\";\n ApiEndpoints2[\"part_stocktake_list\"] = \"part/stocktake/\";\n ApiEndpoints2[\"part_stocktake_generate\"] = \"part/stocktake/generate/\";\n ApiEndpoints2[\"category_list\"] = \"part/category/\";\n ApiEndpoints2[\"category_tree\"] = \"part/category/tree/\";\n ApiEndpoints2[\"category_parameter_list\"] = \"part/category/parameters/\";\n ApiEndpoints2[\"related_part_list\"] = \"part/related/\";\n ApiEndpoints2[\"part_test_template_list\"] = \"part/test-template/\";\n ApiEndpoints2[\"company_list\"] = \"company/\";\n ApiEndpoints2[\"contact_list\"] = \"company/contact/\";\n ApiEndpoints2[\"address_list\"] = \"company/address/\";\n ApiEndpoints2[\"supplier_part_list\"] = \"company/part/\";\n ApiEndpoints2[\"supplier_part_pricing_list\"] = \"company/price-break/\";\n ApiEndpoints2[\"manufacturer_part_list\"] = \"company/part/manufacturer/\";\n ApiEndpoints2[\"stock_location_list\"] = \"stock/location/\";\n ApiEndpoints2[\"stock_location_type_list\"] = \"stock/location-type/\";\n ApiEndpoints2[\"stock_location_tree\"] = \"stock/location/tree/\";\n ApiEndpoints2[\"stock_item_list\"] = \"stock/\";\n ApiEndpoints2[\"stock_tracking_list\"] = \"stock/track/\";\n ApiEndpoints2[\"stock_test_result_list\"] = \"stock/test/\";\n ApiEndpoints2[\"stock_transfer\"] = \"stock/transfer/\";\n ApiEndpoints2[\"stock_remove\"] = \"stock/remove/\";\n ApiEndpoints2[\"stock_return\"] = \"stock/return/\";\n ApiEndpoints2[\"stock_add\"] = \"stock/add/\";\n ApiEndpoints2[\"stock_count\"] = \"stock/count/\";\n ApiEndpoints2[\"stock_change_status\"] = \"stock/change_status/\";\n ApiEndpoints2[\"stock_merge\"] = \"stock/merge/\";\n ApiEndpoints2[\"stock_assign\"] = \"stock/assign/\";\n ApiEndpoints2[\"stock_status\"] = \"stock/status/\";\n ApiEndpoints2[\"stock_convert\"] = \"stock/:id/convert/\";\n ApiEndpoints2[\"stock_disassemble\"] = \"stock/:id/disassemble/\";\n ApiEndpoints2[\"stock_install\"] = \"stock/:id/install/\";\n ApiEndpoints2[\"stock_uninstall\"] = \"stock/:id/uninstall/\";\n ApiEndpoints2[\"stock_serialize\"] = \"stock/:id/serialize/\";\n ApiEndpoints2[\"stock_serial_info\"] = \"stock/:id/serial-numbers/\";\n ApiEndpoints2[\"generate_batch_code\"] = \"generate/batch-code/\";\n ApiEndpoints2[\"generate_serial_number\"] = \"generate/serial-number/\";\n ApiEndpoints2[\"purchase_order_list\"] = \"order/po/\";\n ApiEndpoints2[\"purchase_order_issue\"] = \"order/po/:id/issue/\";\n ApiEndpoints2[\"purchase_order_hold\"] = \"order/po/:id/hold/\";\n ApiEndpoints2[\"purchase_order_cancel\"] = \"order/po/:id/cancel/\";\n ApiEndpoints2[\"purchase_order_complete\"] = \"order/po/:id/complete/\";\n ApiEndpoints2[\"purchase_order_line_list\"] = \"order/po-line/\";\n ApiEndpoints2[\"purchase_order_extra_line_list\"] = \"order/po-extra-line/\";\n ApiEndpoints2[\"purchase_order_receive\"] = \"order/po/:id/receive/\";\n ApiEndpoints2[\"sales_order_list\"] = \"order/so/\";\n ApiEndpoints2[\"sales_order_issue\"] = \"order/so/:id/issue/\";\n ApiEndpoints2[\"sales_order_hold\"] = \"order/so/:id/hold/\";\n ApiEndpoints2[\"sales_order_cancel\"] = \"order/so/:id/cancel/\";\n ApiEndpoints2[\"sales_order_ship\"] = \"order/so/:id/ship/\";\n ApiEndpoints2[\"sales_order_complete\"] = \"order/so/:id/complete/\";\n ApiEndpoints2[\"sales_order_allocate\"] = \"order/so/:id/allocate/\";\n ApiEndpoints2[\"sales_order_allocate_serials\"] = \"order/so/:id/allocate-serials/\";\n ApiEndpoints2[\"sales_order_auto_allocate\"] = \"order/so/:id/auto-allocate/\";\n ApiEndpoints2[\"sales_order_line_list\"] = \"order/so-line/\";\n ApiEndpoints2[\"sales_order_extra_line_list\"] = \"order/so-extra-line/\";\n ApiEndpoints2[\"sales_order_allocation_list\"] = \"order/so-allocation/\";\n ApiEndpoints2[\"sales_order_shipment_list\"] = \"order/so/shipment/\";\n ApiEndpoints2[\"sales_order_shipment_complete\"] = \"order/so/shipment/:id/ship/\";\n ApiEndpoints2[\"return_order_list\"] = \"order/ro/\";\n ApiEndpoints2[\"return_order_issue\"] = \"order/ro/:id/issue/\";\n ApiEndpoints2[\"return_order_hold\"] = \"order/ro/:id/hold/\";\n ApiEndpoints2[\"return_order_cancel\"] = \"order/ro/:id/cancel/\";\n ApiEndpoints2[\"return_order_complete\"] = \"order/ro/:id/complete/\";\n ApiEndpoints2[\"return_order_receive\"] = \"order/ro/:id/receive/\";\n ApiEndpoints2[\"return_order_line_list\"] = \"order/ro-line/\";\n ApiEndpoints2[\"return_order_extra_line_list\"] = \"order/ro-extra-line/\";\n ApiEndpoints2[\"transfer_order_list\"] = \"order/transfer-order/\";\n ApiEndpoints2[\"transfer_order_issue\"] = \"order/transfer-order/:id/issue/\";\n ApiEndpoints2[\"transfer_order_hold\"] = \"order/transfer-order/:id/hold/\";\n ApiEndpoints2[\"transfer_order_cancel\"] = \"order/transfer-order/:id/cancel/\";\n ApiEndpoints2[\"transfer_order_complete\"] = \"order/transfer-order/:id/complete/\";\n ApiEndpoints2[\"transfer_order_allocate\"] = \"order/transfer-order/:id/allocate/\";\n ApiEndpoints2[\"transfer_order_allocate_serials\"] = \"order/transfer-order/:id/allocate-serials/\";\n ApiEndpoints2[\"transfer_order_line_list\"] = \"order/transfer-order-line/\";\n ApiEndpoints2[\"transfer_order_allocation_list\"] = \"order/transfer-order-allocation/\";\n ApiEndpoints2[\"label_list\"] = \"label/template/\";\n ApiEndpoints2[\"label_print\"] = \"label/print/\";\n ApiEndpoints2[\"report_list\"] = \"report/template/\";\n ApiEndpoints2[\"report_print\"] = \"report/print/\";\n ApiEndpoints2[\"report_snippet\"] = \"report/snippet/\";\n ApiEndpoints2[\"report_asset\"] = \"report/asset/\";\n ApiEndpoints2[\"plugin_list\"] = \"plugins/\";\n ApiEndpoints2[\"plugin_setting_list\"] = \"plugins/:plugin/settings/\";\n ApiEndpoints2[\"plugin_user_setting_list\"] = \"plugins/:plugin/user-settings/\";\n ApiEndpoints2[\"plugin_registry_status\"] = \"plugins/status/\";\n ApiEndpoints2[\"plugin_install\"] = \"plugins/install/\";\n ApiEndpoints2[\"plugin_reload\"] = \"plugins/reload/\";\n ApiEndpoints2[\"plugin_activate\"] = \"plugins/:key/activate/\";\n ApiEndpoints2[\"plugin_uninstall\"] = \"plugins/:key/uninstall/\";\n ApiEndpoints2[\"plugin_admin\"] = \"plugins/:key/admin/\";\n ApiEndpoints2[\"plugin_ui_features_list\"] = \"plugins/ui/features/:feature_type/\";\n ApiEndpoints2[\"plugin_locate_item\"] = \"locate/\";\n ApiEndpoints2[\"plugin_supplier_list\"] = \"supplier/list/\";\n ApiEndpoints2[\"plugin_supplier_search\"] = \"supplier/search/\";\n ApiEndpoints2[\"plugin_supplier_import\"] = \"supplier/import/\";\n ApiEndpoints2[\"machine_types_list\"] = \"machine/types/\";\n ApiEndpoints2[\"machine_driver_list\"] = \"machine/drivers/\";\n ApiEndpoints2[\"machine_registry_status\"] = \"machine/status/\";\n ApiEndpoints2[\"machine_list\"] = \"machine/\";\n ApiEndpoints2[\"machine_restart\"] = \"machine/:machine/restart/\";\n ApiEndpoints2[\"machine_setting_list\"] = \"machine/:machine/settings/\";\n ApiEndpoints2[\"machine_setting_detail\"] = \"machine/:machine/settings/:config_type/\";\n ApiEndpoints2[\"attachment_list\"] = \"attachment/\";\n ApiEndpoints2[\"error_report_list\"] = \"error-report/\";\n ApiEndpoints2[\"project_code_list\"] = \"project-code/\";\n ApiEndpoints2[\"custom_unit_list\"] = \"units/\";\n ApiEndpoints2[\"notes_image_upload\"] = \"notes-image-upload/\";\n ApiEndpoints2[\"email_list\"] = \"admin/email/\";\n ApiEndpoints2[\"email_test\"] = \"admin/email/test/\";\n ApiEndpoints2[\"config_list\"] = \"admin/config/\";\n ApiEndpoints2[\"parameter_list\"] = \"parameter/\";\n ApiEndpoints2[\"parameter_template_list\"] = \"parameter/template/\";\n ApiEndpoints2[\"tag_list\"] = \"tag/\";\n ApiEndpoints2[\"system_internal_trace_end\"] = \"system-internal/observability/end\";\n return ApiEndpoints2;\n})(ApiEndpoints || {});\nexport {\n ApiEndpoints\n};\n//# sourceMappingURL=ApiEndpoints.js.map\n","window[\"LinguiCore\"].i18n;\nvar UserRoles = /* @__PURE__ */ ((UserRoles2) => {\n UserRoles2[\"admin\"] = \"admin\";\n UserRoles2[\"bom\"] = \"bom\";\n UserRoles2[\"build\"] = \"build\";\n UserRoles2[\"part\"] = \"part\";\n UserRoles2[\"part_category\"] = \"part_category\";\n UserRoles2[\"purchase_order\"] = \"purchase_order\";\n UserRoles2[\"return_order\"] = \"return_order\";\n UserRoles2[\"transfer_order\"] = \"transfer_order\";\n UserRoles2[\"sales_order\"] = \"sales_order\";\n UserRoles2[\"stock\"] = \"stock\";\n UserRoles2[\"stock_location\"] = \"stock_location\";\n return UserRoles2;\n})(UserRoles || {});\nvar UserPermissions = /* @__PURE__ */ ((UserPermissions2) => {\n UserPermissions2[\"view\"] = \"view\";\n UserPermissions2[\"add\"] = \"add\";\n UserPermissions2[\"change\"] = \"change\";\n UserPermissions2[\"delete\"] = \"delete\";\n return UserPermissions2;\n})(UserPermissions || {});\nexport {\n UserPermissions,\n UserRoles\n};\n//# sourceMappingURL=Roles.js.map\n","import { ApiEndpoints } from \"./ApiEndpoints.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ModelInformationDict = {\n part: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"vgP+9p\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"pmRbKZ\"\n }\n ),\n url_overview: \"/part/category/index/parts\",\n url_detail: \"/part/:pk/\",\n api_endpoint: ApiEndpoints.part_list,\n admin_url: \"/part/part/\",\n supports_barcode: true,\n icon: \"part\"\n },\n parameter: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"T/87By\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F18WP3\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_list,\n icon: \"list_details\"\n },\n parametertemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"+nwoLk\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"ciZG57\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_template_list,\n admin_url: \"/common/parametertemplate/\",\n icon: \"list\"\n },\n parttesttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"75lDy5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"KevMsQ\"\n }\n ),\n url_detail: \"/parttesttemplate/:pk/\",\n api_endpoint: ApiEndpoints.part_test_template_list,\n icon: \"test\"\n },\n supplierpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"nne72x\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"FcNRrt\"\n }\n ),\n url_overview: \"/purchasing/index/supplier-parts\",\n url_detail: \"/purchasing/supplier-part/:pk/\",\n api_endpoint: ApiEndpoints.supplier_part_list,\n admin_url: \"/company/supplierpart/\",\n supports_barcode: true,\n icon: \"supplier_part\",\n default_query_params: {\n part_detail: true,\n supplier_detail: true,\n manufacturer_detail: true\n }\n },\n manufacturerpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"bisS0I\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"d0fBfb\"\n }\n ),\n url_overview: \"/purchasing/index/manufacturer-parts\",\n url_detail: \"/purchasing/manufacturer-part/:pk/\",\n api_endpoint: ApiEndpoints.manufacturer_part_list,\n admin_url: \"/company/manufacturerpart/\",\n supports_barcode: true,\n icon: \"manufacturers\",\n default_query_params: {\n part_detail: true,\n manufacturer_detail: true\n }\n },\n partcategory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"QXANxH\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2GkbLI\"\n }\n ),\n url_overview: \"/part/category/parts/subcategories\",\n url_detail: \"/part/category/:pk/\",\n api_endpoint: ApiEndpoints.category_list,\n admin_url: \"/part/partcategory/\",\n icon: \"category\"\n },\n stockitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"igx8Og\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Jbck4N\"\n }\n ),\n url_overview: \"/stock/location/index/stock-items\",\n url_detail: \"/stock/item/:pk/\",\n api_endpoint: ApiEndpoints.stock_item_list,\n admin_url: \"/stock/stockitem/\",\n supports_barcode: true,\n icon: \"stock\",\n default_query_params: {\n part_detail: true\n }\n },\n stocklocation: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"adXdas\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1eBWAw\"\n }\n ),\n url_overview: \"/stock/location\",\n url_detail: \"/stock/location/:pk/\",\n api_endpoint: ApiEndpoints.stock_location_list,\n admin_url: \"/stock/stocklocation/\",\n supports_barcode: true,\n icon: \"location\"\n },\n stocklocationtype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"DjwC2f\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"vkPSyZ\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_location_type_list,\n icon: \"location\"\n },\n stockhistory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"cE4TWF\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"rewkgt\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_tracking_list,\n icon: \"history\"\n },\n build: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"YxwWvi\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"RCVhIP\"\n }\n ),\n url_overview: \"/manufacturing/index/buildorders/\",\n url_detail: \"/manufacturing/build-order/:pk/\",\n api_endpoint: ApiEndpoints.build_order_list,\n admin_url: \"/build/build/\",\n supports_barcode: true,\n icon: \"build_order\",\n default_query_params: {\n part_detail: true\n }\n },\n buildline: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"9TLpo1\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CRYIQ0\"\n }\n ),\n url_overview: \"/build/line\",\n url_detail: \"/build/line/:pk/\",\n api_endpoint: ApiEndpoints.build_line_list,\n icon: \"build_order\"\n },\n builditem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LN2ON5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"A7FuwR\"\n }\n ),\n api_endpoint: ApiEndpoints.build_item_list,\n icon: \"build_order\"\n },\n company: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7i8j3G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"s2QZS6\"\n }\n ),\n url_detail: \"/company/:pk/\",\n api_endpoint: ApiEndpoints.company_list,\n admin_url: \"/company/company/\",\n icon: \"building\"\n },\n projectcode: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Sdfr6G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"AklCpf\"\n }\n ),\n url_detail: \"/project-code/:pk/\",\n api_endpoint: ApiEndpoints.project_code_list,\n icon: \"list_details\"\n },\n purchaseorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"KxySMG\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"85Yvr2\"\n }\n ),\n url_overview: \"/purchasing/index/purchaseorders\",\n url_detail: \"/purchasing/purchase-order/:pk/\",\n api_endpoint: ApiEndpoints.purchase_order_list,\n admin_url: \"/order/purchaseorder/\",\n supports_barcode: true,\n icon: \"purchase_orders\",\n default_query_params: {\n supplier_detail: true\n }\n },\n purchaseorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Enr0Pf\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"MXjnQS\"\n }\n ),\n api_endpoint: ApiEndpoints.purchase_order_line_list,\n icon: \"purchase_orders\"\n },\n salesorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LozYBo\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"B1TL+X\"\n }\n ),\n url_overview: \"/sales/index/salesorders\",\n url_detail: \"/sales/sales-order/:pk/\",\n api_endpoint: ApiEndpoints.sales_order_list,\n admin_url: \"/order/salesorder/\",\n supports_barcode: true,\n icon: \"sales_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n salesordershipment: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"qGSobR\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"D/EkfS\"\n }\n ),\n url_overview: \"/sales/index/shipments\",\n url_detail: \"/sales/shipment/:pk/\",\n admin_url: \"/order/salesordershipment/\",\n api_endpoint: ApiEndpoints.sales_order_shipment_list,\n supports_barcode: true,\n icon: \"shipment\",\n default_query_params: {\n order_detail: true\n }\n },\n returnorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Z6ve1w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"LlTg8M\"\n }\n ),\n url_overview: \"/sales/index/returnorders\",\n url_detail: \"/sales/return-order/:pk/\",\n api_endpoint: ApiEndpoints.return_order_list,\n admin_url: \"/order/returnorder/\",\n supports_barcode: true,\n icon: \"return_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n returnorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Frsz7D\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"4dCpFa\"\n }\n ),\n api_endpoint: ApiEndpoints.return_order_line_list,\n icon: \"return_orders\"\n },\n transferorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"8P0cA/\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"IxhZtQ\"\n }\n ),\n url_overview: \"/stock/location/index/transfer-orders\",\n url_detail: \"/stock/transfer-order/:pk/\",\n api_endpoint: ApiEndpoints.transfer_order_list,\n admin_url: \"/order/transferorder/\",\n supports_barcode: true,\n icon: \"transfer_orders\"\n },\n transferorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"VKydzB\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"VkSETm\"\n }\n ),\n api_endpoint: ApiEndpoints.transfer_order_line_list,\n icon: \"transfer-orders\"\n },\n address: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Du6bPw\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"bYmAV1\"\n }\n ),\n url_detail: \"/address/:pk/\",\n api_endpoint: ApiEndpoints.address_list,\n icon: \"address\"\n },\n contact: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"jfC/xh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"gVfVfe\"\n }\n ),\n url_detail: \"/contact/:pk/\",\n api_endpoint: ApiEndpoints.contact_list,\n icon: \"group\"\n },\n owner: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LtI9AS\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CYRJEX\"\n }\n ),\n url_detail: \"/owner/:pk/\",\n api_endpoint: ApiEndpoints.owner_list,\n icon: \"group\"\n },\n user: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7PzzBU\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Sxm8rQ\"\n }\n ),\n url_detail: \"/core/user/:pk/\",\n api_endpoint: ApiEndpoints.user_list,\n icon: \"user\"\n },\n group: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"L8fEEm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"zhrjek\"\n }\n ),\n url_detail: \"/core/group/:pk/\",\n api_endpoint: ApiEndpoints.group_list,\n admin_url: \"/auth/group/\",\n icon: \"group\"\n },\n importsession: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"e5WBGh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1dn8uK\"\n }\n ),\n url_overview: \"/settings/admin/import\",\n url_detail: \"/import/:pk/\",\n api_endpoint: ApiEndpoints.import_session_list,\n icon: \"import\"\n },\n labeltemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"aKf3M5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"0qHiFS\"\n }\n ),\n url_overview: \"/settings/admin/labels\",\n url_detail: \"/settings/admin/labels/:pk/\",\n api_endpoint: ApiEndpoints.label_list,\n icon: \"labels\"\n },\n reporttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"F/A+39\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"SX006I\"\n }\n ),\n url_overview: \"/settings/admin/reports\",\n url_detail: \"/settings/admin/reports/:pk/\",\n api_endpoint: ApiEndpoints.report_list,\n icon: \"reports\"\n },\n pluginconfig: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"BFm1Jm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"7ybWp/\"\n }\n ),\n url_overview: \"/settings/admin/plugin\",\n url_detail: \"/settings/admin/plugin/:pk/\",\n api_endpoint: ApiEndpoints.plugin_list,\n icon: \"plugin\"\n },\n contenttype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"f9cDxV\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F7Jcuy\"\n }\n ),\n api_endpoint: ApiEndpoints.content_type_list,\n icon: \"list_details\"\n },\n selectionlist: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"ifEZiy\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2q2/qs\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionlist_list,\n icon: \"list_details\"\n },\n selectionentry: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"0Mx1/T\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"jDVRSq\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionentry_list,\n icon: \"list_details\"\n },\n error: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"SlfejT\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"UirGxE\"\n }\n ),\n api_endpoint: ApiEndpoints.error_report_list,\n url_overview: \"/settings/admin/errors\",\n url_detail: \"/settings/admin/errors/:pk/\",\n icon: \"exclamation\"\n },\n tag: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"UL8A9w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"OYHzN1\"\n }\n ),\n api_endpoint: ApiEndpoints.tag_list,\n icon: \"tag\"\n }\n};\nexport {\n ModelInformationDict\n};\n//# sourceMappingURL=ModelInformation.js.map\n","import { getHotkeyMatcher } from \"./parse-hotkey.js\";\nconst useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable = false) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) return !tagsToIgnore.includes(event.target.tagName);\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n return true;\n}\nfunction useHotkeys(hotkeys, tagsToIgnore = [\n \"INPUT\",\n \"TEXTAREA\",\n \"SELECT\"\n], triggerOnContentEditable = false) {\n const handleKeydown = useEffectEvent((event) => {\n hotkeys.forEach(([hotkey, handler, options = {\n preventDefault: true,\n usePhysicalKeys: false\n }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) && shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)) {\n if (options.preventDefault) event.preventDefault();\n handler(event);\n }\n });\n });\n useEffect(() => {\n document.documentElement.addEventListener(\"keydown\", handleKeydown);\n return () => document.documentElement.removeEventListener(\"keydown\", handleKeydown);\n }, []);\n}\nexport {\n useHotkeys\n};\n//# sourceMappingURL=use-hotkeys.js.map\n","const _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nfunction notYetImplemented() {\n notifications.hide(\"not-implemented\");\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"ipE2p4\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"WvSApV\"\n }\n ),\n color: \"red\",\n id: \"not-implemented\"\n });\n}\nfunction permissionDenied() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"JUwB5j\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"3WjGlZ\"\n }\n ),\n color: \"red\"\n });\n}\nfunction invalidResponse(returnCode) {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"J7PX+R\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"78bD8l\",\n values: {\n returnCode\n }\n }\n ),\n color: \"red\"\n });\n}\nfunction showTimeoutNotification() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"xY9s5E\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"g/KPkG\"\n }\n ),\n color: \"red\"\n });\n}\nexport {\n invalidResponse,\n notYetImplemented,\n permissionDenied,\n showTimeoutNotification\n};\n//# sourceMappingURL=Notification.js.map\n","var jsxRuntime = { exports: {} };\nexport {\n jsxRuntime as __module\n};\n//# sourceMappingURL=jsx-runtime2.js.map\n","var reactJsxRuntime_production = {};\nexport {\n reactJsxRuntime_production as __exports\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __exports as reactJsxRuntime_production } from \"../../../_virtual/react-jsx-runtime.production.js\";\nvar hasRequiredReactJsxRuntime_production;\nfunction requireReactJsxRuntime_production() {\n if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production;\n hasRequiredReactJsxRuntime_production = 1;\n var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.transitional.element\"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.fragment\");\n function jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n }\n reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE;\n reactJsxRuntime_production.jsx = jsxProd;\n reactJsxRuntime_production.jsxs = jsxProd;\n return reactJsxRuntime_production;\n}\nexport {\n requireReactJsxRuntime_production as __require\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __module as jsxRuntime } from \"../../_virtual/jsx-runtime2.js\";\nimport { __require as requireReactJsxRuntime_production } from \"./cjs/react-jsx-runtime.production.js\";\nvar hasRequiredJsxRuntime;\nfunction requireJsxRuntime() {\n if (hasRequiredJsxRuntime) return jsxRuntime.exports;\n hasRequiredJsxRuntime = 1;\n {\n jsxRuntime.exports = requireReactJsxRuntime_production();\n }\n return jsxRuntime.exports;\n}\nexport {\n requireJsxRuntime as __require\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { __require as requireJsxRuntime } from \"../node_modules/react/jsx-runtime.js\";\nvar jsxRuntimeExports = requireJsxRuntime();\nexport {\n jsxRuntimeExports as j\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { identifierString } from \"../functions/Conversion.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Group = window[\"MantineCore\"].Group;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ActionButton(props) {\n const hidden = props.hidden ?? false;\n return !hidden && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { disabled: !props.tooltip && !props.text, label: props.tooltip ?? props.text, position: props.tooltipAlignment ?? \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { disabled: props.disabled, p: 17, radius: props.radius ?? \"xs\", color: props.color, size: props.size, \"aria-label\": `action-button-${identifierString(props.tooltip ?? props.text ?? \"\")}`, onClick: (event) => {\n props.onClick(event);\n }, variant: props.variant ?? \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Group, { gap: \"xs\", wrap: \"nowrap\", children: props.icon }) }, `action-icon-${props.tooltip ?? props.text}`) }, `tooltip-${props.tooltip ?? props.text}`);\n}\nexport {\n ActionButton\n};\n//# sourceMappingURL=ActionButton.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","const objectToString = Object.prototype.toString;\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case \"[object Error]\":\n case \"[object Exception]\":\n case \"[object DOMException]\":\n case \"[object WebAssembly.Exception]\":\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\nfunction isPlainObject(wat) {\n return isBuiltin(wat, \"Object\");\n}\nfunction isThenable(wat) {\n return Boolean(wat?.then && typeof wat.then === \"function\");\n}\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch {\n return false;\n }\n}\nexport {\n isError,\n isInstanceOf,\n isPlainObject,\n isThenable\n};\n//# sourceMappingURL=is.js.map\n","const SDK_VERSION = \"10.70.0\";\nexport {\n SDK_VERSION\n};\n//# sourceMappingURL=version.js.map\n","const GLOBAL_OBJ = globalThis;\nexport {\n GLOBAL_OBJ\n};\n//# sourceMappingURL=worldwide.js.map\n","import { SDK_VERSION } from \"./utils/version.js\";\nimport { GLOBAL_OBJ } from \"./utils/worldwide.js\";\nfunction getMainCarrier() {\n getSentryCarrier(GLOBAL_OBJ);\n return GLOBAL_OBJ;\n}\nfunction getSentryCarrier(carrier) {\n const __SENTRY__ = carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n return __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n}\nfunction getGlobalSingleton(name, creator, obj = GLOBAL_OBJ) {\n const __SENTRY__ = obj.__SENTRY__ = obj.__SENTRY__ || {};\n const carrier = __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n return carrier[name] || (carrier[name] = creator());\n}\nexport {\n getGlobalSingleton,\n getMainCarrier,\n getSentryCarrier\n};\n//# sourceMappingURL=carrier.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nlet RESOLVED_RUNNER;\nfunction withRandomSafeContext(cb) {\n if (RESOLVED_RUNNER !== void 0) {\n return RESOLVED_RUNNER ? RESOLVED_RUNNER(cb) : cb();\n }\n const sym = /* @__PURE__ */ Symbol.for(\"__SENTRY_SAFE_RANDOM_ID_WRAPPER__\");\n const globalWithSymbol = GLOBAL_OBJ;\n if (sym in globalWithSymbol && typeof globalWithSymbol[sym] === \"function\") {\n RESOLVED_RUNNER = globalWithSymbol[sym];\n return RESOLVED_RUNNER(cb);\n }\n RESOLVED_RUNNER = null;\n return cb();\n}\nfunction safeMathRandom() {\n return withRandomSafeContext(() => Math.random());\n}\nfunction safeDateNow() {\n return withRandomSafeContext(() => Date.now());\n}\nexport {\n safeDateNow,\n safeMathRandom,\n withRandomSafeContext\n};\n//# sourceMappingURL=randomSafeContext.js.map\n","import { withRandomSafeContext, safeMathRandom } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction getCrypto() {\n const gbl = GLOBAL_OBJ;\n return gbl.crypto || gbl.msCrypto;\n}\nlet emptyUuid;\nfunction getRandomByte() {\n return safeMathRandom() * 16;\n}\nfunction uuid4(crypto = getCrypto()) {\n try {\n if (crypto?.randomUUID) {\n return withRandomSafeContext(() => crypto.randomUUID()).replace(/-/g, \"\");\n }\n } catch {\n }\n if (!emptyUuid) {\n emptyUuid = \"10000000100040008000\" + 1e11;\n }\n return emptyUuid.replace(\n /[018]/g,\n (c) => (\n // eslint-disable-next-line no-bitwise\n (c ^ (getRandomByte() & 15) >> c / 4).toString(16)\n )\n );\n}\nexport {\n uuid4\n};\n//# sourceMappingURL=misc.js.map\n","import { safeDateNow, withRandomSafeContext } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst ONE_SECOND_IN_MS = 1e3;\nfunction dateTimestampInSeconds() {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\nfunction createUnixTimestampInSecondsFunc() {\n const { performance } = GLOBAL_OBJ;\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n const timeOrigin = performance.timeOrigin;\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\nlet _cachedTimestampInSeconds;\nfunction timestampInSeconds() {\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\nexport {\n dateTimestampInSeconds,\n timestampInSeconds\n};\n//# sourceMappingURL=time.js.map\n","import { uuid4 } from \"./utils/misc.js\";\nimport { timestampInSeconds } from \"./utils/time.js\";\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n session.timestamp = context.timestamp || timestampInSeconds();\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== void 0) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === \"number\") {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = void 0;\n } else if (typeof context.duration === \"number\") {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === \"number\") {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\nexport {\n updateSession\n};\n//# sourceMappingURL=session.js.map\n","import { getGlobalSingleton } from \"../carrier.js\";\nimport { DEBUG_BUILD } from \"../debug-build.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst PREFIX = \"Sentry Logger \";\nconst originalConsoleMethods = {};\nfunction consoleSandbox(callback) {\n if (!(\"console\" in GLOBAL_OBJ)) {\n return callback();\n }\n const console = GLOBAL_OBJ.console;\n const wrappedFuncs = {};\n const wrappedLevels = Object.keys(originalConsoleMethods);\n wrappedLevels.forEach((level) => {\n const originalConsoleMethod = originalConsoleMethods[level];\n wrappedFuncs[level] = console[level];\n console[level] = originalConsoleMethod;\n });\n try {\n return callback();\n } finally {\n wrappedLevels.forEach((level) => {\n console[level] = wrappedFuncs[level];\n });\n }\n}\nfunction enable() {\n _getLoggerSettings().enabled = true;\n}\nfunction disable() {\n _getLoggerSettings().enabled = false;\n}\nfunction isEnabled() {\n return _getLoggerSettings().enabled;\n}\nfunction log(...args) {\n _maybeLog(\"log\", ...args);\n}\nfunction warn(...args) {\n _maybeLog(\"warn\", ...args);\n}\nfunction error(...args) {\n _maybeLog(\"error\", ...args);\n}\nfunction _maybeLog(level, ...args) {\n if (!DEBUG_BUILD) {\n return;\n }\n if (isEnabled()) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[level](`${PREFIX}[${level}]:`, ...args);\n });\n }\n}\nfunction _getLoggerSettings() {\n if (!DEBUG_BUILD) {\n return { enabled: false };\n }\n return getGlobalSingleton(\"loggerSettings\", () => ({ enabled: false }));\n}\nconst debug = {\n /** Enable logging. */\n enable,\n /** Disable logging. */\n disable,\n /** Check if logging is enabled. */\n isEnabled,\n /** Log a message. */\n log,\n /** Log a warning. */\n warn,\n /** Log an error. */\n error\n};\nexport {\n consoleSandbox,\n debug,\n originalConsoleMethods\n};\n//# sourceMappingURL=debug-logger.js.map\n","function merge(initialObj, mergeObj, levels = 2) {\n if (!mergeObj || typeof mergeObj !== \"object\" || levels <= 0) {\n return mergeObj;\n }\n if (initialObj && Object.keys(mergeObj).length === 0) {\n return initialObj;\n }\n const output = { ...initialObj };\n for (const key in mergeObj) {\n if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n output[key] = merge(output[key], mergeObj[key], levels - 1);\n }\n }\n return output;\n}\nexport {\n merge\n};\n//# sourceMappingURL=merge.js.map\n","import { uuid4 } from \"./misc.js\";\nfunction generateTraceId() {\n return uuid4();\n}\nexport {\n generateTraceId\n};\n//# sourceMappingURL=propagationContext.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { debug } from \"./debug-logger.js\";\nfunction addNonEnumerableProperty(obj, name, value) {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value,\n writable: true,\n configurable: true\n });\n } catch {\n DEBUG_BUILD && debug.log(`Failed to add non-enumerable property \"${String(name)}\" to object`, obj);\n }\n}\nexport {\n addNonEnumerableProperty\n};\n//# sourceMappingURL=object.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction makeWeakRef(value) {\n try {\n const WeakRefImpl = GLOBAL_OBJ.WeakRef;\n if (typeof WeakRefImpl === \"function\") {\n return new WeakRefImpl(value);\n }\n } catch {\n }\n return value;\n}\nfunction derefWeakRef(ref) {\n if (!ref) {\n return void 0;\n }\n if (typeof ref === \"object\" && \"deref\" in ref && typeof ref.deref === \"function\") {\n try {\n return ref.deref();\n } catch {\n return void 0;\n }\n }\n return ref;\n}\nexport {\n derefWeakRef,\n makeWeakRef\n};\n//# sourceMappingURL=weakRef.js.map\n","import { addNonEnumerableProperty } from \"./object.js\";\nimport { makeWeakRef, derefWeakRef } from \"./weakRef.js\";\nconst SCOPE_SPAN_FIELD = \"_sentrySpan\";\nfunction _setSpanForScope(scope, span) {\n if (span) {\n addNonEnumerableProperty(scope, SCOPE_SPAN_FIELD, makeWeakRef(span));\n } else {\n delete scope[SCOPE_SPAN_FIELD];\n }\n}\nfunction _getSpanForScope(scope) {\n return derefWeakRef(scope[SCOPE_SPAN_FIELD]);\n}\nexport {\n _getSpanForScope,\n _setSpanForScope\n};\n//# sourceMappingURL=spanOnScope.js.map\n","function truncate(str, max = 0) {\n if (typeof str !== \"string\" || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nexport {\n truncate\n};\n//# sourceMappingURL=string.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { updateSession } from \"./session.js\";\nimport { debug } from \"./utils/debug-logger.js\";\nimport { isPlainObject } from \"./utils/is.js\";\nimport { merge } from \"./utils/merge.js\";\nimport { uuid4 } from \"./utils/misc.js\";\nimport { generateTraceId } from \"./utils/propagationContext.js\";\nimport { safeMathRandom } from \"./utils/randomSafeContext.js\";\nimport { _setSpanForScope, _getSpanForScope } from \"./utils/spanOnScope.js\";\nimport { truncate } from \"./utils/string.js\";\nimport { dateTimestampInSeconds } from \"./utils/time.js\";\nconst DEFAULT_MAX_BREADCRUMBS = 100;\nclass Scope {\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = {\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n };\n }\n /**\n * Clone all data from this scope into a new scope.\n */\n clone() {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._attributes = { ...this._attributes };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n if (this._contexts.flags) {\n newScope._contexts.flags = {\n values: [...this._contexts.flags.values]\n };\n }\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n newScope._lastEventId = this._lastEventId;\n newScope._conversationId = this._conversationId;\n _setSpanForScope(newScope, _getSpanForScope(this));\n return newScope;\n }\n /**\n * Update the client assigned to this scope.\n * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n * as well as manually created scopes.\n */\n setClient(client) {\n this._client = client;\n }\n /**\n * Set the ID of the last captured error event.\n * This is generally only captured on the isolation scope.\n */\n setLastEventId(lastEventId) {\n this._lastEventId = lastEventId;\n }\n /**\n * Get the client assigned to this scope.\n */\n getClient() {\n return this._client;\n }\n /**\n * Get the ID of the last captured error event.\n * This is generally only available on the isolation scope.\n */\n lastEventId() {\n return this._lastEventId;\n }\n /**\n * @inheritDoc\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n /**\n * Add an event processor that will be called before an event is sent.\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n /**\n * Set the user for this scope.\n * Set to `null` to unset the user.\n */\n setUser(user) {\n this._user = user || {\n email: void 0,\n id: void 0,\n ip_address: void 0,\n username: void 0\n };\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the user from this scope.\n */\n getUser() {\n return this._user;\n }\n /**\n * Set the conversation ID for this scope.\n * Set to `null` to unset the conversation ID.\n */\n setConversationId(conversationId) {\n this._conversationId = conversationId || void 0;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set an object that will be merged into existing tags on the scope,\n * and will be sent as tags data with the event.\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single tag that will be sent as tags data with the event.\n */\n setTag(key, value) {\n return this.setTags({ [key]: value });\n }\n /**\n * Sets attributes onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param newAttributes - The attributes to set on the scope, as key-value pairs.\n *\n * @example\n * ```typescript\n * scope.setAttributes({\n * is_admin: true,\n * payment_selection: 'credit_card',\n * render_duration: 150,\n * });\n * ```\n */\n setAttributes(newAttributes) {\n this._attributes = {\n ...this._attributes,\n ...newAttributes\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets an attribute onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param key - The attribute key.\n * @param value - The attribute value.\n *\n * @example\n * ```typescript\n * scope.setAttribute('is_admin', true);\n * scope.setAttribute('render_duration', 150);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAttribute(key, value) {\n return this.setAttributes({ [key]: value });\n }\n /**\n * Removes the attribute with the given key from the scope.\n *\n * @param key - The attribute key.\n *\n * @example\n * ```typescript\n * scope.removeAttribute('is_admin');\n * ```\n */\n removeAttribute(key) {\n if (key in this._attributes) {\n delete this._attributes[key];\n this._notifyScopeListeners();\n }\n return this;\n }\n /**\n * Set an object that will be merged into existing extra on the scope,\n * and will be sent as extra data with the event.\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single key:value extra entry that will be sent as extra data with the event.\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the fingerprint on the scope to send with the events.\n * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the level on the scope for future events.\n */\n setLevel(level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the transaction name on the scope so that the name of e.g. taken server route or\n * the page location is attached to future events.\n *\n * IMPORTANT: Calling this function does NOT change the name of the currently active\n * root span. If you want to change the name of the active root span, use\n * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n *\n * By default, the SDK updates the scope's transaction name automatically on sensible\n * occasions, such as a page navigation or when handling a new request on the server.\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets context data with the given name.\n * Data passed as context will be normalized. You can also pass `null` to unset the context.\n * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n */\n setContext(key, context) {\n if (context === null) {\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set the session for the scope.\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the session from the scope.\n */\n getSession() {\n return this._session;\n }\n /**\n * Updates the scope with provided data. Can work in three variations:\n * - plain object containing updatable attributes\n * - Scope instance that'll extract the attributes from\n * - callback function that'll receive the current scope as an argument and allow for modifications\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n const scopeToMerge = typeof captureContext === \"function\" ? captureContext(this) : captureContext;\n const scopeInstance = scopeToMerge instanceof Scope ? scopeToMerge.getScopeData() : isPlainObject(scopeToMerge) ? captureContext : void 0;\n const {\n tags,\n attributes,\n extra,\n user,\n contexts,\n level,\n fingerprint = [],\n propagationContext,\n conversationId\n } = scopeInstance || {};\n this._tags = { ...this._tags, ...tags };\n this._attributes = { ...this._attributes, ...attributes };\n this._extra = { ...this._extra, ...extra };\n this._contexts = { ...this._contexts, ...contexts };\n if (user && Object.keys(user).length) {\n this._user = user;\n }\n if (level) {\n this._level = level;\n }\n if (fingerprint.length) {\n this._fingerprint = fingerprint;\n }\n if (propagationContext) {\n this._propagationContext = propagationContext;\n }\n if (conversationId) {\n this._conversationId = conversationId;\n }\n return this;\n }\n /**\n * Clears the current scope and resets its properties.\n * Note: The client will not be cleared.\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = void 0;\n this._transactionName = void 0;\n this._fingerprint = void 0;\n this._session = void 0;\n this._conversationId = void 0;\n _setSpanForScope(this, void 0);\n this._attachments = [];\n this.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n });\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Adds a breadcrumb to the scope.\n * By default, the last 100 breadcrumbs are kept.\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === \"number\" ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n if (maxCrumbs <= 0) {\n return this;\n }\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n // Breadcrumb messages can theoretically be infinitely large and they're held in memory so we truncate them not to leak (too much) memory\n message: breadcrumb.message ? truncate(breadcrumb.message, 2048) : breadcrumb.message\n };\n this._breadcrumbs.push(mergedBreadcrumb);\n if (this._breadcrumbs.length > maxCrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n this._client?.recordDroppedEvent(\"buffer_overflow\", \"log_item\");\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the last breadcrumb of the scope.\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n /**\n * Clear all breadcrumbs from the scope.\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Add an attachment to the scope.\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n /**\n * Clear all attachments from the scope.\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n /**\n * Get the data of this scope, which should be applied to an event during processing.\n */\n getScopeData() {\n return {\n breadcrumbs: this._breadcrumbs,\n attachments: this._attachments,\n contexts: this._contexts,\n tags: this._tags,\n attributes: this._attributes,\n extra: this._extra,\n user: this._user,\n level: this._level,\n fingerprint: this._fingerprint || [],\n eventProcessors: this._eventProcessors,\n propagationContext: this._propagationContext,\n sdkProcessingMetadata: this._sdkProcessingMetadata,\n transactionName: this._transactionName,\n span: _getSpanForScope(this),\n conversationId: this._conversationId\n };\n }\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry.\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n return this;\n }\n /**\n * Add propagation context to the scope, used for distributed tracing\n */\n setPropagationContext(context) {\n this._propagationContext = context;\n return this;\n }\n /**\n * Get propagation context from the scope, used for distributed tracing\n */\n getPropagationContext() {\n return this._propagationContext;\n }\n /**\n * Capture an exception for this scope.\n *\n * @returns {string} The id of the captured Sentry event.\n */\n captureException(exception, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture exception!\");\n return eventId;\n }\n const syntheticException = new Error(\"Sentry syntheticException\");\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a message for this scope.\n *\n * @returns {string} The id of the captured message.\n */\n captureMessage(message, level, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture message!\");\n return eventId;\n }\n const syntheticException = hint?.syntheticException ?? new Error(message);\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a Sentry event for this scope.\n *\n * @returns {string} The id of the captured event.\n */\n captureEvent(event, hint) {\n const eventId = event.event_id || hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture event!\");\n return eventId;\n }\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n return eventId;\n }\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach((callback) => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\nexport {\n Scope\n};\n//# sourceMappingURL=scope.js.map\n","import { getGlobalSingleton } from \"./carrier.js\";\nimport { Scope } from \"./scope.js\";\nfunction getDefaultCurrentScope() {\n return getGlobalSingleton(\"defaultCurrentScope\", () => new Scope());\n}\nfunction getDefaultIsolationScope() {\n return getGlobalSingleton(\"defaultIsolationScope\", () => new Scope());\n}\nexport {\n getDefaultCurrentScope,\n getDefaultIsolationScope\n};\n//# sourceMappingURL=defaultScopes.js.map\n","const isActualPromise = (p) => p instanceof Promise && !p[kChainedCopy];\nconst kChainedCopy = /* @__PURE__ */ Symbol(\"chained PromiseLike\");\nconst chainAndCopyPromiseLike = (original, onSuccess, onError) => {\n const chained = original.then(\n (value) => {\n onSuccess(value);\n return value;\n },\n (err) => {\n onError(err);\n throw err;\n }\n );\n return isActualPromise(chained) && isActualPromise(original) ? chained : copyProps(original, chained);\n};\nconst copyProps = (original, chained) => {\n if (!chained) return original;\n let mutated = false;\n for (const key in original) {\n if (key in chained) continue;\n mutated = true;\n const value = original[key];\n if (typeof value === \"function\") {\n Object.defineProperty(chained, key, {\n value: (...args) => value.apply(original, args),\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n chained[key] = value;\n }\n }\n if (mutated) Object.assign(chained, { [kChainedCopy]: true });\n return chained;\n};\nexport {\n chainAndCopyPromiseLike\n};\n//# sourceMappingURL=chain-and-copy-promiselike.js.map\n","import { getDefaultCurrentScope, getDefaultIsolationScope } from \"../defaultScopes.js\";\nimport { Scope } from \"../scope.js\";\nimport { chainAndCopyPromiseLike } from \"../utils/chain-and-copy-promiselike.js\";\nimport { isThenable } from \"../utils/is.js\";\nimport { getMainCarrier, getSentryCarrier } from \"../carrier.js\";\nclass AsyncContextStack {\n constructor(scope, isolationScope) {\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n } else {\n assignedScope = scope;\n }\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n } else {\n assignedIsolationScope = isolationScope;\n }\n this._stack = [{ scope: assignedScope }];\n this._isolationScope = assignedIsolationScope;\n }\n /**\n * Fork a scope for the stack.\n */\n withScope(callback) {\n const scope = this._pushScope();\n let maybePromiseResult;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n this._popScope();\n throw e;\n }\n if (isThenable(maybePromiseResult)) {\n return chainAndCopyPromiseLike(\n maybePromiseResult,\n () => this._popScope(),\n () => this._popScope()\n );\n }\n this._popScope();\n return maybePromiseResult;\n }\n /**\n * Get the client of the stack.\n */\n getClient() {\n return this.getStackTop().client;\n }\n /**\n * Returns the scope of the top stack.\n */\n getScope() {\n return this.getStackTop().scope;\n }\n /**\n * Get the isolation scope for the stack.\n */\n getIsolationScope() {\n return this._isolationScope;\n }\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n /**\n * Push a scope to the stack.\n */\n _pushScope() {\n const scope = this.getScope().clone();\n this._stack.push({\n client: this.getClient(),\n scope\n });\n return scope;\n }\n /**\n * Pop a scope from the stack.\n */\n _popScope() {\n if (this._stack.length <= 1) return false;\n return !!this._stack.pop();\n }\n}\nfunction getAsyncContextStack() {\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n return sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope());\n}\nfunction withScope(callback) {\n return getAsyncContextStack().withScope(callback);\n}\nfunction withSetScope(scope, callback) {\n const stack = getAsyncContextStack();\n return stack.withScope(() => {\n stack.getStackTop().scope = scope;\n return callback(scope);\n });\n}\nfunction withIsolationScope(callback) {\n return getAsyncContextStack().withScope(() => {\n return callback(getAsyncContextStack().getIsolationScope());\n });\n}\nfunction getStackAsyncContextStrategy() {\n return {\n withIsolationScope,\n withScope,\n withSetScope,\n withSetIsolationScope: (_isolationScope, callback) => {\n return withIsolationScope(callback);\n },\n getCurrentScope: () => getAsyncContextStack().getScope(),\n getIsolationScope: () => getAsyncContextStack().getIsolationScope()\n };\n}\nexport {\n AsyncContextStack,\n getStackAsyncContextStrategy\n};\n//# sourceMappingURL=stackStrategy.js.map\n","import { getSentryCarrier } from \"../carrier.js\";\nimport { getStackAsyncContextStrategy } from \"./stackStrategy.js\";\nfunction getAsyncContextStrategy(carrier) {\n const sentry = getSentryCarrier(carrier);\n if (sentry.acs) {\n return sentry.acs;\n }\n return getStackAsyncContextStrategy();\n}\nexport {\n getAsyncContextStrategy\n};\n//# sourceMappingURL=index.js.map\n","import { getAsyncContextStrategy } from \"./asyncContext/index.js\";\nimport { getMainCarrier } from \"./carrier.js\";\nfunction getCurrentScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getCurrentScope();\n}\nfunction getIsolationScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getIsolationScope();\n}\nfunction withScope(...rest) {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (rest.length === 2) {\n const [scope, callback] = rest;\n if (!scope) {\n return acs.withScope(callback);\n }\n return acs.withSetScope(scope, callback);\n }\n return acs.withScope(rest[0]);\n}\nfunction getClient() {\n return getCurrentScope().getClient();\n}\nexport {\n getClient,\n getCurrentScope,\n getIsolationScope,\n withScope\n};\n//# sourceMappingURL=currentScopes.js.map\n","import { Scope } from \"../scope.js\";\nfunction parseEventHintOrCaptureContext(hint) {\n if (!hint) {\n return void 0;\n }\n if (hintIsScopeOrFunction(hint)) {\n return { captureContext: hint };\n }\n if (hintIsScopeContext(hint)) {\n return {\n captureContext: hint\n };\n }\n return hint;\n}\nfunction hintIsScopeOrFunction(hint) {\n return hint instanceof Scope || typeof hint === \"function\";\n}\nconst captureContextKeys = [\n \"user\",\n \"level\",\n \"extra\",\n \"contexts\",\n \"tags\",\n \"fingerprint\",\n \"propagationContext\"\n];\nfunction hintIsScopeContext(hint) {\n return Object.keys(hint).some((key) => captureContextKeys.includes(key));\n}\nexport {\n parseEventHintOrCaptureContext\n};\n//# sourceMappingURL=prepareEvent.js.map\n","import { getIsolationScope, getCurrentScope } from \"./currentScopes.js\";\nimport { parseEventHintOrCaptureContext } from \"./utils/prepareEvent.js\";\nfunction captureException(exception, hint) {\n return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\nfunction lastEventId() {\n return getIsolationScope().lastEventId();\n}\nexport {\n captureException,\n lastEventId\n};\n//# sourceMappingURL=exports.js.map\n","import { isError } from \"../../../core/build/esm/utils/is.js\";\nimport { captureException } from \"../../../core/build/esm/exports.js\";\nconst version = window[\"React\"].version;\nfunction isAtLeastReact17(reactVersion) {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\nfunction setCause(error, cause) {\n const seenErrors = /* @__PURE__ */ new WeakSet();\n function recurse(error2, cause2) {\n if (seenErrors.has(error2)) {\n return;\n }\n if (error2.cause) {\n seenErrors.add(error2);\n return recurse(error2.cause, cause2);\n }\n error2.cause = cause2;\n }\n recurse(error, cause);\n}\nfunction captureReactException(error, { componentStack }, hint) {\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n setCause(error, errorBoundaryError);\n }\n return captureException(error, hint);\n}\nexport {\n captureReactException,\n isAtLeastReact17,\n setCause\n};\n//# sourceMappingURL=error.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"../../../../../core/build/esm/utils/worldwide.js\";\nconst WINDOW = GLOBAL_OBJ;\nexport {\n WINDOW\n};\n//# sourceMappingURL=helpers.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { consoleSandbox, debug } from \"./debug-logger.js\";\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)((?:\\[[:.%\\w]+\\]|[\\w.-]+))(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n return protocol === \"http\" || protocol === \"https\";\n}\nfunction dsnToString(dsn, withPassword = false) {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : \"\"}@${host}${port ? `:${port}` : \"\"}/${path ? `${path}/` : path}${projectId}`;\n}\nfunction dsnFromString(str) {\n const match = DSN_REGEX.exec(str);\n if (!match) {\n consoleSandbox(() => {\n console.error(`Invalid Sentry Dsn: ${str}`);\n });\n return void 0;\n }\n const [protocol, publicKey, pass = \"\", host = \"\", port = \"\", lastPath = \"\"] = match.slice(1);\n let path = \"\";\n let projectId = lastPath;\n const split = projectId.split(\"/\");\n if (split.length > 1) {\n path = split.slice(0, -1).join(\"/\");\n projectId = split.pop();\n }\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n return dsnFromComponents({ host, pass, path, projectId, port, protocol, publicKey });\n}\nfunction dsnFromComponents(components) {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || \"\",\n pass: components.pass || \"\",\n host: components.host,\n port: components.port || \"\",\n path: components.path || \"\",\n projectId: components.projectId\n };\n}\nfunction validateDsn(dsn) {\n if (!DEBUG_BUILD) {\n return true;\n }\n const { port, projectId, protocol } = dsn;\n const requiredComponents = [\"protocol\", \"publicKey\", \"host\", \"projectId\"];\n const hasMissingRequiredComponent = requiredComponents.find((component) => {\n if (!dsn[component]) {\n debug.error(`Invalid Sentry Dsn: ${component} missing`);\n return true;\n }\n return false;\n });\n if (hasMissingRequiredComponent) {\n return false;\n }\n if (!projectId.match(/^\\d+$/)) {\n debug.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n return false;\n }\n if (!isValidProtocol(protocol)) {\n debug.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n return false;\n }\n if (port && isNaN(parseInt(port, 10))) {\n debug.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n return false;\n }\n return true;\n}\nfunction makeDsn(from) {\n const components = typeof from === \"string\" ? dsnFromString(from) : dsnFromComponents(from);\n if (!components || !validateDsn(components)) {\n return void 0;\n }\n return components;\n}\nexport {\n dsnFromString,\n dsnToString,\n makeDsn\n};\n//# sourceMappingURL=dsn.js.map\n","import { makeDsn, dsnToString } from \"./utils/dsn.js\";\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : \"\";\n const port = dsn.port ? `:${dsn.port}` : \"\";\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : \"\"}/api/`;\n}\nfunction getReportDialogEndpoint(dsnLike, dialogOptions) {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return \"\";\n }\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === \"dsn\") {\n continue;\n }\n if (key === \"onClose\") {\n continue;\n }\n if (key === \"user\") {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key])}`;\n }\n }\n return `${endpoint}?${encodedOptions}`;\n}\nexport {\n getReportDialogEndpoint\n};\n//# sourceMappingURL=api.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { WINDOW } from \"./helpers.js\";\nimport { debug } from \"../../../../../core/build/esm/utils/debug-logger.js\";\nimport { getCurrentScope, getClient } from \"../../../../../core/build/esm/currentScopes.js\";\nimport { lastEventId } from \"../../../../../core/build/esm/exports.js\";\nimport { getReportDialogEndpoint } from \"../../../../../core/build/esm/api.js\";\nfunction showReportDialog(options = {}) {\n const optionalDocument = WINDOW.document;\n const injectionPoint = optionalDocument?.head || optionalDocument?.body;\n if (!injectionPoint) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] Global document not defined\");\n return;\n }\n const scope = getCurrentScope();\n const client = getClient();\n const dsn = client?.getDsn();\n if (!dsn) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] DSN not configured\");\n return;\n }\n const mergedOptions = {\n ...options,\n user: {\n ...scope.getUser(),\n ...options.user\n },\n eventId: options.eventId || lastEventId()\n };\n const script = WINDOW.document.createElement(\"script\");\n script.async = true;\n script.crossOrigin = \"anonymous\";\n script.src = getReportDialogEndpoint(dsn, mergedOptions);\n const { onLoad, onClose } = mergedOptions;\n if (onLoad) {\n script.onload = onLoad;\n }\n if (onClose) {\n const reportDialogClosedMessageHandler = (event) => {\n if (event.data === \"__sentry_reportdialog_closed__\") {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n injectionPoint.appendChild(script);\n}\nexport {\n showReportDialog\n};\n//# sourceMappingURL=report-dialog.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { captureReactException } from \"./error.js\";\nimport { getClient, withScope } from \"../../../core/build/esm/currentScopes.js\";\nimport { showReportDialog } from \"../../../browser/build/npm/esm/prod/report-dialog.js\";\nimport { debug } from \"../../../core/build/esm/utils/debug-logger.js\";\nconst React = window[\"React\"];\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null\n};\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on(\"afterSendEvent\", (event) => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope((scope) => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: \"auto.function.react.error_boundary\" }\n });\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n this.setState({ error, componentStack, eventId });\n });\n }\n componentDidMount() {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n componentWillUnmount() {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n onUnmount(null, null, null);\n } else {\n onUnmount(error, componentStack, eventId);\n }\n }\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = void 0;\n }\n }\n resetErrorBoundary() {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n this.setState(INITIAL_STATE);\n }\n render() {\n const { fallback, children } = this.props;\n const state = this.state;\n if (state.componentStack === null) {\n return typeof children === \"function\" ? children() : children;\n }\n const element = typeof fallback === \"function\" ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId\n }) : fallback;\n if (React.isValidElement(element)) {\n return element;\n }\n if (fallback) {\n DEBUG_BUILD && debug.warn(\"fallback did not produce a valid ReactElement\");\n }\n return null;\n }\n}\nexport {\n ErrorBoundary\n};\n//# sourceMappingURL=errorboundary.js.map\n","var defaultAttributes = {\n outline: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n },\n filled: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n stroke: \"none\"\n }\n};\nexport {\n defaultAttributes as default\n};\n//# sourceMappingURL=defaultAttributes.js.map\n","import defaultAttributes from \"./defaultAttributes.js\";\nconst forwardRef = window[\"React\"].forwardRef;\nconst createElement = window[\"React\"].createElement;\nconst createReactComponent = (type, iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = \"currentColor\", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(\" \"),\n ...{\n strokeWidth: stroke,\n stroke: color\n },\n ...rest\n },\n [\n title && createElement(\"title\", { key: \"svg-title\" }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n );\n Component.displayName = `${iconNamePascal}`;\n return Component;\n};\nexport {\n createReactComponent as default\n};\n//# sourceMappingURL=createReactComponent.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M12 16v.01\", \"key\": \"svg-2\" }]];\nconst IconExclamationCircle = createReactComponent(\"outline\", \"exclamation-circle\", \"ExclamationCircle\", __iconNode);\nexport {\n __iconNode,\n IconExclamationCircle as default\n};\n//# sourceMappingURL=IconExclamationCircle.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9h.01\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M11 12h1v4h1\", \"key\": \"svg-2\" }]];\nconst IconInfoCircle = createReactComponent(\"outline\", \"info-circle\", \"InfoCircle\", __iconNode);\nexport {\n __iconNode,\n IconInfoCircle as default\n};\n//# sourceMappingURL=IconInfoCircle.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { ErrorBoundary } from \"../node_modules/@sentry/react/build/esm/errorboundary.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconInfoCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Alert = window[\"MantineCore\"].Alert;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useState = window[\"React\"].useState;\nfunction DefaultFallback({\n title,\n error\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}), title: `INVE-E17: ${_i18n._(\n /*i18n*/\n {\n id: \"qwCNwv\"\n }\n )}: ${title}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"iqWQW8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"pz0nW1\"\n }\n ) })\n ] }) }),\n error && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconInfoCircle, {}), title: _i18n._(\n /*i18n*/\n {\n id: \"7Jw/XW\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: error }) })\n ] });\n}\nfunction Boundary({\n children,\n label,\n fallback\n}) {\n const [errorMessage, setErrorMessage] = useState(null);\n const onError = useCallback((error, componentStack, eventId) => {\n console.error(`ERR: Error rendering component: ${label}`);\n console.error(error);\n setErrorMessage(error instanceof Error ? error.message : String(error));\n }, []);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { fallback: fallback ?? /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultFallback, { title: label, error: errorMessage }), onError, children });\n}\nexport {\n Boundary,\n DefaultFallback\n};\n//# sourceMappingURL=Boundary.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ButtonMenu({\n icon,\n actions,\n tooltip = \"\",\n label = \"\"\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"default\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: tooltip, children: icon }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { children: [\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: label }),\n actions.map((action, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: action }, `${i}-${action}`))\n ] })\n ] });\n}\nexport {\n ButtonMenu\n};\n//# sourceMappingURL=ButtonMenu.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l5 5l10 -10\", \"key\": \"svg-0\" }]];\nconst IconCheck = createReactComponent(\"outline\", \"check\", \"Check\", __iconNode);\nexport {\n __iconNode,\n IconCheck as default\n};\n//# sourceMappingURL=IconCheck.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\", \"key\": \"svg-1\" }]];\nconst IconCopy = createReactComponent(\"outline\", \"copy\", \"Copy\", __iconNode);\nexport {\n __iconNode,\n IconCopy as default\n};\n//# sourceMappingURL=IconCopy.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Button = window[\"MantineCore\"].Button;\nconst MantineCopyButton = window[\"MantineCore\"].CopyButton;\nconst Text = window[\"MantineCore\"].Text;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction CopyButton({\n value,\n label,\n tooltip,\n disabled,\n tooltipPosition,\n content,\n size,\n color = \"gray\",\n variant = \"transparent\"\n}) {\n const ButtonComponent = label ? Button : ActionIcon;\n if (!window.isSecureContext) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(MantineCopyButton, { value, children: ({\n copied,\n copy\n }) => /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: copied ? _i18n._(\n /*i18n*/\n {\n id: \"6V3Ea3\"\n }\n ) : tooltip ?? _i18n._(\n /*i18n*/\n {\n id: \"he3ygx\"\n }\n ), withArrow: true, position: tooltipPosition, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ButtonComponent, { disabled, color: copied ? \"teal\" : color, onClick: (e) => {\n e.stopPropagation();\n e.preventDefault();\n copy();\n }, variant: copied ? \"transparent\" : variant ?? \"transparent\", size: size ?? \"sm\", children: [\n copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {}),\n content,\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { p: size ?? \"sm\", size: size ?? \"sm\", children: label })\n ] }) }) });\n}\nexport {\n CopyButton\n};\n//# sourceMappingURL=CopyButton.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { CopyButton } from \"./CopyButton.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst useState = window[\"React\"].useState;\nfunction CopyableCell({\n children,\n value\n}) {\n const [isHovered, setIsHovered] = useState(false);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: 0, p: 0, wrap: \"nowrap\", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), justify: \"space-between\", align: \"center\", children: [\n children,\n window.isSecureContext && isHovered && value != null && /* @__PURE__ */ jsxRuntimeExports.jsx(\"span\", { style: {\n position: \"relative\"\n }, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntimeExports.jsx(\"div\", { style: {\n position: \"absolute\",\n right: 0,\n transform: \"translateY(-50%)\"\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(CopyButton, { value, variant: \"default\" }) }) })\n ] });\n}\nexport {\n CopyableCell\n};\n//# sourceMappingURL=CopyableCell.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { formatDecimal } from \"../functions/Formatting.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst Progress = window[\"MantineCore\"].Progress;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useMemo = window[\"React\"].useMemo;\nfunction ProgressBar(props) {\n const progress = useMemo(() => {\n const maximum = props.maximum ?? 100;\n const value = Math.max(props.value, 0);\n if (maximum == 0) {\n return 0;\n }\n return value / maximum * 100;\n }, [props]);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: 2, style: {\n flexGrow: 1,\n minWidth: \"100px\"\n }, children: [\n props.progressLabel && /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", justify: \"center\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { ta: \"center\", size: \"xs\", children: [\n formatDecimal(props.value),\n \" / \",\n formatDecimal(props.maximum)\n ] }),\n props.units && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { size: \"xs\", children: [\n \"[\",\n props.units,\n \"]\"\n ] })\n ] }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Progress, { value: progress, color: progress < 100 ? \"orange\" : progress > 100 ? \"blue\" : \"green\", size: props.size ?? \"md\", radius: \"sm\", animated: props.animated })\n ] });\n}\nexport {\n ProgressBar\n};\n//# sourceMappingURL=ProgressBar.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { isTrue } from \"../functions/Conversion.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Badge = window[\"MantineCore\"].Badge;\nwindow[\"MantineCore\"].Skeleton;\nfunction PassFailButton({\n value,\n passText,\n failText,\n passColor,\n failColor\n}) {\n const v = isTrue(value);\n const pass = passText ?? _i18n._(\n /*i18n*/\n {\n id: \"wFwgKk\"\n }\n );\n const fail = failText ?? _i18n._(\n /*i18n*/\n {\n id: \"qcloGZ\"\n }\n );\n const pColor = passColor ?? \"green\";\n const fColor = failColor ?? \"red\";\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { color: v ? pColor : fColor, variant: \"filled\", radius: \"lg\", size: \"sm\", style: {\n maxWidth: \"50px\"\n }, children: v ? pass : fail });\n}\nfunction YesNoButton({\n value\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(PassFailButton, { value, passText: _i18n._(\n /*i18n*/\n {\n id: \"l75CjT\"\n }\n ), failText: _i18n._(\n /*i18n*/\n {\n id: \"1UzENP\"\n }\n ), failColor: \"orange.6\" });\n}\nexport {\n PassFailButton,\n YesNoButton\n};\n//# sourceMappingURL=YesNoButton.js.map\n","const useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useRef = window[\"React\"].useRef;\nconst useState = window[\"React\"].useState;\nfunction useDebouncedValue(value, wait, options = { leading: false }) {\n const [_value, setValue] = useState(value);\n const mountedRef = useRef(false);\n const timeoutRef = useRef(null);\n const cooldownRef = useRef(false);\n const latestValueRef = useRef(value);\n latestValueRef.current = value;\n const cancel = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n cooldownRef.current = false;\n }, []);\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n cancel();\n cooldownRef.current = false;\n setValue(latestValueRef.current);\n }\n }, []);\n useEffect(() => {\n if (mountedRef.current) if (!cooldownRef.current && options.leading) {\n cooldownRef.current = true;\n setValue(value);\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n }, wait);\n } else {\n cancel();\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n setValue(value);\n }, wait);\n }\n }, [\n value,\n options.leading,\n wait\n ]);\n useEffect(() => {\n mountedRef.current = true;\n return cancel;\n }, []);\n return [\n _value,\n cancel,\n {\n cancel,\n flush\n }\n ];\n}\nexport {\n useDebouncedValue\n};\n//# sourceMappingURL=use-debounced-value.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 21l-6 -6\", \"key\": \"svg-1\" }]];\nconst IconSearch = createReactComponent(\"outline\", \"search\", \"Search\", __iconNode);\nexport {\n __iconNode,\n IconSearch as default\n};\n//# sourceMappingURL=IconSearch.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDebouncedValue } from \"../node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js\";\nimport IconSearch from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst CloseButton = window[\"MantineCore\"].CloseButton;\nconst TextInput = window[\"MantineCore\"].TextInput;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction SearchInput({\n disabled,\n debounce,\n placeholder,\n searchCallback\n}) {\n const [value, setValue] = useState(\"\");\n const [searchText] = useDebouncedValue(value, debounce ?? 500);\n useEffect(() => {\n searchCallback(searchText);\n }, [searchText]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(TextInput, { value, disabled, \"aria-label\": \"table-search-input\", leftSection: /* @__PURE__ */ jsxRuntimeExports.jsx(IconSearch, {}), placeholder: placeholder ?? _i18n._(\n /*i18n*/\n {\n id: \"A1taO8\"\n }\n ), onChange: (event) => setValue(event.target.value), rightSection: value.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(CloseButton, { size: \"xs\", onClick: () => {\n setValue(\"\");\n searchCallback(\"\");\n } }) : null });\n}\nexport {\n SearchInput\n};\n//# sourceMappingURL=SearchInput.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M6 4v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M6 12v8\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M12 4v10\", \"key\": \"svg-4\" }], [\"path\", { \"d\": \"M12 18v2\", \"key\": \"svg-5\" }], [\"path\", { \"d\": \"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-6\" }], [\"path\", { \"d\": \"M18 4v1\", \"key\": \"svg-7\" }], [\"path\", { \"d\": \"M18 9v11\", \"key\": \"svg-8\" }]];\nconst IconAdjustments = createReactComponent(\"outline\", \"adjustments\", \"Adjustments\", __iconNode);\nexport {\n __iconNode,\n IconAdjustments as default\n};\n//# sourceMappingURL=IconAdjustments.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconAdjustments from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Checkbox = window[\"MantineCore\"].Checkbox;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction TableColumnSelect({\n columns,\n onToggleColumn\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", closeOnItemClick: false, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"transparent\", \"aria-label\": \"table-select-columns\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ), position: \"top-end\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconAdjustments, {}) }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { style: {\n maxHeight: \"400px\",\n overflowY: \"auto\"\n }, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n columns.filter((col) => (col.switchable ?? true) && !col.propHidden).map((col) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { checked: !col.hidden, label: col.title || col.accessor, onChange: () => onToggleColumn(col.accessor), radius: \"sm\" }) }, col.accessor))\n ] })\n ] });\n}\nexport {\n TableColumnSelect\n};\n//# sourceMappingURL=TableColumnSelect.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3\", \"key\": \"svg-1\" }]];\nconst IconTag = createReactComponent(\"outline\", \"tag\", \"Tag\", __iconNode);\nexport {\n __iconNode,\n IconTag as default\n};\n//# sourceMappingURL=IconTag.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconTag from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Badge = window[\"MantineCore\"].Badge;\nconst Group = window[\"MantineCore\"].Group;\nconst Paper = window[\"MantineCore\"].Paper;\nfunction TagsList({\n tags\n}) {\n if (!tags || tags.length === 0) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Paper, { p: \"xs\", shadow: \"xs\", withBorder: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { size: \"sm\", variant: \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTag, {}) }),\n tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: \"outline\", size: \"sm\", children: tag }, tag))\n ] }) });\n}\nexport {\n TagsList as default\n};\n//# sourceMappingURL=TagsList.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nconst Alert = window[\"MantineCore\"].Alert;\nfunction InvenTreeTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n context\n}) {\n if (!context?.tables?.renderTable) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { title: \"Plugin Version Error\", color: \"red\", children: [\n 'The component cannot be rendered because the plugin context is missing the \"renderTable\" function.',\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n \"This means that the InvenTree UI library version is incompatible with this plugin version.\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"Plugin Version:\" }),\n \" \",\n INVENTREE_PLUGIN_VERSION,\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"UI Version:\" }),\n \" \",\n context?.version?.inventree || \"unknown\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {})\n ] });\n }\n return context?.tables.renderTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n api: context.api,\n navigate: context.navigate\n });\n}\nexport {\n InvenTreeTable as default\n};\n//# sourceMappingURL=InvenTreeTable.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-2\" }]];\nconst IconDots = createReactComponent(\"outline\", \"dots\", \"Dots\", __iconNode);\nexport {\n __iconNode,\n IconDots as default\n};\n//# sourceMappingURL=IconDots.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 10l4 4m0 -4l-4 4\", \"key\": \"svg-1\" }]];\nconst IconCircleX = createReactComponent(\"outline\", \"circle-x\", \"CircleX\", __iconNode);\nexport {\n __iconNode,\n IconCircleX as default\n};\n//# sourceMappingURL=IconCircleX.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 7l16 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 11l0 6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M14 11l0 6\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\", \"key\": \"svg-4\" }]];\nconst IconTrash = createReactComponent(\"outline\", \"trash\", \"Trash\", __iconNode);\nexport {\n __iconNode,\n IconTrash as default\n};\n//# sourceMappingURL=IconTrash.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M16 5l3 3\", \"key\": \"svg-2\" }]];\nconst IconEdit = createReactComponent(\"outline\", \"edit\", \"Edit\", __iconNode);\nexport {\n __iconNode,\n IconEdit as default\n};\n//# sourceMappingURL=IconEdit.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M13 18l6 -6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M13 6l6 6\", \"key\": \"svg-2\" }]];\nconst IconArrowRight = createReactComponent(\"outline\", \"arrow-right\", \"ArrowRight\", __iconNode);\nexport {\n __iconNode,\n IconArrowRight as default\n};\n//# sourceMappingURL=IconArrowRight.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { cancelEvent } from \"../functions/Events.js\";\nimport { eventModified, getDetailUrl, navigateToLink } from \"../functions/Navigation.js\";\nimport IconDots from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconTrash from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nimport IconEdit from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js\";\nimport IconArrowRight from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction RowViewAction(props) {\n return {\n ...props,\n color: void 0,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowRight, {}),\n onClick: (event) => {\n const showPreviewPanel = props.isPreviewEnabled?.() ?? false;\n if (!showPreviewPanel || eventModified(event) || !props.openPreview) {\n const url = getDetailUrl(props.modelType, props.modelId);\n navigateToLink(url, props.navigate, event);\n } else {\n props.openPreview(props.modelType, props.modelId);\n }\n }\n };\n}\nfunction RowDuplicateAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"euc6Ns\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {})\n };\n}\nfunction RowEditAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"ePK91l\"\n }\n ),\n color: \"blue\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconEdit, {})\n };\n}\nfunction RowDeleteAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"cnGeoo\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTrash, {})\n };\n}\nfunction RowCancelAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"dEgA5A\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {})\n };\n}\nfunction RowActions({\n title,\n actions,\n disabled = false,\n index\n}) {\n function openMenu(event) {\n cancelEvent(event);\n setOpened(!opened);\n }\n const [opened, setOpened] = useState(false);\n const visibleActions = useMemo(() => {\n return actions.filter((action) => !action.hidden);\n }, [actions]);\n function RowActionIcon(action) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: action.tooltip ?? action.title, position: \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { color: action.color, leftSection: action.icon, onClick: (event) => {\n cancelEvent(event);\n action.onClick?.(event);\n setOpened(false);\n }, disabled: action.disabled || false, children: action.title }) }, action.title);\n }\n return visibleActions.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { withinPortal: true, disabled, position: \"bottom-end\", opened, onChange: setOpened, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: title || _i18n._(\n /*i18n*/\n {\n id: \"7L01XJ\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { \"aria-label\": `row-action-menu-${index ?? \"\"}`, onClick: openMenu, disabled, variant: \"transparent\", size: \"sm\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconDots, {}) }, `row-action-menu-${index ?? \"\"}`) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Dropdown, { children: visibleActions.map((action) => /* @__PURE__ */ jsxRuntimeExports.jsx(RowActionIcon, { ...action }, action.title)) })\n ] });\n}\nexport {\n RowActions,\n RowCancelAction,\n RowDeleteAction,\n RowDuplicateAction,\n RowEditAction,\n RowViewAction\n};\n//# sourceMappingURL=RowActions.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useDocumentVisibility() {\n const [documentVisibility, setDocumentVisibility] = useState(\"visible\");\n useEffect(() => {\n setDocumentVisibility(document.visibilityState);\n const listener = () => setDocumentVisibility(document.visibilityState);\n document.addEventListener(\"visibilitychange\", listener);\n return () => document.removeEventListener(\"visibilitychange\", listener);\n }, []);\n return documentVisibility;\n}\nexport {\n useDocumentVisibility\n};\n//# sourceMappingURL=use-document-visibility.js.map\n","var Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nexport {\n QueryClientContext,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nexport {\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map\n","const React = window[\"React\"];\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nIsRestoringContext.Provider;\nexport {\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M9 12l2 2l4 -4\", \"key\": \"svg-1\" }]];\nconst IconCircleCheck = createReactComponent(\"outline\", \"circle-check\", \"CircleCheck\", __iconNode);\nexport {\n __iconNode,\n IconCircleCheck as default\n};\n//# sourceMappingURL=IconCircleCheck.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ProgressBar } from \"../components/ProgressBar.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorDataOutput(props) {\n const visibility = useDocumentVisibility();\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (!!props.id) {\n setLoading(true);\n showNotification({\n id: `data-output-${props.id}`,\n title: props.title,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", value: 0, progressLabel: true })\n });\n } else setLoading(false);\n }, [props.id, props.title]);\n useQuery({\n enabled: !!props.id && loading && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"data-output\", props.id, props.title],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.data_output, props.id)).then((response) => {\n const data = response?.data ?? {};\n if (!!data.errors || !!data.error) {\n setLoading(false);\n const error = data?.error ?? data?.errors?.error ?? _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n );\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}),\n autoClose: 2500,\n title: props.title,\n message: error,\n color: \"red\"\n });\n } else if (data.complete) {\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: _i18n._(\n /*i18n*/\n {\n id: \"TCOQbo\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {})\n });\n if (data.output) {\n const url = data.output;\n const base = props.hostname ?? window.location.origin;\n const downloadUrl = new URL(url, base);\n window.open(downloadUrl.toString(), \"_blank\");\n }\n } else {\n notifications.update({\n id: `data-output-${props.id}`,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", maximum: data.total, value: data.progress, progressLabel: data.total > 0, animated: true })\n });\n }\n return data;\n }).catch((error) => {\n console.error(\"Error in useMonitorDataOutput:\", error);\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: error.message || _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n ),\n color: \"red\"\n });\n return {};\n })\n }, props.queryClient);\n}\nexport {\n useMonitorDataOutput as default\n};\n//# sourceMappingURL=MonitorDataOutput.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorBackgroundTask(props) {\n const visibility = useDocumentVisibility();\n const [tracking, setTracking] = useState(false);\n useEffect(() => {\n if (!!props.taskId) {\n setTracking(true);\n showNotification({\n id: `background-task-${props.taskId}`,\n title: props.title,\n message: props.message,\n loading: true,\n autoClose: false,\n withCloseButton: false\n });\n } else {\n setTracking(false);\n }\n }, [props.taskId]);\n useQuery({\n enabled: !!props.taskId && tracking && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"background-task\", props.taskId],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.task_overview, props.taskId)).then((response) => {\n const data = response?.data ?? {};\n if (data.complete) {\n setTracking(false);\n props.onComplete?.();\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: data.success ? \"green\" : \"red\",\n message: response.data?.success ? props.successMessage ?? props.message : props.failureMessage ?? props.message,\n icon: response.data?.success ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {}),\n autoClose: 1e3,\n withCloseButton: true\n });\n if (data.success) {\n props.onSuccess?.();\n } else {\n props.onFailure?.();\n }\n }\n return response;\n }).catch((error) => {\n console.error(`Error fetching background task status for task ${props.taskId}:`, error);\n setTracking(false);\n props.onError?.(error);\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: \"red\",\n message: props.errorMessage ?? props.message,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, { color: \"red\" }),\n autoClose: 5e3,\n withCloseButton: true\n });\n })\n }, props.queryClient);\n}\nexport {\n useMonitorBackgroundTask as default\n};\n//# sourceMappingURL=MonitorBackgroundTask.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction useWindowEvent(type, listener, options) {\n const stableListener = useEffectEvent(listener);\n useEffect(() => {\n window.addEventListener(type, stableListener, options);\n return () => window.removeEventListener(type, stableListener, options);\n }, [type]);\n}\nexport {\n useWindowEvent\n};\n//# sourceMappingURL=use-window-event.js.map\n","import { useWindowEvent } from \"../use-window-event/use-window-event.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction serializeJSON(value, hookName = \"use-local-storage\") {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\nfunction deserializeJSON(value) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\nfunction createStorageHandler(type) {\n const getItem = (key) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to get value from storage, localStorage is blocked\");\n return null;\n }\n };\n const setItem = (key, value) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to set value to storage, localStorage is blocked\");\n }\n };\n const removeItem = (key) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to remove value from storage, localStorage is blocked\");\n }\n };\n return {\n getItem,\n setItem,\n removeItem\n };\n}\nfunction createStorage(type, hookName) {\n const eventName = \"mantine-local-storage\";\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n return function useStorage({ key, defaultValue, getInitialValueInEffect = true, sync = true, deserialize = deserializeJSON, serialize = (value) => serializeJSON(value, hookName) }) {\n const readStorageValue = useCallback((skipStorage) => {\n let storageBlockedOrSkipped;\n try {\n storageBlockedOrSkipped = typeof window === \"undefined\" || !(type in window) || window[type] === null || !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n if (storageBlockedOrSkipped) return defaultValue;\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : defaultValue;\n }, [key, defaultValue]);\n const [value, setValue] = useState(readStorageValue(getInitialValueInEffect));\n const setStorageValue = useCallback((val) => {\n if (val instanceof Function) setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: result\n } }));\n });\n return result;\n });\n else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: val\n } }));\n setValue(val);\n }\n }, [key]);\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue);\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: defaultValue\n } }));\n }, [key, defaultValue]);\n useWindowEvent(\"storage\", (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) setValue(deserialize(event.newValue ?? void 0));\n }\n });\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) setValue(event.detail.value);\n }\n });\n useEffect(() => {\n if (defaultValue !== void 0 && value === void 0) setStorageValue(defaultValue);\n }, [\n defaultValue,\n value,\n setStorageValue\n ]);\n useEffect(() => {\n const val = readStorageValue();\n val !== void 0 && setStorageValue(val);\n }, [key]);\n return [\n value === void 0 ? defaultValue : value,\n setStorageValue,\n removeStorageValue\n ];\n };\n}\nexport {\n createStorage\n};\n//# sourceMappingURL=create-storage.js.map\n","import { useLocalStorage } from \"../node_modules/@mantine/hooks/esm/use-local-storage/use-local-storage.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useMemo = window[\"React\"].useMemo;\nfunction useFilterSet(filterKey, initialFilters) {\n const [storedFilters, setStoredFilters] = useLocalStorage({\n key: `inventree-filterset-${filterKey}`,\n defaultValue: null,\n sync: false,\n getInitialValueInEffect: false\n });\n const [storedNamedSets, setStoredNamedSets] = useLocalStorage({\n key: `inventree-filtersets-${filterKey}`,\n defaultValue: [],\n sync: false,\n getInitialValueInEffect: false\n });\n useEffect(() => {\n if (storedFilters == null) {\n setStoredFilters(initialFilters || []);\n }\n }, [storedFilters, initialFilters, setStoredFilters]);\n const activeFilters = useMemo(() => {\n return storedFilters ?? initialFilters ?? [];\n }, [storedFilters, initialFilters]);\n const clearActiveFilters = useCallback(() => {\n setStoredFilters([]);\n }, []);\n const setActiveFilters = useCallback((filters) => {\n setStoredFilters(filters);\n }, [setStoredFilters]);\n const saveFilterSet = useCallback((name) => {\n const snapshot = activeFilters.map(({\n name: n,\n value,\n displayValue\n }) => ({\n name: n,\n value,\n displayValue\n }));\n setStoredNamedSets((prev) => {\n const without = (prev ?? []).filter((s) => s.name !== name);\n return [...without, {\n name,\n filters: snapshot\n }];\n });\n }, [activeFilters, setStoredNamedSets]);\n const loadFilterSet = useCallback((name) => {\n const saved = (storedNamedSets ?? []).find((s) => s.name === name);\n if (saved) {\n setStoredFilters(saved.filters);\n }\n }, [storedNamedSets, setStoredFilters]);\n const deleteFilterSet = useCallback((name) => {\n setStoredNamedSets((prev) => (prev ?? []).filter((s) => s.name !== name));\n }, [setStoredNamedSets]);\n return {\n filterKey,\n activeFilters,\n setActiveFilters,\n clearActiveFilters,\n savedFilterSets: storedNamedSets ?? [],\n saveFilterSet,\n loadFilterSet,\n deleteFilterSet\n };\n}\nexport {\n useFilterSet as default\n};\n//# sourceMappingURL=UseFilterSet.js.map\n","import { randomId } from \"../node_modules/@mantine/hooks/esm/utils/random-id/random-id.js\";\nimport useFilterSet from \"./UseFilterSet.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction useTable(tableName, tableProps = {\n idAccessor: \"pk\",\n initialFilters: []\n}) {\n function generateTableName() {\n return `${tableName.replaceAll(\"-\", \"\")}-${randomId()}`;\n }\n const [tableKey, setTableKey] = useState(generateTableName());\n const refreshTable = useCallback((clearSelection) => {\n setTableKey(generateTableName());\n if (clearSelection) {\n clearSelectedRecords();\n }\n }, [generateTableName]);\n const filterSet = useFilterSet(`table-${tableName}`, tableProps.initialFilters);\n const [expandedRecords, setExpandedRecords] = useState([]);\n const isRowExpanded = useCallback((pk) => {\n return expandedRecords.includes(pk);\n }, [expandedRecords]);\n const [hiddenColumns, setHiddenColumns] = useState([]);\n const [selectedRecords, setSelectedRecords] = useState([]);\n const selectedIds = useMemo(() => selectedRecords.map((r) => r[tableProps.idAccessor || \"pk\"]), [selectedRecords]);\n const clearSelectedRecords = useCallback(() => {\n setSelectedRecords([]);\n }, []);\n const hasSelectedRecords = useMemo(() => {\n return selectedRecords.length > 0;\n }, [selectedRecords]);\n const [recordCount, setRecordCount] = useState(0);\n const [page, setPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [records, setRecords] = useState([]);\n const updateRecord = useCallback((record) => {\n const _records = [...records];\n const index = _records.findIndex((r) => r[tableProps.idAccessor || \"pk\"] === record.pk);\n if (index >= 0) {\n _records[index] = {\n ..._records[index],\n ...record\n };\n } else {\n _records.push(record);\n }\n setRecords(_records);\n }, [records]);\n const idAccessor = useMemo(() => tableProps.idAccessor || \"pk\", [tableProps.idAccessor]);\n const [isLoading, setIsLoading] = useState(false);\n return {\n tableKey,\n refreshTable,\n isLoading,\n setIsLoading,\n filterSet,\n expandedRecords,\n setExpandedRecords,\n isRowExpanded,\n selectedRecords,\n selectedIds,\n setSelectedRecords,\n clearSelectedRecords,\n hasSelectedRecords,\n searchTerm,\n setSearchTerm,\n recordCount,\n setRecordCount,\n hiddenColumns,\n setHiddenColumns,\n page,\n setPage,\n records,\n setRecords,\n updateRecord,\n idAccessor\n };\n}\nexport {\n useTable as default\n};\n//# sourceMappingURL=UseTable.js.map\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nvar Action;\n(function(Action2) {\n Action2[\"Pop\"] = \"POP\";\n Action2[\"Push\"] = \"PUSH\";\n Action2[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n throw new Error(message);\n } catch (e) {\n }\n }\n}\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nvar ResultType;\n(function(ResultType2) {\n ResultType2[\"data\"] = \"data\";\n ResultType2[\"deferred\"] = \"deferred\";\n ResultType2[\"redirect\"] = \"redirect\";\n ResultType2[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n return matchRoutesImpl(routes, locationArg, basename);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n let decoded = decodePath(pathname);\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], decoded);\n }\n return matches;\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === void 0 ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), 'Absolute route path \"' + meta.relativePath + '\" nested under path ' + ('\"' + parentPath + '\" is not valid. An absolute child route path ') + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n \"Index routes must not have child routes. Please remove \" + ('all child routes from route path \"' + path + '\".')\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n let isOptional = first.endsWith(\"?\");\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n result.push(...restExploded.map((subpath) => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n if (isOptional) {\n result.push(...restExploded);\n }\n return result.map((exploded) => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(a.routesMeta.map((meta) => meta.childrenIndex), b.routesMeta.map((meta) => meta.childrenIndex)));\n}\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s) => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? (\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n ) : (\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0\n );\n}\nfunction matchRouteBranch(branch, pathname, allowPartial) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n let route = meta.route;\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = void 0;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), 'Route path \"' + path + '\" will be treated as if it were ' + ('\"' + path.replace(/\\*$/, \"/*\") + '\" because the `*` character must ') + \"always follow a `/` in the pattern. To get rid of this warning, \" + ('please change the route path to \"' + path.replace(/\\*$/, \"/*\") + '\".'));\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\").replace(/^\\/*/, \"/\").replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\").replace(/\\/:([\\w-]+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n if (path.endsWith(\"*\")) {\n params.push({\n paramName: \"*\"\n });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" : \"(?:\\\\/(.+)|\\\\/*)$\";\n } else if (end) {\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(false, 'The URL path \"' + value + '\" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent ' + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\nconst ABSOLUTE_URL_REGEX$1 = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX$1.test(url);\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname;\n if (toPathname) {\n if (isAbsoluteUrl(toPathname)) {\n pathname = toPathname;\n } else {\n if (toPathname.includes(\"//\")) {\n let oldPathname = toPathname;\n toPathname = removeDoubleSlashes(toPathname);\n warning(false, \"Pathnames cannot have embedded double slashes - normalizing \" + (oldPathname + \" -> \" + toPathname));\n }\n if (toPathname.startsWith(\"/\")) {\n pathname = resolvePathname(toPathname.substring(1), \"/\");\n } else {\n pathname = resolvePathname(toPathname, fromPathname);\n }\n }\n } else {\n pathname = fromPathname;\n }\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + 'a string in and the router will parse it for you.';\n}\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n let pathMatches = getPathContributingMatches(matches);\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n }\n return pathMatches.map((match) => match.pathnameBase);\n}\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\nconst removeDoubleSlashes = (path) => path.replace(/\\/\\/+/g, \"/\");\nconst joinPaths = (paths) => removeDoubleSlashes(paths.join(\"/\"));\nconst normalizePathname = (pathname) => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\nconst normalizeSearch = (search) => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\nconst normalizeHash = (hash) => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\nclass AbortedDeferredError extends Error {\n}\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nnew Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nnew Set(validRequestMethodsArr);\nexport {\n AbortedDeferredError,\n Action,\n decodePath as UNSAFE_decodePath,\n getResolveToMatches as UNSAFE_getResolveToMatches,\n invariant as UNSAFE_invariant,\n warning as UNSAFE_warning,\n createPath,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n normalizePathname,\n parsePath,\n resolvePath,\n resolveTo,\n stripBasename\n};\n//# sourceMappingURL=router.js.map\n","import { UNSAFE_invariant as invariant, UNSAFE_getResolveToMatches as getResolveToMatches, resolveTo, joinPaths, parsePath, matchRoutes, Action, isRouteErrorResponse, AbortedDeferredError } from \"../../@remix-run/router/dist/router.js\";\nimport { createPath, matchPath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nconst DataRouterContext = /* @__PURE__ */ React.createContext(null);\nconst DataRouterStateContext = /* @__PURE__ */ React.createContext(null);\nconst AwaitContext = /* @__PURE__ */ React.createContext(null);\nconst NavigationContext = /* @__PURE__ */ React.createContext(null);\nconst LocationContext = /* @__PURE__ */ React.createContext(null);\nconst RouteContext = /* @__PURE__ */ React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nconst RouteErrorContext = /* @__PURE__ */ React.createContext(null);\nfunction useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\nfunction useInRouterContext() {\n return React.useContext(LocationContext) != null;\n}\nfunction useLocation() {\n !useInRouterContext() ? invariant(false) : void 0;\n return React.useContext(LocationContext).location;\n}\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n React.useLayoutEffect(cb);\n }\n}\nfunction useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext);\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n future,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\nfunction useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n future\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\nfunction useRoutesImpl(routes, locationArg, dataRouterState, future) {\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n routeMatch && routeMatch.route;\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n let renderedMatches = _renderMatches(matches && matches.map((match) => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase\n ])\n })), parentMatches, dataRouterState, future);\n if (locationArg && renderedMatches) {\n return /* @__PURE__ */ React.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /* @__PURE__ */ React.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /* @__PURE__ */ React.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /* @__PURE__ */ React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n return {\n error: props.error !== void 0 ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n render() {\n return this.state.error !== void 0 ? /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /* @__PURE__ */ React.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = React.useContext(DataRouterContext);\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState, future) {\n var _dataRouterState;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (future === void 0) {\n future = null;\n }\n if (matches == null) {\n var _future;\n if (!dataRouterState) {\n return null;\n }\n if (dataRouterState.errors) {\n matches = dataRouterState.matches;\n } else if ((_future = future) != null && _future.v7_partialHydration && parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n let errors = (_dataRouterState = dataRouterState) == null ? void 0 : _dataRouterState.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex((m) => m.route.id && (errors == null ? void 0 : errors[m.route.id]) !== void 0);\n !(errorIndex >= 0) ? invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n if (match.route.id) {\n let {\n loaderData,\n errors: errors2\n } = dataRouterState;\n let needsToRunLoader = match.route.loader && loaderData[match.route.id] === void 0 && (!errors2 || errors2[match.route.id] === void 0);\n if (match.route.lazy || needsToRunLoader) {\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error;\n let shouldRenderHydrateFallback = false;\n let errorElement = null;\n let hydrateFallbackElement = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : void 0;\n errorElement = match.route.errorElement || defaultErrorElement;\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\"route-fallback\");\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n children = /* @__PURE__ */ React.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /* @__PURE__ */ React.createElement(RenderedRoute, {\n match,\n routeContext: {\n outlet,\n matches: matches2,\n isDataRoute: dataRouterState != null\n },\n children\n });\n };\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches: matches2,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /* @__PURE__ */ (function(DataRouterHook2) {\n DataRouterHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook2[\"UseNavigateStable\"] = \"useNavigate\";\n return DataRouterHook2;\n})(DataRouterHook || {});\nvar DataRouterStateHook = /* @__PURE__ */ (function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook2[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook2[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook2[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook2[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook2[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook2[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook2[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook2[\"UseRouteId\"] = \"useRouteId\";\n return DataRouterStateHook2;\n})(DataRouterStateHook || {});\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? invariant(false) : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = React.useContext(DataRouterStateContext);\n !state ? invariant(false) : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = React.useContext(RouteContext);\n !route ? invariant(false) : void 0;\n return route;\n}\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext();\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? invariant(false) : void 0;\n return thisRoute.route.id;\n}\nfunction useRouteError() {\n var _state$errors;\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState();\n let routeId = useCurrentRouteId();\n if (error !== void 0) {\n return error;\n }\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\nconst alreadyWarned$1 = {};\nfunction warningOnce(key, cond, message) {\n if (!alreadyWarned$1[key]) {\n alreadyWarned$1[key] = true;\n }\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nfunction Route(_props) {\n invariant(false);\n}\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\nvar AwaitRenderStatus = /* @__PURE__ */ (function(AwaitRenderStatus2) {\n AwaitRenderStatus2[AwaitRenderStatus2[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"success\"] = 1] = \"success\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"error\"] = 2] = \"error\";\n return AwaitRenderStatus2;\n})(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(() => {\n});\nclass AwaitErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\" caught the following error during render\", error, errorInfo);\n }\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_data\", {\n get: () => resolve\n });\n } else if (this.state.error) {\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {\n });\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_error\", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n promise = resolve;\n status = \"_error\" in promise ? AwaitRenderStatus.error : \"_data\" in promise ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: () => true\n });\n promise = resolve.then((data) => Object.defineProperty(resolve, \"_data\", {\n get: () => data\n }), (error) => Object.defineProperty(resolve, \"_error\", {\n get: () => error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children\n });\n }\n throw promise;\n }\n}\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (!/* @__PURE__ */ React.isValidElement(element)) {\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React.Fragment) {\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\nexport {\n AbortedDeferredError,\n Action as NavigationType,\n Route,\n Routes,\n DataRouterContext as UNSAFE_DataRouterContext,\n DataRouterStateContext as UNSAFE_DataRouterStateContext,\n LocationContext as UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n RouteContext as UNSAFE_RouteContext,\n useRoutesImpl as UNSAFE_useRoutesImpl,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","import { UNSAFE_NavigationContext as NavigationContext, useHref, useNavigate, useLocation, useResolvedPath } from \"../../react-router/dist/index.js\";\nimport { Route, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_RouteContext, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromChildren2, useInRouterContext, useParams, useRouteError, useRoutes } from \"../../react-router/dist/index.js\";\nimport { stripBasename, createPath } from \"../../@remix-run/router/dist/router.js\";\nimport { AbortedDeferredError, Action, isRouteErrorResponse, matchPath, matchRoutes, parsePath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nconst ReactDOM = window[\"ReactDOM\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event);\n}\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\", \"viewTransition\"];\nconst REACT_ROUTER_VERSION = \"6\";\ntry {\n window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nReact[USE_ID];\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst Link = /* @__PURE__ */ React.forwardRef(function LinkWithRef(_ref7, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace: replace2,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition\n } = _ref7, rest = _objectWithoutPropertiesLoose(_ref7, _excluded);\n let {\n basename\n } = React.useContext(NavigationContext);\n let absoluteHref;\n let isExternal = false;\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n absoluteHref = to;\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n }\n }\n }\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace: replace2,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n /* @__PURE__ */ React.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref,\n target\n }))\n );\n});\nvar DataRouterHook;\n(function(DataRouterHook2) {\n DataRouterHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook2[\"UseSubmit\"] = \"useSubmit\";\n DataRouterHook2[\"UseSubmitFetcher\"] = \"useSubmitFetcher\";\n DataRouterHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterHook2[\"useViewTransitionState\"] = \"useViewTransitionState\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterStateHook2[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n viewTransition\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback((event) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace: replace2,\n state,\n preventScrollReset,\n relative,\n viewTransition\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative, viewTransition]);\n}\nexport {\n AbortedDeferredError,\n Link,\n Action as NavigationType,\n Route,\n Routes,\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n UNSAFE_RouteContext,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren2 as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLinkClickHandler,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","function createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, void 0);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, void 0)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\nexport {\n createJSONStorage,\n persist\n};\n//# sourceMappingURL=middleware.js.map\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\nexport {\n createStore\n};\n//# sourceMappingURL=vanilla.js.map\n","import { createStore } from \"./vanilla.js\";\nconst React = window[\"React\"];\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createImpl);\nexport {\n create,\n useStore\n};\n//# sourceMappingURL=react.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst useLocalLibState = create()(persist((set, get) => ({\n detailDrawerStack: 0,\n addDetailDrawer: (value) => {\n set({\n detailDrawerStack: value === false ? 0 : get().detailDrawerStack + value\n });\n },\n hotkeys: {},\n addHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const [ref, details] of hotkeys) {\n newHotkeys[ref] = details;\n }\n set({\n hotkeys: newHotkeys\n });\n },\n removeHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const ref of hotkeys) {\n delete newHotkeys[ref];\n }\n set({\n hotkeys: newHotkeys\n });\n }\n}), {\n name: \"session-settings-inventreedb_lib\"\n}));\nexport {\n useLocalLibState\n};\n//# sourceMappingURL=LocalLibState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst Text = window[\"MantineCore\"].Text;\nconst darken = window[\"MantineCore\"].darken;\nconst getThemeColor = window[\"MantineCore\"].getThemeColor;\nconst useMantineTheme = window[\"MantineCore\"].useMantineTheme;\nconst useMemo = window[\"React\"].useMemo;\nconst useThematicGradient = () => {\n const theme = useMantineTheme();\n const primary = useMemo(() => {\n return getThemeColor(theme.primaryColor, theme);\n }, [theme]);\n const secondary = useMemo(() => darken(primary, 0.25), [primary]);\n return useMemo(() => {\n return {\n primary,\n secondary\n };\n }, [primary, secondary]);\n};\nfunction StylishText({\n children,\n size\n}) {\n const {\n primary,\n secondary\n } = useThematicGradient();\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { fw: 700, size: size ?? \"xl\", variant: \"gradient\", gradient: {\n from: primary.toString(),\n to: secondary.toString()\n }, children });\n}\nexport {\n StylishText\n};\n//# sourceMappingURL=StylishText.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M15 6l-6 6l6 6\", \"key\": \"svg-0\" }]];\nconst IconChevronLeft = createReactComponent(\"outline\", \"chevron-left\", \"ChevronLeft\", __iconNode);\nexport {\n __iconNode,\n IconChevronLeft as default\n};\n//# sourceMappingURL=IconChevronLeft.js.map\n","import { j as jsxRuntimeExports } from \"../../_virtual/jsx-runtime.js\";\nimport { Link } from \"../../node_modules/react-router-dom/dist/index.js\";\nimport { useShallow } from \"../../node_modules/zustand/esm/react/shallow.js\";\nimport { useLocalLibState } from \"../../states/LocalLibState.js\";\nimport { StylishText } from \"../StylishText.js\";\nimport { flex } from \"./DetailDrawer.css.js\";\nimport { Routes, Route, useNavigate, useParams } from \"../../node_modules/react-router/dist/index.js\";\nimport IconChevronLeft from \"../../node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Drawer = window[\"MantineCore\"].Drawer;\nconst Group = window[\"MantineCore\"].Group;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nfunction DetailDrawerComponent({\n title,\n position = \"right\",\n size,\n closeOnEscape = true,\n renderContent\n}) {\n const navigate = useNavigate();\n const {\n id\n } = useParams();\n const content = renderContent(id);\n const opened = useMemo(() => !!id && !!content, [id, content]);\n const [detailDrawerStack, addDetailDrawer] = useLocalLibState(useShallow((state) => [state.detailDrawerStack, state.addDetailDrawer]));\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Drawer, { opened, onClose: () => {\n navigate(\"../\");\n addDetailDrawer(false);\n }, position, closeOnEscape, size, classNames: {\n root: flex,\n body: flex\n }, scrollAreaComponent: Stack, title: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { children: [\n detailDrawerStack > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"outline\", onClick: () => {\n navigate(-1);\n addDetailDrawer(-1);\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconChevronLeft, {}) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(StylishText, { size: \"xl\", children: title })\n ] }), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", className: flex, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n content\n ] }) });\n}\nfunction DetailDrawer(props) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Routes, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: \":id?/\", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DetailDrawerComponent, { ...props }) }) });\n}\nfunction DetailDrawerLink({\n to,\n text\n}) {\n const addDetailDrawer = useLocalLibState(useShallow((state) => state.addDetailDrawer));\n const onNavigate = useCallback(() => {\n addDetailDrawer(1);\n }, [addDetailDrawer]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to, onClick: onNavigate, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { children: text }) });\n}\nexport {\n DetailDrawer,\n DetailDrawerComponent,\n DetailDrawerLink\n};\n//# sourceMappingURL=DetailDrawer.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst DEFAULT_PAGE_SIZE = 25;\nconst useStoredTableState = create()(persist((set, get) => ({\n pageSize: DEFAULT_PAGE_SIZE,\n setPageSize: (size) => {\n set((state) => ({\n pageSize: size\n }));\n },\n tableSorting: {},\n getTableSorting: (tableKey) => {\n return get().tableSorting[tableKey] || {};\n },\n setTableSorting: (tableKey) => (sorting) => {\n set({\n tableSorting: {\n ...get().tableSorting,\n [tableKey]: sorting\n }\n });\n },\n tableColumnNames: {},\n getTableColumnNames: (tableKey) => {\n return get().tableColumnNames[tableKey] || null;\n },\n setTableColumnNames: (tableKey) => (names) => {\n set({\n tableColumnNames: {\n ...get().tableColumnNames,\n [tableKey]: names\n }\n });\n },\n clearTableColumnNames: () => {\n set({\n tableColumnNames: {}\n });\n },\n hiddenColumns: {},\n getHiddenColumns: (tableKey) => {\n return get().hiddenColumns?.[tableKey] ?? null;\n },\n setHiddenColumns: (tableKey) => (columns) => {\n set({\n hiddenColumns: {\n ...get().hiddenColumns,\n [tableKey]: columns\n }\n });\n }\n}), {\n name: \"inventree-table-state\"\n}));\nexport {\n useStoredTableState\n};\n//# sourceMappingURL=StoredTableState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst I18nProvider = window[\"LinguiReact\"].I18nProvider;\nconst Skeleton = window[\"MantineCore\"].Skeleton;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nasync function tryLoadLocale(locale, loader) {\n try {\n return await loader(locale);\n } catch (error) {\n console.warn(`Failed to load locale ${locale}`);\n return null;\n }\n}\nasync function loadPluginLocale(i18n, locale, loader) {\n let messages = null;\n messages = await tryLoadLocale(locale, loader);\n if (!messages && locale.includes(\"-\")) {\n const fallbackLocale = locale.split(\"-\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale.includes(\"_\")) {\n const fallbackLocale = locale.split(\"_\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale !== \"en\") {\n console.debug(`Locale ${locale} not found, trying fallback locale en`);\n messages = await tryLoadLocale(\"en\", loader);\n }\n if (messages?.messages) {\n i18n.load(locale, messages.messages);\n i18n.activate(locale);\n } else {\n console.error(`Failed to load any locale for ${locale}`);\n }\n}\nconst defaultLocaleLoader = async (_locale) => null;\nfunction LocalizedComponent({\n i18n,\n locale,\n loadLocale,\n children\n}) {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n setLoaded(false);\n loadPluginLocale(i18n, locale, loadLocale ?? defaultLocaleLoader).then(() => {\n setLoaded(true);\n });\n }, [i18n, locale, loadLocale]);\n return loaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(I18nProvider, { i18n, children }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { w: \"100%\", animate: true });\n}\nexport {\n LocalizedComponent as default\n};\n//# sourceMappingURL=LocalizedComponent.js.map\n","import { useHotkeys } from \"../node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js\";\nimport \"../enums/Roles.js\";\nimport \"../enums/ModelInformation.js\";\nimport \"./Notification.js\";\nimport \"../components/ActionButton.js\";\nimport \"../_virtual/jsx-runtime.js\";\nimport \"../components/Boundary.js\";\nimport \"../components/ButtonMenu.js\";\nimport \"../components/CopyButton.js\";\nimport \"../components/CopyableCell.js\";\nimport \"../components/ProgressBar.js\";\nimport \"../components/YesNoButton.js\";\nimport \"../components/SearchInput.js\";\nimport \"../components/TableColumnSelect.js\";\nimport \"../components/TagsList.js\";\nimport \"../components/InvenTreeTable.js\";\nimport \"../components/RowActions.js\";\nimport \"../hooks/MonitorDataOutput.js\";\nimport \"../hooks/MonitorBackgroundTask.js\";\nimport \"../hooks/UseFilterSet.js\";\nimport \"../hooks/UseTable.js\";\nimport \"../components/nav/DetailDrawer.js\";\nimport \"../components/StylishText.js\";\nimport \"../states/StoredTableState.js\";\nimport { useLocalLibState } from \"../states/LocalLibState.js\";\nimport \"../plugin/LocalizedComponent.js\";\nconst useEffect = window[\"React\"].useEffect;\nfunction cancelEvent(event) {\n event?.preventDefault();\n event?.stopPropagation();\n event?.nativeEvent?.stopImmediatePropagation();\n}\nfunction useInvenTreeHotkeys(_keys, tagsToIgnore) {\n const keyelems = _keys.map(([key, description]) => [key, description]);\n const mappedHotkeys = _keys.map(([key, _, handler, options]) => [key, handler, options]);\n useHotkeys(mappedHotkeys, tagsToIgnore);\n useEffect(() => {\n useLocalLibState.getState().addHotkeys(keyelems);\n return () => useLocalLibState.getState().removeHotkeys(keyelems.map(([key]) => key));\n }, []);\n}\nexport {\n cancelEvent,\n useInvenTreeHotkeys\n};\n//# sourceMappingURL=Events.js.map\n","import { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nfunction checkPluginVersion(context) {\n const systemVersion = context?.version?.inventree || \"\";\n if (INVENTREE_PLUGIN_VERSION != systemVersion) {\n console.info(`Plugin version mismatch! Expected version ${INVENTREE_PLUGIN_VERSION}, got ${systemVersion}`);\n }\n}\nfunction initPlugin(context) {\n checkPluginVersion(context);\n context.i18n?.activate?.(context.locale);\n}\nexport {\n checkPluginVersion,\n initPlugin\n};\n//# sourceMappingURL=Plugins.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M12 5l0 14\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-1\" }]];\nconst IconPlus = createReactComponent(\"outline\", \"plus\", \"Plus\", __iconNode);\nexport {\n __iconNode,\n IconPlus as default\n};\n//# sourceMappingURL=IconPlus.js.map\n","import type { LocaleLoader } from '@inventreedb/ui';\n\n// Necessary callback function to dynamically load the locale messages for the plugin\nexport const loadLocale: LocaleLoader = async (locale: string) =>\n import(`./locales/${locale}/messages.ts`).catch(() => null);\n","import {\n checkPluginVersion,\n type InvenTreePluginContext,\n LocalizedComponent\n} from '@inventreedb/ui';\nimport { t } from '@lingui/core/macro';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Switch,\n Table,\n Text,\n Title\n} from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { loadLocale } from './locales';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\nconst GENERATE_URL = '/plugin/batchcode/generate/';\n\n/** Settings dict provided by BatchCodePlugin.get_ui_panels */\ntype BatchCodeSettings = Record;\n\n/**\n * Summary of the settings which decide what a generated code looks like.\n */\nfunction SettingsSummary({ settings }: { settings: BatchCodeSettings }) {\n const rows: [string, string][] = useMemo(() => {\n const scopes: string[] = [];\n\n if (settings.PER_PART) scopes.push(t`per part`);\n if (settings.PER_LOCATION) scopes.push(t`per location`);\n if (settings.DAILY_RESET) scopes.push(t`reset daily`);\n\n return [\n [t`Format`, String(settings.CODE_FORMAT ?? '')],\n [\n t`Prefix`,\n settings.USE_LOCATION_PREFIX\n ? t`from location field '${String(settings.LOCATION_FIELD)}'`\n : String(settings.PREFIX ?? '')\n ],\n [t`Counter`, scopes.length ? scopes.join(', ') : t`global`],\n [t`Trigger`, String(settings.TRIGGER_MODE ?? '')]\n ];\n }, [settings]);\n\n return (\n \n \n {rows.map(([label, value]) => (\n \n \n \n {label}\n \n \n \n {value}\n \n \n ))}\n \n
\n );\n}\n\nfunction BatchCodePanel({ context }: { context: InvenTreePluginContext }) {\n const settings: BatchCodeSettings = useMemo(\n () => context.context?.settings ?? {},\n [context.context]\n );\n\n const canGenerate: boolean = useMemo(\n () => !!context.context?.can_generate,\n [context.context]\n );\n\n const itemId = useMemo(() => context.id ?? null, [context.id]);\n\n const currentCode: string = useMemo(\n () => context.instance?.batch || '',\n [context.instance]\n );\n\n const [preview, setPreview] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [busy, setBusy] = useState(false);\n const [overwrite, setOverwrite] = useState(false);\n\n // Ask the backend which code would be issued next. This is a preview: it\n // does not advance the counter, so it can be refreshed freely.\n const loadPreview = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, { item: itemId })\n .then((response) => setPreview(response.data?.batch_code ?? ''))\n .catch(() => setError(t`Could not load a batch code preview`))\n .finally(() => setLoading(false));\n }, [context.api, itemId]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n const generate = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setBusy(true);\n\n context.api\n .post(GENERATE_URL, { item: itemId, overwrite: overwrite })\n .then((response) => {\n const code = response.data?.batch_code ?? '';\n\n notifications.show({\n title: t`Batch code generated`,\n message: code,\n color: 'green'\n });\n\n context.reloadInstance?.();\n loadPreview();\n })\n .catch((e) => {\n const detail =\n e?.response?.data?.item?.[0] ??\n e?.response?.data?.detail ??\n t`Could not generate a batch code`;\n\n notifications.show({\n title: t`Batch code not generated`,\n message: String(detail),\n color: 'red'\n });\n })\n .finally(() => setBusy(false));\n }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]);\n\n if (!settings.ENABLED) {\n return (\n \n \n {t`Enable the plugin setting 'Enabled' to generate batch codes.`}\n \n \n );\n }\n\n return (\n \n \n \n \n {t`Current batch code`}\n \n {currentCode ? (\n \n {currentCode}\n \n ) : (\n \n {t`Not set`}\n \n )}\n \n \n \n {t`Next code`}\n \n {loading ? (\n \n ) : (\n \n {preview || '—'}\n \n )}\n \n \n\n {error && (\n \n {error}\n \n )}\n\n {canGenerate ? (\n \n setOverwrite(event.currentTarget.checked)}\n label={t`Overwrite the existing batch code`}\n disabled={!currentCode}\n />\n \n \n \n {t`Generate and save`}\n \n \n \n ) : (\n \n {t`You do not have permission to generate batch codes.`}\n \n )}\n\n \n {t`Configuration`}\n \n \n \n );\n}\n\n// This is the function which is called by InvenTree to render the actual panel component\nexport function RenderBatchCodePluginPanel(context: InvenTreePluginContext) {\n checkPluginVersion(context);\n\n return (\n \n \n \n );\n}\n"],"file":"Panel.js"} \ No newline at end of file diff --git a/batchcode_plugin/static/Settings-D5NnX1mC.js b/batchcode_plugin/static/Settings-D5NnX1mC.js new file mode 100644 index 0000000..4052de1 --- /dev/null +++ b/batchcode_plugin/static/Settings-D5NnX1mC.js @@ -0,0 +1,2 @@ +const R=window.MantineCore.Alert,w=window.MantineCore.Badge,E=window.MantineCore.Button,e=window.MantineCore.Code,g=window.MantineCore.Group,p=window.MantineCore.Loader,u=window.MantineCore.Stack,c=window.MantineCore.Text,h=window.React.useCallback,C=window.React.useEffect,l=window.React.useState,f="/plugin/batchcode/preview/";function b({context:t}){const[m,o]=l(""),[r,i]=l(""),[s,d]=l(!1),a=h(()=>{d(!0),i(""),t.api.post(f,{}).then(n=>o(n.data?.batch_code??"")).catch(n=>{i(String(n?.response?.data?.detail??"Could not render a preview code")),o("")}).finally(()=>d(!1))},[t.api]);return C(()=>{a()},[a]),React.createElement(u,{gap:"sm"},React.createElement(R,{color:"blue",title:"Format preview"},React.createElement(u,{gap:"sm"},React.createElement(c,{size:"sm"},"The next batch code for the global counter, using the settings above. Part, location and date placeholders resolve against the actual stock item when a code is generated."),React.createElement(g,{gap:"sm",align:"center"},s?React.createElement(p,{size:"sm"}):React.createElement(w,{size:"lg",variant:"light"},m||"—"),React.createElement(E,{size:"xs",variant:"default",onClick:a,disabled:s},"Refresh")),r&&React.createElement(c,{size:"sm",c:"red"},r))),React.createElement(c,{size:"xs",c:"dimmed"},"Placeholders: ",React.createElement(e,null,"{prefix}")," ",React.createElement(e,null,"{num}")," ",React.createElement(e,null,"{sep}")," ",React.createElement(e,null,"{date}")," ",React.createElement(e,null,"{part}")," ",React.createElement(e,null,"{ipn}")," ",React.createElement(e,null,"{loc}")," ",React.createElement(e,null,"{year}")," ",React.createElement(e,null,"{month}")," ",React.createElement(e,null,"{day}")," ",React.createElement(e,null,"{week}")))}function v(t){return React.createElement(b,{context:t})}export{v as RenderPluginSettings}; +//# sourceMappingURL=Settings-D5NnX1mC.js.map diff --git a/batchcode_plugin/static/Settings-D5NnX1mC.js.map b/batchcode_plugin/static/Settings-D5NnX1mC.js.map new file mode 100644 index 0000000..bbbcc31 --- /dev/null +++ b/batchcode_plugin/static/Settings-D5NnX1mC.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Settings-D5NnX1mC.js","sources":["../../frontend/src/Settings.tsx"],"sourcesContent":["import type { InvenTreePluginContext } from '@inventreedb/ui';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Text\n} from '@mantine/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\n\n/**\n * Rendered on the plugin settings page, below the settings themselves.\n *\n * Shows the code the current settings would produce. The preview endpoint\n * does not advance the counter, so this can be refreshed after each settings\n * change to check a format before it is used for real.\n */\nfunction PluginSettingsDisplay({\n context\n}: {\n context: InvenTreePluginContext;\n}) {\n const [code, setCode] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const loadPreview = useCallback(() => {\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, {})\n .then((response) => setCode(response.data?.batch_code ?? ''))\n .catch((e) => {\n setError(\n String(e?.response?.data?.detail ?? 'Could not render a preview code')\n );\n setCode('');\n })\n .finally(() => setLoading(false));\n }, [context.api]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n return (\n \n \n \n \n The next batch code for the global counter, using the settings\n above. Part, location and date placeholders resolve against the\n actual stock item when a code is generated.\n \n \n {loading ? (\n \n ) : (\n \n {code || '—'}\n \n )}\n \n Refresh\n \n \n {error && (\n \n {error}\n \n )}\n \n \n \n Placeholders: {'{prefix}'} {'{num}'}{' '}\n {'{sep}'} {'{date}'} {'{part}'}{' '}\n {'{ipn}'} {'{loc}'} {'{year}'}{' '}\n {'{month}'} {'{day}'} {'{week}'}\n \n \n );\n}\n\nexport function RenderPluginSettings(context: InvenTreePluginContext) {\n return ;\n}\n"],"names":["Alert","useCallback","PREVIEW_URL","PluginSettingsDisplay","context","code","setCode","useState","error","setError","loading","setLoading","loadPreview","api","post","then","response","data","batch_code","catch","e","String","detail","finally","useEffect","Stack","Text","Group","Loader","Badge","Button","Code","RenderPluginSettings"],"mappings":"AACA,MAAAA,EAAA,OAAA,YAAA,mMAUAC,EAAA,OAAA,MAAA,6DAEMC,EAAc,6BASpB,SAASC,EAAsB,CAC7BC,QAAAA,CAGF,EAAG,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAiB,EAAE,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAiB,EAAE,EACvC,CAACG,EAASC,CAAU,EAAIJ,EAAkB,EAAK,EAE/CK,EAAcX,EAAY,IAAM,CACpCU,EAAW,EAAI,EACfF,EAAS,EAAE,EAEXL,EAAQS,IACLC,KAAKZ,EAAa,CAAA,CAAE,EACpBa,KAAMC,GAAaV,EAAQU,EAASC,MAAMC,YAAc,EAAE,CAAC,EAC3DC,MAAOC,GAAM,CACZX,EACEY,OAAOD,GAAGJ,UAAUC,MAAMK,QAAU,iCAAiC,CACvE,EACAhB,EAAQ,EAAE,CACZ,CAAC,EACAiB,QAAQ,IAAMZ,EAAW,EAAK,CAAC,CACpC,EAAG,CAACP,EAAQS,GAAG,CAAC,EAEhBW,OAAAA,EAAU,IAAM,CACdZ,EAAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAGd,MAAA,cAACa,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACzB,EAAA,CAAM,MAAM,OAAO,MAAM,gBAAA,EACxB,MAAA,cAACyB,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACC,EAAA,CAAK,KAAK,IAAA,EAAI,4KAIf,EACA,MAAA,cAACC,EAAA,CAAM,IAAI,KAAK,MAAM,UACnBjB,EACC,MAAA,cAACkB,EAAA,CAAO,KAAK,IAAA,CAAI,EAEjB,MAAA,cAACC,EAAA,CAAM,KAAK,KAAK,QAAQ,OAAA,EACtBxB,GAAQ,GACX,EAEF,MAAA,cAACyB,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAASlB,EACT,SAAUF,GAAQ,SAGpB,CACF,EACCF,GACC,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,OACflB,CACH,CAEJ,CACF,EACA,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,QAAA,EAAQ,iBACV,MAAA,cAACK,EAAA,KAAM,UAAW,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAQ,IAC/D,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACvE,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACtE,MAAA,cAACA,EAAA,KAAM,SAAU,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,CAClE,CACF,CAEJ,CAEO,SAASC,EAAqB5B,EAAiC,CACpE,OAAO,MAAA,cAACD,GAAsB,QAAAC,CAAA,CAAiB,CACjD"} \ No newline at end of file diff --git a/batchcode_plugin/static/Settings.js b/batchcode_plugin/static/Settings.js new file mode 100644 index 0000000..688c6dd --- /dev/null +++ b/batchcode_plugin/static/Settings.js @@ -0,0 +1,2 @@ +const R=window.MantineCore.Alert,w=window.MantineCore.Badge,E=window.MantineCore.Button,e=window.MantineCore.Code,g=window.MantineCore.Group,p=window.MantineCore.Loader,u=window.MantineCore.Stack,c=window.MantineCore.Text,h=window.React.useCallback,C=window.React.useEffect,l=window.React.useState,f="/plugin/batchcode/preview/";function b({context:t}){const[m,o]=l(""),[r,i]=l(""),[s,d]=l(!1),a=h(()=>{d(!0),i(""),t.api.post(f,{}).then(n=>o(n.data?.batch_code??"")).catch(n=>{i(String(n?.response?.data?.detail??"Could not render a preview code")),o("")}).finally(()=>d(!1))},[t.api]);return C(()=>{a()},[a]),React.createElement(u,{gap:"sm"},React.createElement(R,{color:"blue",title:"Format preview"},React.createElement(u,{gap:"sm"},React.createElement(c,{size:"sm"},"The next batch code for the global counter, using the settings above. Part, location and date placeholders resolve against the actual stock item when a code is generated."),React.createElement(g,{gap:"sm",align:"center"},s?React.createElement(p,{size:"sm"}):React.createElement(w,{size:"lg",variant:"light"},m||"—"),React.createElement(E,{size:"xs",variant:"default",onClick:a,disabled:s},"Refresh")),r&&React.createElement(c,{size:"sm",c:"red"},r))),React.createElement(c,{size:"xs",c:"dimmed"},"Placeholders: ",React.createElement(e,null,"{prefix}")," ",React.createElement(e,null,"{num}")," ",React.createElement(e,null,"{sep}")," ",React.createElement(e,null,"{date}")," ",React.createElement(e,null,"{part}")," ",React.createElement(e,null,"{ipn}")," ",React.createElement(e,null,"{loc}")," ",React.createElement(e,null,"{year}")," ",React.createElement(e,null,"{month}")," ",React.createElement(e,null,"{day}")," ",React.createElement(e,null,"{week}")))}function v(t){return React.createElement(b,{context:t})}export{v as RenderPluginSettings}; +//# sourceMappingURL=Settings.js.map diff --git a/batchcode_plugin/static/Settings.js.map b/batchcode_plugin/static/Settings.js.map new file mode 100644 index 0000000..24de4ff --- /dev/null +++ b/batchcode_plugin/static/Settings.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Settings.js","sources":["../../frontend/src/Settings.tsx"],"sourcesContent":["import type { InvenTreePluginContext } from '@inventreedb/ui';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Text\n} from '@mantine/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\n\n/**\n * Rendered on the plugin settings page, below the settings themselves.\n *\n * Shows the code the current settings would produce. The preview endpoint\n * does not advance the counter, so this can be refreshed after each settings\n * change to check a format before it is used for real.\n */\nfunction PluginSettingsDisplay({\n context\n}: {\n context: InvenTreePluginContext;\n}) {\n const [code, setCode] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const loadPreview = useCallback(() => {\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, {})\n .then((response) => setCode(response.data?.batch_code ?? ''))\n .catch((e) => {\n setError(\n String(e?.response?.data?.detail ?? 'Could not render a preview code')\n );\n setCode('');\n })\n .finally(() => setLoading(false));\n }, [context.api]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n return (\n \n \n \n \n The next batch code for the global counter, using the settings\n above. Part, location and date placeholders resolve against the\n actual stock item when a code is generated.\n \n \n {loading ? (\n \n ) : (\n \n {code || '—'}\n \n )}\n \n Refresh\n \n \n {error && (\n \n {error}\n \n )}\n \n \n \n Placeholders: {'{prefix}'} {'{num}'}{' '}\n {'{sep}'} {'{date}'} {'{part}'}{' '}\n {'{ipn}'} {'{loc}'} {'{year}'}{' '}\n {'{month}'} {'{day}'} {'{week}'}\n \n \n );\n}\n\nexport function RenderPluginSettings(context: InvenTreePluginContext) {\n return ;\n}\n"],"names":["Alert","useCallback","PREVIEW_URL","PluginSettingsDisplay","context","code","setCode","useState","error","setError","loading","setLoading","loadPreview","api","post","then","response","data","batch_code","catch","e","String","detail","finally","useEffect","Stack","Text","Group","Loader","Badge","Button","Code","RenderPluginSettings"],"mappings":"AACA,MAAAA,EAAA,OAAA,YAAA,mMAUAC,EAAA,OAAA,MAAA,6DAEMC,EAAc,6BASpB,SAASC,EAAsB,CAC7BC,QAAAA,CAGF,EAAG,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAiB,EAAE,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAiB,EAAE,EACvC,CAACG,EAASC,CAAU,EAAIJ,EAAkB,EAAK,EAE/CK,EAAcX,EAAY,IAAM,CACpCU,EAAW,EAAI,EACfF,EAAS,EAAE,EAEXL,EAAQS,IACLC,KAAKZ,EAAa,CAAA,CAAE,EACpBa,KAAMC,GAAaV,EAAQU,EAASC,MAAMC,YAAc,EAAE,CAAC,EAC3DC,MAAOC,GAAM,CACZX,EACEY,OAAOD,GAAGJ,UAAUC,MAAMK,QAAU,iCAAiC,CACvE,EACAhB,EAAQ,EAAE,CACZ,CAAC,EACAiB,QAAQ,IAAMZ,EAAW,EAAK,CAAC,CACpC,EAAG,CAACP,EAAQS,GAAG,CAAC,EAEhBW,OAAAA,EAAU,IAAM,CACdZ,EAAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAGd,MAAA,cAACa,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACzB,EAAA,CAAM,MAAM,OAAO,MAAM,gBAAA,EACxB,MAAA,cAACyB,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACC,EAAA,CAAK,KAAK,IAAA,EAAI,4KAIf,EACA,MAAA,cAACC,EAAA,CAAM,IAAI,KAAK,MAAM,UACnBjB,EACC,MAAA,cAACkB,EAAA,CAAO,KAAK,IAAA,CAAI,EAEjB,MAAA,cAACC,EAAA,CAAM,KAAK,KAAK,QAAQ,OAAA,EACtBxB,GAAQ,GACX,EAEF,MAAA,cAACyB,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAASlB,EACT,SAAUF,GAAQ,SAGpB,CACF,EACCF,GACC,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,OACflB,CACH,CAEJ,CACF,EACA,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,QAAA,EAAQ,iBACV,MAAA,cAACK,EAAA,KAAM,UAAW,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAQ,IAC/D,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACvE,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACtE,MAAA,cAACA,EAAA,KAAM,SAAU,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,CAClE,CACF,CAEJ,CAEO,SAASC,EAAqB5B,EAAiC,CACpE,OAAO,MAAA,cAACD,GAAsB,QAAAC,CAAA,CAAiB,CACjD"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-6MO-OwBA.js b/batchcode_plugin/static/assets/messages-6MO-OwBA.js new file mode 100644 index 0000000..c127abb --- /dev/null +++ b/batchcode_plugin/static/assets/messages-6MO-OwBA.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-6MO-OwBA.js.map diff --git a/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map b/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map new file mode 100644 index 0000000..965820f --- /dev/null +++ b/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-6MO-OwBA.js","sources":["../../../frontend/src/locales/pseudo-LOCALE/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-B19F09LY.js b/batchcode_plugin/static/assets/messages-B19F09LY.js new file mode 100644 index 0000000..f5ee4e8 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-B19F09LY.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-B19F09LY.js.map diff --git a/batchcode_plugin/static/assets/messages-B19F09LY.js.map b/batchcode_plugin/static/assets/messages-B19F09LY.js.map new file mode 100644 index 0000000..c5d48c0 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-B19F09LY.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-B19F09LY.js","sources":["../../../frontend/src/locales/es/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BVqXLN8V.js b/batchcode_plugin/static/assets/messages-BVqXLN8V.js new file mode 100644 index 0000000..1b90887 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BVqXLN8V.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BVqXLN8V.js.map diff --git a/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map b/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map new file mode 100644 index 0000000..3c2a649 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BVqXLN8V.js","sources":["../../../frontend/src/locales/en/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BaNfSHmL.js b/batchcode_plugin/static/assets/messages-BaNfSHmL.js new file mode 100644 index 0000000..2bf98ab --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BaNfSHmL.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BaNfSHmL.js.map diff --git a/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map b/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map new file mode 100644 index 0000000..99a9142 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BaNfSHmL.js","sources":["../../../frontend/src/locales/ru/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-Bs4XYOTm.js b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js new file mode 100644 index 0000000..5cded04 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-Bs4XYOTm.js.map diff --git a/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map new file mode 100644 index 0000000..0b59d96 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-Bs4XYOTm.js","sources":["../../../frontend/src/locales/zh_Hant/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BwzuZfs7.js b/batchcode_plugin/static/assets/messages-BwzuZfs7.js new file mode 100644 index 0000000..37d6c65 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BwzuZfs7.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BwzuZfs7.js.map diff --git a/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map b/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map new file mode 100644 index 0000000..b524b67 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BwzuZfs7.js","sources":["../../../frontend/src/locales/ja/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-DtuQFlMQ.js b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js new file mode 100644 index 0000000..e3cc21c --- /dev/null +++ b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-DtuQFlMQ.js.map diff --git a/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map new file mode 100644 index 0000000..83f0ed3 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-DtuQFlMQ.js","sources":["../../../frontend/src/locales/fr/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-SySx3VqF.js b/batchcode_plugin/static/assets/messages-SySx3VqF.js new file mode 100644 index 0000000..b58c7ab --- /dev/null +++ b/batchcode_plugin/static/assets/messages-SySx3VqF.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-SySx3VqF.js.map diff --git a/batchcode_plugin/static/assets/messages-SySx3VqF.js.map b/batchcode_plugin/static/assets/messages-SySx3VqF.js.map new file mode 100644 index 0000000..6bb50d1 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-SySx3VqF.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-SySx3VqF.js","sources":["../../../frontend/src/locales/de/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-m7AYrdMP.js b/batchcode_plugin/static/assets/messages-m7AYrdMP.js new file mode 100644 index 0000000..fdb35fb --- /dev/null +++ b/batchcode_plugin/static/assets/messages-m7AYrdMP.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Sovrascrivi il codice batch esistente"],"B4m81Y":["Non hai i permessi per generare codici batch."],"DKa9ch":["Genera e salva"],"DerUtL":["La generazione dei codici batch è disattivata"],"H2Sfhg":["Attivazione"],"IF5r8v":["Anteprima non disponibile"],"MTqQMG":["Non impostato"],"NEgaRI":["Impossibile generare il codice batch"],"NKnPpU":["Contatore"],"O/ICOy":["per articolo"],"O8n/gF":["Codice batch non generato"],"SLbeKO":["globale"],"T0z5Hw":["Codice batch generato"],"hPL4I9":["Impossibile caricare l'anteprima del codice batch"],"hsSgoQ":["Attiva l'impostazione 'Enabled' del plugin per generare i codici batch."],"iHaxSq":["azzerato ogni giorno"],"j1yeuR":["dal campo ubicazione {0}"],"kI1qVD":["Formato"],"lCF0wC":["Aggiorna"],"nyqfpO":["Codice batch attuale"],"qt+UdX":["per ubicazione"],"rNqTKZ":["Prefisso"],"ss5emH":["Prossimo codice"],"uNQ6eB":["Sola lettura"],"ywFj2D":["Configurazione"]}`);export{e as messages}; +//# sourceMappingURL=messages-m7AYrdMP.js.map diff --git a/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map b/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map new file mode 100644 index 0000000..1f458ee --- /dev/null +++ b/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-m7AYrdMP.js","sources":["../../../frontend/src/locales/it/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Sovrascrivi il codice batch esistente\\\"],\\\"B4m81Y\\\":[\\\"Non hai i permessi per generare codici batch.\\\"],\\\"DKa9ch\\\":[\\\"Genera e salva\\\"],\\\"DerUtL\\\":[\\\"La generazione dei codici batch è disattivata\\\"],\\\"H2Sfhg\\\":[\\\"Attivazione\\\"],\\\"IF5r8v\\\":[\\\"Anteprima non disponibile\\\"],\\\"MTqQMG\\\":[\\\"Non impostato\\\"],\\\"NEgaRI\\\":[\\\"Impossibile generare il codice batch\\\"],\\\"NKnPpU\\\":[\\\"Contatore\\\"],\\\"O/ICOy\\\":[\\\"per articolo\\\"],\\\"O8n/gF\\\":[\\\"Codice batch non generato\\\"],\\\"SLbeKO\\\":[\\\"globale\\\"],\\\"T0z5Hw\\\":[\\\"Codice batch generato\\\"],\\\"hPL4I9\\\":[\\\"Impossibile caricare l'anteprima del codice batch\\\"],\\\"hsSgoQ\\\":[\\\"Attiva l'impostazione 'Enabled' del plugin per generare i codici batch.\\\"],\\\"iHaxSq\\\":[\\\"azzerato ogni giorno\\\"],\\\"j1yeuR\\\":[\\\"dal campo ubicazione {0}\\\"],\\\"kI1qVD\\\":[\\\"Formato\\\"],\\\"lCF0wC\\\":[\\\"Aggiorna\\\"],\\\"nyqfpO\\\":[\\\"Codice batch attuale\\\"],\\\"qt+UdX\\\":[\\\"per ubicazione\\\"],\\\"rNqTKZ\\\":[\\\"Prefisso\\\"],\\\"ss5emH\\\":[\\\"Prossimo codice\\\"],\\\"uNQ6eB\\\":[\\\"Sola lettura\\\"],\\\"ywFj2D\\\":[\\\"Configurazione\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,m5BAAu/B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-uDIARWjl.js b/batchcode_plugin/static/assets/messages-uDIARWjl.js new file mode 100644 index 0000000..78a8a39 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-uDIARWjl.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-uDIARWjl.js.map diff --git a/batchcode_plugin/static/assets/messages-uDIARWjl.js.map b/batchcode_plugin/static/assets/messages-uDIARWjl.js.map new file mode 100644 index 0000000..be2283c --- /dev/null +++ b/batchcode_plugin/static/assets/messages-uDIARWjl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-uDIARWjl.js","sources":["../../../frontend/src/locales/zh_Hans/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file